notify_spec.rb 17.8 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 13 14 15 16
  shared_examples 'a multiple recipients email' do
    it 'is sent to the given recipient' do
      should deliver_to recipient.email
    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 144 145 146
        it 'is sent to the assignee' do
          should deliver_to assignee.email
        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 164
          end
        end
165

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

          it_behaves_like 'a multiple recipients email'

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

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

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

206 207 208 209 210 211
          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 已提交
212
          it 'has the correct subject' do
213
            should have_subject /#{issue.title} \(##{issue.iid}\)/i
A
Alex Denisov 已提交
214 215 216 217 218 219 220 221 222 223 224 225 226 227 228
          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 已提交
229 230 231
      end

      context 'for merge requests' do
232
        let(:merge_author) { create(:user) }
233
        let(:merge_request) { create(:merge_request, author: current_user, assignee: assignee, source_project: project, target_project: project) }
234
        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 已提交
235 236

        describe 'that are new' do
237
          subject { Notify.new_merge_request_email(merge_request.assignee_id, merge_request.id) }
R
Robb Kidd 已提交
238 239 240 241

          it_behaves_like 'an assignee email'

          it 'has the correct subject' do
242
            should have_subject /#{merge_request.title} \(!#{merge_request.iid}\)/
R
Robb Kidd 已提交
243 244 245
          end

          it 'contains a link to the new merge request' do
246
            should have_body_text /#{project_merge_request_path(project, merge_request)}/
R
Robb Kidd 已提交
247 248 249 250 251 252 253 254 255 256 257
          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
        end

258 259 260 261 262 263 264 265
        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 已提交
266
        describe 'that are reassigned' do
267
          subject { Notify.reassigned_merge_request_email(recipient.id, merge_request.id, previous_assignee.id, current_user.id) }
R
Robb Kidd 已提交
268 269 270

          it_behaves_like 'a multiple recipients email'

271 272 273 274 275 276
          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 已提交
277
          it 'has the correct subject' do
278
            should have_subject /#{merge_request.title} \(!#{merge_request.iid}\)/
R
Robb Kidd 已提交
279 280 281
          end

          it 'contains the name of the previous assignee' do
282
            should have_body_text /#{previous_assignee.name}/
R
Robb Kidd 已提交
283 284 285 286 287 288 289
          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
290
            should have_body_text /#{project_merge_request_path project, merge_request}/
R
Robb Kidd 已提交
291
          end
292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307
        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
            should have_subject /#{merge_request.title} \(!#{merge_request.iid}\)/
          end
R
Robb Kidd 已提交
308

309 310 311 312 313 314 315
          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 已提交
316 317
        end
      end
318 319
    end

320 321 322 323 324
    describe 'project was moved' do
      let(:project) { create(:project) }
      let(:user) { create(:user) }
      subject { Notify.project_was_moved_email(project.id, user.id) }

325 326
      it_behaves_like 'an email sent from GitLab'

327
      it 'has the correct subject' do
328
        should have_subject /Project was moved/
329 330 331 332 333 334 335 336 337 338 339
      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

340
    describe 'project access changed' do
341
      let(:project) { create(:project) }
342 343 344 345
      let(:user) { create(:user) }
      let(:users_project) { create(:users_project,
                                   project: project,
                                   user: user) }
346
      subject { Notify.project_access_granted_email(users_project.id) }
347 348 349

      it_behaves_like 'an email sent from GitLab'

350
      it 'has the correct subject' do
351
        should have_subject /Access to project was granted/
352 353 354 355 356
      end
      it 'contains name of project' do
        should have_body_text /#{project.name}/
      end
      it 'contains new user role' do
357
        should have_body_text /#{users_project.human_access}/
358 359 360
      end
    end

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

365
      before :each do
D
Dmitriy Zaporozhets 已提交
366
        Note.stub(:find).with(note.id).and_return(note)
367 368
      end

R
Robb Kidd 已提交
369
      shared_examples 'a note email' do
370 371 372 373 374 375
        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 已提交
376 377 378 379 380 381 382 383 384 385
        it 'is sent to the given recipient' do
          should deliver_to recipient.email
        end

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

      describe 'on a project wall' do
386
        let(:note_on_the_wall_path) { project_wall_path(project, anchor: "note_#{note.id}") }
R
Robb Kidd 已提交
387

388
        subject { Notify.note_wall_email(recipient.id, note.id) }
R
Robb Kidd 已提交
389 390 391 392 393 394 395 396

        it_behaves_like 'a note email'

        it 'has the correct subject' do
          should have_subject /#{project.name}/
        end

        it 'contains a link to the wall note' do
397
          should have_body_text /#{note_on_the_wall_path}/
R
Robb Kidd 已提交
398 399 400 401
        end
      end

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

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

D
Dmitriy Zaporozhets 已提交
406
        subject { Notify.note_commit_email(recipient.id, note.id) }
R
Robb Kidd 已提交
407 408 409 410

        it_behaves_like 'a note email'

        it 'has the correct subject' do
411
          should have_subject /#{commit.title} \(#{commit.short_id}\)/
R
Robb Kidd 已提交
412 413 414
        end

        it 'contains a link to the commit' do
415
          should have_body_text commit.short_id
R
Robb Kidd 已提交
416 417 418 419
        end
      end

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

424
        subject { Notify.note_merge_request_email(recipient.id, note.id) }
R
Robb Kidd 已提交
425 426 427 428

        it_behaves_like 'a note email'

        it 'has the correct subject' do
429
          should have_subject /#{merge_request.title} \(!#{merge_request.iid}\)/
R
Robb Kidd 已提交
430 431 432
        end

        it 'contains a link to the merge request note' do
433
          should have_body_text /#{note_on_merge_request_path}/
R
Robb Kidd 已提交
434 435 436 437
        end
      end

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

        subject { Notify.note_issue_email(recipient.id, note.id) }
R
Robb Kidd 已提交
443 444 445 446

        it_behaves_like 'a note email'

        it 'has the correct subject' do
447
          should have_subject /#{issue.title} \(##{issue.iid}\)/
R
Robb Kidd 已提交
448 449 450
        end

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

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

464 465
    it_behaves_like 'an email sent from GitLab'

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

  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 }

490 491
    it_behaves_like 'an email sent from GitLab'

492 493 494 495 496 497 498 499 500 501 502 503
    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 已提交
504

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

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

514 515 516 517 518 519
    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 已提交
520 521 522 523 524 525 526 527 528 529 530 531 532 533 534
    it 'is sent to recipient' do
      should deliver_to 'devs@company.name'
    end

    it 'has the correct subject' do
      should have_subject /New push to repository/
    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
535 536 537 538

    it 'contains a link to the diff' do
      should have_body_text /#{diff_path}/
    end
D
Dmitriy Zaporozhets 已提交
539
  end
540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575

  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
      should deliver_to 'devs@company.name'
    end

    it 'has the correct subject' do
      should have_subject /New push to repository/
    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
576
end