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

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

7
  let(:recipient) { create(:user, email: 'recipient@example.com') }
8
  let(:project) { create(:project_with_code) }
9

R
Robb Kidd 已提交
10 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

  describe 'for new users, the email' do
17
    let(:example_site_path) { root_path }
D
Dmitriy Zaporozhets 已提交
18
    let(:new_user) { create(:user, email: 'newguy@example.com', created_by_id: 1) }
19

20
    subject { Notify.new_user_email(new_user.id, new_user.password) }
21 22 23 24 25 26

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

    it 'has the correct subject' do
A
Alex Denisov 已提交
27
      should have_subject /^gitlab \| Account was created for you$/i
28 29 30 31 32 33 34
    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 已提交
35
      should have_body_text /password/
36 37 38
    end

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

M
Marin Jankovski 已提交
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62

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

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

    it 'has the correct subject' do
      should have_subject /^gitlab \| Account was created for you$/i
    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 已提交
63
      should_not have_body_text /password/
M
Marin Jankovski 已提交
64 65 66 67 68 69 70
    end

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

71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
  describe 'user added ssh key' do
    let(:key) { create(:personal_key) }

    subject { Notify.new_ssh_key_email(key.id) }

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

    it 'has the correct subject' do
      should have_subject /^gitlab \| SSH key was added to your account$/i
    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
89
      should have_body_text /#{profile_keys_path}/
90 91 92
    end
  end

R
Robb Kidd 已提交
93 94
  context 'for a project' do
    describe 'items that are assignable, the email' do
95 96
      let(:assignee) { create(:user, email: 'assignee@example.com') }
      let(:previous_assignee) { create(:user, name: 'Previous Assignee') }
97

R
Robb Kidd 已提交
98 99 100 101 102
      shared_examples 'an assignee email' do
        it 'is sent to the assignee' do
          should deliver_to assignee.email
        end
      end
103

R
Robb Kidd 已提交
104
      context 'for issues' do
105
        let(:issue) { create(:issue, assignee: assignee, project: project ) }
106

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

R
Robb Kidd 已提交
110
          it_behaves_like 'an assignee email'
111

R
Robb Kidd 已提交
112
          it 'has the correct subject' do
113
            should have_subject /#{project.name} \| New issue ##{issue.iid} \| #{issue.title}/
R
Robb Kidd 已提交
114
          end
115

R
Robb Kidd 已提交
116
          it 'contains a link to the new issue' do
117
            should have_body_text /#{project_issue_path project, issue}/
R
Robb Kidd 已提交
118 119
          end
        end
120

R
Robb Kidd 已提交
121
        describe 'that have been reassigned' do
122
          before(:each) { issue.stub(:assignee_id_was).and_return(previous_assignee.id) }
123

124
          subject { Notify.reassigned_issue_email(recipient.id, issue.id, previous_assignee.id) }
R
Robb Kidd 已提交
125 126 127 128

          it_behaves_like 'a multiple recipients email'

          it 'has the correct subject' do
129
            should have_subject /Changed issue ##{issue.iid} \| #{issue.title}/
R
Robb Kidd 已提交
130 131 132
          end

          it 'contains the name of the previous assignee' do
133
            should have_body_text /#{previous_assignee.name}/
R
Robb Kidd 已提交
134 135 136 137 138 139 140
          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
141
            should have_body_text /#{project_issue_path project, issue}/
R
Robb Kidd 已提交
142 143
          end
        end
A
Alex Denisov 已提交
144 145

        describe 'status changed' do
146
          let(:current_user) { create(:user, email: "current@email.com") }
A
Alex Denisov 已提交
147 148
          let(:status) { 'closed' }
          subject { Notify.issue_status_changed_email(recipient.id, issue.id, status, current_user) }
149

A
Alex Denisov 已提交
150
          it 'has the correct subject' do
151
            should have_subject /Changed issue ##{issue.iid} \| #{issue.title}/i
A
Alex Denisov 已提交
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
          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 已提交
167 168 169
      end

      context 'for merge requests' do
I
Izaak Alpert 已提交
170
        let(:merge_request) { create(:merge_request, assignee: assignee, source_project: project, target_project: project) }
R
Robb Kidd 已提交
171 172

        describe 'that are new' do
173
          subject { Notify.new_merge_request_email(merge_request.assignee_id, merge_request.id) }
R
Robb Kidd 已提交
174 175 176 177

          it_behaves_like 'an assignee email'

          it 'has the correct subject' do
178
            should have_subject /New merge request ##{merge_request.iid}/
R
Robb Kidd 已提交
179 180 181
          end

          it 'contains a link to the new merge request' do
182
            should have_body_text /#{project_merge_request_path(project, merge_request)}/
