Commit a7ab029d22baec1aa6e5a095b5eac99a9ffebdaa

Authored by Dmitriy Zaporozhets
2 parents 96f91c0f 9b6224f9

Merge branch 'reduce-observers' into 'master'

Remove some observers
app/controllers/projects/merge_requests_controller.rb
@@ -76,10 +76,10 @@ class Projects::MergeRequestsController < Projects::ApplicationController @@ -76,10 +76,10 @@ class Projects::MergeRequestsController < Projects::ApplicationController
76 end 76 end
77 77
78 def create 78 def create
79 - @merge_request = MergeRequest.new(params[:merge_request])  
80 - @merge_request.author = current_user  
81 @target_branches ||= [] 79 @target_branches ||= []
82 - if @merge_request.save 80 + @merge_request = MergeRequests::CreateService.new(project, current_user, params[:merge_request]).execute
  81 +
  82 + if @merge_request.valid?
83 redirect_to [@merge_request.target_project, @merge_request], notice: 'Merge request was successfully created.' 83 redirect_to [@merge_request.target_project, @merge_request], notice: 'Merge request was successfully created.'
84 else 84 else
85 @source_project = @merge_request.source_project 85 @source_project = @merge_request.source_project
@@ -89,29 +89,9 @@ class Projects::MergeRequestsController < Projects::ApplicationController @@ -89,29 +89,9 @@ class Projects::MergeRequestsController < Projects::ApplicationController
89 end 89 end
90 90
91 def update 91 def update
92 - # If we close MergeRequest we want to ignore validation  
93 - # so we can close broken one (Ex. fork project removed)  
94 - if params[:merge_request] == {"state_event"=>"close"}  
95 - @merge_request.allow_broken = true  
96 -  
97 - if @merge_request.close  
98 - opts = { notice: 'Merge request was successfully closed.' }  
99 - else  
100 - opts = { alert: 'Failed to close merge request.' }  
101 - end  
102 -  
103 - redirect_to [@merge_request.target_project, @merge_request], opts  
104 - return  
105 - end  
106 -  
107 - # We dont allow change of source/target projects  
108 - # after merge request was created  
109 - params[:merge_request].delete(:source_project_id)  
110 - params[:merge_request].delete(:target_project_id)  
111 -  
112 - if @merge_request.update_attributes(params[:merge_request])  
113 - @merge_request.reset_events_cache 92 + @merge_request = MergeRequests::UpdateService.new(project, current_user, params[:merge_request]).execute(@merge_request)
114 93
  94 + if @merge_request.valid?
115 respond_to do |format| 95 respond_to do |format|
116 format.js 96 format.js
117 format.html do 97 format.html do
app/models/email.rb
@@ -13,14 +13,15 @@ class Email < ActiveRecord::Base @@ -13,14 +13,15 @@ class Email < ActiveRecord::Base
13 # Relations 13 # Relations
14 # 14 #
15 belongs_to :user 15 belongs_to :user
16 - 16 +
17 # 17 #
18 # Validations 18 # Validations
19 # 19 #
20 validates :user_id, presence: true 20 validates :user_id, presence: true
21 validates :email, presence: true, email: { strict_mode: true }, uniqueness: true 21 validates :email, presence: true, email: { strict_mode: true }, uniqueness: true
22 validate :unique_email, if: ->(email) { email.email_changed? } 22 validate :unique_email, if: ->(email) { email.email_changed? }
23 - 23 +
  24 + after_create :notify
24 before_validation :cleanup_email 25 before_validation :cleanup_email
25 26
26 def cleanup_email 27 def cleanup_email
@@ -30,4 +31,8 @@ class Email < ActiveRecord::Base @@ -30,4 +31,8 @@ class Email < ActiveRecord::Base
30 def unique_email 31 def unique_email
31 self.errors.add(:email, 'has already been taken') if User.exists?(email: self.email) 32 self.errors.add(:email, 'has already been taken') if User.exists?(email: self.email)
32 end 33 end
33 -end  
34 \ No newline at end of file 34 \ No newline at end of file
  35 +
  36 + def notify
  37 + NotificationService.new.new_email(self)
  38 + end
  39 +end
app/models/key.rb
@@ -29,6 +29,10 @@ class Key < ActiveRecord::Base @@ -29,6 +29,10 @@ class Key < ActiveRecord::Base
29 29
30 delegate :name, :email, to: :user, prefix: true 30 delegate :name, :email, to: :user, prefix: true
31 31
  32 + after_create :add_to_shell
  33 + after_create :notify_user
  34 + after_destroy :remove_from_shell
  35 +
