notify_spec.rb 20.4 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
      should deliver_to recipient.notification_email
R
Robb Kidd 已提交
20 21 22
    end
  end

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

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

  shared_examples 'an answer to an existing thread' do |thread_id_prefix|
    it 'has a subject that begins with Re: ' do
      should have_subject /^Re: /
    end

    it 'has headers that reference an existing thread' do
      should have_header 'References',  /<#{thread_id_prefix}(.*)@#{Gitlab.config.gitlab.host}>/
      should have_header 'In-Reply-To', /<#{thread_id_prefix}(.*)@#{Gitlab.config.gitlab.host}>/
46
      should 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 61 62 63 64
    it 'is sent to the new user' do
      should deliver_to new_user.email
    end

    it 'has the correct subject' do
65
      should have_subject /^Account was created for you$/i
66 67 68 69 70 71
    end

    it 'contains the new user\'s login name' do
      should have_body_text /#{new_user.email}/
    end

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

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

    it 'includes a link to the site' do
84
      should 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 98 99 100 101
    it 'is sent to the new user' do
      should deliver_to new_user.email
    end

    it 'has the correct subject' do
102
      should have_subject /^Account was created for you$/i
M
Marin Jankovski 已提交
103 104 105 106 107 108 109
    end

    it 'contains the new user\'s login name' do
      should have_body_text /#{new_user.email}/
    end

    it 'should not contain the new user\'s password' do
D
Dmitriy Zaporozhets 已提交
110
      should_not have_body_text /password/
M
Marin Jankovski 已提交
111 112 113 114 115 116 117
    end

    it 'includes a link to the site' do
      should have_body_text /#{example_site_path}/
    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 126 127 128 129
    it 'is sent to the new user' do
      should deliver_to key.user.email
    end

    it 'has the correct subject' do
130
      should have_subject /^SSH key was added to your account$/i
131 132 133 134 135 136 137
    end

    it 'contains the new ssh key title' do
      should have_body_text /#{key.title}/
    end

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

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

    subject { Notify.new_email_email(email.id) }

    it 'is sent to the new user' do
      should deliver_to email.user.email
    end

    it 'has the correct subject' do
D
Dmitriy Zaporozhets 已提交
152
      should have_subject /^Email was added to your account$/i
153 154 155 156 157 158 159 160 161 162 163
    end

    it 'contains the new email address' do
      should have_body_text /#{email.email}/
    end

    it 'includes a link to emails page' do
      should have_body_text /#{profile_emails_path}/
    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 173 174 175 176
        it 'is sent as the author' do
          sender = subject.header[:from].addrs[0]
          sender.display_name.should eq(current_user.name)
          sender.address.should eq(gitlab_sender)
        end

R
Robb Kidd 已提交
177
        it 'is sent to the assignee' do
178
          should 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
            should 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
197
            should have_body_text /#{project_issue_path project, issue}/
R
Robb Kidd 已提交
198 199
          end
        end
200

201 202 203 204 205 206 207 208
        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
            should have_body_text /#{issue_with_description.description}/
          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 217 218 219 220
          it 'is sent as the author' do
            sender = subject.header[:from].addrs[0]
            sender.display_name.should eq(current_user.name)
            sender.address.should eq(gitlab_sender)
          end

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

          it 'contains the name of the previous assignee' do
226
            should have_body_text /#{previous_assignee.name}/
R
Robb Kidd 已提交
227 228 229 230 231 232 233
          end

          it 'contains the name of the new assignee' do
            should have_body_text /#{assignee.name}/
          end

          it 'contains a link to the issue' do
234
            should have_body_text /#{project_issue_path 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 246 247 248 249
          it 'is sent as the author' do
            sender = subject.header[:from].addrs[0]
            sender.display_name.should eq(current_user.name)
            sender.address.should eq(gitlab_sender)
          end

A
Alex Denisov 已提交
250
          it 'has the correct subject' do
251
            should have_subject /#{issue.title} \(##{issue.iid}\)/i
A
Alex Denisov 已提交
252 253 254 255 256 257 258 259 260 261 262 263 264 265 266
          end

          it 'contains the new status' do
            should have_body_text /#{status}/i
          end

          it 'contains the user name' do
            should have_body_text /#{current_user.name}/i
          end

          it 'contains a link to the issue' do
            should have_body_text /#{project_issue_path project, issue}/
          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
D
Dmitriy Zaporozhets 已提交
281
            should 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
285
            should have_body_text /#{project_merge_request_path(project, merge_request)}/
R
Robb Kidd 已提交
286 287 288 289 290 291 292 293 294
          end

          it 'contains the source branch for the merge request' do
            should have_body_text /#{merge_request.source_branch}/
          end

          it 'contains the target branch for the merge request' do
            should have_body_text /#{merge_request.target_branch}/
          end
P
Philip Blatter 已提交
295 296 297 298

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

301 302 303 304 305 306 307 308
        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
            should have_body_text /#{merge_request_with_description.description}/
          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 317 318 319 320
          it 'is sent as the author' do
            sender = subject.header[:from].addrs[0]
            sender.display_name.should eq(current_user.name)
            sender.address.should eq(gitlab_sender)
          end

R
Robb Kidd 已提交
321
          it 'has the correct subject' do
