notification_service_spec.rb 13.9 KB
Newer Older
1 2
require 'spec_helper'

D
Douwe Maan 已提交
3
describe NotificationService, services: true do
4
  let(:notification) { NotificationService.new }
D
Dmitriy Zaporozhets 已提交
5

V
Valery Sizov 已提交
6 7 8 9 10 11
  around(:each) do |example|
    perform_enqueued_jobs do
      example.run
    end
  end

12 13
  describe 'Keys' do
    describe :new_key do
D
Dmitriy Zaporozhets 已提交
14
      let!(:key) { create(:personal_key) }
15

16
      it { expect(notification.new_key(key)).to be_truthy }
17 18

      it 'should sent email to key owner' do
V
Valery Sizov 已提交
19
        expect{ notification.new_key(key) }.to change{ ActionMailer::Base.deliveries.size }.by(1)
20 21 22 23
      end
    end
  end

24 25
  describe 'Email' do
    describe :new_email do
D
Dmitriy Zaporozhets 已提交
26
      let!(:email) { create(:email) }
27

28
      it { expect(notification.new_email(email)).to be_truthy }
29 30

      it 'should send email to email owner' do
V
Valery Sizov 已提交
31
        expect{ notification.new_email(email) }.to change{ ActionMailer::Base.deliveries.size }.by(1)
32 33 34 35
      end
    end
  end

36
  describe 'Notes' do
37
    context 'issue note' do
38
      let(:project) { create(:empty_project, :private) }
D
Douwe Maan 已提交
39
      let(:issue) { create(:issue, project: project, assignee: create(:user)) }
40
      let(:mentioned_issue) { create(:issue, assignee: issue.assignee) }
41
      let(:note) { create(:note_on_issue, noteable: issue, project_id: issue.project_id, note: '@mention referenced, @outsider also') }
42

43 44
      before do
        build_team(note.project)
45 46 47
        project.team << [issue.author, :master]
        project.team << [issue.assignee, :master]
        project.team << [note.author, :master]
48
        create(:note_on_issue, noteable: issue, project_id: issue.project_id, note: '@subscribed_participant cc this guy')
49 50
      end

51 52
      describe :new_note do
        it do
V
tests  
Valery Sizov 已提交
53 54
          add_users_with_subscription(note.project, issue)

55
          # Ensure create SentNotification by noteable = issue 6 times, not noteable = note
D
Douwe Maan 已提交
56
          expect(SentNotification).to receive(:record).with(issue, any_args).exactly(7).times
57

V
Valery Sizov 已提交
58
          ActionMailer::Base.deliveries.clear
V
tests  
Valery Sizov 已提交
59

60
          notification.new_note(note)
V
Valery Sizov 已提交
61 62 63 64 65 66

          should_email(@u_watcher)
          should_email(note.noteable.author)
          should_email(note.noteable.assignee)
          should_email(@u_mentioned)
          should_email(@subscriber)
67
          should_email(@watcher_and_subscriber)
68
          should_email(@subscribed_participant)
V
Valery Sizov 已提交
69 70 71 72 73
          should_not_email(note.author)
          should_not_email(@u_participating)
          should_not_email(@u_disabled)
          should_not_email(@unsubscriber)
          should_not_email(@u_outsider_mentioned)
74 75
        end

76
        it 'filters out "mentioned in" notes' do
77
          mentioned_note = SystemNoteService.cross_reference(mentioned_issue, issue, issue.author)
78

79
          expect(Notify).not_to receive(:note_issue_email)
80 81
          notification.new_note(mentioned_note)
        end
M
Marin Jankovski 已提交
82 83 84 85
      end

      describe 'new note on issue in project that belongs to a group' do
        let(:group) { create(:group) }
86

M
Marin Jankovski 已提交
87 88
        before do
          note.project.namespace_id = group.id
89
          note.project.group.add_user(@u_watcher, GroupMember::MASTER)
M
Marin Jankovski 已提交
90
          note.project.save
91
          user_project = note.project.project_members.find_by_user_id(@u_watcher.id)
M
Marin Jankovski 已提交
92 93
          user_project.notification_level = Notification::N_PARTICIPATING
          user_project.save
94 95 96
          group_member = note.project.group.group_members.find_by_user_id(@u_watcher.id)
          group_member.notification_level = Notification::N_GLOBAL
          group_member.save
V
Valery Sizov 已提交
97
          ActionMailer::Base.deliveries.clear
98 99
        end