32 def strip_white_space 36 def strip_white_space
33 self.key = key.strip unless key.blank? 37 self.key = key.strip unless key.blank?
34 end 38 end
@@ -42,6 +46,26 @@ class Key < ActiveRecord::Base @@ -42,6 +46,26 @@ class Key < ActiveRecord::Base
42 "key-#{id}" 46 "key-#{id}"
43 end 47 end
44 48
  49 + def add_to_shell
  50 + GitlabShellWorker.perform_async(
  51 + :add_key,
  52 + shell_id,
  53 + key
  54 + )
  55 + end
  56 +
  57 + def notify_user
  58 + NotificationService.new.new_key(self)
  59 + end
  60 +
  61 + def remove_from_shell
  62 + GitlabShellWorker.perform_async(
  63 + :remove_key,
  64 + shell_id,
  65 + key,
  66 + )
  67 + end
  68 +
45 private 69 private
46 70
47 def generate_fingerpint 71 def generate_fingerpint
app/models/merge_request.rb
@@ -97,6 +97,7 @@ class MergeRequest < ActiveRecord::Base @@ -97,6 +97,7 @@ class MergeRequest < ActiveRecord::Base
97 validates :target_project, presence: true 97 validates :target_project, presence: true
98 validates :target_branch, presence: true 98 validates :target_branch, presence: true
99 validate :validate_branches 99 validate :validate_branches
  100 + validate :validate_fork
100 101
101 scope :of_group, ->(group) { where("source_project_id in (:group_project_ids) OR target_project_id in (:group_project_ids)", group_project_ids: group.project_ids) } 102 scope :of_group, ->(group) { where("source_project_id in (:group_project_ids) OR target_project_id in (:group_project_ids)", group_project_ids: group.project_ids) }
102 scope :of_user_team, ->(team) { where("(source_project_id in (:team_project_ids) OR target_project_id in (:team_project_ids) AND assignee_id in (:team_member_ids))", team_project_ids: team.project_ids, team_member_ids: team.member_ids) } 103 scope :of_user_team, ->(team) { where("(source_project_id in (:team_project_ids) OR target_project_id in (:team_project_ids) AND assignee_id in (:team_member_ids))", team_project_ids: team.project_ids, team_member_ids: team.member_ids) }
@@ -125,6 +126,22 @@ class MergeRequest < ActiveRecord::Base @@ -125,6 +126,22 @@ class MergeRequest < ActiveRecord::Base
125 end 126 end
126 end 127 end
127 128
  129 + def validate_fork
  130 + return true unless target_project && source_project
  131 +
  132 + if target_project == source_project
  133 + true
  134 + else
  135 + # If source and target projects are different
  136 + # we should check if source project is actually a fork of target project
  137 + if source_project.forked_from?(target_project)
  138 + true
  139 + else
  140 + errors.add :base, "Source project is not a fork of target project"
  141 + end
  142 + end
  143 + end
  144 +
128 def update_merge_request_diff 145 def update_merge_request_diff
129 if source_branch_changed? || target_branch_changed? 146 if source_branch_changed? || target_branch_changed?
130 reload_code 147 reload_code
app/models/project.rb
@@ -552,4 +552,8 @@ class Project < ActiveRecord::Base @@ -552,4 +552,8 @@ class Project < ActiveRecord::Base
552 gitlab_shell.update_repository_head(self.path_with_namespace, branch) 552 gitlab_shell.update_repository_head(self.path_with_namespace, branch)
553 reload_default_branch 553 reload_default_branch
554 end 554 end
  555 +
  556 + def forked_from?(project)
  557 + forked? && project == forked_from_project
  558 + end