D
Dmitriy Zaporozhets 已提交
322
            should 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
            should have_body_text /#{previous_assignee.name}/
R
Robb Kidd 已提交
327 328 329 330 331 332 333
          end

          it 'contains the name of the new assignee' do
            should have_body_text /#{assignee.name}/
          end

          it 'contains a link to the merge request' do
334
            should have_body_text /#{project_merge_request_path project, merge_request}/
R
Robb Kidd 已提交
335
          end
336 337
        end

338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366
        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]
            sender.display_name.should eq(current_user.name)
            sender.address.should eq(gitlab_sender)
          end

          it 'has the correct subject' do
            should have_subject /#{merge_request.title} \(##{merge_request.iid}\)/i
          end

          it 'contains the new status' do
            should have_body_text /#{status}/i
          end

          it 'contains the user name' do
            should have_body_text /#{current_user.name}/i
          end

          it 'contains a link to the merge request' do
            should have_body_text /#{project_merge_request_path project, merge_request}/
          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 375 376 377 378 379

          it 'is sent as the merge author' do
            sender = subject.header[:from].addrs[0]
            sender.display_name.should eq(merge_author.name)
            sender.address.should eq(gitlab_sender)
          end

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

383 384 385 386 387 388 389
          it 'contains the new status' do
            should have_body_text /merged/i
          end

          it 'contains a link to the merge request' do
            should have_body_text /#{project_merge_request_path project, merge_request}/
          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
        should have_subject /Project was moved/
403 404 405 406 407 408 409 410 411 412 413
      end

      it 'contains name of project' do
        should have_body_text /#{project.name_with_namespace}/
      end

      it 'contains new user role' do
        should have_body_text /#{project.ssh_url_to_repo}/
      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
        should have_subject /Access to project was granted/
426 427 428 429 430
      end
      it 'contains name of project' do
        should have_body_text /#{project.name}/
      end
      it 'contains new user role' do
431
        should 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
D
Dmitriy Zaporozhets 已提交
440
        Note.stub(:find).with(note.id).and_return(note)
441 442
      end

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

R
Robb Kidd 已提交
450
        it 'is sent to the given recipient' do
451
          should deliver_to recipient.notification_email
R
Robb Kidd 已提交
452 453 454 455 456 457 458 459
        end

        it 'contains the message from the note' do
          should have_body_text /#{note.note}/
        end
      end

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

R
Riyad Preukschas 已提交
462
        before(:each) { note.stub(: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
          should have_subject /#{commit.title} \(#{commit.short_id}\)/
R
Robb Kidd 已提交
471 472 473
        end

        it 'contains a link to the commit' do
474
          should 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) }
480
        let(:note_on_merge_request_path) { project_merge_request_path(project, merge_request, anchor: "note_#{note.id}") }
R
Robb Kidd 已提交
481 482
        before(:each) { note.stub(:noteable).and_return(merge_request) }

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
D
Dmitriy Zaporozhets 已提交
489
          should 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
          should 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) }
499
        let(:note_on_issue_path) { project_issue_path(project, issue, anchor: "note_#{note.id}") }
R
Robb Kidd 已提交
500
        before(:each) { note.stub(: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
          should have_subject /#{issue.title} \(##{issue.iid}\)/
R
Robb Kidd 已提交
509 510 511
        end

        it 'contains a link to the issue note' do
512
          should 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
      should have_subject /Access to group was granted/
529 530 531 532 533 534 535 536 537 538
    end

    it 'contains name of project' do
      should have_body_text /#{group.name}/
    end

    it 'contains new user role' do
      should have_body_text /#{membership.human_access}/
    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 554 555 556 557 558 559 560 561 562 563 564
    it 'is sent to the new user' do
      should deliver_to 'new-email@mail.com'
    end

    it 'has the correct subject' do
      should have_subject "Confirmation instructions"
    end

    it 'includes a link to the site' do
      should have_body_text /#{example_site_path}/
    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 571
    let(:commits) { Commit.decorate(compare.commits) }
    let(:diff_path) { project_compare_path(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 577 578 579 580
    it 'is sent as the author' do
      sender = subject.header[:from].addrs[0]
      sender.display_name.should eq(user.name)
      sender.address.should eq(gitlab_sender)
    end

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

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

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

    it 'includes diffs' do
D
Dmitriy Zaporozhets 已提交
594
      should have_body_text /def archive_formats_regex/
D
Dmitriy Zaporozhets 已提交
595
    end
596 597 598 599

    it 'contains a link to the diff' do
      should have_body_text /#{diff_path}/
    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 607 608 609 610 611 612 613 614 615 616 617
    let(:commits) { Commit.decorate(compare.commits) }
    let(:diff_path) { project_commit_path(project, commits.first) }

    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]
      sender.display_name.should eq(user.name)
      sender.address.should eq(gitlab_sender)
    end

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

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

    it 'includes commits list' do
D
Dmitriy Zaporozhets 已提交
626
      should have_body_text /Change some files/
627 628 629
    end

    it 'includes diffs' do
D
Dmitriy Zaporozhets 已提交
630
      should have_body_text /def archive_formats_regex/
631 632 633 634 635 636
    end

    it 'contains a link to the diff' do
      should have_body_text /#{diff_path}/
    end
  end
637
end