notify_spec.rb 21.5 KB
Newer Older
1 2 3 4 5
require 'spec_helper'

describe Notify do
  include EmailSpec::Helpers
  include EmailSpec::Matchers
D
Dmitriy Zaporozhets 已提交
6
  include RepoHelpers
7

8
  let(:gitlab_sender) { Gitlab.config.gitlab.email_from }
9
  let(:recipient) { create(:user, email: 'recipient@example.com') }
D
Dmitriy Zaporozhets 已提交
10
  let(:project) { create(:project) }
11

12 13 14 15 16
  before(:each) do
    email = recipient.emails.create(email: "notifications@example.com")
    recipient.update_attribute(:notification_email, email.email)
  end

R
Robb Kidd 已提交
17 18
  shared_examples 'a multiple recipients email' do
    it 'is sent to the given recipient' do
19
      is_expected.to deliver_to recipient.notification_email
R
Robb Kidd 已提交
20 21 22
    end
  end

23 24 25
  shared_examples 'an email sent from GitLab' do
    it 'is sent from GitLab' do
      sender = subject.header[:from].addrs[0]
26 27
      expect(sender.display_name).to eq('GitLab')
      expect(sender.address).to eq(gitlab_sender)
28 29 30
    end
  end

31 32
  shared_examples 'an email starting a new thread' do |message_id_prefix|
    it 'has a discussion identifier' do
33 34
      is_expected.to have_header 'Message-ID',  /<#{message_id_prefix}(.*)@#{Gitlab.config.gitlab.host}>/
      is_expected.to have_header 'X-GitLab-Project', /#{project.name}/
35 36 37 38 39
    end
  end

  shared_examples 'an answer to an existing thread' do |thread_id_prefix|
    it 'has a subject that begins with Re: ' do
40
      is_expected.to have_subject /^Re: /
41 42 43
    end

    it 'has headers that reference an existing thread' do
44 45 46
      is_expected.to have_header 'References',  /<#{thread_id_prefix}(.*)@#{Gitlab.config.gitlab.host}>/
      is_expected.to have_header 'In-Reply-To', /<#{thread_id_prefix}(.*)@#{Gitlab.config.gitlab.host}>/
      is_expected.to have_header 'X-GitLab-Project', /#{project.name}/
47 48 49
    end
  end

R
Robb Kidd 已提交
50
  describe 'for new users, the email' do
51
    let(:example_site_path) { root_path }
D
Dmitriy Zaporozhets 已提交
52
    let(:new_user) { create(:user, email: 'newguy@example.com', created_by_id: 1) }
53

54 55
    token = 'kETLwRaayvigPq_x3SNM'

56
    subject { Notify.new_user_email(new_user.id, token) }
57

58 59
    it_behaves_like 'an email sent from GitLab'

60
    it 'is sent to the new user' do
61
      is_expected.to deliver_to new_user.email
62 63 64
    end

    it 'has the correct subject' do
65
      is_expected.to have_subject /^Account was created for you$/i
66 67 68
    end

    it 'contains the new user\'s login name' do
69
      is_expected.to have_body_text /#{new_user.email}/
70 71
    end

M
Marin Jankovski 已提交
72
    it 'contains the password text' do
73
      is_expected.to have_body_text /Click here to set your password/
M
Marin Jankovski 已提交
74 75 76
    end

    it 'includes a link for user to set password' do
77
      params = "reset_password_token=#{token}"