555 end 559 end
app/observers/email_observer.rb
@@ -1,5 +0,0 @@ @@ -1,5 +0,0 @@
1 -class EmailObserver < BaseObserver  
2 - def after_create(email)  
3 - notification.new_email(email)  
4 - end  
5 -end  
app/observers/key_observer.rb
@@ -1,19 +0,0 @@ @@ -1,19 +0,0 @@
1 -class KeyObserver < BaseObserver  
2 - def after_create(key)  
3 - GitlabShellWorker.perform_async(  
4 - :add_key,  
5 - key.shell_id,  
6 - key.key  
7 - )  
8 -  
9 - notification.new_key(key)  
10 - end  
11 -  
12 - def after_destroy(key)  
13 - GitlabShellWorker.perform_async(  
14 - :remove_key,  
15 - key.shell_id,  
16 - key.key,  
17 - )  
18 - end  
19 -end  
app/observers/merge_request_observer.rb
@@ -1,43 +0,0 @@ @@ -1,43 +0,0 @@
1 -class MergeRequestObserver < BaseObserver  
2 - def after_create(merge_request)  
3 - event_service.open_mr(merge_request, current_user)  
4 - notification.new_merge_request(merge_request, current_user)  
5 - merge_request.create_cross_references!(merge_request.project, current_user)  
6 - execute_hooks(merge_request)  
7 - end  
8 -  
9 - def after_close(merge_request, transition)  
10 - event_service.close_mr(merge_request, current_user)  
11 - notification.close_mr(merge_request, current_user)  
12 - create_note(merge_request)  
13 - execute_hooks(merge_request)  
14 - end  
15 -  
16 - def after_reopen(merge_request, transition)  
17 - event_service.reopen_mr(merge_request, current_user)  
18 - create_note(merge_request)  
19 - execute_hooks(merge_request)  
20 - merge_request.reload_code  
21 - merge_request.mark_as_unchecked  
22 - end  
23 -  
24 - def after_update(merge_request)  
25 - notification.reassigned_merge_request(merge_request, current_user) if merge_request.is_being_reassigned?  
26 -  
27 - merge_request.notice_added_references(merge_request.project, current_user)  
28 - execute_hooks(merge_request)  
29 - end  
30 -  
31 - private  
32 -  
33 - # Create merge request note with service comment like 'Status changed to closed'  
34 - def create_note(merge_request)  
35 - Note.create_status_change_note(merge_request, merge_request.target_project, current_user, merge_request.state, nil)  
36 - end  
37 -  
38 - def execute_hooks(merge_request)  
39 - if merge_request.project  
40 - merge_request.project.execute_hooks(merge_request.to_hook_data, :merge_request_hooks)  
41 - end  
42 - end  
43 -end  
app/services/merge_requests/base_service.rb 0 → 100644
@@ -0,0 +1,16 @@ @@ -0,0 +1,16 @@
  1 +module MergeRequests
  2 + class BaseService < ::BaseService
  3 +
  4 + private
  5 +
  6 + def create_note(merge_request)
  7 + Note.create_status_change_note(merge_request, merge_request.target_project, current_user, merge_request.state, nil)
  8 + end
  9 +
  10 + def execute_hooks(merge_request)
  11 + if merge_request.project
  12 + merge_request.project.execute_hooks(merge_request.to_hook_data, :merge_request_hooks)
  13 + end
  14 + end
  15 + end
  16 +end
app/services/merge_requests/close_service.rb 0 → 100644
@@ -0,0 +1,18 @@ @@ -0,0 +1,18 @@
  1 +module MergeRequests
  2 + class CloseService < MergeRequests::BaseService
  3 + def execute(merge_request, commit = nil)
  4 + # If we close MergeRequest we want to ignore validation
  5 + # so we can close broken one (Ex. fork project removed)
  6 + merge_request.allow_broken = true
  7 +
  8 + if merge_request.close
  9 + event_service.close_mr(merge_request, current_user)
  10 + notification_service.close_mr(merge_request, current_user)
  11 + create_note(merge_request)
  12 + execute_hooks(merge_request)
  13 + end
  14 +
  15 + merge_request
  16 + end
  17 + end
  18 +end
app/services/merge_requests/create_service.rb 0 → 100644
@@ -0,0 +1,19 @@ @@ -0,0 +1,19 @@
  1 +module MergeRequests
  2 + class CreateService < MergeRequests::BaseService
  3 + def execute
  4 + merge_request = MergeRequest.new(params)
  5 + merge_request.source_project = project
  6 + merge_request.target_project ||= project
  7 + merge_request.author = current_user
  8 +
  9 + if merge_request.save
  10 + event_service.open_mr(merge_request, current_user)
  11 + notification_service.new_merge_request(merge_request, current_user)
  12 + merge_request.create_cross_references!(merge_request.project, current_user)
  13 + execute_hooks(merge_request)
  14 + end
  15 +
  16 + merge_request
  17 + end
  18 + end
  19 +end
app/services/merge_requests/reopen_service.rb 0 → 100644
@@ -0,0 +1,15 @@ @@ -0,0 +1,15 @@
  1 +module MergeRequests
  2 + class ReopenService < MergeRequests::BaseService
  3 + def execute(merge_request)
  4 + if merge_request.reopen
  5 + event_service.reopen_mr(merge_request, current_user)
  6 + create_note(merge_request)
  7 + execute_hooks(merge_request)
  8 + merge_request.reload_code
  9 + merge_request.mark_as_unchecked
  10 + end
  11 +
  12 + merge_request
  13 + end
  14 + end
  15 +end
