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

describe Notify do
  include EmailSpec::Helpers
  include EmailSpec::Matchers

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

R
Robb Kidd 已提交
11 12
  shared_examples 'a multiple recipients email' do
    it 'is sent to the given recipient' do
13
      should deliver_to recipient.email
R
Robb Kidd 已提交
14 15 16
    end
  end

17 18 19 20 21 22 23 24
  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

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

29
    subject { Notify.new_user_email(new_user.id, new_user.password) }
30

31 32
    it_behaves_like 'an email sent from GitLab'

33 34 35 36 37
    it 'is sent to the new user' do
      should deliver_to new_user.email
    end

    it 'has the correct subject' do
38
      should have_subject /^Account was created for you$/i
39 40 41 42 43 44 45
    end

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

    it 'contains the new user\'s password' do
D
Dmitriy Zaporozhets 已提交
46
      should have_body_text /password/
47 48 49
    end

    it 'includes a link to the site' do
50
      should have_body_text /#{example_site_path}/
51 52 53
    end
  end

M
Marin Jankovski 已提交
54 55 56 57 58 59 60

  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") }

    subject { Notify.new_user_email(new_user.id, new_user.password) }

61 62
    it_behaves_like 'an email sent from GitLab'

M
Marin Jankovski 已提交
63 64 65 66 67
    it 'is sent to the new user' do
      should deliver_to new_user.email
    end

    it 'has the correct subject' do
68
      should have_subject /^Account was created for you$/i
M
Marin Jankovski 已提交
69 70 71 72 73 74 75
    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 已提交
76
      should_not have_body_text /password/
M
Marin Jankovski 已提交
77 78 79 80 81 82 83
    end

    it 'includes a link to the site' do
      should have_body_text /#{example_site_path}/
    end
  end

84 85 86 87 88
  describe 'user added ssh key' do
    let(:key) { create(:personal_key) }

    subject { Notify.new_ssh_key_email(key.id) }

89 90
    it_behaves_like 'an email sent from GitLab'

91 92 93 94 95
    it 'is sent to the new user' do
      should deliver_to key.user.email
    end

    it 'has the correct subject' do
96
      should have_subject /^SSH key was added to your account$/i
97 98 99 100 101 102 103
    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
104
      should have_body_text /#{profile_keys_path}/
105 106 107
    end
  end

108 109 110 111 112 113 114 115 116 117
  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 已提交
118
      should have_subject /^Email was added to your account$/i
119 120 121 122 123 124 125 126 127 128 129
    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 已提交
130 131
  context 'for a project' do
    describe 'items that are assignable, the email' do
132
      let(:current_user) { create(:user, email: "current@email.com") }
133 134
      let(:assignee) { create(:user, email: 'assignee@example.com') }
      let(:previous_assignee) { create(:user, name: 'Previous Assignee') }
135

R
Robb Kidd 已提交
136
      shared_examples 'an assignee email' do
137 138 139 140 141 142
        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 已提交
143
        it 'is sent to the assignee' do
144
          should deliver_to assignee.email
R
Robb Kidd 已提交
145 146
        end
      end
147

R
Robb Kidd 已提交
148
      context 'for issues' do
149 150
        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) }
151

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

R
Robb Kidd 已提交
155
          it_behaves_like 'an assignee email'
156

R
Robb Kidd 已提交
157
          it 'has the correct subject' do
158
            should have_subject /#{project.name} \| #{issue.title} \(##{issue.iid}\)/
R
Robb Kidd 已提交
159
          end
160

R
Robb Kidd 已提交
161
          it 'contains a link to the new issue' do
162
            should have_body_text /#{project_issue_path project, issue}/
R
Robb Kidd 已提交
163
          end
164 165 166 167

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

170 171 172 173 174 175 176 177
        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 已提交
178
        describe 'that have been reassigned' do
179
          subject { Notify.reassigned_issue_email(recipient.id, issue.id, previous_assignee.id, current_user) }
R
Robb Kidd 已提交
180 181 182

          it_behaves_like 'a multiple recipients email'

183 184 185 186 187 188
          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 已提交
189
          it 'has the correct subject' do
190
            should have_subject /#{issue.title} \(##{issue.iid}\)/
R
Robb Kidd 已提交
191 192 193
          end

          it 'contains the name of the previous assignee' do
194
            should have_body_text /#{previous_assignee.name}/
R
Robb Kidd 已提交
195 196 197 198 199 200 201
          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
202
            should have_body_text /#{project_issue_path project, issue}/
R
Robb Kidd 已提交
203
          end
204 205 206 207

          it 'has the correct reference set' do
            should have_header 'References', "<issue_#{issue.id}@#{Gitlab.config.gitlab.host}>"
          end