M
Marin Jankovski 已提交
100 101 102
        it do
          notification.new_note(note)

V
Valery Sizov 已提交
103 104 105 106 107 108 109 110
          should_email(note.noteable.author)
          should_email(note.noteable.assignee)
          should_email(@u_mentioned)
          should_not_email(@u_watcher)
          should_not_email(note.author)
          should_not_email(@u_participating)
          should_not_email(@u_disabled)
        end
M
Marin Jankovski 已提交
111
      end
112
    end
113

114
    context 'issue note mention' do
D
Douwe Maan 已提交
115 116
      let(:project) { create(:empty_project, :public) }
      let(:issue) { create(:issue, project: project, assignee: create(:user)) }
117 118 119 120 121
      let(:mentioned_issue) { create(:issue, assignee: issue.assignee) }
      let(:note) { create(:note_on_issue, noteable: issue, project_id: issue.project_id, note: '@all mentioned') }

      before do
        build_team(note.project)
D
Douwe Maan 已提交
122
        note.project.team << [note.author, :master]
V
Valery Sizov 已提交
123
        ActionMailer::Base.deliveries.clear
124 125 126 127
      end

      describe :new_note do
        it do
V
Valery Sizov 已提交
128 129
          notification.new_note(note)

130 131 132 133
          # Notify all team members
          note.project.team.members.each do |member|
            # User with disabled notification should not be notified
            next if member.id == @u_disabled.id
D
Douwe Maan 已提交
134 135
            # Author should not be notified
            next if member.id == note.author.id
V
Valery Sizov 已提交
136
            should_email(member)
137 138
          end

V
Valery Sizov 已提交
139 140 141 142 143 144
          should_email(note.noteable.author)
          should_email(note.noteable.assignee)
          should_not_email(note.author)
          should_email(@u_mentioned)
          should_not_email(@u_disabled)
          should_email(@u_not_mentioned)
145 146 147
        end

        it 'filters out "mentioned in" notes' do
148
          mentioned_note = SystemNoteService.cross_reference(mentioned_issue, issue, issue.author)
149

150
          expect(Notify).not_to receive(:note_issue_email)
151 152 153 154 155
          notification.new_note(mentioned_note)
        end
      end
    end

156
    context 'commit note' do
D
Douwe Maan 已提交
157 158
      let(:project) { create(:project, :public) }
      let(:note) { create(:note_on_commit, project: project) }
159 160 161

      before do
        build_team(note.project)
V
Valery Sizov 已提交
162
        ActionMailer::Base.deliveries.clear
D
Douwe Maan 已提交
163
        allow_any_instance_of(Commit).to receive(:author).and_return(@u_committer)
164 165
      end

V
Valery Sizov 已提交
166
      describe :new_note, :perform_enqueued_jobs do
167 168
        it do
          notification.new_note(note)
V
Valery Sizov 已提交
169 170 171 172 173 174 175

          should_email(@u_committer)
          should_email(@u_watcher)
          should_not_email(@u_mentioned)
          should_not_email(note.author)
          should_not_email(@u_participating)
          should_not_email(@u_disabled)
176 177 178
        end

        it do
179 180
          note.update_attribute(:note, '@mention referenced')
          notification.new_note(note)
V
Valery Sizov 已提交
181 182 183 184 185 186 187

          should_email(@u_committer)
          should_email(@u_watcher)
          should_email(@u_mentioned)
          should_not_email(note.author)
          should_not_email(@u_participating)
          should_not_email(@u_disabled)
188 189
        end

190 191 192
        it do
          @u_committer.update_attributes(notification_level: Notification::N_MENTION)
          notification.new_note(note)
V
Valery Sizov 已提交
193
          should_not_email(@u_committer)
194
        end
195 196 197 198
      end
    end
  end

199
  describe 'Issues' do
D
Douwe Maan 已提交
200 201
    let(:project) { create(:empty_project, :public) }
    let(:issue) { create :issue, project: project, assignee: create(:user), description: 'cc @participant' }
202

203 204
    before do
      build_team(issue.project)
V
tests  
Valery Sizov 已提交
205
      add_users_with_subscription(issue.project, issue)
V
Valery Sizov 已提交
206
      ActionMailer::Base.deliveries.clear
207 208
    end

209
    describe :new_issue do
210 211
      it do
        notification.new_issue(issue, @u_disabled)