app/services/merge_requests/update_service.rb 0 → 100644
@@ -0,0 +1,37 @@ @@ -0,0 +1,37 @@
  1 +require_relative 'base_service'
  2 +require_relative 'reopen_service'
  3 +require_relative 'close_service'
  4 +
  5 +module MergeRequests
  6 + class UpdateService < MergeRequests::BaseService
  7 + def execute(merge_request)
  8 + # We dont allow change of source/target projects
  9 + # after merge request was created
  10 + params.delete(:source_project_id)
  11 + params.delete(:target_project_id)
  12 +
  13 + state = params.delete('state_event')
  14 +
  15 + case state
  16 + when 'reopen'
  17 + MergeRequests::ReopenService.new(project, current_user, {}).execute(merge_request)
  18 + when 'close'
  19 + MergeRequests::CloseService.new(project, current_user, {}).execute(merge_request)
  20 + end
  21 +
  22 + if params.present? && merge_request.update_attributes(params)
  23 + merge_request.reset_events_cache
  24 +
  25 + if merge_request.previous_changes.include?('assignee_id')
  26 + notification_service.reassigned_merge_request(merge_request, current_user)
  27 + create_assignee_note(merge_request)
  28 + end
  29 +
  30 + merge_request.notice_added_references(merge_request.project, current_user)
  31 + execute_hooks(merge_request)
  32 + end
  33 +
  34 + merge_request
  35 + end
  36 + end
  37 +end
app/views/projects/merge_requests/_form.html.haml
@@ -33,7 +33,7 @@ @@ -33,7 +33,7 @@
33 .col-sm-10 33 .col-sm-10
34 .clearfix 34 .clearfix
35 .pull-left 35 .pull-left
36 - - projects = @project.forked_from_project.nil? ? [@project] : [ @project,@project.forked_from_project] 36 + - projects = @project.forked_from_project.nil? ? [@project] : [@project, @project.forked_from_project]
37 = f.select(:target_project_id, options_from_collection_for_select(projects, 'id', 'path_with_namespace', f.object.target_project_id), {}, { class: 'target_project select2 span3', disabled: @merge_request.persisted? }) 37 = f.select(:target_project_id, options_from_collection_for_select(projects, 'id', 'path_with_namespace', f.object.target_project_id), {}, { class: 'target_project select2 span3', disabled: @merge_request.persisted? })
38 .pull-left 38 .pull-left
39 &nbsp; 39 &nbsp;
config/application.rb
@@ -21,8 +21,6 @@ module Gitlab @@ -21,8 +21,6 @@ module Gitlab
21 # Activate observers that should always be running. 21 # Activate observers that should always be running.
22 config.active_record.observers = :milestone_observer, 22 config.active_record.observers = :milestone_observer,
23 :project_activity_cache_observer, 23 :project_activity_cache_observer,
24 - :key_observer,  
25 - :merge_request_observer,  
26 :note_observer, 24 :note_observer,
27 :project_observer, 25 :project_observer,
28 :system_hook_observer, 26 :system_hook_observer,
features/steps/dashboard/merge_requests.rb
@@ -53,15 +53,15 @@ class DashboardMergeRequests &lt; Spinach::FeatureSteps @@ -53,15 +53,15 @@ class DashboardMergeRequests &lt; Spinach::FeatureSteps
53 end 53 end
54 54
55 def assigned_merge_request 55 def assigned_merge_request
56 - @assigned_merge_request ||= create :merge_request, assignee: current_user, target_project: project 56 + @assigned_merge_request ||= create :merge_request, assignee: current_user, target_project: project, source_project: project
57 end 57 end
58 58
59 def authored_merge_request 59 def authored_merge_request
60 - @authored_merge_request ||= create :merge_request, author: current_user, target_project: project 60 + @authored_merge_request ||= create :merge_request, source_branch: 'simple_merge_request', author: current_user, target_project: project, source_project: project
61 end 61 end
62 62
63 def other_merge_request 63 def other_merge_request
64 - @other_merge_request ||= create :merge_request, target_project: project 64 + @other_merge_request ||= create :merge_request, source_branch: '2_3_notes_fix', target_project: project, source_project: project
65 end 65 end
66 66
67 def project 67 def project
features/support/env.rb
@@ -52,6 +52,4 @@ Spinach.hooks.before_run do @@ -52,6 +52,4 @@ Spinach.hooks.before_run do
52 RSpec::Mocks::setup self 52 RSpec::Mocks::setup self
53 53
54 include FactoryGirl::Syntax::Methods 54 include FactoryGirl::Syntax::Methods
55 - MergeRequestObserver.any_instance.stub(current_user: create(:user))  
56 end 55 end
57 -  
lib/api/merge_requests.rb
@@ -13,14 +13,6 @@ module API @@ -13,14 +13,6 @@ module API
13 end 13 end
14 not_found! 14 not_found!
15 end 15 end
16 -  
17 - def not_fork?(target_project_id, user_project)  
18 - target_project_id.nil? || target_project_id == user_project.id.to_s  
19 - end  
20 -  
21 - def target_matches_fork(target_project_id,user_project)  
22 - user_project.forked? && user_project.forked_from_project.id.to_s == target_project_id  
23 - end  
24 end 16 end
25 17
26 # List merge requests 18 # List merge requests
@@ -70,29 +62,15 @@ module API @@ -70,29 +62,15 @@ module API
70 # POST /projects/:id/merge_requests 62 # POST /projects/:id/merge_requests
71 # 63 #
72 post ":id/merge_requests" do 64 post ":id/merge_requests" do
73 - set_current_user_for_thread do  
74 - authorize! :write_merge_request, user_project  
75 - required_attributes! [:source_branch, :target_branch, :title]  
76 - attrs = attributes_for_keys [:source_branch, :target_branch, :assignee_id, :title, :target_project_id, :description]  
77 - merge_request = user_project.merge_requests.new(attrs)  
78 - merge_request.author = current_user  
79 - merge_request.source_project = user_project  
80 - target_project_id = attrs[:target_project_id]  
81 - if not_fork?(target_project_id, user_project)  
82 - merge_request.target_project = user_project  
83 - else  
84 - if target_matches_fork(target_project_id,user_project)  
85 - merge_request.target_project = Project.find_by(id: attrs[:target_project_id])  
86 - else  
87 - render_api_error!('(Bad Request) Specified target project that is not the source project, or the source fork of the project.', 400)  
88 - end  
89 - end  
90 -  
91 - if merge_request.save  
92 - present merge_request, with: Entities::MergeRequest  
93 - else  
94 - handle_merge_request_errors! merge_request.errors  
95 - end 65 + authorize! :write_merge_request, user_project
  66 + required_attributes! [:source_branch, :target_branch, :title]
  67 + attrs = attributes_for_keys [:source_branch, :target_branch, :assignee_id, :title, :target_project_id, :description]
  68 + merge_request = ::MergeRequests::CreateService.new(user_project, current_user, attrs).execute
  69 +
  70 + if merge_request.valid?
  71 + present merge_request, with: Entities::MergeRequest
  72 + else
  73 + handle_merge_request_errors! merge_request.errors