R
Robb Kidd 已提交
208
        end
A
Alex Denisov 已提交
209 210 211 212

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

214 215 216 217 218 219
          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 已提交
220
          it 'has the correct subject' do
221
            should have_subject /#{issue.title} \(##{issue.iid}\)/i
A
Alex Denisov 已提交
222 223 224 225 226 227 228 229 230 231 232 233 234
          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
235 236 237 238

          it 'has the correct reference set' do
            should have_header 'References', "<issue_#{issue.id}@#{Gitlab.config.gitlab.host}>"
          end
A
Alex Denisov 已提交
239 240
        end

R
Robb Kidd 已提交
241 242 243
      end

      context 'for merge requests' do
244
        let(:merge_author) { create(:user) }
245
        let(:merge_request) { create(:merge_request, author: current_user, assignee: assignee, source_project: project, target_project: project) }
246
        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 已提交
247 248

        describe 'that are new' do
249
          subject { Notify.new_merge_request_email(merge_request.assignee_id, merge_request.id) }
R
Robb Kidd 已提交
250 251 252 253

          it_behaves_like 'an assignee email'

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

          it 'contains a link to the new merge request' do
258
            should have_body_text /#{project_merge_request_path(project, merge_request)}/
R
Robb Kidd 已提交
259 260 261 262 263 264 265 266 267
          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 已提交
268 269 270 271

          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 已提交
272 273
        end

274 275 276 277 278 279 280 281
        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 已提交
282
        describe 'that are reassigned' do
283
          subject { Notify.reassigned_merge_request_email(recipient.id, merge_request.id, previous_assignee.id, current_user.id) }
R
Robb Kidd 已提交
284 285 286

          it_behaves_like 'a multiple recipients email'

287 288 289 290 291 292
          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 已提交
293
          it 'has the correct subject' do
D
Dmitriy Zaporozhets 已提交
294
            should have_subject /#{merge_request.title} \(##{merge_request.iid}\)/
R
Robb Kidd 已提交
295 296 297
          end

          it 'contains the name of the previous assignee' do
298
            should have_body_text /#{previous_assignee.name}/
R
Robb Kidd 已提交
299 300 301 302 303 304 305
          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
306
            should have_body_text /#{project_merge_request_path project, merge_request}/
R
Robb Kidd 已提交
307
          end
308 309 310 311 312 313 314 315 316 317 318 319 320 321
        end

        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'

          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 已提交
322
            should have_subject /#{merge_request.title} \(##{merge_request.iid}\)/
323
          end
R
Robb Kidd 已提交
324

325 326 327 328 329 330 331
          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
332 333 334 335

          it 'has the correct reference set' do
            should have_header 'References', "<merge_request_#{merge_request.id}@#{Gitlab.config.gitlab.host}>"
          end
R
Robb Kidd 已提交
336 337
        end
      end
338 339
    end

340 341 342 343 344
    describe 'project was moved' do
      let(:project) { create(:project) }
      let(:user) { create(:user) }
      subject { Notify.project_was_moved_email(project.id, user.id) }

345 346
      it_behaves_like 'an email sent from GitLab'

347
      it 'has the correct subject' do
348
        should have_subject /Project was moved/
349 350 351 352 353 354 355 356 357 358 359
      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

360
    describe 'project access changed' do
361
      let(:project) { create(:project) }
362 363 364 365
      let(:user) { create(:user) }
      let(:users_project) { create(:users_project,
                                   project: project,
                                   user: user) }
366
      subject { Notify.project_access_granted_email(users_project.id) }
367 368 369

      it_behaves_like 'an email sent from GitLab'

370
      it 'has the correct subject' do
371
        should have_subject /Access to project was granted/
372 373 374 375 376
      end
      it 'contains name of project' do
        should have_body_text /#{project.name}/
      end
      it 'contains new user role' do
377
        should have_body_text /#{users_project.human_access}/
378 379 380
      end
    end

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

385
      before :each do
D
Dmitriy Zaporozhets 已提交
386
        Note.stub(:find).with(note.id).and_return(note)
387 388
      end

R
Robb Kidd 已提交
389
      shared_examples 'a note email' do
390 391 392 393 394 395
        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 已提交
396
        it 'is sent to the given recipient' do
397
          should deliver_to recipient.email
R
Robb Kidd 已提交
398 399 400 401 402 403 404 405
        end

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

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

R
Riyad Preukschas 已提交
408
        before(:each) { note.stub(:noteable).and_return(commit) }
R
Robb Kidd 已提交
409

D
Dmitriy Zaporozhets 已提交
410
        subject { Notify.note_commit_email(recipient.id, note.id) }