78
      is_expected.to have_body_text(
79 80
        %r{http://localhost(:\d+)?/users/password/edit\?#{params}}
      )
81 82 83
    end

    it 'includes a link to the site' do
84
      is_expected.to have_body_text /#{example_site_path}/
85 86 87
    end
  end

M
Marin Jankovski 已提交
88 89 90 91 92

  describe 'for users that signed up, the email' do
    let(:example_site_path) { root_path }
    let(:new_user) { create(:user, email: 'newguy@example.com', password: "securePassword") }

93
    subject { Notify.new_user_email(new_user.id) }
M
Marin Jankovski 已提交
94

95 96
    it_behaves_like 'an email sent from GitLab'

M
Marin Jankovski 已提交
97
    it 'is sent to the new user' do
98
      is_expected.to deliver_to new_user.email
M
Marin Jankovski 已提交
99 100 101
    end

    it 'has the correct subject' do
102
      is_expected.to have_subject /^Account was created for you$/i
M
Marin Jankovski 已提交
103 104 105
    end

    it 'contains the new user\'s login name' do
106
      is_expected.to have_body_text /#{new_user.email}/
M
Marin Jankovski 已提交
107 108 109
    end

    it 'should not contain the new user\'s password' do
110
      is_expected.not_to have_body_text /password/
M
Marin Jankovski 已提交
111 112 113
    end

    it 'includes a link to the site' do
114
      is_expected.to have_body_text /#{example_site_path}/
M
Marin Jankovski 已提交
115 116 117
    end
  end

118 119 120 121 122
  describe 'user added ssh key' do
    let(:key) { create(:personal_key) }

    subject { Notify.new_ssh_key_email(key.id) }

123 124
    it_behaves_like 'an email sent from GitLab'

125
    it 'is sent to the new user' do
126
      is_expected.to deliver_to key.user.email
127 128 129
    end

    it 'has the correct subject' do
130
      is_expected.to have_subject /^SSH key was added to your account$/i
131 132 133
    end

    it 'contains the new ssh key title' do
134
      is_expected.to have_body_text /#{key.title}/
135 136 137
    end

    it 'includes a link to ssh keys page' do
138
      is_expected.to have_body_text /#{profile_keys_path}/
139 140 141
    end
  end

142 143 144 145 146 147
  describe 'user added email' do
    let(:email) { create(:email) }

    subject { Notify.new_email_email(email.id) }

    it 'is sent to the new user' do
148
      is_expected.to deliver_to email.user.email
149 150 151
    end

    it 'has the correct subject' do
152
      is_expected.to have_subject /^Email was added to your account$/i
153 154 155
    end

    it 'contains the new email address' do
156
      is_expected.to have_body_text /#{email.email}/
157 158 159
    end

    it 'includes a link to emails page' do
160
      is_expected.to have_body_text /#{profile_emails_path}/
161 162 163
    end
  end

R
Robb Kidd 已提交
164 165
  context 'for a project' do
    describe 'items that are assignable, the email' do
166
      let(:current_user) { create(:user, email: "current@email.com") }
167 168
      let(:assignee) { create(:user, email: 'assignee@example.com') }
      let(:previous_assignee) { create(:user, name: 'Previous Assignee') }
169

R
Robb Kidd 已提交
170
      shared_examples 'an assignee email' do
171 172
        it 'is sent as the author' do
          sender = subject.header[:from].addrs[0]
173 174
          expect(sender.display_name).to eq(current_user.name)
          expect(sender.address).to eq(gitlab_sender)
175 176
        end

R
Robb Kidd 已提交
177
        it 'is sent to the assignee' do
178
          is_expected.to deliver_to assignee.email
R
Robb Kidd 已提交
179 180
        end
      end
181

R
Robb Kidd 已提交
182
      context 'for issues' do
183 184
        let(:issue) { create(:issue, author: current_user, assignee: assignee, project: project) }
        let(:issue_with_description) { create(:issue, author: current_user, assignee: assignee, project: project, description: Faker::Lorem.sentence) }
185

R
Robb Kidd 已提交
186
        describe 'that are new' do
187
          subject { Notify.new_issue_email(issue.assignee_id, issue.id) }
188

R
Robb Kidd 已提交
189
          it_behaves_like 'an assignee email'
190
          it_behaves_like 'an email starting a new thread', 'issue'
191

R
Robb Kidd 已提交
192
          it 'has the correct subject' do
193
            is_expected.to have_subject /#{project.name} \| #{issue.title} \(##{issue.iid}\)/
R
Robb Kidd 已提交
194
          end
195

R
Robb Kidd 已提交
196
          it 'contains a link to the new issue' do
V
Vinnie Okada 已提交
197
            is_expected.to have_body_text /#{namespace_project_issue_path project.namespace, project, issue}/
R
Robb Kidd 已提交
198 199
          end
        end
200

201 202 203 204
        describe 'that are new with a description' do
          subject { Notify.new_issue_email(issue_with_description.assignee_id, issue_with_description.id) }

          it 'contains the description' do
205
            is_expected.to have_body_text /#{issue_with_description.description}/
206 207 208
          end
        end

R
Robb Kidd 已提交
209
        describe 'that have been reassigned' do
210
          subject { Notify.reassigned_issue_email(recipient.id, issue.id, previous_assignee.id, current_user) }
R
Robb Kidd 已提交
211 212

          it_behaves_like 'a multiple recipients email'
213
          it_behaves_like 'an answer to an existing thread', 'issue'
R
Robb Kidd 已提交
214

215 216
          it 'is sent as the author' do
            sender = subject.header[:from].addrs[0]
217 218
            expect(sender.display_name).to eq(current_user.name)
            expect(sender.address).to eq(gitlab_sender)
219 220
          end

R
Robb Kidd 已提交
221
          it 'has the correct subject' do
222
            is_expected.to have_subject /#{issue.title} \(##{issue.iid}\)/
R
Robb Kidd 已提交
223 224 225
          end

          it 'contains the name of the previous assignee' do
226
            is_expected.to have_body_text /#{previous_assignee.name}/
R
Robb Kidd 已提交
227 228 229
          end

          it 'contains the name of the new assignee' do
230
            is_expected.to have_body_text /#{assignee.name}/
R
Robb Kidd 已提交
231 232 233
          end

          it 'contains a link to the issue' do
V
Vinnie Okada 已提交
234
            is_expected.to have_body_text /#{namespace_project_issue_path project.namespace, project, issue}/
R
Robb Kidd 已提交
235 236
          end
        end
A
Alex Denisov 已提交
237 238 239 240

        describe 'status changed' do
          let(:status) { 'closed' }
          subject { Notify.issue_status_changed_email(recipient.id, issue.id, status, current_user) }
241

242 243
          it_behaves_like 'an answer to an existing thread', 'issue'

244 245
          it 'is sent as the author' do
            sender = subject.header[:from].addrs[0]
246 247
            expect(sender.display_name).to eq(current_user.name)
            expect(sender.address).to eq(gitlab_sender)
248 249
          end

A
Alex Denisov 已提交
250
          it 'has the correct subject' do
251
            is_expected.to have_subject /#{issue.title} \(##{issue.iid}\)/i
A
Alex Denisov 已提交
252 253 254
          end

          it 'contains the new status' do
255
            is_expected.to have_body_text /#{status}/i
A
Alex Denisov 已提交
256 257 258
          end

          it 'contains the user name' do
259
            is_expected.to have_body_text /#{current_user.name}/i
A
Alex Denisov 已提交
260 261 262
          end

          it 'contains a link to the issue' do
V
Vinnie Okada 已提交
263
            is_expected.to have_body_text /#{namespace_project_issue_path project.namespace, project, issue}/
A
Alex Denisov 已提交
264 265 266
          end
        end

R
Robb Kidd 已提交
267 268 269
      end

      context 'for merge requests' do
270
        let(:merge_author) { create(:user) }
271
        let(:merge_request) { create(:merge_request, author: current_user, assignee: assignee, source_project: project, target_project: project) }
272
        let(:merge_request_with_description) { create(:merge_request, author: current_user, assignee: assignee, source_project: project, target_project: project, description: Faker::Lorem.sentence) }
R
Robb Kidd 已提交
273 274

        describe 'that are new' do
275
          subject { Notify.new_merge_request_email(merge_request.assignee_id, merge_request.id) }
R
Robb Kidd 已提交
276 277

          it_behaves_like 'an assignee email'
278
          it_behaves_like 'an email starting a new thread', 'merge_request'
R
Robb Kidd 已提交
279 280

          it 'has the correct subject' do
281
            is_expected.to have_subject /#{merge_request.title} \(##{merge_request.iid}\)/
R
Robb Kidd 已提交
282 283 284
          end

          it 'contains a link to the new merge request' do
V
Vinnie Okada 已提交
285
            is_expected.to have_body_text /#{namespace_project_merge_request_path(project.namespace, project, merge_request)}/
R
Robb Kidd 已提交
286 287 288
          end

          it 'contains the source branch for the merge request' do
289
            is_expected.to have_body_text /#{merge_request.source_branch}/
R
Robb Kidd 已提交
290 291 292
          end

          it 'contains the target branch for the merge request' do
293
            is_expected.to have_body_text /#{merge_request.target_branch}/
R
Robb Kidd 已提交
294
          end
P
Philip Blatter 已提交
295 296

          it 'has the correct message-id set' do
297
            is_expected.to have_header 'Message-ID', "<merge_request_#{merge_request.id}@#{Gitlab.config.gitlab.host}>"
P
Philip Blatter 已提交
298
          end
R
Robb Kidd 已提交
299 300
        end

301 302 303 304
        describe 'that are new with a description' do
          subject { Notify.new_merge_request_email(merge_request_with_description.assignee_id, merge_request_with_description.id) }

          it 'contains the description' do
305
            is_expected.to have_body_text /#{merge_request_with_description.description}/
306 307 308
          end
        end

R
Robb Kidd 已提交
309
        describe 'that are reassigned' do
310
          subject { Notify.reassigned_merge_request_email(recipient.id, merge_request.id, previous_assignee.id, current_user.id) }
R
Robb Kidd 已提交
311 312

          it_behaves_like 'a multiple recipients email'
313
          it_behaves_like 'an answer to an existing thread', 'merge_request'
R
Robb Kidd 已提交
314

315 316
          it 'is sent as the author' do
            sender = subject.header[:from].addrs[0]
317 318
            expect(sender.display_name).to eq(current_user.name)
            expect(sender.address).to eq(gitlab_sender)
319 320
          end

R
Robb Kidd 已提交
321
          it 'has the correct subject' do
322
            is_expected.to have_subject /#{merge_request.title} \(##{merge_request.iid}\)/
R
Robb Kidd 已提交
323 324 325
          end

          it 'contains the name of the previous assignee' do
326
            is_expected.to have_body_text /#{previous_assignee.name}/
R
Robb Kidd 已提交
327 328 329
          end

          it 'contains the name of the new assignee' do
330
            is_expected.to have_body_text /#{assignee.name}/
R
Robb Kidd 已提交
331 332 333
          end

          it 'contains a link to the merge request' do
V
Vinnie Okada 已提交
334
            is_expected.to have_body_text /#{namespace_project_merge_request_path project.namespace, project, merge_request}/
R
Robb Kidd 已提交
335
          end
336 337
        end

338 339 340 341 342 343 344 345
        describe 'status changed' do
          let(:status) { 'reopened' }
          subject { Notify.merge_request_status_email(recipient.id, merge_request.id, status, current_user) }

          it_behaves_like 'an answer to an existing thread', 'merge_request'

          it 'is sent as the author' do
            sender = subject.header[:from].addrs[0]
346 347
            expect(sender.display_name).to eq(current_user.name)
            expect(sender.address).to eq(gitlab_sender)
348 349 350
          end

          it 'has the correct subject' do
351
            is_expected.to have_subject /#{merge_request.title} \(##{merge_request.iid}\)/i
352 353 354
          end

          it 'contains the new status' do
355
            is_expected.to have_body_text /#{status}/i
356 357 358
          end

          it 'contains the user name' do
359
            is_expected.to have_body_text /#{current_user.name}/i
360 361 362
          end

          it 'contains a link to the merge request' do
V
Vinnie Okada 已提交
363
            is_expected.to have_body_text /#{namespace_project_merge_request_path project.namespace, project, merge_request}/
364 365 366
          end
        end

367 368 369 370
        describe 'that are merged' do
          subject { Notify.merged_merge_request_email(recipient.id, merge_request.id, merge_author.id) }

          it_behaves_like 'a multiple recipients email'
371
          it_behaves_like 'an answer to an existing thread', 'merge_request'
372 373 374

          it 'is sent as the merge author' do
            sender = subject.header[:from].addrs[0]
375 376
            expect(sender.display_name).to eq(merge_author.name)
            expect(sender.address).to eq(gitlab_sender)
377 378 379
          end

          it 'has the correct subject' do
380
            is_expected.to have_subject /#{merge_request.title} \(##{merge_request.iid}\)/
381
          end
R
Robb Kidd 已提交
382

383
          it 'contains the new status' do
384
            is_expected.to have_body_text /merged/i
385 386 387
          end

          it 'contains a link to the merge request' do
V
Vinnie Okada 已提交
388
            is_expected.to have_body_text /#{namespace_project_merge_request_path project.namespace, project, merge_request}/
389
          end
R
Robb Kidd 已提交
390 391
        end
      end
392 393
    end

394 395 396 397 398
    describe 'project was moved' do
      let(:project) { create(:project) }
      let(:user) { create(:user) }
      subject { Notify.project_was_moved_email(project.id, user.id) }

399 400
      it_behaves_like 'an email sent from GitLab'

401
      it 'has the correct subject' do
402
        is_expected.to have_subject /Project was moved/
403 404 405
      end

      it 'contains name of project' do
406
        is_expected.to have_body_text /#{project.name_with_namespace}/
407 408 409
      end

      it 'contains new user role' do
410
        is_expected.to have_body_text /#{project.ssh_url_to_repo}/
411 412 413
      end
    end

414
    describe 'project access changed' do
415
      let(:project) { create(:project) }
416
      let(:user) { create(:user) }
417
      let(:project_member) { create(:project_member,
418 419
                                   project: project,
                                   user: user) }
420
      subject { Notify.project_access_granted_email(project_member.id) }
421 422 423

      it_behaves_like 'an email sent from GitLab'

424
      it 'has the correct subject' do
425
        is_expected.to have_subject /Access to project was granted/
426 427
      end
      it 'contains name of project' do
428
        is_expected.to have_body_text /#{project.name}/
429 430
      end
      it 'contains new user role' do
431
        is_expected.to have_body_text /#{project_member.human_access}/
432 433 434
      end
    end

R
Robb Kidd 已提交
435
    context 'items that are noteable, the email for a note' do
436 437
      let(:note_author) { create(:user, name: 'author_name') }
      let(:note) { create(:note, project: project, author: note_author) }
R
Robb Kidd 已提交
438

439
      before :each do
440
        allow(Note).to receive(:find).with(note.id).and_return(note)
441 442
      end

R
Robb Kidd 已提交
443
      shared_examples 'a note email' do
444 445
        it 'is sent as the author' do
          sender = subject.header[:from].addrs[0]
446 447
          expect(sender.display_name).to eq(note_author.name)
          expect(sender.address).to eq(gitlab_sender)
448 449
        end

R
Robb Kidd 已提交
450
        it 'is sent to the given recipient' do
451
          is_expected.to deliver_to recipient.notification_email
R
Robb Kidd 已提交
452 453 454
        end

        it 'contains the message from the note' do
455
          is_expected.to have_body_text /#{note.note}/
R
Robb Kidd 已提交
456 457 458 459
        end
      end

      describe 'on a commit' do
460
        let(:commit) { project.repository.commit }
D
Dmitriy Zaporozhets 已提交
461

462
        before(:each) { allow(note).to receive(:noteable).and_return(commit) }
R
Robb Kidd 已提交
463

D
Dmitriy Zaporozhets 已提交
464
        subject { Notify.note_commit_email(recipient.id, note.id) }
R
Robb Kidd 已提交
465 466

        it_behaves_like 'a note email'
467
        it_behaves_like 'an answer to an existing thread', 'commits'
R
Robb Kidd 已提交
468 469

        it 'has the correct subject' do
470
          is_expected.to have_subject /#{commit.title} \(#{commit.short_id}\)/
R
Robb Kidd 已提交
471 472 473
        end

        it 'contains a link to the commit' do
474
          is_expected.to have_body_text commit.short_id
R
Robb Kidd 已提交
475 476 477 478
        end
      end

      describe 'on a merge request' do
I
Izaak Alpert 已提交
479
        let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
V
Vinnie Okada 已提交
480
        let(:note_on_merge_request_path) { namespace_project_merge_request_path(project.namespace, project, merge_request, anchor: "note_#{note.id}") }
481
        before(:each) { allow(note).to receive(:noteable).and_return(merge_request) }
R
Robb Kidd 已提交
482

483
        subject { Notify.note_merge_request_email(recipient.id, note.id) }
R
Robb Kidd 已提交
484 485

        it_behaves_like 'a note email'
486
        it_behaves_like 'an answer to an existing thread', 'merge_request'
R
Robb Kidd 已提交
487 488

        it 'has the correct subject' do
489
          is_expected.to have_subject /#{merge_request.title} \(##{merge_request.iid}\)/
R
Robb Kidd 已提交
490 491 492
        end

        it 'contains a link to the merge request note' do
493
          is_expected.to have_body_text /#{note_on_merge_request_path}/
R
Robb Kidd 已提交
494 495 496 497
        end
      end

      describe 'on an issue' do
498
        let(:issue) { create(:issue, project: project) }
V
Vinnie Okada 已提交
499
        let(:note_on_issue_path) { namespace_project_issue_path(project.namespace, project, issue, anchor: "note_#{note.id}") }
500
        before(:each) { allow(note).to receive(:noteable).and_return(issue) }
501 502

        subject { Notify.note_issue_email(recipient.id, note.id) }
R
Robb Kidd 已提交
503 504

        it_behaves_like 'a note email'
505
        it_behaves_like 'an answer to an existing thread', 'issue'
R
Robb Kidd 已提交
506 507

        it 'has the correct subject' do
508
          is_expected.to have_subject /#{issue.title} \(##{issue.iid}\)/
R
Robb Kidd 已提交
509 510 511
        end

        it 'contains a link to the issue note' do
512
          is_expected.to have_body_text /#{note_on_issue_path}/
R
Robb Kidd 已提交
513 514
        end
      end
515 516
    end
  end
517 518 519 520

  describe 'group access changed' do
    let(:group) { create(:group) }
    let(:user) { create(:user) }
521
    let(:membership) { create(:group_member, group: group, user: user) }
522 523 524

    subject { Notify.group_access_granted_email(membership.id) }

525 526
    it_behaves_like 'an email sent from GitLab'

527
    it 'has the correct subject' do
528
      is_expected.to have_subject /Access to group was granted/
529 530 531
    end

    it 'contains name of project' do
532
      is_expected.to have_body_text /#{group.name}/
533 534 535
    end

    it 'contains new user role' do
536
      is_expected.to have_body_text /#{membership.human_access}/
537 538
    end
  end
539 540 541 542 543 544 545 546 547 548 549 550

  describe 'confirmation if email changed' do
    let(:example_site_path) { root_path }
    let(:user) { create(:user, email: 'old-email@mail.com') }

    before do
      user.email = "new-email@mail.com"
      user.save
    end

    subject { ActionMailer::Base.deliveries.last }

551 552
    it_behaves_like 'an email sent from GitLab'

553
    it 'is sent to the new user' do
554
      is_expected.to deliver_to 'new-email@mail.com'
555 556 557
    end

    it 'has the correct subject' do
558
      is_expected.to have_subject "Confirmation instructions"
559 560 561
    end

    it 'includes a link to the site' do
562
      is_expected.to have_body_text /#{example_site_path}/
563 564
    end
  end
D
Dmitriy Zaporozhets 已提交
565

566
  describe 'email on push with multiple commits' do
D
Dmitriy Zaporozhets 已提交
567 568
    let(:example_site_path) { root_path }
    let(:user) { create(:user) }
D
Dmitriy Zaporozhets 已提交
569
    let(:compare) { Gitlab::Git::Compare.new(project.repository.raw_repository, sample_image_commit.id, sample_commit.id) }
570
    let(:commits) { Commit.decorate(compare.commits) }
V
Vinnie Okada 已提交
571
    let(:diff_path) { namespace_project_compare_path(project.namespace, project, from: commits.first, to: commits.last) }
D
Dmitriy Zaporozhets 已提交
572 573 574

    subject { Notify.repository_push_email(project.id, 'devs@company.name', user.id, 'master', compare) }

575 576
    it 'is sent as the author' do
      sender = subject.header[:from].addrs[0]
577 578
      expect(sender.display_name).to eq(user.name)
      expect(sender.address).to eq(gitlab_sender)
579 580
    end

D
Dmitriy Zaporozhets 已提交
581
    it 'is sent to recipient' do
582
      is_expected.to deliver_to 'devs@company.name'
D
Dmitriy Zaporozhets 已提交
583 584 585
    end

    it 'has the correct subject' do
586
      is_expected.to have_subject /#{commits.length} new commits pushed to repository/
D
Dmitriy Zaporozhets 已提交
587 588 589
    end

    it 'includes commits list' do
590
      is_expected.to have_body_text /Change some files/
D
Dmitriy Zaporozhets 已提交
591 592 593
    end

    it 'includes diffs' do
594
      is_expected.to have_body_text /def archive_formats_regex/
D
Dmitriy Zaporozhets 已提交
595
    end
596 597

    it 'contains a link to the diff' do
598
      is_expected.to have_body_text /#{diff_path}/
599
    end
D
Dmitriy Zaporozhets 已提交
600
  end
601 602 603 604

  describe 'email on push with a single commit' do
    let(:example_site_path) { root_path }
    let(:user) { create(:user) }
D
Dmitriy Zaporozhets 已提交
605
    let(:compare) { Gitlab::Git::Compare.new(project.repository.raw_repository, sample_commit.parent_id, sample_commit.id) }
606
    let(:commits) { Commit.decorate(compare.commits) }
V
Vinnie Okada 已提交
607
    let(:diff_path) { namespace_project_commit_path(project.namespace, project, commits.first) }
608 609 610 611 612

    subject { Notify.repository_push_email(project.id, 'devs@company.name', user.id, 'master', compare) }

    it 'is sent as the author' do
      sender = subject.header[:from].addrs[0]
613 614
      expect(sender.display_name).to eq(user.name)
      expect(sender.address).to eq(gitlab_sender)
615 616 617
    end

    it 'is sent to recipient' do
618
      is_expected.to deliver_to 'devs@company.name'
619 620 621
    end

    it 'has the correct subject' do
622
      is_expected.to have_subject /#{commits.first.title}/
623 624 625
    end

    it 'includes commits list' do
626
      is_expected.to have_body_text /Change some files/
627 628 629
    end

    it 'includes diffs' do
630
      is_expected.to have_body_text /def archive_formats_regex/
631 632 633
    end

    it 'contains a link to the diff' do
634
      is_expected.to have_body_text /#{diff_path}/
635 636
    end
  end
637
end