OSDN Git Service

Make changes to tests
[wvm/gitlab.git] / spec / observers / merge_request_observer_spec.rb
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, source_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