notify_spec.rb 15.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_request) { create(:merge_request, author: current_user, assignee: assignee, source_project: project, target_project: project) }
233
        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 已提交
234 235

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

          it_behaves_like 'an assignee email'

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

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

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

          it_behaves_like 'a multiple recipients email'

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

          it 'contains the name of the previous assignee' do
281
            should have_body_text /#{previous_assignee.name}/
R
Robb Kidd 已提交
282 283 284 285 286 287 288
          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
289
            should have_body_text /#{project_merge_request_path project, merge_request}/
R
Robb Kidd 已提交
290 291 292 293
          end

        end
      end
294 295
    end

296 297 298 299 300
    describe 'project was moved' do
      let(:project) { create(:project) }
      let(:user) { create(:user) }
      subject { Notify.project_was_moved_email(project.id, user.id) }

301 302
      it_behaves_like 'an email sent from GitLab'

303
      it 'has the correct subject' do
304
        should have_subject /Project was moved/
305 306 307 308 309 310 311 312 313 314 315
      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

316
    describe 'project access changed' do
317
      let(:project) { create(:project) }
318 319 320 321
      let(:user) { create(:user) }
      let(:users_project) { create(:users_project,
                                   project: project,
                                   user: user) }
322
      subject { Notify.project_access_granted_email(users_project.id) }
323 324 325

      it_behaves_like 'an email sent from GitLab'

326
      it 'has the correct subject' do
327
        should have_subject /Access to project was granted/
328 329 330 331 332
      end
      it 'contains name of project' do
        should have_body_text /#{project.name}/
      end
      it 'contains new user role' do
333
        should have_body_text /#{users_project.human_access}/
334 335 336
      end
    end

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

341
      before :each do
D
Dmitriy Zaporozhets 已提交
342
        Note.stub(:find).with(note.id).and_return(note)
343 344
      end

R
Robb Kidd 已提交
345
      shared_examples 'a note email' do
346 347 348 349 350 351
        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 已提交
352 353 354 355 356 357 358 359 360 361
        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
362
        let(:note_on_the_wall_path) { project_wall_path(project, anchor: "note_#{note.id}") }
R
Robb Kidd 已提交
363

364
        subject { Notify.note_wall_email(recipient.id, note.id) }
R
Robb Kidd 已提交
365 366 367 368 369 370 371 372

        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
373
          should have_body_text /#{note_on_the_wall_path}/
R
Robb Kidd 已提交
374 375 376 377
        end
      end

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

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

D
Dmitriy Zaporozhets 已提交
382
        subject { Notify.note_commit_email(recipient.id, note.id) }
R
Robb Kidd 已提交
383 384 385 386

        it_behaves_like 'a note email'

        it 'has the correct subject' do
387
          should have_subject /#{commit.title} \(#{commit.short_id}\)/
R
Robb Kidd 已提交
388 389 390
        end

        it 'contains a link to the commit' do
391
          should have_body_text commit.short_id
R
Robb Kidd 已提交
392 393 394 395
        end
      end

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

400
        subject { Notify.note_merge_request_email(recipient.id, note.id) }
R
Robb Kidd 已提交
401 402 403 404

        it_behaves_like 'a note email'

        it 'has the correct subject' do
405
          should have_subject /#{merge_request.title} \(!#{merge_request.iid}\)/
R
Robb Kidd 已提交
406 407 408
        end

        it 'contains a link to the merge request note' do
409
          should have_body_text /#{note_on_merge_request_path}/
R
Robb Kidd 已提交
410 411 412 413
        end
      end

      describe 'on an issue' do
414
        let(:issue) { create(:issue, project: project) }
415
        let(:note_on_issue_path) { project_issue_path(project, issue, anchor: "note_#{note.id}") }
R
Robb Kidd 已提交
416
        before(:each) { note.stub(:noteable).and_return(issue) }
417 418

        subject { Notify.note_issue_email(recipient.id, note.id) }
R
Robb Kidd 已提交
419 420 421 422

        it_behaves_like 'a note email'

        it 'has the correct subject' do
423
          should have_subject /#{issue.title} \(##{issue.iid}\)/
R
Robb Kidd 已提交
424 425 426
        end

        it 'contains a link to the issue note' do
427
          should have_body_text /#{note_on_issue_path}/
R
Robb Kidd 已提交
428 429
        end
      end
430 431
    end
  end
432 433 434 435 436 437 438 439

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

440 441
    it_behaves_like 'an email sent from GitLab'

442
    it 'has the correct subject' do
443
      should have_subject /Access to group was granted/
444 445 446 447 448 449 450 451 452 453
    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
454 455 456 457 458 459 460 461 462 463 464 465

  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 }

466 467
    it_behaves_like 'an email sent from GitLab'

468 469 470 471 472 473 474 475 476 477 478 479
    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 已提交
480 481 482 483 484

  describe 'email on push' do
    let(:example_site_path) { root_path }
    let(:user) { create(:user) }
    let(:compare) { Gitlab::Git::Compare.new(project.repository.raw_repository, 'cd5c4bac', 'b1e6a9db') }
485 486
    let(:commits) { Commit.decorate(compare.commits) }
    let(:diff_path) { project_compare_path(project, from: commits.first, to: commits.last) }
D
Dmitriy Zaporozhets 已提交
487 488 489

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

490 491 492 493 494 495
    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 已提交
496 497 498 499 500 501 502 503 504 505 506 507 508 509 510
    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
511 512 513 514

    it 'contains a link to the diff' do
      should have_body_text /#{diff_path}/
    end
D
Dmitriy Zaporozhets 已提交
515
  end
516
end