R
Robb Kidd 已提交
411 412 413 414

        it_behaves_like 'a note email'

        it 'has the correct subject' do
415
          should have_subject /#{commit.title} \(#{commit.short_id}\)/
R
Robb Kidd 已提交
416 417 418
        end

        it 'contains a link to the commit' do
419
          should have_body_text commit.short_id
R
Robb Kidd 已提交
420 421 422 423
        end
      end

      describe 'on a merge request' do
I
Izaak Alpert 已提交
424
        let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
425
        let(:note_on_merge_request_path) { project_merge_request_path(project, merge_request, anchor: "note_#{note.id}") }
R
Robb Kidd 已提交
426 427
        before(:each) { note.stub(:noteable).and_return(merge_request) }

428
        subject { Notify.note_merge_request_email(recipient.id, note.id) }
R
Robb Kidd 已提交
429 430 431 432

        it_behaves_like 'a note email'

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

        it 'contains a link to the merge request note' do
437
          should have_body_text /#{note_on_merge_request_path}/
R
Robb Kidd 已提交
438 439 440 441
        end
      end

      describe 'on an issue' do
442
        let(:issue) { create(:issue, project: project) }
443
        let(:note_on_issue_path) { project_issue_path(project, issue, anchor: "note_#{note.id}") }
R
Robb Kidd 已提交
444
        before(:each) { note.stub(:noteable).and_return(issue) }
445 446

        subject { Notify.note_issue_email(recipient.id, note.id) }
R
Robb Kidd 已提交
447 448 449 450

        it_behaves_like 'a note email'

        it 'has the correct subject' do
451
          should have_subject /#{issue.title} \(##{issue.iid}\)/
R
Robb Kidd 已提交
452 453 454
        end

        it 'contains a link to the issue note' do
455
          should have_body_text /#{note_on_issue_path}/
R
Robb Kidd 已提交
456 457
        end
      end
458 459
    end
  end
460 461 462 463 464 465 466 467

  describe 'group access changed' do
    let(:group) { create(:group) }
    let(:user) { create(:user) }
    let(:membership) { create(:users_group, group: group, user: user) }

    subject { Notify.group_access_granted_email(membership.id) }

468 469
    it_behaves_like 'an email sent from GitLab'

470
    it 'has the correct subject' do
471
      should have_subject /Access to group was granted/
472 473 474 475 476 477 478 479 480 481
    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
482 483 484 485 486 487 488 489 490 491 492 493

  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 }

494 495
    it_behaves_like 'an email sent from GitLab'

496 497 498 499 500 501 502 503 504 505 506 507
    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 已提交
508

509
  describe 'email on push with multiple commits' do
D
Dmitriy Zaporozhets 已提交
510 511 512
    let(:example_site_path) { root_path }
    let(:user) { create(:user) }
    let(:compare) { Gitlab::Git::Compare.new(project.repository.raw_repository, 'cd5c4bac', 'b1e6a9db') }
513 514
    let(:commits) { Commit.decorate(compare.commits) }
    let(:diff_path) { project_compare_path(project, from: commits.first, to: commits.last) }
D
Dmitriy Zaporozhets 已提交
515 516 517

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

518 519 520 521 522 523
    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 已提交
524
    it 'is sent to recipient' do
525
      should deliver_to 'devs@company.name'
D
Dmitriy Zaporozhets 已提交
526 527 528
    end

    it 'has the correct subject' do
529
      should have_subject /#{commits.length} new commits pushed to repository/
D
Dmitriy Zaporozhets 已提交
530 531 532 533 534 535 536 537 538
    end

    it 'includes commits list' do
      should have_body_text /tree css fixes/
    end

    it 'includes diffs' do
      should have_body_text /Checkout wiki pages for installation information/
    end
539 540 541 542

    it 'contains a link to the diff' do
      should have_body_text /#{diff_path}/
    end
D
Dmitriy Zaporozhets 已提交
543
  end
544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560

  describe 'email on push with a single commit' do
    let(:example_site_path) { root_path }
    let(:user) { create(:user) }
    let(:compare) { Gitlab::Git::Compare.new(project.repository.raw_repository, '8716fc78', 'b1e6a9db') }
    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
561
      should deliver_to 'devs@company.name'
562 563 564
    end

    it 'has the correct subject' do
565
      should have_subject /#{commits.first.title}/
566 567 568 569 570 571 572 573 574 575 576 577 578 579
    end

    it 'includes commits list' do
      should have_body_text /tree css fixes/
    end

    it 'includes diffs' do
      should have_body_text /Checkout wiki pages for installation information/
    end

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