V
Valery Sizov 已提交
212 213 214 215 216 217 218

        should_email(issue.assignee)
        should_email(@u_watcher)
        should_email(@u_participant_mentioned)
        should_not_email(@u_mentioned)
        should_not_email(@u_participating)
        should_not_email(@u_disabled)
219 220
      end

221 222 223
      it do
        issue.assignee.update_attributes(notification_level: Notification::N_MENTION)
        notification.new_issue(issue, @u_disabled)
224

V
Valery Sizov 已提交
225
        should_not_email(issue.assignee)
226 227 228 229
      end
    end

    describe :reassigned_issue do
230 231 232
      it 'should email new assignee' do
        notification.reassigned_issue(issue, @u_disabled)

V
Valery Sizov 已提交
233 234 235 236 237 238 239
        should_email(issue.assignee)
        should_email(@u_watcher)
        should_email(@u_participant_mentioned)
        should_email(@subscriber)
        should_not_email(@unsubscriber)
        should_not_email(@u_participating)
        should_not_email(@u_disabled)
240 241 242 243 244
      end
    end

    describe :close_issue do
      it 'should sent email to issue assignee and issue author' do
245 246
        notification.close_issue(issue, @u_disabled)

V
Valery Sizov 已提交
247 248 249 250 251
        should_email(issue.assignee)
        should_email(issue.author)
        should_email(@u_watcher)
        should_email(@u_participant_mentioned)
        should_email(@subscriber)
252
        should_email(@watcher_and_subscriber)
V
Valery Sizov 已提交
253 254 255
        should_not_email(@unsubscriber)
        should_not_email(@u_participating)
        should_not_email(@u_disabled)
256 257
      end
    end
258 259 260 261 262

    describe :reopen_issue do
      it 'should send email to issue assignee and issue author' do
        notification.reopen_issue(issue, @u_disabled)

V
Valery Sizov 已提交
263 264 265 266 267
        should_email(issue.assignee)
        should_email(issue.author)
        should_email(@u_watcher)
        should_email(@u_participant_mentioned)
        should_email(@subscriber)
268
        should_email(@watcher_and_subscriber)
V
Valery Sizov 已提交
269 270
        should_not_email(@unsubscriber)
        should_not_email(@u_participating)
271 272
      end
    end
273
  end
274 275

  describe 'Merge Requests' do
D
Douwe Maan 已提交
276
    let(:project) { create(:project, :public) }
277
    let(:merge_request) { create :merge_request, source_project: project, assignee: create(:user), description: 'cc @participant' }
278

279
    before do
I
Izaak Alpert 已提交
280
      build_team(merge_request.target_project)
V
tests  
Valery Sizov 已提交
281
      add_users_with_subscription(merge_request.target_project, merge_request)
V
Valery Sizov 已提交
282
      ActionMailer::Base.deliveries.clear
283 284
    end

285
    describe :new_merge_request do
286 287 288
      it do
        notification.new_merge_request(merge_request, @u_disabled)

V
Valery Sizov 已提交
289 290
        should_email(merge_request.assignee)
        should_email(@u_watcher)
291
        should_email(@watcher_and_subscriber)
V
Valery Sizov 已提交
292 293 294
        should_email(@u_participant_mentioned)
        should_not_email(@u_participating)
        should_not_email(@u_disabled)
295 296
      end
    end
297 298 299 300 301

    describe :reassigned_merge_request do
      it do
        notification.reassigned_merge_request(merge_request, merge_request.author)

V
Valery Sizov 已提交
302 303 304 305
        should_email(merge_request.assignee)
        should_email(@u_watcher)
        should_email(@u_participant_mentioned)
        should_email(@subscriber)
306
        should_email(@watcher_and_subscriber)
V
Valery Sizov 已提交
307 308 309
        should_not_email(@unsubscriber)
        should_not_email(@u_participating)
        should_not_email(@u_disabled)
310 311 312 313 314
      end
    end

    describe :closed_merge_request do
      it do
315
        notification.close_mr(merge_request, @u_disabled)
316

V
Valery Sizov 已提交
317 318 319 320
        should_email(merge_request.assignee)
        should_email(@u_watcher)
        should_email(@u_participant_mentioned)
        should_email(@subscriber)
321
        should_email(@watcher_and_subscriber)
V
Valery Sizov 已提交
322 323 324
        should_not_email(@unsubscriber)
        should_not_email(@u_participating)
        should_not_email(@u_disabled)
325 326 327 328 329
      end
    end

    describe :merged_merge_request do
      it do
330
        notification.merge_mr(merge_request, @u_disabled)
331

