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) }
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) }
23 before(:each) { enable_observers }
24 after(:each) { disable_observers }
26 subject { MergeRequestObserver.instance }
28 describe '#after_create' do
29 it 'trigger notification service' do
30 subject.should_receive(:notification)
31 subject.after_create(mr_mock)
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)
39 subject.after_create(mr_mock)
43 context '#after_update' do
45 mr_mock.stub(:is_being_reassigned?).and_return(false)
46 mr_mock.stub(:notice_added_references)
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)
53 MergeRequest.observers.enable :merge_request_observer do
54 changed.title = 'I changed'
59 it 'checks for new references' do
60 mr_mock.should_receive(:notice_added_references)
62 subject.after_update(mr_mock)
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)
70 subject.after_update(mr_mock)
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)
77 subject.after_update(mr_mock)
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)
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)
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)
103 closed_assigned_mr.reopen
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)
109 closed_unassigned_mr.reopen
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 }
123 @merge_request = create(:merge_request, source_project: project, source_project: project)
127 it_should_be_valid_event
128 it { @event.action.should == Event::CREATED }
129 it { @event.target.should == @merge_request }