96 end 74 end
97 end 75 end
98 76
@@ -111,17 +89,15 @@ module API @@ -111,17 +89,15 @@ module API
111 # PUT /projects/:id/merge_request/:merge_request_id 89 # PUT /projects/:id/merge_request/:merge_request_id
112 # 90 #
113 put ":id/merge_request/:merge_request_id" do 91 put ":id/merge_request/:merge_request_id" do
114 - set_current_user_for_thread do  
115 - attrs = attributes_for_keys [:source_branch, :target_branch, :assignee_id, :title, :state_event, :description]  
116 - merge_request = user_project.merge_requests.find(params[:merge_request_id])  
117 -  
118 - authorize! :modify_merge_request, merge_request 92 + attrs = attributes_for_keys [:source_branch, :target_branch, :assignee_id, :title, :state_event, :description]
  93 + merge_request = user_project.merge_requests.find(params[:merge_request_id])
  94 + authorize! :modify_merge_request, merge_request
  95 + merge_request = ::MergeRequests::UpdateService.new(user_project, current_user, attrs).execute(merge_request)
119 96
120 - if merge_request.update_attributes attrs  
121 - present merge_request, with: Entities::MergeRequest  
122 - else  
123 - handle_merge_request_errors! merge_request.errors  
124 - end 97 + if merge_request.valid?
  98 + present merge_request, with: Entities::MergeRequest
  99 + else
  100 + handle_merge_request_errors! merge_request.errors
125 end 101 end
126 end 102 end
127 103
spec/finders/merge_requests_finder_spec.rb
@@ -5,10 +5,10 @@ describe MergeRequestsFinder do @@ -5,10 +5,10 @@ describe MergeRequestsFinder do
5 let(:user2) { create :user } 5 let(:user2) { create :user }
6 6
7 let(:project1) { create(:project) } 7 let(:project1) { create(:project) }
8 - let(:project2) { create(:project) } 8 + let(:project2) { create(:project, forked_from_project: project1) }
9 9
10 - let!(:merge_request1) { create(:merge_request, :simple, author: user, source_project: project1, target_project: project2) }  
11 - let!(:merge_request2) { create(:merge_request, :simple, author: user, source_project: project2, target_project: project1) } 10 + let!(:merge_request1) { create(:merge_request, :simple, author: user, source_project: project2, target_project: project1) }
  11 + let!(:merge_request2) { create(:merge_request, :simple, author: user, source_project: project2, target_project: project1, state: 'closed') }