R
Robb Kidd 已提交
183 184 185 186 187 188 189 190 191 192 193 194
          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

        describe 'that are reassigned' do
195
          before(:each) { merge_request.stub(:assignee_id_was).and_return(previous_assignee.id) }
R
Robb Kidd 已提交
196

197
          subject { Notify.reassigned_merge_request_email(recipient.id, merge_request.id, previous_assignee.id) }
R
Robb Kidd 已提交
198 199 200 201

          it_behaves_like 'a multiple recipients email'

          it 'has the correct subject' do
202
            should have_subject /Changed merge request ##{merge_request.iid}/
R
Robb Kidd 已提交
203 204 205
          end

          it 'contains the name of the previous assignee' do
206
            should have_body_text /#{previous_assignee.name}/
R
Robb Kidd 已提交
207 208 209 210 211 212 213
          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
214
            should have_body_text /#{project_merge_request_path project, merge_request}/
R
Robb Kidd 已提交
215 216 217 218
          end

        end
      end
219 220
    end

221 222 223 224 225 226
    describe 'project was moved' do
      let(:project) { create(:project) }
      let(:user) { create(:user) }
      subject { Notify.project_was_moved_email(project.id, user.id) }

      it 'has the correct subject' do
227
        should have_subject /Project was moved/
228 229 230 231 232 233 234 235 236 237 238
      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

239
    describe 'project access changed' do
240
      let(:project) { create(:project) }
241 242 243 244
      let(:user) { create(:user) }
      let(:users_project) { create(:users_project,
                                   project: project,
                                   user: user) }
245 246
      subject { Notify.project_access_granted_email(users_project.id) }
      it 'has the correct subject' do
247
        should have_subject /Access to project was granted/
248 249 250 251 252
      end
      it 'contains name of project' do
        should have_body_text /#{project.name}/
      end
      it 'contains new user role' do
253
        should have_body_text /#{users_project.human_access}/
254 255 256
      end
    end

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

261
      before :each do
D
Dmitriy Zaporozhets 已提交
262
        Note.stub(:find).with(note.id).and_return(note)
263 264
      end

R
Robb Kidd 已提交
265 266 267 268 269 270 271 272 273 274 275 276 277 278 279
      shared_examples 'a note email' do
        it 'is sent to the given recipient' do
          should deliver_to recipient.email
        end

        it 'contains the name of the note\'s author' do
          should have_body_text /#{note_author.name}/
        end

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

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

282
        subject { Notify.note_wall_email(recipient.id, note.id) }
R
Robb Kidd 已提交
283 284 285 286 287 288 289 290

        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
291
          should have_body_text /#{note_on_the_wall_path}/
R
Robb Kidd 已提交
292 293 294 295
        end
      end

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

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

D
Dmitriy Zaporozhets 已提交
300
        subject { Notify.note_commit_email(recipient.id, note.id) }
R
Robb Kidd 已提交
301 302 303 304

        it_behaves_like 'a note email'

        it 'has the correct subject' do
305
          should have_subject /Note for commit #{commit.short_id}/
R
Robb Kidd 已提交
306 307 308
        end

        it 'contains a link to the commit' do
309
          should have_body_text commit.short_id
R
Robb Kidd 已提交
310 311 312 313
        end
      end

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

318
        subject { Notify.note_merge_request_email(recipient.id, note.id) }
R
Robb Kidd 已提交
319 320 321 322

        it_behaves_like 'a note email'

        it 'has the correct subject' do
323
          should have_subject /Note for merge request ##{merge_request.iid}/
R
Robb Kidd 已提交
324 325 326
        end

        it 'contains a link to the merge request note' do
327
          should have_body_text /#{note_on_merge_request_path}/
R
Robb Kidd 已提交
328 329 330 331
        end
      end

      describe 'on an issue' do
332
        let(:issue) { create(:issue, project: project) }
333
        let(:note_on_issue_path) { project_issue_path(project, issue, anchor: "note_#{note.id}") }
R
Robb Kidd 已提交
334
        before(:each) { note.stub(:noteable).and_return(issue) }
335 336

        subject { Notify.note_issue_email(recipient.id, note.id) }
R
Robb Kidd 已提交
337 338 339 340

        it_behaves_like 'a note email'

        it 'has the correct subject' do
341
          should have_subject /Note for issue ##{issue.iid}/
R
Robb Kidd 已提交
342 343 344
        end

        it 'contains a link to the issue note' do
345
          should have_body_text /#{note_on_issue_path}/
R
Robb Kidd 已提交
346 347
        end
      end
348 349
    end
  end
350 351 352 353 354 355 356 357 358

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

    it 'has the correct subject' do
359
      should have_subject /Access to group was granted/
360 361 362 363 364 365 366 367 368 369
    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
370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393

  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 }

    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 已提交
394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417

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

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

    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
  end
418
end