V
Valery Sizov 已提交
332 333 334 335
        should_email(merge_request.assignee)
        should_email(@u_watcher)
        should_email(@u_participant_mentioned)
        should_email(@subscriber)
336
        should_email(@watcher_and_subscriber)
V
Valery Sizov 已提交
337 338 339
        should_not_email(@unsubscriber)
        should_not_email(@u_participating)
        should_not_email(@u_disabled)
340 341
      end
    end
342 343 344 345 346

    describe :reopen_merge_request do
      it do
        notification.reopen_mr(merge_request, @u_disabled)

V
Valery Sizov 已提交
347 348 349 350
        should_email(merge_request.assignee)
        should_email(@u_watcher)
        should_email(@u_participant_mentioned)
        should_email(@subscriber)
351
        should_email(@watcher_and_subscriber)
V
Valery Sizov 已提交
352 353 354
        should_not_email(@unsubscriber)
        should_not_email(@u_participating)
        should_not_email(@u_disabled)
355 356
      end
    end
357 358
  end

359 360 361 362 363
  describe 'Projects' do
    let(:project) { create :project }

    before do
      build_team(project)
V
Valery Sizov 已提交
364
      ActionMailer::Base.deliveries.clear
365 366 367 368
    end

    describe :project_was_moved do
      it do
369
        notification.project_was_moved(project, "gitlab/gitlab")
370

V
Valery Sizov 已提交
371 372 373
        should_email(@u_watcher)
        should_email(@u_participating)
        should_not_email(@u_disabled)
374 375 376 377
      end
    end
  end

378
  def build_team(project)
D
Dmitriy Zaporozhets 已提交
379 380
    @u_watcher = create(:user, notification_level: Notification::N_WATCH)
    @u_participating = create(:user, notification_level: Notification::N_PARTICIPATING)
381
    @u_participant_mentioned = create(:user, username: 'participant', notification_level: Notification::N_PARTICIPATING)
D
Dmitriy Zaporozhets 已提交
382
    @u_disabled = create(:user, notification_level: Notification::N_DISABLED)
383
    @u_mentioned = create(:user, username: 'mention', notification_level: Notification::N_MENTION)
384
    @u_committer = create(:user, username: 'committer')
385
    @u_not_mentioned = create(:user, username: 'regular', notification_level: Notification::N_PARTICIPATING)
386
    @u_outsider_mentioned = create(:user, username: 'outsider')
387 388 389

    project.team << [@u_watcher, :master]
    project.team << [@u_participating, :master]
390
    project.team << [@u_participant_mentioned, :master]
391
    project.team << [@u_disabled, :master]
392
    project.team << [@u_mentioned, :master]
393
    project.team << [@u_committer, :master]
394
    project.team << [@u_not_mentioned, :master]
395
  end
V
tests  
Valery Sizov 已提交
396 397 398 399

  def add_users_with_subscription(project, issuable)
    @subscriber = create :user
    @unsubscriber = create :user
400
    @subscribed_participant = create(:user, username: 'subscribed_participant', notification_level: Notification::N_PARTICIPATING)
401
    @watcher_and_subscriber = create(:user, notification_level: Notification::N_WATCH)
V
tests  
Valery Sizov 已提交
402

403
    project.team << [@subscribed_participant, :master]
V
tests  
Valery Sizov 已提交
404 405
    project.team << [@subscriber, :master]
    project.team << [@unsubscriber, :master]
406
    project.team << [@watcher_and_subscriber, :master]
V
tests  
Valery Sizov 已提交
407 408

    issuable.subscriptions.create(user: @subscriber, subscribed: true)
409
    issuable.subscriptions.create(user: @subscribed_participant, subscribed: true)
V
tests  
Valery Sizov 已提交
410
    issuable.subscriptions.create(user: @unsubscriber, subscribed: false)
411 412
    # Make the watcher a subscriber to detect dupes
    issuable.subscriptions.create(user: @watcher_and_subscriber, subscribed: true)
V
tests  
Valery Sizov 已提交
413
  end
V
Valery Sizov 已提交
414 415

  def sent_to_user?(user)
416
    ActionMailer::Base.deliveries.map(&:to).flatten.count(user.email) == 1
V
Valery Sizov 已提交
417 418 419 420 421 422 423 424 425
  end

  def should_email(user)
    expect(sent_to_user?(user)).to be_truthy
  end

  def should_not_email(user)
    expect(sent_to_user?(user)).to be_falsey
  end
426
end