12 let!(:merge_request3) { create(:merge_request, :simple, author: user, source_project: project2, target_project: project2) } 12 let!(:merge_request3) { create(:merge_request, :simple, author: user, source_project: project2, target_project: project2) }
13 13
14 before do 14 before do
@@ -21,7 +21,7 @@ describe MergeRequestsFinder do @@ -21,7 +21,7 @@ describe MergeRequestsFinder do
21 it 'should filter by scope' do 21 it 'should filter by scope' do
22 params = { scope: 'authored', state: 'opened' } 22 params = { scope: 'authored', state: 'opened' }
23 merge_requests = MergeRequestsFinder.new.execute(user, params) 23 merge_requests = MergeRequestsFinder.new.execute(user, params)
24 - merge_requests.size.should == 3 24 + merge_requests.size.should == 2
25 end 25 end
26 26
27 it 'should filter by project' do 27 it 'should filter by project' do
spec/lib/gitlab/satellite/merge_action_spec.rb
@@ -13,7 +13,7 @@ describe &#39;Gitlab::Satellite::MergeAction&#39; do @@ -13,7 +13,7 @@ describe &#39;Gitlab::Satellite::MergeAction&#39; do
13 end 13 end
14 14
15 let(:project) { create(:project, namespace: create(:group)) } 15 let(:project) { create(:project, namespace: create(:group)) }
16 - let(:fork_project) { create(:project, namespace: create(:group)) } 16 + let(:fork_project) { create(:project, namespace: create(:group), forked_from_project: project) }
17 let(:merge_request) { create(:merge_request, source_project: project, target_project: project) } 17 let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
18 let(:merge_request_fork) { create(:merge_request, source_project: fork_project, target_project: project) } 18 let(:merge_request_fork) { create(:merge_request, source_project: fork_project, target_project: project) }
19 19
spec/models/key_spec.rb
@@ -68,4 +68,18 @@ describe Key do @@ -68,4 +68,18 @@ describe Key do
68 build(:invalid_key).should_not be_valid 68 build(:invalid_key).should_not be_valid
69 end 69 end
70 end 70 end
  71 +
  72 + context 'callbacks' do
  73 + it 'should add new key to authorized_file' do
  74 + @key = build(:personal_key, id: 7)
  75 + GitlabShellWorker.should_receive(:perform_async).with(:add_key, @key.shell_id, @key.key)
  76 + @key.save
  77 + end
  78 +
  79 + it 'should remove key from authorized_file' do
  80 + @key = create(:personal_key)
  81 + GitlabShellWorker.should_receive(:perform_async).with(:remove_key, @key.shell_id, @key.key)
  82 + @key.destroy
  83 + end
  84 + end
