2012-05-14 14:05:32 -04:00
|
|
|
require 'spec_helper'
|
2015-05-21 18:41:31 -04:00
|
|
|
require 'email_spec'
|
2012-05-14 14:05:32 -04:00
|
|
|
|
|
|
|
describe Notify do
|
|
|
|
include EmailSpec::Helpers
|
|
|
|
include EmailSpec::Matchers
|
2014-08-01 08:18:17 -04:00
|
|
|
include RepoHelpers
|
2012-05-14 14:05:32 -04:00
|
|
|
|
2016-02-12 07:20:21 -05:00
|
|
|
include_context 'gitlab email notification'
|
2015-12-09 05:59:25 -05:00
|
|
|
|
2017-03-14 08:56:07 -04:00
|
|
|
def have_referable_subject(referable, reply: false)
|
|
|
|
prefix = referable.project.name if referable.project
|
|
|
|
prefix = "Re: #{prefix}" if reply
|
|
|
|
|
|
|
|
suffix = "#{referable.title} (#{referable.to_reference})"
|
|
|
|
|
|
|
|
have_subject [prefix, suffix].compact.join(' | ')
|
|
|
|
end
|
|
|
|
|
2012-05-14 18:03:30 -04:00
|
|
|
context 'for a project' do
|
|
|
|
describe 'items that are assignable, the email' do
|
2014-02-17 12:49:42 -05:00
|
|
|
let(:current_user) { create(:user, email: "current@email.com") }
|
2016-07-22 07:12:30 -04:00
|
|
|
let(:assignee) { create(:user, email: 'assignee@example.com', name: 'John Doe') }
|
2012-11-05 22:31:55 -05:00
|
|
|
let(:previous_assignee) { create(:user, name: 'Previous Assignee') }
|
2012-05-14 14:05:32 -04:00
|
|
|
|
2012-05-14 18:03:30 -04:00
|
|
|
shared_examples 'an assignee email' do
|
2014-02-17 12:49:42 -05:00
|
|
|
it 'is sent as the author' do
|
|
|
|
sender = subject.header[:from].addrs[0]
|
2015-02-12 13:17:35 -05:00
|
|
|
expect(sender.display_name).to eq(current_user.name)
|
|
|
|
expect(sender.address).to eq(gitlab_sender)
|
2014-02-17 12:49:42 -05:00
|
|
|
end
|
|
|
|
|
2012-05-14 18:03:30 -04:00
|
|
|
it 'is sent to the assignee' do
|
2015-02-12 13:17:35 -05:00
|
|
|
is_expected.to deliver_to assignee.email
|
2012-05-14 18:03:30 -04:00
|
|
|
end
|
|
|
|
end
|
2012-05-14 14:05:32 -04:00
|
|
|
|
2012-05-14 18:03:30 -04:00
|
|
|
context 'for issues' do
|
2014-02-18 08:44:00 -05:00
|
|
|
let(:issue) { create(:issue, author: current_user, assignee: assignee, project: project) }
|
2015-05-20 19:22:00 -04:00
|
|
|
let(:issue_with_description) { create(:issue, author: current_user, assignee: assignee, project: project, description: FFaker::Lorem.sentence) }
|
2012-05-14 14:05:32 -04:00
|
|
|
|
2012-05-14 18:03:30 -04:00
|
|
|
describe 'that are new' do
|
2013-03-28 07:24:01 -04:00
|
|
|
subject { Notify.new_issue_email(issue.assignee_id, issue.id) }
|
2012-05-14 14:05:32 -04:00
|
|
|
|
2012-05-14 18:03:30 -04:00
|
|
|
it_behaves_like 'an assignee email'
|
2016-03-17 15:03:51 -04:00
|
|
|
it_behaves_like 'an email starting a new thread with reply-by-email enabled' do
|
|
|
|
let(:model) { issue }
|
|
|
|
end
|
2015-11-25 07:59:03 -05:00
|
|
|
it_behaves_like 'it should show Gmail Actions View Issue link'
|
2015-12-09 05:59:25 -05:00
|
|
|
it_behaves_like 'an unsubscribeable thread'
|
2012-05-14 14:05:32 -04:00
|
|
|
|
2012-05-14 18:03:30 -04:00
|
|
|
it 'has the correct subject' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_referable_subject(issue)
|
2012-05-14 18:03:30 -04:00
|
|
|
end
|
2012-05-14 14:05:32 -04:00
|
|
|
|
2012-05-14 18:03:30 -04:00
|
|
|
it 'contains a link to the new issue' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text namespace_project_issue_path(project.namespace, project, issue)
|
2012-05-14 18:03:30 -04:00
|
|
|
end
|
2016-01-26 08:34:42 -05:00
|
|
|
|
|
|
|
context 'when enabled email_author_in_body' do
|
|
|
|
before do
|
2016-11-17 17:22:39 -05:00
|
|
|
stub_application_setting(email_author_in_body: true)
|
2016-01-26 08:34:42 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains a link to note author' do
|
2017-03-16 05:56:39 -04:00
|
|
|
is_expected.to have_html_escaped_body_text issue.author_name
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text 'wrote:'
|
2016-01-26 08:34:42 -05:00
|
|
|
end
|
|
|
|
end
|
2012-05-14 18:03:30 -04:00
|
|
|
end
|
2012-05-14 14:05:32 -04:00
|
|
|
|
2014-02-18 08:44:00 -05:00
|
|
|
describe 'that are new with a description' do
|
|
|
|
subject { Notify.new_issue_email(issue_with_description.assignee_id, issue_with_description.id) }
|
|
|
|
|
2015-11-25 07:59:03 -05:00
|
|
|
it_behaves_like 'it should show Gmail Actions View Issue link'
|
|
|
|
|
2014-02-18 08:44:00 -05:00
|
|
|
it 'contains the description' do
|
2017-03-16 05:56:39 -04:00
|
|
|
is_expected.to have_html_escaped_body_text issue_with_description.description
|
2014-02-18 08:44:00 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-05-14 18:03:30 -04:00
|
|
|
describe 'that have been reassigned' do
|
2015-12-03 03:33:38 -05:00
|
|
|
subject { Notify.reassigned_issue_email(recipient.id, issue.id, previous_assignee.id, current_user.id) }
|
2012-05-14 18:03:30 -04:00
|
|
|
|
|
|
|
it_behaves_like 'a multiple recipients email'
|
2016-03-17 15:03:51 -04:00
|
|
|
it_behaves_like 'an answer to an existing thread with reply-by-email enabled' do
|
|
|
|
let(:model) { issue }
|
|
|
|
end
|
2015-11-25 07:59:03 -05:00
|
|
|
it_behaves_like 'it should show Gmail Actions View Issue link'
|
2016-03-17 15:03:51 -04:00
|
|
|
it_behaves_like 'an unsubscribeable thread'
|
2012-05-14 18:03:30 -04:00
|
|
|
|
2014-02-17 12:49:42 -05:00
|
|
|
it 'is sent as the author' do
|
|
|
|
sender = subject.header[:from].addrs[0]
|
2015-02-12 13:17:35 -05:00
|
|
|
expect(sender.display_name).to eq(current_user.name)
|
|
|
|
expect(sender.address).to eq(gitlab_sender)
|
2014-02-17 12:49:42 -05:00
|
|
|
end
|
|
|
|
|
2012-05-14 18:03:30 -04:00
|
|
|
it 'has the correct subject' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_referable_subject(issue, reply: true)
|
2012-05-14 18:03:30 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains the name of the previous assignee' do
|
2017-03-16 05:56:39 -04:00
|
|
|
is_expected.to have_html_escaped_body_text previous_assignee.name
|
2012-05-14 18:03:30 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains the name of the new assignee' do
|
2017-03-16 05:56:39 -04:00
|
|
|
is_expected.to have_html_escaped_body_text assignee.name
|
2012-05-14 18:03:30 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains a link to the issue' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text namespace_project_issue_path(project.namespace, project, issue)
|
2012-05-14 18:03:30 -04:00
|
|
|
end
|
|
|
|
end
|
2012-08-29 02:49:39 -04:00
|
|
|
|
2016-03-01 11:33:13 -05:00
|
|
|
describe 'that have been relabeled' do
|
|
|
|
subject { Notify.relabeled_issue_email(recipient.id, issue.id, %w[foo bar baz], current_user.id) }
|
|
|
|
|
|
|
|
it_behaves_like 'a multiple recipients email'
|
2016-03-17 15:03:51 -04:00
|
|
|
it_behaves_like 'an answer to an existing thread with reply-by-email enabled' do
|
|
|
|
let(:model) { issue }
|
|
|
|
end
|
2016-03-01 11:33:13 -05:00
|
|
|
it_behaves_like 'it should show Gmail Actions View Issue link'
|
|
|
|
it_behaves_like 'a user cannot unsubscribe through footer link'
|
|
|
|
it_behaves_like 'an email with a labels subscriptions link in its footer'
|
|
|
|
|
|
|
|
it 'is sent as the author' do
|
|
|
|
sender = subject.header[:from].addrs[0]
|
|
|
|
expect(sender.display_name).to eq(current_user.name)
|
|
|
|
expect(sender.address).to eq(gitlab_sender)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'has the correct subject' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_referable_subject(issue, reply: true)
|
2016-03-01 11:33:13 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains the names of the added labels' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text 'foo, bar, and baz'
|
2016-03-01 11:33:13 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains a link to the issue' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text namespace_project_issue_path(project.namespace, project, issue)
|
2016-03-01 11:33:13 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-08-29 02:49:39 -04:00
|
|
|
describe 'status changed' do
|
|
|
|
let(:status) { 'closed' }
|
2015-12-03 03:33:38 -05:00
|
|
|
subject { Notify.issue_status_changed_email(recipient.id, issue.id, status, current_user.id) }
|
2012-11-05 22:31:55 -05:00
|
|
|
|
2016-03-17 15:03:51 -04:00
|
|
|
it_behaves_like 'an answer to an existing thread with reply-by-email enabled' do
|
|
|
|
let(:model) { issue }
|
|
|
|
end
|
2015-11-25 07:59:03 -05:00
|
|
|
it_behaves_like 'it should show Gmail Actions View Issue link'
|
2015-12-09 05:59:25 -05:00
|
|
|
it_behaves_like 'an unsubscribeable thread'
|
2014-02-24 06:12:29 -05:00
|
|
|
|
2014-02-17 12:49:42 -05:00
|
|
|
it 'is sent as the author' do
|
|
|
|
sender = subject.header[:from].addrs[0]
|
2015-02-12 13:17:35 -05:00
|
|
|
expect(sender.display_name).to eq(current_user.name)
|
|
|
|
expect(sender.address).to eq(gitlab_sender)
|
2014-02-17 12:49:42 -05:00
|
|
|
end
|
|
|
|
|
2012-08-29 02:49:39 -04:00
|
|
|
it 'has the correct subject' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_referable_subject(issue, reply: true)
|
2012-08-29 02:49:39 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains the new status' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text status
|
2012-08-29 02:49:39 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains the user name' do
|
2017-03-16 05:56:39 -04:00
|
|
|
is_expected.to have_html_escaped_body_text current_user.name
|
2012-08-29 02:49:39 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains a link to the issue' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text(namespace_project_issue_path project.namespace, project, issue)
|
2012-08-29 02:49:39 -04:00
|
|
|
end
|
2015-11-25 07:27:31 -05:00
|
|
|
end
|
2016-03-15 06:35:40 -04:00
|
|
|
|
|
|
|
describe 'moved to another project' do
|
|
|
|
let(:new_issue) { create(:issue) }
|
|
|
|
subject { Notify.issue_moved_email(recipient, issue, new_issue, current_user) }
|
|
|
|
|
2016-03-17 15:03:51 -04:00
|
|
|
it_behaves_like 'an answer to an existing thread with reply-by-email enabled' do
|
|
|
|
let(:model) { issue }
|
|
|
|
end
|
2016-03-15 06:35:40 -04:00
|
|
|
it_behaves_like 'it should show Gmail Actions View Issue link'
|
|
|
|
it_behaves_like 'an unsubscribeable thread'
|
|
|
|
|
|
|
|
it 'contains description about action taken' do
|
|
|
|
is_expected.to have_body_text 'Issue was moved to another project'
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'has the correct subject' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_referable_subject(issue, reply: true)
|
2016-03-15 06:35:40 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains link to new issue' do
|
|
|
|
new_issue_url = namespace_project_issue_path(new_issue.project.namespace,
|
|
|
|
new_issue.project, new_issue)
|
|
|
|
is_expected.to have_body_text new_issue_url
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains a link to the original issue' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text namespace_project_issue_path(project.namespace, project, issue)
|
2016-03-15 06:35:40 -04:00
|
|
|
end
|
|
|
|
end
|
2012-05-14 18:03:30 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'for merge requests' do
|
2014-03-24 10:11:35 -04:00
|
|
|
let(:merge_author) { create(:user) }
|
2014-02-17 12:49:42 -05:00
|
|
|
let(:merge_request) { create(:merge_request, author: current_user, assignee: assignee, source_project: project, target_project: project) }
|
2015-05-20 19:22:00 -04:00
|
|
|
let(:merge_request_with_description) { create(:merge_request, author: current_user, assignee: assignee, source_project: project, target_project: project, description: FFaker::Lorem.sentence) }
|
2012-05-14 18:03:30 -04:00
|
|
|
|
|
|
|
describe 'that are new' do
|
2013-03-28 07:24:01 -04:00
|
|
|
subject { Notify.new_merge_request_email(merge_request.assignee_id, merge_request.id) }
|
2012-05-14 18:03:30 -04:00
|
|
|
|
|
|
|
it_behaves_like 'an assignee email'
|
2016-03-17 15:03:51 -04:00
|
|
|
it_behaves_like 'an email starting a new thread with reply-by-email enabled' do
|
|
|
|
let(:model) { merge_request }
|
|
|
|
end
|
2015-11-25 07:59:03 -05:00
|
|
|
it_behaves_like 'it should show Gmail Actions View Merge request link'
|
2016-03-17 15:03:51 -04:00
|
|
|
it_behaves_like 'an unsubscribeable thread'
|
2012-05-14 18:03:30 -04:00
|
|
|
|
|
|
|
it 'has the correct subject' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_referable_subject(merge_request)
|
2012-05-14 18:03:30 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains a link to the new merge request' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text namespace_project_merge_request_path(project.namespace, project, merge_request)
|
2012-05-14 18:03:30 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains the source branch for the merge request' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text merge_request.source_branch
|
2012-05-14 18:03:30 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains the target branch for the merge request' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text merge_request.target_branch
|
2012-05-14 18:03:30 -04:00
|
|
|
end
|
2014-03-04 09:14:58 -05:00
|
|
|
|
2016-01-26 08:34:42 -05:00
|
|
|
context 'when enabled email_author_in_body' do
|
|
|
|
before do
|
2016-11-17 17:22:39 -05:00
|
|
|
stub_application_setting(email_author_in_body: true)
|
2016-01-26 08:34:42 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains a link to note author' do
|
2017-03-16 05:56:39 -04:00
|
|
|
is_expected.to have_html_escaped_body_text merge_request.author_name
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text 'wrote:'
|
2016-01-26 08:34:42 -05:00
|
|
|
end
|
|
|
|
end
|
2012-05-14 18:03:30 -04:00
|
|
|
end
|
|
|
|
|
2014-02-18 08:44:00 -05:00
|
|
|
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) }
|
|
|
|
|
2015-11-25 07:59:03 -05:00
|
|
|
it_behaves_like 'it should show Gmail Actions View Merge request link'
|
2015-12-09 05:59:25 -05:00
|
|
|
it_behaves_like "an unsubscribeable thread"
|
2015-11-25 07:27:31 -05:00
|
|
|
|
2014-02-18 08:44:00 -05:00
|
|
|
it 'contains the description' do
|
2017-03-16 05:56:39 -04:00
|
|
|
is_expected.to have_html_escaped_body_text merge_request_with_description.description
|
2014-02-18 08:44:00 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-05-14 18:03:30 -04:00
|
|
|
describe 'that are reassigned' do
|
2014-02-17 12:49:42 -05:00
|
|
|
subject { Notify.reassigned_merge_request_email(recipient.id, merge_request.id, previous_assignee.id, current_user.id) }
|
2012-05-14 18:03:30 -04:00
|
|
|
|
|
|
|
it_behaves_like 'a multiple recipients email'
|
2016-03-17 15:03:51 -04:00
|
|
|
it_behaves_like 'an answer to an existing thread with reply-by-email enabled' do
|
|
|
|
let(:model) { merge_request }
|
|
|
|
end
|
2015-11-25 07:59:03 -05:00
|
|
|
it_behaves_like 'it should show Gmail Actions View Merge request link'
|
2015-12-09 05:59:25 -05:00
|
|
|
it_behaves_like "an unsubscribeable thread"
|
2012-05-14 18:03:30 -04:00
|
|
|
|
2014-02-17 12:49:42 -05:00
|
|
|
it 'is sent as the author' do
|
|
|
|
sender = subject.header[:from].addrs[0]
|
2015-02-12 13:17:35 -05:00
|
|
|
expect(sender.display_name).to eq(current_user.name)
|
|
|
|
expect(sender.address).to eq(gitlab_sender)
|
2014-02-17 12:49:42 -05:00
|
|
|
end
|
|
|
|
|
2012-05-14 18:03:30 -04:00
|
|
|
it 'has the correct subject' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_referable_subject(merge_request, reply: true)
|
2012-05-14 18:03:30 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains the name of the previous assignee' do
|
2017-03-16 05:56:39 -04:00
|
|
|
is_expected.to have_html_escaped_body_text previous_assignee.name
|
2012-05-14 18:03:30 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains the name of the new assignee' do
|
2017-03-16 05:56:39 -04:00
|
|
|
is_expected.to have_html_escaped_body_text assignee.name
|
2012-05-14 18:03:30 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains a link to the merge request' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text namespace_project_merge_request_path(project.namespace, project, merge_request)
|
2012-05-14 18:03:30 -04:00
|
|
|
end
|
2014-03-24 10:11:35 -04:00
|
|
|
end
|
|
|
|
|
2016-03-01 11:33:13 -05:00
|
|
|
describe 'that have been relabeled' do
|
|
|
|
subject { Notify.relabeled_merge_request_email(recipient.id, merge_request.id, %w[foo bar baz], current_user.id) }
|
|
|
|
|
|
|
|
it_behaves_like 'a multiple recipients email'
|
2016-03-17 15:03:51 -04:00
|
|
|
it_behaves_like 'an answer to an existing thread with reply-by-email enabled' do
|
|
|
|
let(:model) { merge_request }
|
|
|
|
end
|
2016-03-01 11:33:13 -05:00
|
|
|
it_behaves_like 'it should show Gmail Actions View Merge request link'
|
|
|
|
it_behaves_like 'a user cannot unsubscribe through footer link'
|
|
|
|
it_behaves_like 'an email with a labels subscriptions link in its footer'
|
|
|
|
|
|
|
|
it 'is sent as the author' do
|
|
|
|
sender = subject.header[:from].addrs[0]
|
|
|
|
expect(sender.display_name).to eq(current_user.name)
|
|
|
|
expect(sender.address).to eq(gitlab_sender)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'has the correct subject' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_referable_subject(merge_request, reply: true)
|
2016-03-01 11:33:13 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains the names of the added labels' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text 'foo, bar, and baz'
|
2016-03-01 11:33:13 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains a link to the merge request' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text namespace_project_merge_request_path(project.namespace, project, merge_request)
|
2016-03-01 11:33:13 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2014-07-08 07:56:37 -04:00
|
|
|
describe 'status changed' do
|
|
|
|
let(:status) { 'reopened' }
|
2015-12-03 03:33:38 -05:00
|
|
|
subject { Notify.merge_request_status_email(recipient.id, merge_request.id, status, current_user.id) }
|
2014-07-08 07:56:37 -04:00
|
|
|
|
2016-03-17 15:03:51 -04:00
|
|
|
it_behaves_like 'an answer to an existing thread with reply-by-email enabled' do
|
|
|
|
let(:model) { merge_request }
|
|
|
|
end
|
2015-11-25 07:59:03 -05:00
|
|
|
it_behaves_like 'it should show Gmail Actions View Merge request link'
|
2016-03-17 15:03:51 -04:00
|
|
|
it_behaves_like 'an unsubscribeable thread'
|
2014-07-08 07:56:37 -04:00
|
|
|
|
|
|
|
it 'is sent as the author' do
|
|
|
|
sender = subject.header[:from].addrs[0]
|
2015-02-12 13:17:35 -05:00
|
|
|
expect(sender.display_name).to eq(current_user.name)
|
|
|
|
expect(sender.address).to eq(gitlab_sender)
|
2014-07-08 07:56:37 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'has the correct subject' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_referable_subject(merge_request, reply: true)
|
2014-07-08 07:56:37 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains the new status' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text status
|
2014-07-08 07:56:37 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains the user name' do
|
2017-03-16 05:56:39 -04:00
|
|
|
is_expected.to have_html_escaped_body_text current_user.name
|
2014-07-08 07:56:37 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains a link to the merge request' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text namespace_project_merge_request_path(project.namespace, project, merge_request)
|
2014-07-08 07:56:37 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2014-03-24 10:11:35 -04:00
|
|
|
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'
|
2016-03-17 15:03:51 -04:00
|
|
|
it_behaves_like 'an answer to an existing thread with reply-by-email enabled' do
|
|
|
|
let(:model) { merge_request }
|
|
|
|
end
|
2015-11-25 07:59:03 -05:00
|
|
|
it_behaves_like 'it should show Gmail Actions View Merge request link'
|
2016-03-17 15:03:51 -04:00
|
|
|
it_behaves_like 'an unsubscribeable thread'
|
2014-03-24 10:11:35 -04:00
|
|
|
|
|
|
|
it 'is sent as the merge author' do
|
|
|
|
sender = subject.header[:from].addrs[0]
|
2015-02-12 13:17:35 -05:00
|
|
|
expect(sender.display_name).to eq(merge_author.name)
|
|
|
|
expect(sender.address).to eq(gitlab_sender)
|
2014-03-24 10:11:35 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'has the correct subject' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_referable_subject(merge_request, reply: true)
|
2014-03-24 10:11:35 -04:00
|
|
|
end
|
2012-05-14 18:03:30 -04:00
|
|
|
|
2014-03-24 10:11:35 -04:00
|
|
|
it 'contains the new status' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text 'merged'
|
2014-03-24 10:11:35 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains a link to the merge request' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text namespace_project_merge_request_path(project.namespace, project, merge_request)
|
2014-03-24 10:11:35 -04:00
|
|
|
end
|
2012-05-14 18:03:30 -04:00
|
|
|
end
|
|
|
|
end
|
2012-05-14 14:05:32 -04:00
|
|
|
end
|
|
|
|
|
2013-06-22 03:56:51 -04:00
|
|
|
describe 'project was moved' do
|
|
|
|
let(:project) { create(:project) }
|
|
|
|
let(:user) { create(:user) }
|
2015-09-29 09:37:50 -04:00
|
|
|
subject { Notify.project_was_moved_email(project.id, user.id, "gitlab/gitlab") }
|
2013-06-22 03:56:51 -04:00
|
|
|
|
2014-02-17 12:49:42 -05:00
|
|
|
it_behaves_like 'an email sent from GitLab'
|
2015-11-25 07:27:31 -05:00
|
|
|
it_behaves_like 'it should not have Gmail Actions links'
|
2016-01-09 13:32:03 -05:00
|
|
|
it_behaves_like "a user cannot unsubscribe through footer link"
|
2014-02-17 12:49:42 -05:00
|
|
|
|
2013-06-22 03:56:51 -04:00
|
|
|
it 'has the correct subject' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_subject "#{project.name} | Project was moved"
|
2013-06-22 03:56:51 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains name of project' do
|
2017-03-16 05:56:39 -04:00
|
|
|
is_expected.to have_html_escaped_body_text project.name_with_namespace
|
2013-06-22 03:56:51 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains new user role' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text project.ssh_url_to_repo
|
2013-06-22 03:56:51 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-04-18 12:53:32 -04:00
|
|
|
describe 'project access requested' do
|
2016-06-20 06:10:37 -04:00
|
|
|
context 'for a project in a user namespace' do
|
2016-11-11 07:51:50 -05:00
|
|
|
let(:project) do
|
|
|
|
create(:empty_project, :public, :access_requestable) do |project|
|
|
|
|
project.team << [project.owner, :master, project.owner]
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-06-20 06:10:37 -04:00
|
|
|
let(:user) { create(:user) }
|
|
|
|
let(:project_member) do
|
|
|
|
project.request_access(user)
|
2016-06-27 10:20:57 -04:00
|
|
|
project.requesters.find_by(user_id: user.id)
|
2016-06-20 06:10:37 -04:00
|
|
|
end
|
|
|
|
subject { Notify.member_access_requested_email('project', project_member.id) }
|
|
|
|
|
|
|
|
it_behaves_like 'an email sent from GitLab'
|
|
|
|
it_behaves_like 'it should not have Gmail Actions links'
|
|
|
|
it_behaves_like "a user cannot unsubscribe through footer link"
|
|
|
|
|
|
|
|
it 'contains all the useful information' do
|
|
|
|
to_emails = subject.header[:to].addrs
|
|
|
|
expect(to_emails.size).to eq(1)
|
|
|
|
expect(to_emails[0].address).to eq(project.members.owners_and_masters.first.user.notification_email)
|
|
|
|
|
|
|
|
is_expected.to have_subject "Request to join the #{project.name_with_namespace} project"
|
2017-03-16 05:56:39 -04:00
|
|
|
is_expected.to have_html_escaped_body_text project.name_with_namespace
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text namespace_project_project_members_url(project.namespace, project)
|
|
|
|
is_expected.to have_body_text project_member.human_access
|
2016-06-20 06:10:37 -04:00
|
|
|
end
|
2016-04-18 12:53:32 -04:00
|
|
|
end
|
|
|
|
|
2016-06-20 06:10:37 -04:00
|
|
|
context 'for a project in a group' do
|
|
|
|
let(:group_owner) { create(:user) }
|
|
|
|
let(:group) { create(:group).tap { |g| g.add_owner(group_owner) } }
|
2016-11-11 07:51:50 -05:00
|
|
|
let(:project) { create(:empty_project, :public, :access_requestable, namespace: group) }
|
2016-06-20 06:10:37 -04:00
|
|
|
let(:user) { create(:user) }
|
|
|
|
let(:project_member) do
|
|
|
|
project.request_access(user)
|
2016-06-27 10:20:57 -04:00
|
|
|
project.requesters.find_by(user_id: user.id)
|
2016-06-20 06:10:37 -04:00
|
|
|
end
|
|
|
|
subject { Notify.member_access_requested_email('project', project_member.id) }
|
2016-04-18 12:53:32 -04:00
|
|
|
|
2016-06-20 06:10:37 -04:00
|
|
|
it_behaves_like 'an email sent from GitLab'
|
|
|
|
it_behaves_like 'it should not have Gmail Actions links'
|
|
|
|
it_behaves_like "a user cannot unsubscribe through footer link"
|
|
|
|
|
|
|
|
it 'contains all the useful information' do
|
|
|
|
to_emails = subject.header[:to].addrs
|
|
|
|
expect(to_emails.size).to eq(1)
|
|
|
|
expect(to_emails[0].address).to eq(group.members.owners_and_masters.first.user.notification_email)
|
|
|
|
|
|
|
|
is_expected.to have_subject "Request to join the #{project.name_with_namespace} project"
|
2017-03-16 05:56:39 -04:00
|
|
|
is_expected.to have_html_escaped_body_text project.name_with_namespace
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text namespace_project_project_members_url(project.namespace, project)
|
|
|
|
is_expected.to have_body_text project_member.human_access
|
2016-06-20 06:10:37 -04:00
|
|
|
end
|
2016-06-02 12:05:06 -04:00
|
|
|
end
|
2016-04-18 12:53:32 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
describe 'project access denied' do
|
2016-11-11 07:51:50 -05:00
|
|
|
let(:project) { create(:empty_project, :public, :access_requestable) }
|
2016-04-18 12:53:32 -04:00
|
|
|
let(:user) { create(:user) }
|
|
|
|
let(:project_member) do
|
|
|
|
project.request_access(user)
|
2016-06-27 10:20:57 -04:00
|
|
|
project.requesters.find_by(user_id: user.id)
|
2016-04-18 12:53:32 -04:00
|
|
|
end
|
2016-06-02 10:14:02 -04:00
|
|
|
subject { Notify.member_access_denied_email('project', project.id, user.id) }
|
2016-04-18 12:53:32 -04:00
|
|
|
|
|
|
|
it_behaves_like 'an email sent from GitLab'
|
|
|
|
it_behaves_like 'it should not have Gmail Actions links'
|
|
|
|
it_behaves_like "a user cannot unsubscribe through footer link"
|
|
|
|
|
2016-06-02 12:05:06 -04:00
|
|
|
it 'contains all the useful information' do
|
|
|
|
is_expected.to have_subject "Access to the #{project.name_with_namespace} project was denied"
|
2017-03-16 05:56:39 -04:00
|
|
|
is_expected.to have_html_escaped_body_text project.name_with_namespace
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text project.web_url
|
2016-06-02 12:05:06 -04:00
|
|
|
end
|
2016-04-18 12:53:32 -04:00
|
|
|
end
|
|
|
|
|
2012-08-26 17:13:03 -04:00
|
|
|
describe 'project access changed' do
|
2017-03-16 05:56:39 -04:00
|
|
|
let(:owner) { create(:user, name: "Chang O'Keefe") }
|
|
|
|
let(:project) { create(:empty_project, :public, :access_requestable, namespace: owner.namespace) }
|
2012-11-05 22:31:55 -05:00
|
|
|
let(:user) { create(:user) }
|
2015-06-22 16:00:54 -04:00
|
|
|
let(:project_member) { create(:project_member, project: project, user: user) }
|
2016-06-02 10:14:02 -04:00
|
|
|
subject { Notify.member_access_granted_email('project', project_member.id) }
|
2014-02-17 12:49:42 -05:00
|
|
|
|
|
|
|
it_behaves_like 'an email sent from GitLab'
|
2015-11-25 07:27:31 -05:00
|
|
|
it_behaves_like 'it should not have Gmail Actions links'
|
2016-01-09 13:32:03 -05:00
|
|
|
it_behaves_like "a user cannot unsubscribe through footer link"
|
2014-02-17 12:49:42 -05:00
|
|
|
|
2016-06-02 12:05:06 -04:00
|
|
|
it 'contains all the useful information' do
|
|
|
|
is_expected.to have_subject "Access to the #{project.name_with_namespace} project was granted"
|
2017-03-16 05:56:39 -04:00
|
|
|
is_expected.to have_html_escaped_body_text project.name_with_namespace
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text project.web_url
|
|
|
|
is_expected.to have_body_text project_member.human_access
|
2016-06-02 12:05:06 -04:00
|
|
|
end
|
2016-06-02 10:14:02 -04:00
|
|
|
end
|
2015-11-25 07:27:31 -05:00
|
|
|
|
2016-09-16 11:54:21 -04:00
|
|
|
def invite_to_project(project, inviter:)
|
|
|
|
create(
|
|
|
|
:project_member,
|
|
|
|
:developer,
|
|
|
|
project: project,
|
|
|
|
invite_token: '1234',
|
|
|
|
invite_email: 'toto@example.com',
|
|
|
|
user: nil,
|
|
|
|
created_by: inviter
|
2016-08-02 14:37:22 -04:00
|
|
|
)
|
2016-06-02 10:14:02 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
describe 'project invitation' do
|
|
|
|
let(:project) { create(:project) }
|
|
|
|
let(:master) { create(:user).tap { |u| project.team << [u, :master] } }
|
2016-09-16 11:54:21 -04:00
|
|
|
let(:project_member) { invite_to_project(project, inviter: master) }
|
2016-06-02 10:14:02 -04:00
|
|
|
|
|
|
|
subject { Notify.member_invited_email('project', project_member.id, project_member.invite_token) }
|
|
|
|
|
|
|
|
it_behaves_like 'an email sent from GitLab'
|
|
|
|
it_behaves_like 'it should not have Gmail Actions links'
|
|
|
|
it_behaves_like "a user cannot unsubscribe through footer link"
|
|
|
|
|
2016-06-02 12:05:06 -04:00
|
|
|
it 'contains all the useful information' do
|
|
|
|
is_expected.to have_subject "Invitation to join the #{project.name_with_namespace} project"
|
2017-03-16 05:56:39 -04:00
|
|
|
is_expected.to have_html_escaped_body_text project.name_with_namespace
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text project.web_url
|
|
|
|
is_expected.to have_body_text project_member.human_access
|
|
|
|
is_expected.to have_body_text project_member.invite_token
|
2016-06-02 12:05:06 -04:00
|
|
|
end
|
2016-06-02 10:14:02 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
describe 'project invitation accepted' do
|
|
|
|
let(:project) { create(:project) }
|
2016-09-16 11:54:21 -04:00
|
|
|
let(:invited_user) { create(:user, name: 'invited user') }
|
2016-06-02 10:14:02 -04:00
|
|
|
let(:master) { create(:user).tap { |u| project.team << [u, :master] } }
|
|
|
|
let(:project_member) do
|
2016-09-16 11:54:21 -04:00
|
|
|
invitee = invite_to_project(project, inviter: master)
|
2016-06-02 10:14:02 -04:00
|
|
|
invitee.accept_invite!(invited_user)
|
|
|
|
invitee
|
2012-08-26 17:13:03 -04:00
|
|
|
end
|
2015-11-25 07:27:31 -05:00
|
|
|
|
2016-06-02 10:14:02 -04:00
|
|
|
subject { Notify.member_invite_accepted_email('project', project_member.id) }
|
|
|
|
|
|
|
|
it_behaves_like 'an email sent from GitLab'
|
|
|
|
it_behaves_like 'it should not have Gmail Actions links'
|
|
|
|
it_behaves_like "a user cannot unsubscribe through footer link"
|
|
|
|
|
2016-06-02 12:05:06 -04:00
|
|
|
it 'contains all the useful information' do
|
|
|
|
is_expected.to have_subject 'Invitation accepted'
|
2017-03-16 05:56:39 -04:00
|
|
|
is_expected.to have_html_escaped_body_text project.name_with_namespace
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text project.web_url
|
|
|
|
is_expected.to have_body_text project_member.invite_email
|
2017-03-16 05:56:39 -04:00
|
|
|
is_expected.to have_html_escaped_body_text invited_user.name
|
2016-06-02 12:05:06 -04:00
|
|
|
end
|
2016-06-02 10:14:02 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
describe 'project invitation declined' do
|
|
|
|
let(:project) { create(:project) }
|
|
|
|
let(:master) { create(:user).tap { |u| project.team << [u, :master] } }
|
|
|
|
let(:project_member) do
|
2016-09-16 11:54:21 -04:00
|
|
|
invitee = invite_to_project(project, inviter: master)
|
2016-06-02 10:14:02 -04:00
|
|
|
invitee.decline_invite!
|
|
|
|
invitee
|
2012-08-26 17:13:03 -04:00
|
|
|
end
|
2016-06-02 10:14:02 -04:00
|
|
|
|
|
|
|
subject { Notify.member_invite_declined_email('project', project.id, project_member.invite_email, master.id) }
|
|
|
|
|
|
|
|
it_behaves_like 'an email sent from GitLab'
|
|
|
|
it_behaves_like 'it should not have Gmail Actions links'
|
|
|
|
it_behaves_like "a user cannot unsubscribe through footer link"
|
|
|
|
|
2016-06-02 12:05:06 -04:00
|
|
|
it 'contains all the useful information' do
|
|
|
|
is_expected.to have_subject 'Invitation declined'
|
2017-03-16 05:56:39 -04:00
|
|
|
is_expected.to have_html_escaped_body_text project.name_with_namespace
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text project.web_url
|
|
|
|
is_expected.to have_body_text project_member.invite_email
|
2016-06-02 12:05:06 -04:00
|
|
|
end
|
2012-08-26 17:13:03 -04:00
|
|
|
end
|
|
|
|
|
2012-05-14 18:03:30 -04:00
|
|
|
context 'items that are noteable, the email for a note' do
|
2012-11-05 22:31:55 -05:00
|
|
|
let(:note_author) { create(:user, name: 'author_name') }
|
|
|
|
let(:note) { create(:note, project: project, author: note_author) }
|
2012-05-14 18:03:30 -04:00
|
|
|
|
2016-08-23 01:36:30 -04:00
|
|
|
before :each do
|
|
|
|
allow(Note).to receive(:find).with(note.id).and_return(note)
|
2012-05-15 18:48:00 -04:00
|
|
|
end
|
|
|
|
|
2012-05-14 18:03:30 -04:00
|
|
|
shared_examples 'a note email' do
|
2015-11-25 07:27:31 -05:00
|
|
|
it_behaves_like 'it should have Gmail Actions links'
|
|
|
|
|
2014-02-17 12:49:42 -05:00
|
|
|
it 'is sent as the author' do
|
|
|
|
sender = subject.header[:from].addrs[0]
|
2015-02-12 13:17:35 -05:00
|
|
|
expect(sender.display_name).to eq(note_author.name)
|
|
|
|
expect(sender.address).to eq(gitlab_sender)
|
2014-02-17 12:49:42 -05:00
|
|
|
end
|
|
|
|
|
2012-05-14 18:03:30 -04:00
|
|
|
it 'is sent to the given recipient' do
|
2015-02-12 13:17:35 -05:00
|
|
|
is_expected.to deliver_to recipient.notification_email
|
2012-05-14 18:03:30 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains the message from the note' do
|
2017-03-16 05:56:39 -04:00
|
|
|
is_expected.to have_html_escaped_body_text note.note
|
2012-05-14 18:03:30 -04:00
|
|
|
end
|
2016-01-26 08:34:42 -05:00
|
|
|
|
2016-08-01 11:00:44 -04:00
|
|
|
it 'does not contain note author' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.not_to have_body_text 'wrote:'
|
2016-01-26 08:34:42 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'when enabled email_author_in_body' do
|
|
|
|
before do
|
2016-11-17 17:22:39 -05:00
|
|
|
stub_application_setting(email_author_in_body: true)
|
2016-01-26 08:34:42 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains a link to note author' do
|
2017-03-16 05:56:39 -04:00
|
|
|
is_expected.to have_html_escaped_body_text note.author_name
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text 'wrote:'
|
2016-01-26 08:34:42 -05:00
|
|
|
end
|
|
|
|
end
|
2012-05-14 18:03:30 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
describe 'on a commit' do
|
2015-04-21 09:13:40 -04:00
|
|
|
let(:commit) { project.commit }
|
2013-01-15 09:36:35 -05:00
|
|
|
|
2015-02-12 13:17:35 -05:00
|
|
|
before(:each) { allow(note).to receive(:noteable).and_return(commit) }
|
2012-05-14 18:03:30 -04:00
|
|
|
|
2013-02-01 08:37:21 -05:00
|
|
|
subject { Notify.note_commit_email(recipient.id, note.id) }
|
2012-05-14 18:03:30 -04:00
|
|
|
|
|
|
|
it_behaves_like 'a note email'
|
2016-03-17 15:03:51 -04:00
|
|
|
it_behaves_like 'an answer to an existing thread with reply-by-email enabled' do
|
|
|
|
let(:model) { commit }
|
|
|
|
end
|
2015-11-25 07:59:03 -05:00
|
|
|
it_behaves_like 'it should show Gmail Actions View Commit link'
|
2016-03-17 15:03:51 -04:00
|
|
|
it_behaves_like 'a user cannot unsubscribe through footer link'
|
2012-05-14 18:03:30 -04:00
|
|
|
|
|
|
|
it 'has the correct subject' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_subject "Re: #{project.name} | #{commit.title.strip} (#{commit.short_id})"
|
2012-05-14 18:03:30 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains a link to the commit' do
|
2015-02-12 13:17:35 -05:00
|
|
|
is_expected.to have_body_text commit.short_id
|
2012-05-14 18:03:30 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'on a merge request' do
|
2013-04-25 10:15:33 -04:00
|
|
|
let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
|
2015-01-24 13:02:58 -05:00
|
|
|
let(:note_on_merge_request_path) { namespace_project_merge_request_path(project.namespace, project, merge_request, anchor: "note_#{note.id}") }
|
2015-02-12 13:17:35 -05:00
|
|
|
before(:each) { allow(note).to receive(:noteable).and_return(merge_request) }
|
2012-05-14 18:03:30 -04:00
|
|
|
|
2012-05-15 18:48:00 -04:00
|
|
|
subject { Notify.note_merge_request_email(recipient.id, note.id) }
|
2016-11-23 11:25:31 -05:00
|
|
|
|
2012-05-14 18:03:30 -04:00
|
|
|
it_behaves_like 'a note email'
|
2016-03-17 15:03:51 -04:00
|
|
|
it_behaves_like 'an answer to an existing thread with reply-by-email enabled' do
|
|
|
|
let(:model) { merge_request }
|
|
|
|
end
|
2015-11-25 07:59:03 -05:00
|
|
|
it_behaves_like 'it should show Gmail Actions View Merge request link'
|
2015-12-09 05:59:25 -05:00
|
|
|
it_behaves_like 'an unsubscribeable thread'
|
2012-05-14 18:03:30 -04:00
|
|
|
|
|
|
|
it 'has the correct subject' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_referable_subject(merge_request, reply: true)
|
2012-05-14 18:03:30 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains a link to the merge request note' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text note_on_merge_request_path
|
2012-05-14 18:03:30 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'on an issue' do
|
2012-11-05 22:31:55 -05:00
|
|
|
let(:issue) { create(:issue, project: project) }
|
2015-01-24 13:02:58 -05:00
|
|
|
let(:note_on_issue_path) { namespace_project_issue_path(project.namespace, project, issue, anchor: "note_#{note.id}") }
|
2015-02-12 13:17:35 -05:00
|
|
|
before(:each) { allow(note).to receive(:noteable).and_return(issue) }
|
2012-05-15 18:50:36 -04:00
|
|
|
|
|
|
|
subject { Notify.note_issue_email(recipient.id, note.id) }
|
2012-05-14 18:03:30 -04:00
|
|
|
|
|
|
|
it_behaves_like 'a note email'
|
2016-03-17 15:03:51 -04:00
|
|
|
it_behaves_like 'an answer to an existing thread with reply-by-email enabled' do
|
|
|
|
let(:model) { issue }
|
|
|
|
end
|
2015-11-25 07:59:03 -05:00
|
|
|
it_behaves_like 'it should show Gmail Actions View Issue link'
|
2015-12-09 05:59:25 -05:00
|
|
|
it_behaves_like 'an unsubscribeable thread'
|
2012-05-14 18:03:30 -04:00
|
|
|
|
|
|
|
it 'has the correct subject' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_referable_subject(issue, reply: true)
|
2012-05-14 18:03:30 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains a link to the issue note' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text note_on_issue_path
|
2012-05-14 18:03:30 -04:00
|
|
|
end
|
|
|
|
end
|
2012-05-14 14:05:32 -04:00
|
|
|
end
|
Change diff highlight/truncate for reusability
Previously the `truncated_diff_lines` method for outputting a discussion diff took in already highlighted lines, which meant it wasn't reuseable for truncating ANY lines. In the way it was used, it also meant that for any email truncation, the whole diff was being highlighted before being truncated, meaning wasted time highlighting lines that wouldn't even be used (granted, they were being memoized, so perhaps this wasn't that great of an issue). I refactored truncation away from highlighting, in order to truncate formatted diffs for text templates in email, using `>`s to designate each line, but otherwise retaining the parsing already done to create `diff_lines`.
Additionally, while notes on merge requests or commits had already been tested, there was no existing test for notes on a diff on an MR or commit. Added mailer tests for such, and a unit test for truncating diff lines.
2016-08-25 12:38:07 -04:00
|
|
|
|
|
|
|
context 'items that are noteable, emails for a note on a diff' do
|
|
|
|
let(:note_author) { create(:user, name: 'author_name') }
|
|
|
|
|
|
|
|
before :each do
|
|
|
|
allow(Note).to receive(:find).with(note.id).and_return(note)
|
|
|
|
end
|
|
|
|
|
2016-09-03 00:25:53 -04:00
|
|
|
shared_examples 'a note email on a diff' do |model|
|
Change diff highlight/truncate for reusability
Previously the `truncated_diff_lines` method for outputting a discussion diff took in already highlighted lines, which meant it wasn't reuseable for truncating ANY lines. In the way it was used, it also meant that for any email truncation, the whole diff was being highlighted before being truncated, meaning wasted time highlighting lines that wouldn't even be used (granted, they were being memoized, so perhaps this wasn't that great of an issue). I refactored truncation away from highlighting, in order to truncate formatted diffs for text templates in email, using `>`s to designate each line, but otherwise retaining the parsing already done to create `diff_lines`.
Additionally, while notes on merge requests or commits had already been tested, there was no existing test for notes on a diff on an MR or commit. Added mailer tests for such, and a unit test for truncating diff lines.
2016-08-25 12:38:07 -04:00
|
|
|
let(:note) { create(model, project: project, author: note_author) }
|
|
|
|
|
|
|
|
it "includes diffs with character-level highlighting" do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text '<span class="p">}</span></span>'
|
Change diff highlight/truncate for reusability
Previously the `truncated_diff_lines` method for outputting a discussion diff took in already highlighted lines, which meant it wasn't reuseable for truncating ANY lines. In the way it was used, it also meant that for any email truncation, the whole diff was being highlighted before being truncated, meaning wasted time highlighting lines that wouldn't even be used (granted, they were being memoized, so perhaps this wasn't that great of an issue). I refactored truncation away from highlighting, in order to truncate formatted diffs for text templates in email, using `>`s to designate each line, but otherwise retaining the parsing already done to create `diff_lines`.
Additionally, while notes on merge requests or commits had already been tested, there was no existing test for notes on a diff on an MR or commit. Added mailer tests for such, and a unit test for truncating diff lines.
2016-08-25 12:38:07 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains a link to the diff file' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text note.diff_file.file_path
|
Change diff highlight/truncate for reusability
Previously the `truncated_diff_lines` method for outputting a discussion diff took in already highlighted lines, which meant it wasn't reuseable for truncating ANY lines. In the way it was used, it also meant that for any email truncation, the whole diff was being highlighted before being truncated, meaning wasted time highlighting lines that wouldn't even be used (granted, they were being memoized, so perhaps this wasn't that great of an issue). I refactored truncation away from highlighting, in order to truncate formatted diffs for text templates in email, using `>`s to designate each line, but otherwise retaining the parsing already done to create `diff_lines`.
Additionally, while notes on merge requests or commits had already been tested, there was no existing test for notes on a diff on an MR or commit. Added mailer tests for such, and a unit test for truncating diff lines.
2016-08-25 12:38:07 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it_behaves_like 'it should have Gmail Actions links'
|
|
|
|
|
|
|
|
it 'is sent as the author' do
|
|
|
|
sender = subject.header[:from].addrs[0]
|
|
|
|
expect(sender.display_name).to eq(note_author.name)
|
|
|
|
expect(sender.address).to eq(gitlab_sender)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'is sent to the given recipient' do
|
|
|
|
is_expected.to deliver_to recipient.notification_email
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains the message from the note' do
|
2017-03-16 05:56:39 -04:00
|
|
|
is_expected.to have_html_escaped_body_text note.note
|
Change diff highlight/truncate for reusability
Previously the `truncated_diff_lines` method for outputting a discussion diff took in already highlighted lines, which meant it wasn't reuseable for truncating ANY lines. In the way it was used, it also meant that for any email truncation, the whole diff was being highlighted before being truncated, meaning wasted time highlighting lines that wouldn't even be used (granted, they were being memoized, so perhaps this wasn't that great of an issue). I refactored truncation away from highlighting, in order to truncate formatted diffs for text templates in email, using `>`s to designate each line, but otherwise retaining the parsing already done to create `diff_lines`.
Additionally, while notes on merge requests or commits had already been tested, there was no existing test for notes on a diff on an MR or commit. Added mailer tests for such, and a unit test for truncating diff lines.
2016-08-25 12:38:07 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'does not contain note author' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.not_to have_body_text 'wrote:'
|
Change diff highlight/truncate for reusability
Previously the `truncated_diff_lines` method for outputting a discussion diff took in already highlighted lines, which meant it wasn't reuseable for truncating ANY lines. In the way it was used, it also meant that for any email truncation, the whole diff was being highlighted before being truncated, meaning wasted time highlighting lines that wouldn't even be used (granted, they were being memoized, so perhaps this wasn't that great of an issue). I refactored truncation away from highlighting, in order to truncate formatted diffs for text templates in email, using `>`s to designate each line, but otherwise retaining the parsing already done to create `diff_lines`.
Additionally, while notes on merge requests or commits had already been tested, there was no existing test for notes on a diff on an MR or commit. Added mailer tests for such, and a unit test for truncating diff lines.
2016-08-25 12:38:07 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'when enabled email_author_in_body' do
|
|
|
|
before do
|
2016-11-17 17:22:39 -05:00
|
|
|
stub_application_setting(email_author_in_body: true)
|
Change diff highlight/truncate for reusability
Previously the `truncated_diff_lines` method for outputting a discussion diff took in already highlighted lines, which meant it wasn't reuseable for truncating ANY lines. In the way it was used, it also meant that for any email truncation, the whole diff was being highlighted before being truncated, meaning wasted time highlighting lines that wouldn't even be used (granted, they were being memoized, so perhaps this wasn't that great of an issue). I refactored truncation away from highlighting, in order to truncate formatted diffs for text templates in email, using `>`s to designate each line, but otherwise retaining the parsing already done to create `diff_lines`.
Additionally, while notes on merge requests or commits had already been tested, there was no existing test for notes on a diff on an MR or commit. Added mailer tests for such, and a unit test for truncating diff lines.
2016-08-25 12:38:07 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains a link to note author' do
|
2017-03-16 05:56:39 -04:00
|
|
|
is_expected.to have_html_escaped_body_text note.author_name
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text 'wrote:'
|
Change diff highlight/truncate for reusability
Previously the `truncated_diff_lines` method for outputting a discussion diff took in already highlighted lines, which meant it wasn't reuseable for truncating ANY lines. In the way it was used, it also meant that for any email truncation, the whole diff was being highlighted before being truncated, meaning wasted time highlighting lines that wouldn't even be used (granted, they were being memoized, so perhaps this wasn't that great of an issue). I refactored truncation away from highlighting, in order to truncate formatted diffs for text templates in email, using `>`s to designate each line, but otherwise retaining the parsing already done to create `diff_lines`.
Additionally, while notes on merge requests or commits had already been tested, there was no existing test for notes on a diff on an MR or commit. Added mailer tests for such, and a unit test for truncating diff lines.
2016-08-25 12:38:07 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'on a commit' do
|
|
|
|
let(:commit) { project.commit }
|
|
|
|
let(:note) { create(:diff_note_on_commit) }
|
|
|
|
|
|
|
|
subject { Notify.note_commit_email(recipient.id, note.id) }
|
|
|
|
|
|
|
|
it_behaves_like 'a note email on a diff', :diff_note_on_commit
|
|
|
|
it_behaves_like 'it should show Gmail Actions View Commit link'
|
|
|
|
it_behaves_like 'a user cannot unsubscribe through footer link'
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'on a merge request' do
|
|
|
|
let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
|
|
|
|
let(:note) { create(:diff_note_on_merge_request) }
|
|
|
|
|
|
|
|
subject { Notify.note_merge_request_email(recipient.id, note.id) }
|
|
|
|
|
|
|
|
it_behaves_like 'a note email on a diff', :diff_note_on_merge_request
|
|
|
|
it_behaves_like 'it should show Gmail Actions View Merge request link'
|
|
|
|
it_behaves_like 'an unsubscribeable thread'
|
|
|
|
end
|
|
|
|
end
|
2012-05-14 14:05:32 -04:00
|
|
|
end
|
2013-09-12 12:00:32 -04:00
|
|
|
|
2016-06-02 10:14:02 -04:00
|
|
|
context 'for a group' do
|
|
|
|
describe 'group access requested' do
|
2016-11-11 07:51:50 -05:00
|
|
|
let(:group) { create(:group, :public, :access_requestable) }
|
2016-06-02 10:14:02 -04:00
|
|
|
let(:user) { create(:user) }
|
|
|
|
let(:group_member) do
|
|
|
|
group.request_access(user)
|
2016-06-27 10:20:57 -04:00
|
|
|
group.requesters.find_by(user_id: user.id)
|
2016-06-02 10:14:02 -04:00
|
|
|
end
|
|
|
|
subject { Notify.member_access_requested_email('group', group_member.id) }
|
2016-04-18 12:53:32 -04:00
|
|
|
|
2016-06-02 10:14:02 -04:00
|
|
|
it_behaves_like 'an email sent from GitLab'
|
|
|
|
it_behaves_like 'it should not have Gmail Actions links'
|
|
|
|
it_behaves_like "a user cannot unsubscribe through footer link"
|
2016-04-18 12:53:32 -04:00
|
|
|
|
2016-06-02 12:05:06 -04:00
|
|
|
it 'contains all the useful information' do
|
|
|
|
is_expected.to have_subject "Request to join the #{group.name} group"
|
2017-03-16 05:56:39 -04:00
|
|
|
is_expected.to have_html_escaped_body_text group.name
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text group_group_members_url(group)
|
|
|
|
is_expected.to have_body_text group_member.human_access
|
2016-06-02 12:05:06 -04:00
|
|
|
end
|
2016-04-18 12:53:32 -04:00
|
|
|
end
|
|
|
|
|
2016-06-02 10:14:02 -04:00
|
|
|
describe 'group access denied' do
|
|
|
|
let(:group) { create(:group) }
|
|
|
|
let(:user) { create(:user) }
|
|
|
|
let(:group_member) do
|
|
|
|
group.request_access(user)
|
2016-06-27 10:20:57 -04:00
|
|
|
group.requesters.find_by(user_id: user.id)
|
2016-06-02 10:14:02 -04:00
|
|
|
end
|
|
|
|
subject { Notify.member_access_denied_email('group', group.id, user.id) }
|
2016-04-18 12:53:32 -04:00
|
|
|
|
2016-06-02 10:14:02 -04:00
|
|
|
it_behaves_like 'an email sent from GitLab'
|
|
|
|
it_behaves_like 'it should not have Gmail Actions links'
|
|
|
|
it_behaves_like "a user cannot unsubscribe through footer link"
|
2016-04-18 12:53:32 -04:00
|
|
|
|
2016-06-02 12:05:06 -04:00
|
|
|
it 'contains all the useful information' do
|
|
|
|
is_expected.to have_subject "Access to the #{group.name} group was denied"
|
2017-03-16 05:56:39 -04:00
|
|
|
is_expected.to have_html_escaped_body_text group.name
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text group.web_url
|
2016-06-02 12:05:06 -04:00
|
|
|
end
|
2016-04-18 12:53:32 -04:00
|
|
|
end
|
|
|
|
|
2016-06-02 10:14:02 -04:00
|
|
|
describe 'group access changed' do
|
|
|
|
let(:group) { create(:group) }
|
|
|
|
let(:user) { create(:user) }
|
|
|
|
let(:group_member) { create(:group_member, group: group, user: user) }
|
2016-04-18 12:53:32 -04:00
|
|
|
|
2016-06-02 10:14:02 -04:00
|
|
|
subject { Notify.member_access_granted_email('group', group_member.id) }
|
|
|
|
|
|
|
|
it_behaves_like 'an email sent from GitLab'
|
|
|
|
it_behaves_like 'it should not have Gmail Actions links'
|
|
|
|
it_behaves_like "a user cannot unsubscribe through footer link"
|
|
|
|
|
2016-06-02 12:05:06 -04:00
|
|
|
it 'contains all the useful information' do
|
|
|
|
is_expected.to have_subject "Access to the #{group.name} group was granted"
|
2017-03-16 05:56:39 -04:00
|
|
|
is_expected.to have_html_escaped_body_text group.name
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text group.web_url
|
|
|
|
is_expected.to have_body_text group_member.human_access
|
2016-06-02 12:05:06 -04:00
|
|
|
end
|
2016-04-18 12:53:32 -04:00
|
|
|
end
|
|
|
|
|
2016-09-16 11:54:21 -04:00
|
|
|
def invite_to_group(group, inviter:)
|
|
|
|
create(
|
|
|
|
:group_member,
|
|
|
|
:developer,
|
|
|
|
group: group,
|
|
|
|
invite_token: '1234',
|
|
|
|
invite_email: 'toto@example.com',
|
|
|
|
user: nil,
|
|
|
|
created_by: inviter
|
2016-08-02 14:37:22 -04:00
|
|
|
)
|
2016-04-18 12:53:32 -04:00
|
|
|
end
|
|
|
|
|
2016-06-02 10:14:02 -04:00
|
|
|
describe 'group invitation' do
|
|
|
|
let(:group) { create(:group) }
|
|
|
|
let(:owner) { create(:user).tap { |u| group.add_user(u, Gitlab::Access::OWNER) } }
|
2016-09-16 11:54:21 -04:00
|
|
|
let(:group_member) { invite_to_group(group, inviter: owner) }
|
2013-09-12 12:00:32 -04:00
|
|
|
|
2016-06-02 10:14:02 -04:00
|
|
|
subject { Notify.member_invited_email('group', group_member.id, group_member.invite_token) }
|
2013-09-12 12:00:32 -04:00
|
|
|
|
2016-06-02 10:14:02 -04:00
|
|
|
it_behaves_like 'an email sent from GitLab'
|
|
|
|
it_behaves_like 'it should not have Gmail Actions links'
|
|
|
|
it_behaves_like "a user cannot unsubscribe through footer link"
|
2014-02-17 12:49:42 -05:00
|
|
|
|
2016-06-02 12:05:06 -04:00
|
|
|
it 'contains all the useful information' do
|
|
|
|
is_expected.to have_subject "Invitation to join the #{group.name} group"
|
2017-03-16 05:56:39 -04:00
|
|
|
is_expected.to have_html_escaped_body_text group.name
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text group.web_url
|
|
|
|
is_expected.to have_body_text group_member.human_access
|
|
|
|
is_expected.to have_body_text group_member.invite_token
|
2016-06-02 12:05:06 -04:00
|
|
|
end
|
2013-09-12 12:00:32 -04:00
|
|
|
end
|
|
|
|
|
2016-06-02 10:14:02 -04:00
|
|
|
describe 'group invitation accepted' do
|
|
|
|
let(:group) { create(:group) }
|
2016-09-16 11:54:21 -04:00
|
|
|
let(:invited_user) { create(:user, name: 'invited user') }
|
2016-06-02 10:14:02 -04:00
|
|
|
let(:owner) { create(:user).tap { |u| group.add_user(u, Gitlab::Access::OWNER) } }
|
|
|
|
let(:group_member) do
|
2016-09-16 11:54:21 -04:00
|
|
|
invitee = invite_to_group(group, inviter: owner)
|
2016-06-02 10:14:02 -04:00
|
|
|
invitee.accept_invite!(invited_user)
|
|
|
|
invitee
|
|
|
|
end
|
|
|
|
|
|
|
|
subject { Notify.member_invite_accepted_email('group', group_member.id) }
|
|
|
|
|
|
|
|
it_behaves_like 'an email sent from GitLab'
|
|
|
|
it_behaves_like 'it should not have Gmail Actions links'
|
|
|
|
it_behaves_like "a user cannot unsubscribe through footer link"
|
|
|
|
|
2016-06-02 12:05:06 -04:00
|
|
|
it 'contains all the useful information' do
|
|
|
|
is_expected.to have_subject 'Invitation accepted'
|
2017-03-16 05:56:39 -04:00
|
|
|
is_expected.to have_html_escaped_body_text group.name
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text group.web_url
|
|
|
|
is_expected.to have_body_text group_member.invite_email
|
2017-03-16 05:56:39 -04:00
|
|
|
is_expected.to have_html_escaped_body_text invited_user.name
|
2016-06-02 12:05:06 -04:00
|
|
|
end
|
2013-09-12 12:00:32 -04:00
|
|
|
end
|
|
|
|
|
2016-06-02 10:14:02 -04:00
|
|
|
describe 'group invitation declined' do
|
|
|
|
let(:group) { create(:group) }
|
|
|
|
let(:owner) { create(:user).tap { |u| group.add_user(u, Gitlab::Access::OWNER) } }
|
|
|
|
let(:group_member) do
|
2016-09-16 11:54:21 -04:00
|
|
|
invitee = invite_to_group(group, inviter: owner)
|
2016-06-02 10:14:02 -04:00
|
|
|
invitee.decline_invite!
|
|
|
|
invitee
|
|
|
|
end
|
|
|
|
|
|
|
|
subject { Notify.member_invite_declined_email('group', group.id, group_member.invite_email, owner.id) }
|
|
|
|
|
|
|
|
it_behaves_like 'an email sent from GitLab'
|
|
|
|
it_behaves_like 'it should not have Gmail Actions links'
|
|
|
|
it_behaves_like "a user cannot unsubscribe through footer link"
|
|
|
|
|
2016-06-02 12:05:06 -04:00
|
|
|
it 'contains all the useful information' do
|
|
|
|
is_expected.to have_subject 'Invitation declined'
|
2017-03-16 05:56:39 -04:00
|
|
|
is_expected.to have_html_escaped_body_text group.name
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text group.web_url
|
|
|
|
is_expected.to have_body_text group_member.invite_email
|
2016-06-02 12:05:06 -04:00
|
|
|
end
|
2013-09-12 12:00:32 -04:00
|
|
|
end
|
|
|
|
end
|
2013-11-08 11:29:26 -05:00
|
|
|
|
|
|
|
describe 'confirmation if email changed' do
|
|
|
|
let(:example_site_path) { root_path }
|
|
|
|
let(:user) { create(:user, email: 'old-email@mail.com') }
|
|
|
|
|
|
|
|
before do
|
2016-09-30 05:46:37 -04:00
|
|
|
stub_config_setting(email_subject_suffix: 'A Nice Suffix')
|
2015-12-03 03:33:38 -05:00
|
|
|
perform_enqueued_jobs do
|
|
|
|
user.email = "new-email@mail.com"
|
|
|
|
user.save
|
|
|
|
end
|
2013-11-08 11:29:26 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
subject { ActionMailer::Base.deliveries.last }
|
|
|
|
|
2014-02-17 12:49:42 -05:00
|
|
|
it_behaves_like 'an email sent from GitLab'
|
2016-01-09 13:32:03 -05:00
|
|
|
it_behaves_like "a user cannot unsubscribe through footer link"
|
2014-02-17 12:49:42 -05:00
|
|
|
|
2013-11-08 11:29:26 -05:00
|
|
|
it 'is sent to the new user' do
|
2015-02-12 13:17:35 -05:00
|
|
|
is_expected.to deliver_to 'new-email@mail.com'
|
2013-11-08 11:29:26 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'has the correct subject' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_subject 'Confirmation instructions | A Nice Suffix'
|
2013-11-08 11:29:26 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'includes a link to the site' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text example_site_path
|
2013-11-08 11:29:26 -05:00
|
|
|
end
|
|
|
|
end
|
2013-12-18 06:30:04 -05:00
|
|
|
|
2015-03-17 08:55:39 -04:00
|
|
|
describe 'email on push for a created branch' do
|
|
|
|
let(:example_site_path) { root_path }
|
|
|
|
let(:user) { create(:user) }
|
|
|
|
let(:tree_path) { namespace_project_tree_path(project.namespace, project, "master") }
|
|
|
|
|
2016-05-06 08:16:53 -04:00
|
|
|
subject { Notify.repository_push_email(project.id, author_id: user.id, ref: 'refs/heads/master', action: :create) }
|
2015-03-17 08:55:39 -04:00
|
|
|
|
2015-11-25 07:27:31 -05:00
|
|
|
it_behaves_like 'it should not have Gmail Actions links'
|
2016-07-13 19:56:54 -04:00
|
|
|
it_behaves_like 'a user cannot unsubscribe through footer link'
|
2015-12-19 14:04:40 -05:00
|
|
|
it_behaves_like 'an email with X-GitLab headers containing project details'
|
|
|
|
it_behaves_like 'an email that contains a header with author username'
|
2015-11-25 07:27:31 -05:00
|
|
|
|
2015-03-17 08:55:39 -04:00
|
|
|
it 'is sent as the author' do
|
|
|
|
sender = subject.header[:from].addrs[0]
|
|
|
|
expect(sender.display_name).to eq(user.name)
|
|
|
|
expect(sender.address).to eq(gitlab_sender)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'has the correct subject' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_subject "[Git][#{project.full_path}] Pushed new branch master"
|
2015-03-17 08:55:39 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains a link to the branch' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text tree_path
|
2015-03-17 08:55:39 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'email on push for a created tag' do
|
|
|
|
let(:example_site_path) { root_path }
|
|
|
|
let(:user) { create(:user) }
|
|
|
|
let(:tree_path) { namespace_project_tree_path(project.namespace, project, "v1.0") }
|
|
|
|
|
2016-05-06 08:16:53 -04:00
|
|
|
subject { Notify.repository_push_email(project.id, author_id: user.id, ref: 'refs/tags/v1.0', action: :create) }
|
2015-03-17 08:55:39 -04:00
|
|
|
|
2015-11-25 07:27:31 -05:00
|
|
|
it_behaves_like 'it should not have Gmail Actions links'
|
2016-01-09 13:32:03 -05:00
|
|
|
it_behaves_like "a user cannot unsubscribe through footer link"
|
2015-12-19 14:04:40 -05:00
|
|
|
it_behaves_like 'an email with X-GitLab headers containing project details'
|
|
|
|
it_behaves_like 'an email that contains a header with author username'
|
2015-11-25 07:27:31 -05:00
|
|
|
|
2015-03-17 08:55:39 -04:00
|
|
|
it 'is sent as the author' do
|
|
|
|
sender = subject.header[:from].addrs[0]
|
|
|
|
expect(sender.display_name).to eq(user.name)
|
|
|
|
expect(sender.address).to eq(gitlab_sender)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'has the correct subject' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_subject "[Git][#{project.full_path}] Pushed new tag v1.0"
|
2015-03-17 08:55:39 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains a link to the tag' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text tree_path
|
2015-03-17 08:55:39 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'email on push for a deleted branch' do
|
|
|
|
let(:example_site_path) { root_path }
|
|
|
|
let(:user) { create(:user) }
|
|
|
|
|
2016-05-06 08:16:53 -04:00
|
|
|
subject { Notify.repository_push_email(project.id, author_id: user.id, ref: 'refs/heads/master', action: :delete) }
|
2015-03-17 08:55:39 -04:00
|
|
|
|
2015-11-25 07:27:31 -05:00
|
|
|
it_behaves_like 'it should not have Gmail Actions links'
|
2016-07-13 19:56:54 -04:00
|
|
|
it_behaves_like 'a user cannot unsubscribe through footer link'
|
2015-12-19 14:04:40 -05:00
|
|
|
it_behaves_like 'an email with X-GitLab headers containing project details'
|
|
|
|
it_behaves_like 'an email that contains a header with author username'
|
2015-11-25 07:27:31 -05:00
|
|
|
|
2015-03-17 08:55:39 -04:00
|
|
|
it 'is sent as the author' do
|
|
|
|
sender = subject.header[:from].addrs[0]
|
|
|
|
expect(sender.display_name).to eq(user.name)
|
|
|
|
expect(sender.address).to eq(gitlab_sender)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'has the correct subject' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_subject "[Git][#{project.full_path}] Deleted branch master"
|
2015-03-17 08:55:39 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'email on push for a deleted tag' do
|
|
|
|
let(:example_site_path) { root_path }
|
|
|
|
let(:user) { create(:user) }
|
|
|
|
|
2016-05-06 08:16:53 -04:00
|
|
|
subject { Notify.repository_push_email(project.id, author_id: user.id, ref: 'refs/tags/v1.0', action: :delete) }
|
2015-03-17 08:55:39 -04:00
|
|
|
|
2015-11-25 07:27:31 -05:00
|
|
|
it_behaves_like 'it should not have Gmail Actions links'
|
2016-07-13 19:56:54 -04:00
|
|
|
it_behaves_like 'a user cannot unsubscribe through footer link'
|
2015-12-19 14:04:40 -05:00
|
|
|
it_behaves_like 'an email with X-GitLab headers containing project details'
|
|
|
|
it_behaves_like 'an email that contains a header with author username'
|
2015-11-25 07:27:31 -05:00
|
|
|
|
2015-03-17 08:55:39 -04:00
|
|
|
it 'is sent as the author' do
|
|
|
|
sender = subject.header[:from].addrs[0]
|
|
|
|
expect(sender.display_name).to eq(user.name)
|
|
|
|
expect(sender.address).to eq(gitlab_sender)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'has the correct subject' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_subject "[Git][#{project.full_path}] Deleted tag v1.0"
|
2015-03-17 08:55:39 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2014-04-10 12:41:20 -04:00
|
|
|
describe 'email on push with multiple commits' do
|
2013-12-18 06:30:04 -05:00
|
|
|
let(:example_site_path) { root_path }
|
|
|
|
let(:user) { create(:user) }
|
2016-07-27 07:09:52 -04:00
|
|
|
let(:raw_compare) { Gitlab::Git::Compare.new(project.repository.raw_repository, sample_image_commit.id, sample_commit.id) }
|
|
|
|
let(:compare) { Compare.decorate(raw_compare, project) }
|
|
|
|
let(:commits) { compare.commits }
|
2015-04-21 09:09:15 -04:00
|
|
|
let(:diff_path) { namespace_project_compare_path(project.namespace, project, from: Commit.new(compare.base, project), to: Commit.new(compare.head, project)) }
|
2015-02-25 08:05:45 -05:00
|
|
|
let(:send_from_committer_email) { false }
|
2016-06-20 12:51:48 -04:00
|
|
|
let(:diff_refs) { Gitlab::Diff::DiffRefs.new(base_sha: project.merge_base_commit(sample_image_commit.id, sample_commit.id).id, head_sha: sample_commit.id) }
|
2013-12-18 06:30:04 -05:00
|
|
|
|
2016-05-12 11:06:14 -04:00
|
|
|
subject { Notify.repository_push_email(project.id, author_id: user.id, ref: 'refs/heads/master', action: :push, compare: compare, reverse_compare: false, diff_refs: diff_refs, send_from_committer_email: send_from_committer_email) }
|
2013-12-18 06:30:04 -05:00
|
|
|
|
2015-11-25 07:27:31 -05:00
|
|
|
it_behaves_like 'it should not have Gmail Actions links'
|
2016-07-13 19:56:54 -04:00
|
|
|
it_behaves_like 'a user cannot unsubscribe through footer link'
|
2015-12-19 14:04:40 -05:00
|
|
|
it_behaves_like 'an email with X-GitLab headers containing project details'
|
|
|
|
it_behaves_like 'an email that contains a header with author username'
|
2015-11-25 07:27:31 -05:00
|
|
|
|
2014-02-17 12:49:42 -05:00
|
|
|
it 'is sent as the author' do
|
|
|
|
sender = subject.header[:from].addrs[0]
|
2015-02-12 13:17:35 -05:00
|
|
|
expect(sender.display_name).to eq(user.name)
|
|
|
|
expect(sender.address).to eq(gitlab_sender)
|
2014-02-17 12:49:42 -05:00
|
|
|
end
|
|
|
|
|
2013-12-18 06:30:04 -05:00
|
|
|
it 'has the correct subject' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_subject "[Git][#{project.full_path}][master] #{commits.length} commits: Ruby files modified"
|
2013-12-18 06:30:04 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'includes commits list' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text 'Change some files'
|
2013-12-18 06:30:04 -05:00
|
|
|
end
|
|
|
|
|
2016-05-12 11:06:14 -04:00
|
|
|
it 'includes diffs with character-level highlighting' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text 'def</span> <span class="nf">archive_formats_regex'
|
2013-12-18 06:30:04 -05:00
|
|
|
end
|
2014-02-18 05:12:01 -05:00
|
|
|
|
|
|
|
it 'contains a link to the diff' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text diff_path
|
2014-02-18 05:12:01 -05:00
|
|
|
end
|
2015-02-20 11:44:13 -05:00
|
|
|
|
2016-05-12 11:06:14 -04:00
|
|
|
it 'does not contain the misleading footer' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.not_to have_body_text 'you are a member of'
|
2015-02-20 11:44:13 -05:00
|
|
|
end
|
2015-02-25 08:05:45 -05:00
|
|
|
|
|
|
|
context "when set to send from committer email if domain matches" do
|
|
|
|
let(:send_from_committer_email) { true }
|
|
|
|
|
2015-02-25 09:49:40 -05:00
|
|
|
before do
|
|
|
|
allow(Gitlab.config.gitlab).to receive(:host).and_return("gitlab.corp.company.com")
|
|
|
|
end
|
|
|
|
|
|
|
|
context "when the committer email domain is within the GitLab domain" do
|
2015-02-25 08:05:45 -05:00
|
|
|
before do
|
2015-02-25 09:49:40 -05:00
|
|
|
user.update_attribute(:email, "user@company.com")
|
2015-09-19 21:15:13 -04:00
|
|
|
user.confirm
|
2015-02-25 08:05:45 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
it "is sent from the committer email" do
|
|
|
|
sender = subject.header[:from].addrs[0]
|
|
|
|
expect(sender.address).to eq(user.email)
|
|
|
|
end
|
2015-04-14 06:52:33 -04:00
|
|
|
|
|
|
|
it "is set to reply to the committer email" do
|
|
|
|
sender = subject.header[:reply_to].addrs[0]
|
|
|
|
expect(sender.address).to eq(user.email)
|
|
|
|
end
|
2015-02-25 08:05:45 -05:00
|
|
|
end
|
|
|
|
|
2015-02-25 09:49:40 -05:00
|
|
|
context "when the committer email domain is not completely within the GitLab domain" do
|
|
|
|
before do
|
|
|
|
user.update_attribute(:email, "user@something.company.com")
|
2015-09-19 21:15:13 -04:00
|
|
|
user.confirm
|
2015-02-25 09:49:40 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
it "is sent from the default email" do
|
|
|
|
sender = subject.header[:from].addrs[0]
|
|
|
|
expect(sender.address).to eq(gitlab_sender)
|
|
|
|
end
|
2015-04-14 06:52:33 -04:00
|
|
|
|
|
|
|
it "is set to reply to the default email" do
|
|
|
|
sender = subject.header[:reply_to].addrs[0]
|
|
|
|
expect(sender.address).to eq(gitlab_sender_reply_to)
|
|
|
|
end
|
2015-02-25 09:49:40 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
context "when the committer email domain is outside the GitLab domain" do
|
|
|
|
before do
|
|
|
|
user.update_attribute(:email, "user@mpany.com")
|
2015-09-19 21:15:13 -04:00
|
|
|
user.confirm
|
2015-02-25 09:49:40 -05:00
|
|
|
end
|
2015-02-25 08:05:45 -05:00
|
|
|
|
|
|
|
it "is sent from the default email" do
|
|
|
|
sender = subject.header[:from].addrs[0]
|
|
|
|
expect(sender.address).to eq(gitlab_sender)
|
|
|
|
end
|
2015-04-14 06:52:33 -04:00
|
|
|
|
|
|
|
it "is set to reply to the default email" do
|
|
|
|
sender = subject.header[:reply_to].addrs[0]
|
|
|
|
expect(sender.address).to eq(gitlab_sender_reply_to)
|
|
|
|
end
|
2015-02-25 08:05:45 -05:00
|
|
|
end
|
|
|
|
end
|
2013-12-18 06:30:04 -05:00
|
|
|
end
|
2014-04-10 12:41:20 -04:00
|
|
|
|
|
|
|
describe 'email on push with a single commit' do
|
|
|
|
let(:example_site_path) { root_path }
|
|
|
|
let(:user) { create(:user) }
|
2016-07-27 07:09:52 -04:00
|
|
|
let(:raw_compare) { Gitlab::Git::Compare.new(project.repository.raw_repository, sample_commit.parent_id, sample_commit.id) }
|
|
|
|
let(:compare) { Compare.decorate(raw_compare, project) }
|
|
|
|
let(:commits) { compare.commits }
|
2015-01-24 13:02:58 -05:00
|
|
|
let(:diff_path) { namespace_project_commit_path(project.namespace, project, commits.first) }
|
2016-06-20 12:51:48 -04:00
|
|
|
let(:diff_refs) { Gitlab::Diff::DiffRefs.new(base_sha: project.merge_base_commit(sample_image_commit.id, sample_commit.id).id, head_sha: sample_commit.id) }
|
2014-04-10 12:41:20 -04:00
|
|
|
|
2016-05-12 11:06:14 -04:00
|
|
|
subject { Notify.repository_push_email(project.id, author_id: user.id, ref: 'refs/heads/master', action: :push, compare: compare, diff_refs: diff_refs) }
|
2014-04-10 12:41:20 -04:00
|
|
|
|
2015-11-25 07:59:03 -05:00
|
|
|
it_behaves_like 'it should show Gmail Actions View Commit link'
|
2016-07-13 19:56:54 -04:00
|
|
|
it_behaves_like 'a user cannot unsubscribe through footer link'
|
2015-12-19 14:04:40 -05:00
|
|
|
it_behaves_like 'an email with X-GitLab headers containing project details'
|
|
|
|
it_behaves_like 'an email that contains a header with author username'
|
2015-11-25 07:27:31 -05:00
|
|
|
|
2014-04-10 12:41:20 -04:00
|
|
|
it 'is sent as the author' do
|
|
|
|
sender = subject.header[:from].addrs[0]
|
2015-02-12 13:17:35 -05:00
|
|
|
expect(sender.display_name).to eq(user.name)
|
|
|
|
expect(sender.address).to eq(gitlab_sender)
|
2014-04-10 12:41:20 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'has the correct subject' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_subject "[Git][#{project.full_path}][master] #{commits.first.title}"
|
2014-04-10 12:41:20 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'includes commits list' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text 'Change some files'
|
2014-04-10 12:41:20 -04:00
|
|
|
end
|
|
|
|
|
2016-05-12 11:06:14 -04:00
|
|
|
it 'includes diffs with character-level highlighting' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text 'def</span> <span class="nf">archive_formats_regex'
|
2014-04-10 12:41:20 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'contains a link to the diff' do
|
2017-03-14 08:56:07 -04:00
|
|
|
is_expected.to have_body_text diff_path
|
2014-04-10 12:41:20 -04:00
|
|
|
end
|
|
|
|
end
|
2016-11-28 17:00:03 -05:00
|
|
|
|
|
|
|
describe 'HTML emails setting' do
|
|
|
|
let(:project) { create(:project) }
|
|
|
|
let(:user) { create(:user) }
|
|
|
|
let(:multipart_mail) { Notify.project_was_moved_email(project.id, user.id, "gitlab/gitlab") }
|
|
|
|
|
|
|
|
context 'when disabled' do
|
|
|
|
it 'only sends the text template' do
|
|
|
|
stub_application_setting(html_emails_enabled: false)
|
|
|
|
|
|
|
|
EmailTemplateInterceptor.delivering_email(multipart_mail)
|
|
|
|
|
|
|
|
expect(multipart_mail).to have_part_with('text/plain')
|
|
|
|
expect(multipart_mail).not_to have_part_with('text/html')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when enabled' do
|
|
|
|
it 'sends a multipart message' do
|
|
|
|
stub_application_setting(html_emails_enabled: true)
|
|
|
|
|
|
|
|
EmailTemplateInterceptor.delivering_email(multipart_mail)
|
|
|
|
|
|
|
|
expect(multipart_mail).to have_part_with('text/plain')
|
|
|
|
expect(multipart_mail).to have_part_with('text/html')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
matcher :have_part_with do |expected|
|
|
|
|
match do |actual|
|
|
|
|
actual.body.parts.any? { |part| part.content_type.try(:match, %r(#{expected})) }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2012-05-14 14:05:32 -04:00
|
|
|
end
|