71 end 85 end
spec/models/note_spec.rb
@@ -209,7 +209,7 @@ describe Note do @@ -209,7 +209,7 @@ describe Note do
209 let(:project) { create(:project) } 209 let(:project) { create(:project) }
210 let(:author) { create(:user) } 210 let(:author) { create(:user) }
211 let(:issue) { create(:issue, project: project) } 211 let(:issue) { create(:issue, project: project) }
212 - let(:mergereq) { create(:merge_request, target_project: project) } 212 + let(:mergereq) { create(:merge_request, :simple, target_project: project, source_project: project) }
213 let(:commit) { project.repository.commit } 213 let(:commit) { project.repository.commit }
214 214
215 # Test all of {issue, merge request, commit} in both the referenced and referencing 215 # Test all of {issue, merge request, commit} in both the referenced and referencing
spec/observers/email_observer_spec.rb
@@ -1,17 +0,0 @@ @@ -1,17 +0,0 @@
1 -require 'spec_helper'  
2 -  
3 -describe EmailObserver do  
4 - let(:email) { create(:email) }  
5 -  
6 - before { subject.stub(notification: double('NotificationService').as_null_object) }  
7 -  
8 - subject { EmailObserver.instance }  
9 -  
10 - describe '#after_create' do  
11 - it 'trigger notification to send emails' do  
12 - subject.should_receive(:notification)  
13 -  
14 - subject.after_create(email)  
15 - end  
16 - end  
17 -end  
spec/observers/key_observer_spec.rb
@@ -1,23 +0,0 @@ @@ -1,23 +0,0 @@
1 -require 'spec_helper'  
2 -  
3 -describe KeyObserver do  
4 - before do  
5 - @key = create(:personal_key)  
6 -  
7 - @observer = KeyObserver.instance  
8 - end  
9 -  
10 - context :after_create do  
11 - it do  
12 - GitlabShellWorker.should_receive(:perform_async).with(:add_key, @key.shell_id, @key.key)  
13 - @observer.after_create(@key)  
14 - end  
15 - end  
16 -  
17 - context :after_destroy do  
18 - it do  
19 - GitlabShellWorker.should_receive(:perform_async).with(:remove_key, @key.shell_id, @key.key)  
20 - @observer.after_destroy(@key)  
21 - end  
22 - end  
23 -end  
spec/observers/merge_request_observer_spec.rb
@@ -1,131 +0,0 @@ @@ -1,131 +0,0 @@
1 -require 'spec_helper'  
2 -  
3 -describe MergeRequestObserver do  
4 - let(:some_user) { create :user }  
5 - let(:assignee) { create :user }  
6 - let(:author) { create :user }  
7 - let(:project) { create :project }  
8 - let(:mr_mock) { double(:merge_request, id: 42, assignee: assignee, author: author).as_null_object }  
9 - let(:assigned_mr) { create(:merge_request, assignee: assignee, author: author, source_project: project) }  
10 - let(:unassigned_mr) { create(:merge_request, author: author, source_project: project) }  
11 - let(:closed_assigned_mr) { create(:closed_merge_request, assignee: assignee, author: author, source_project: project) }  
12 - let(:closed_unassigned_mr) { create(:closed_merge_request, author: author, source_project: project) }  
13 -  
14 - before { subject.stub(:current_user).and_return(some_user) }  
15 - before { subject.stub(notification: double('NotificationService').as_null_object) }  
16 - before { mr_mock.stub(:author_id) }  
17 - before { mr_mock.stub(:source_project) }  
18 - before { mr_mock.stub(:source_project) }  
19 - before { mr_mock.stub(:project) }  
20 - before { mr_mock.stub(:create_cross_references!).and_return(true) }  
21 - before { Repository.any_instance.stub(commit: nil) }  
22 -  
23 - before(:each) { enable_observers }  
24 - after(:each) { disable_observers }  
25 -  
26 - subject { MergeRequestObserver.instance }  
27 -  
28 - describe '#after_create' do  
29 - it 'trigger notification service' do  
30 - subject.should_receive(:notification)  
31 - subject.after_create(mr_mock)  
32 - end  
33 -  
34 - it 'creates cross-reference notes' do  
35 - project = create :project  
36 - mr_mock.stub(title: "this mr references !#{assigned_mr.id}", project: project)  
37 - mr_mock.should_receive(:create_cross_references!).with(project, some_user)  
38 -  
39 - subject.after_create(mr_mock)  
40 - end  
41 - end  
42 -  
43 - context '#after_update' do  
44 - before(:each) do  
45 - mr_mock.stub(:is_being_reassigned?).and_return(false)  
46 - mr_mock.stub(:notice_added_references)  
47 - end  
48 -  
49 - it 'is called when a merge request is changed' do  
50 - changed = create(:merge_request, source_project: project)  
51 - subject.should_receive(:after_update)  
52 -  
53 - MergeRequest.observers.enable :merge_request_observer do  
54 - changed.title = 'I changed'  
55 - changed.save  
56 - end  
57 - end  
58 -  
59 - it 'checks for new references' do  
60 - mr_mock.should_receive(:notice_added_references)  
61 -  
62 - subject.after_update(mr_mock)  
63 - end  
64 -  
65 - context 'a notification' do  
66 - it 'is sent if the merge request is being reassigned' do  
67 - mr_mock.should_receive(:is_being_reassigned?).and_return(true)  
68 - subject.should_receive(:notification)  
69 -  
70 - subject.after_update(mr_mock)  
71 - end  
72 -  
73 - it 'is not sent if the merge request is not being reassigned' do  
74 - mr_mock.should_receive(:is_being_reassigned?).and_return(false)  
75 - subject.should_not_receive(:notification)  
76 -  
77 - subject.after_update(mr_mock)  
78 - end  
79 - end  
80 - end  
81 -  
82 - context '#after_close' do  
83 - context 'a status "closed"' do  
84 - it 'note is created if the merge request is being closed' do  
85 - Note.should_receive(:create_status_change_note).with(assigned_mr, assigned_mr.source_project, some_user, 'closed', nil)  
86 -  
87 - assigned_mr.close  
88 - end  
89 -  
90 - it 'notification is delivered only to author if the merge request is being closed' do  
91 - Note.should_receive(:create_status_change_note).with(unassigned_mr, unassigned_mr.source_project, some_user, 'closed', nil)  
92 -  
93 - unassigned_mr.close  
94 - end  
95 - end  
96 - end  
97 -  
98 - context '#after_reopen' do  
99 - context 'a status "reopened"' do  
100 - it 'note is created if the merge request is being reopened' do  
101 - Note.should_receive(:create_status_change_note).with(closed_assigned_mr, closed_assigned_mr.source_project, some_user, 'reopened', nil)  
102 -  
103 - closed_assigned_mr.reopen  
104 - end  
105 -  
106 - it 'notification is delivered only to author if the merge request is being reopened' do  
107 - Note.should_receive(:create_status_change_note).with(closed_unassigned_mr, closed_unassigned_mr.source_project, some_user, 'reopened', nil)  
108 -  
109 - closed_unassigned_mr.reopen  
110 - end  
111 - end  
112 - end  
113 -  
114 - describe "Merge Request created" do  
115 - def self.it_should_be_valid_event  
116 - it { @event.should_not be_nil }  
117 - it { @event.should_not be_nil }  
118 - it { @event.project.should == project }  
119 - it { @event.project.should == project }  
120 - end  
121 -  
122 - before do  
123 - @merge_request = create(:merge_request, source_project: project, target_project: project)  
124 - @event = Event.last  
125 - end  
126 -  
127 - it_should_be_valid_event  
128 - it { @event.action.should == Event::CREATED }  
129 - it { @event.target.should == @merge_request }  
130 - end  
131 -end  
spec/requests/api/merge_requests_spec.rb
@@ -6,7 +6,7 @@ describe API::API do @@ -6,7 +6,7 @@ describe API::API do
6 after(:each) { ActiveRecord::Base.observers.disable(:user_observer) } 6 after(:each) { ActiveRecord::Base.observers.disable(:user_observer) }
7 let(:user) { create(:user) } 7 let(:user) { create(:user) }
8 let!(:project) {create(:project, creator_id: user.id, namespace: user.namespace) } 8 let!(:project) {create(:project, creator_id: user.id, namespace: user.namespace) }
9 - let!(:merge_request) { create(:merge_request, author: user, assignee: user, source_project: project, target_project: project, title: "Test") } 9 + let!(:merge_request) { create(:merge_request, :simple, author: user, assignee: user, source_project: project, target_project: project, title: "Test") }
10 let!(:note) { create(:note_on_merge_request, author: user, project: project, noteable: merge_request, note: "a comment on a MR") } 10 let!(:note) { create(:note_on_merge_request, author: user, project: project, noteable: merge_request, note: "a comment on a MR") }
11 before { 11 before {
12 project.team << [user, :reporters] 12 project.team << [user, :reporters]
@@ -79,16 +79,12 @@ describe API::API do @@ -79,16 +79,12 @@ describe API::API do
79 end 79 end
80 80
81 context 'forked projects' do 81 context 'forked projects' do
82 - let!(:user2) {create(:user)}  
83 - let!(:forked_project_link) { build(:forked_project_link) }  
84 - let!(:fork_project) { create(:project, forked_project_link: forked_project_link, namespace: user2.namespace, creator_id: user2.id) }  
85 - let!(:unrelated_project) { create(:project, namespace: create(:user).namespace, creator_id: user2.id) } 82 + let!(:user2) { create(:user) }
  83 + let!(:fork_project) { create(:project, forked_from_project: project, namespace: user2.namespace, creator_id: user2.id) }
  84 + let!(:unrelated_project) { create(:project, namespace: create(:user).namespace, creator_id: user2.id) }
86 85
87 before :each do |each| 86 before :each do |each|
88 fork_project.team << [user2, :reporters] 87 fork_project.team << [user2, :reporters]
89 - forked_project_link.forked_from_project = project  
90 - forked_project_link.forked_to_project = fork_project  
91 - forked_project_link.save!  
92 end 88 end
93 89
94 it "should return merge_request" do 90 it "should return merge_request" do
@@ -127,16 +123,16 @@ describe API::API do @@ -127,16 +123,16 @@ describe API::API do
127 response.status.should == 400 123 response.status.should == 400
128 end 124 end
129 125
130 - it "should return 400 when target_branch is specified and not a forked project" do 126 + it "should return 404 when target_branch is specified and not a forked project" do
131 post api("/projects/#{project.id}/merge_requests", user), 127 post api("/projects/#{project.id}/merge_requests", user),
132 title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user, target_project_id: fork_project.id 128 title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user, target_project_id: fork_project.id
133 - response.status.should == 400 129 + response.status.should == 404
134 end 130 end
135 131
136 - it "should return 400 when target_branch is specified and for a different fork" do 132 + it "should return 404 when target_branch is specified and for a different fork" do
137 post api("/projects/#{fork_project.id}/merge_requests", user2), 133 post api("/projects/#{fork_project.id}/merge_requests", user2),
138 title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: unrelated_project.id 134 title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: unrelated_project.id
139 - response.status.should == 400 135 + response.status.should == 404
140 end 136 end
141 137
142 it "should return 201 when target_branch is specified and for the same project" do 138 it "should return 201 when target_branch is specified and for the same project" do
spec/services/notification_service_spec.rb
@@ -5,7 +5,7 @@ describe NotificationService do @@ -5,7 +5,7 @@ describe NotificationService do
5 5
6 describe 'Keys' do 6 describe 'Keys' do
7 describe :new_key do 7 describe :new_key do
8 - let(:key) { create(:personal_key) } 8 + let!(:key) { create(:personal_key) }
9 9
10 it { notification.new_key(key).should be_true } 10 it { notification.new_key(key).should be_true }
11 11
@@ -18,7 +18,7 @@ describe NotificationService do @@ -18,7 +18,7 @@ describe NotificationService do
18 18
19 describe 'Email' do 19 describe 'Email' do
20 describe :new_email do 20 describe :new_email do
21 - let(:email) { create(:email) } 21 + let!(:email) { create(:email) }
22 22
23 it { notification.new_email(email).should be_true } 23 it { notification.new_email(email).should be_true }
24 24