summaryrefslogtreecommitdiff
path: root/spec/mailers/notify_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/mailers/notify_spec.rb')
-rw-r--r--spec/mailers/notify_spec.rb531
1 files changed, 232 insertions, 299 deletions
diff --git a/spec/mailers/notify_spec.rb b/spec/mailers/notify_spec.rb
index b692142713f..6a89b007f96 100644
--- a/spec/mailers/notify_spec.rb
+++ b/spec/mailers/notify_spec.rb
@@ -8,6 +8,15 @@ describe Notify do
include_context 'gitlab email notification'
+ 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
+
context 'for a project' do
describe 'items that are assignable, the email' do
let(:current_user) { create(:user, email: "current@email.com") }
@@ -15,20 +24,20 @@ describe Notify do
let(:previous_assignee) { create(:user, name: 'Previous Assignee') }
shared_examples 'an assignee email' do
- 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 'is sent to the assignee as the author' do
+ sender = subject.header[:from].addrs.first
- it 'is sent to the assignee' do
- is_expected.to deliver_to assignee.email
+ aggregate_failures do
+ expect(sender.display_name).to eq(current_user.name)
+ expect(sender.address).to eq(gitlab_sender)
+ expect(subject).to deliver_to(assignee.email)
+ end
end
end
context 'for issues' do
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: FFaker::Lorem.sentence) }
+ let(:issue_with_description) { create(:issue, author: current_user, assignee: assignee, project: project, description: 'My awesome description') }
describe 'that are new' do
subject { Notify.new_issue_email(issue.assignee_id, issue.id) }
@@ -40,12 +49,11 @@ describe Notify do
it_behaves_like 'it should show Gmail Actions View Issue link'
it_behaves_like 'an unsubscribeable thread'
- it 'has the correct subject' do
- is_expected.to have_subject /#{project.name} \| #{issue.title} \(##{issue.iid}\)/
- end
-
- it 'contains a link to the new issue' do
- is_expected.to have_body_text /#{namespace_project_issue_path project.namespace, project, issue}/
+ it 'has the correct subject and body' do
+ aggregate_failures do
+ is_expected.to have_referable_subject(issue)
+ is_expected.to have_body_text(namespace_project_issue_path(project.namespace, project, issue))
+ end
end
context 'when enabled email_author_in_body' do
@@ -54,8 +62,8 @@ describe Notify do
end
it 'contains a link to note author' do
- is_expected.to have_body_text issue.author_name
- is_expected.to have_body_text /wrote\:/
+ is_expected.to have_html_escaped_body_text(issue.author_name)
+ is_expected.to have_body_text 'wrote:'
end
end
end
@@ -66,7 +74,7 @@ describe Notify do
it_behaves_like 'it should show Gmail Actions View Issue link'
it 'contains the description' do
- is_expected.to have_body_text /#{issue_with_description.description}/
+ is_expected.to have_html_escaped_body_text issue_with_description.description
end
end
@@ -86,20 +94,13 @@ describe Notify do
expect(sender.address).to eq(gitlab_sender)
end
- it 'has the correct subject' do
- is_expected.to have_subject /#{issue.title} \(##{issue.iid}\)/
- end
-
- it 'contains the name of the previous assignee' do
- is_expected.to have_body_text /#{previous_assignee.name}/
- end
-
- it 'contains the name of the new assignee' do
- is_expected.to have_body_text /#{assignee.name}/
- end
-
- it 'contains a link to the issue' do
- is_expected.to have_body_text /#{namespace_project_issue_path project.namespace, project, issue}/
+ it 'has the correct subject and body' do
+ aggregate_failures do
+ is_expected.to have_referable_subject(issue, reply: true)
+ is_expected.to have_html_escaped_body_text(previous_assignee.name)
+ is_expected.to have_html_escaped_body_text(assignee.name)
+ is_expected.to have_body_text(namespace_project_issue_path(project.namespace, project, issue))
+ end
end
end
@@ -120,16 +121,12 @@ describe Notify do
expect(sender.address).to eq(gitlab_sender)
end
- it 'has the correct subject' do
- is_expected.to have_subject /#{issue.title} \(##{issue.iid}\)/
- end
-
- it 'contains the names of the added labels' do
- is_expected.to have_body_text /foo, bar, and baz/
- end
-
- it 'contains a link to the issue' do
- is_expected.to have_body_text /#{namespace_project_issue_path project.namespace, project, issue}/
+ it 'has the correct subject and body' do
+ aggregate_failures do
+ is_expected.to have_referable_subject(issue, reply: true)
+ is_expected.to have_body_text('foo, bar, and baz')
+ is_expected.to have_body_text(namespace_project_issue_path(project.namespace, project, issue))
+ end
end
end
@@ -149,20 +146,13 @@ describe Notify do
expect(sender.address).to eq(gitlab_sender)
end
- it 'has the correct subject' do
- is_expected.to have_subject /#{issue.title} \(##{issue.iid}\)/i
- end
-
- it 'contains the new status' do
- is_expected.to have_body_text /#{status}/i
- end
-
- it 'contains the user name' do
- is_expected.to have_body_text /#{current_user.name}/i
- end
-
- it 'contains a link to the issue' do
- is_expected.to have_body_text /#{namespace_project_issue_path project.namespace, project, issue}/
+ it 'has the correct subject and body' do
+ aggregate_failures do
+ is_expected.to have_referable_subject(issue, reply: true)
+ is_expected.to have_body_text(status)
+ is_expected.to have_html_escaped_body_text(current_user.name)
+ is_expected.to have_body_text(namespace_project_issue_path project.namespace, project, issue)
+ end
end
end
@@ -180,26 +170,24 @@ describe Notify do
is_expected.to have_body_text 'Issue was moved to another project'
end
- it 'has the correct subject' do
- is_expected.to have_subject /#{issue.title} \(##{issue.iid}\)/i
- end
-
- it 'contains link to new issue' do
+ it 'has the correct subject and body' 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
- is_expected.to have_body_text /#{namespace_project_issue_path project.namespace, project, issue}/
+ aggregate_failures do
+ is_expected.to have_referable_subject(issue, reply: true)
+ is_expected.to have_body_text(new_issue_url)
+ is_expected.to have_body_text(namespace_project_issue_path(project.namespace, project, issue))
+ end
end
end
end
context 'for merge requests' do
+ let(:project) { create(:project, :repository) }
let(:merge_author) { create(:user) }
let(:merge_request) { create(:merge_request, author: current_user, assignee: assignee, source_project: project, target_project: project) }
- let(:merge_request_with_description) { create(:merge_request, author: current_user, assignee: assignee, source_project: project, target_project: project, description: FFaker::Lorem.sentence) }
+ let(:merge_request_with_description) { create(:merge_request, author: current_user, assignee: assignee, source_project: project, target_project: project, description: 'My awesome description') }
describe 'that are new' do
subject { Notify.new_merge_request_email(merge_request.assignee_id, merge_request.id) }
@@ -211,20 +199,13 @@ describe Notify do
it_behaves_like 'it should show Gmail Actions View Merge request link'
it_behaves_like 'an unsubscribeable thread'
- it 'has the correct subject' do
- is_expected.to have_subject /#{merge_request.title} \(#{merge_request.to_reference}\)/
- end
-
- it 'contains a link to the new merge request' do
- is_expected.to have_body_text /#{namespace_project_merge_request_path(project.namespace, project, merge_request)}/
- end
-
- it 'contains the source branch for the merge request' do
- is_expected.to have_body_text /#{merge_request.source_branch}/
- end
-
- it 'contains the target branch for the merge request' do
- is_expected.to have_body_text /#{merge_request.target_branch}/
+ it 'has the correct subject and body' do
+ aggregate_failures do
+ is_expected.to have_referable_subject(merge_request)
+ is_expected.to have_body_text(namespace_project_merge_request_path(project.namespace, project, merge_request))
+ is_expected.to have_body_text(merge_request.source_branch)
+ is_expected.to have_body_text(merge_request.target_branch)
+ end
end
context 'when enabled email_author_in_body' do
@@ -233,8 +214,8 @@ describe Notify do
end
it 'contains a link to note author' do
- is_expected.to have_body_text merge_request.author_name
- is_expected.to have_body_text /wrote\:/
+ is_expected.to have_html_escaped_body_text merge_request.author_name
+ is_expected.to have_body_text 'wrote:'
end
end
end
@@ -246,7 +227,7 @@ describe Notify do
it_behaves_like "an unsubscribeable thread"
it 'contains the description' do
- is_expected.to have_body_text /#{merge_request_with_description.description}/
+ is_expected.to have_html_escaped_body_text merge_request_with_description.description
end
end
@@ -266,20 +247,13 @@ describe Notify do
expect(sender.address).to eq(gitlab_sender)
end
- it 'has the correct subject' do
- is_expected.to have_subject /#{merge_request.title} \(#{merge_request.to_reference}\)/
- end
-
- it 'contains the name of the previous assignee' do
- is_expected.to have_body_text /#{previous_assignee.name}/
- end
-
- it 'contains the name of the new assignee' do
- is_expected.to have_body_text /#{assignee.name}/
- end
-
- it 'contains a link to the merge request' do
- is_expected.to have_body_text /#{namespace_project_merge_request_path project.namespace, project, merge_request}/
+ it 'has the correct subject and body' do
+ aggregate_failures do
+ is_expected.to have_referable_subject(merge_request, reply: true)
+ is_expected.to have_html_escaped_body_text(previous_assignee.name)
+ is_expected.to have_body_text(namespace_project_merge_request_path(project.namespace, project, merge_request))
+ is_expected.to have_html_escaped_body_text(assignee.name)
+ end
end
end
@@ -300,16 +274,10 @@ describe Notify do
expect(sender.address).to eq(gitlab_sender)
end
- it 'has the correct subject' do
- is_expected.to have_subject /#{merge_request.title} \(#{merge_request.to_reference}\)/
- end
-
- it 'contains the names of the added labels' do
- is_expected.to have_body_text /foo, bar, and baz/
- end
-
- it 'contains a link to the merge request' do
- is_expected.to have_body_text /#{namespace_project_merge_request_path project.namespace, project, merge_request}/
+ it 'has the correct subject and body' do
+ is_expected.to have_referable_subject(merge_request, reply: true)
+ is_expected.to have_body_text('foo, bar, and baz')
+ is_expected.to have_body_text(namespace_project_merge_request_path(project.namespace, project, merge_request))
end
end
@@ -329,20 +297,13 @@ describe Notify do
expect(sender.address).to eq(gitlab_sender)
end
- it 'has the correct subject' do
- is_expected.to have_subject /#{merge_request.title} \(#{merge_request.to_reference}\)/i
- end
-
- it 'contains the new status' do
- is_expected.to have_body_text /#{status}/i
- end
-
- it 'contains the user name' do
- is_expected.to have_body_text /#{current_user.name}/i
- end
-
- it 'contains a link to the merge request' do
- is_expected.to have_body_text /#{namespace_project_merge_request_path project.namespace, project, merge_request}/
+ it 'has the correct subject and body' do
+ aggregate_failures do
+ is_expected.to have_referable_subject(merge_request, reply: true)
+ is_expected.to have_body_text(status)
+ is_expected.to have_html_escaped_body_text(current_user.name)
+ is_expected.to have_body_text(namespace_project_merge_request_path(project.namespace, project, merge_request))
+ end
end
end
@@ -362,23 +323,19 @@ describe Notify do
expect(sender.address).to eq(gitlab_sender)
end
- it 'has the correct subject' do
- is_expected.to have_subject /#{merge_request.title} \(#{merge_request.to_reference}\)/
- end
-
- it 'contains the new status' do
- is_expected.to have_body_text /merged/i
- end
-
- it 'contains a link to the merge request' do
- is_expected.to have_body_text /#{namespace_project_merge_request_path project.namespace, project, merge_request}/
+ it 'has the correct subject and body' do
+ aggregate_failures do
+ is_expected.to have_referable_subject(merge_request, reply: true)
+ is_expected.to have_body_text('merged')
+ is_expected.to have_body_text(namespace_project_merge_request_path(project.namespace, project, merge_request))
+ end
end
end
end
end
describe 'project was moved' do
- let(:project) { create(:project) }
+ let(:project) { create(:empty_project) }
let(:user) { create(:user) }
subject { Notify.project_was_moved_email(project.id, user.id, "gitlab/gitlab") }
@@ -386,16 +343,10 @@ describe Notify do
it_behaves_like 'it should not have Gmail Actions links'
it_behaves_like "a user cannot unsubscribe through footer link"
- it 'has the correct subject' do
- is_expected.to have_subject /Project was moved/
- end
-
- it 'contains name of project' do
- is_expected.to have_body_text /#{project.name_with_namespace}/
- end
-
- it 'contains new user role' do
- is_expected.to have_body_text /#{project.ssh_url_to_repo}/
+ it 'has the correct subject and body' do
+ is_expected.to have_subject("#{project.name} | Project was moved")
+ is_expected.to have_html_escaped_body_text project.name_with_namespace
+ is_expected.to have_body_text(project.ssh_url_to_repo)
end
end
@@ -424,9 +375,9 @@ describe Notify do
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"
- is_expected.to have_body_text /#{project.name_with_namespace}/
- is_expected.to have_body_text /#{namespace_project_project_members_url(project.namespace, project)}/
- is_expected.to have_body_text /#{project_member.human_access}/
+ is_expected.to have_html_escaped_body_text project.name_with_namespace
+ is_expected.to have_body_text namespace_project_project_members_url(project.namespace, project)
+ is_expected.to have_body_text project_member.human_access
end
end
@@ -451,9 +402,9 @@ describe Notify do
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"
- is_expected.to have_body_text /#{project.name_with_namespace}/
- is_expected.to have_body_text /#{namespace_project_project_members_url(project.namespace, project)}/
- is_expected.to have_body_text /#{project_member.human_access}/
+ is_expected.to have_html_escaped_body_text project.name_with_namespace
+ is_expected.to have_body_text namespace_project_project_members_url(project.namespace, project)
+ is_expected.to have_body_text project_member.human_access
end
end
end
@@ -473,13 +424,14 @@ describe Notify do
it 'contains all the useful information' do
is_expected.to have_subject "Access to the #{project.name_with_namespace} project was denied"
- is_expected.to have_body_text /#{project.name_with_namespace}/
- is_expected.to have_body_text /#{project.web_url}/
+ is_expected.to have_html_escaped_body_text project.name_with_namespace
+ is_expected.to have_body_text project.web_url
end
end
describe 'project access changed' do
- let(:project) { create(:empty_project, :public, :access_requestable) }
+ let(:owner) { create(:user, name: "Chang O'Keefe") }
+ let(:project) { create(:empty_project, :public, :access_requestable, namespace: owner.namespace) }
let(:user) { create(:user) }
let(:project_member) { create(:project_member, project: project, user: user) }
subject { Notify.member_access_granted_email('project', project_member.id) }
@@ -490,9 +442,9 @@ describe Notify do
it 'contains all the useful information' do
is_expected.to have_subject "Access to the #{project.name_with_namespace} project was granted"
- is_expected.to have_body_text /#{project.name_with_namespace}/
- is_expected.to have_body_text /#{project.web_url}/
- is_expected.to have_body_text /#{project_member.human_access}/
+ is_expected.to have_html_escaped_body_text project.name_with_namespace
+ is_expected.to have_body_text project.web_url
+ is_expected.to have_body_text project_member.human_access
end
end
@@ -509,7 +461,7 @@ describe Notify do
end
describe 'project invitation' do
- let(:project) { create(:project) }
+ let(:project) { create(:empty_project) }
let(:master) { create(:user).tap { |u| project.team << [u, :master] } }
let(:project_member) { invite_to_project(project, inviter: master) }
@@ -521,15 +473,15 @@ describe Notify do
it 'contains all the useful information' do
is_expected.to have_subject "Invitation to join the #{project.name_with_namespace} project"
- is_expected.to have_body_text /#{project.name_with_namespace}/
- 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}/
+ is_expected.to have_html_escaped_body_text project.name_with_namespace
+ 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
end
end
describe 'project invitation accepted' do
- let(:project) { create(:project) }
+ let(:project) { create(:empty_project) }
let(:invited_user) { create(:user, name: 'invited user') }
let(:master) { create(:user).tap { |u| project.team << [u, :master] } }
let(:project_member) do
@@ -546,15 +498,15 @@ describe Notify do
it 'contains all the useful information' do
is_expected.to have_subject 'Invitation accepted'
- is_expected.to have_body_text /#{project.name_with_namespace}/
- is_expected.to have_body_text /#{project.web_url}/
- is_expected.to have_body_text /#{project_member.invite_email}/
- is_expected.to have_body_text /#{invited_user.name}/
+ is_expected.to have_html_escaped_body_text project.name_with_namespace
+ is_expected.to have_body_text project.web_url
+ is_expected.to have_body_text project_member.invite_email
+ is_expected.to have_html_escaped_body_text invited_user.name
end
end
describe 'project invitation declined' do
- let(:project) { create(:project) }
+ let(:project) { create(:empty_project) }
let(:master) { create(:user).tap { |u| project.team << [u, :master] } }
let(:project_member) do
invitee = invite_to_project(project, inviter: master)
@@ -570,9 +522,9 @@ describe Notify do
it 'contains all the useful information' do
is_expected.to have_subject 'Invitation declined'
- is_expected.to have_body_text /#{project.name_with_namespace}/
- is_expected.to have_body_text /#{project.web_url}/
- is_expected.to have_body_text /#{project_member.invite_email}/
+ is_expected.to have_html_escaped_body_text project.name_with_namespace
+ is_expected.to have_body_text project.web_url
+ is_expected.to have_body_text project_member.invite_email
end
end
@@ -587,22 +539,22 @@ describe Notify do
shared_examples 'a note email' do
it_behaves_like 'it should have Gmail Actions links'
- it 'is sent as the author' do
+ it 'is sent to the given recipient 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
+ aggregate_failures do
+ expect(sender.display_name).to eq(note_author.name)
+ expect(sender.address).to eq(gitlab_sender)
+ expect(subject).to deliver_to(recipient.notification_email)
+ end
end
it 'contains the message from the note' do
- is_expected.to have_body_text /#{note.note}/
+ is_expected.to have_html_escaped_body_text note.note
end
it 'does not contain note author' do
- is_expected.not_to have_body_text /wrote\:/
+ is_expected.not_to have_body_text 'wrote:'
end
context 'when enabled email_author_in_body' do
@@ -611,13 +563,14 @@ describe Notify do
end
it 'contains a link to note author' do
- is_expected.to have_body_text note.author_name
- is_expected.to have_body_text /wrote\:/
+ is_expected.to have_html_escaped_body_text note.author_name
+ is_expected.to have_body_text 'wrote:'
end
end
end
describe 'on a commit' do
+ let(:project) { create(:project, :repository) }
let(:commit) { project.commit }
before(:each) { allow(note).to receive(:noteable).and_return(commit) }
@@ -631,12 +584,11 @@ describe Notify do
it_behaves_like 'it should show Gmail Actions View Commit link'
it_behaves_like 'a user cannot unsubscribe through footer link'
- it 'has the correct subject' do
- is_expected.to have_subject /Re: #{project.name} | #{commit.title} \(#{commit.short_id}\)/
- end
-
- it 'contains a link to the commit' do
- is_expected.to have_body_text commit.short_id
+ it 'has the correct subject and body' do
+ aggregate_failures do
+ is_expected.to have_subject("Re: #{project.name} | #{commit.title.strip} (#{commit.short_id})")
+ is_expected.to have_body_text(commit.short_id)
+ end
end
end
@@ -654,12 +606,11 @@ describe Notify do
it_behaves_like 'it should show Gmail Actions View Merge request link'
it_behaves_like 'an unsubscribeable thread'
- it 'has the correct subject' do
- is_expected.to have_subject /#{merge_request.title} \(#{merge_request.to_reference}\)/
- end
-
- it 'contains a link to the merge request note' do
- is_expected.to have_body_text /#{note_on_merge_request_path}/
+ it 'has the correct subject and body' do
+ aggregate_failures do
+ is_expected.to have_referable_subject(merge_request, reply: true)
+ is_expected.to have_body_text note_on_merge_request_path
+ end
end
end
@@ -677,17 +628,17 @@ describe Notify do
it_behaves_like 'it should show Gmail Actions View Issue link'
it_behaves_like 'an unsubscribeable thread'
- it 'has the correct subject' do
- is_expected.to have_subject /#{issue.title} \(##{issue.iid}\)/
- end
-
- it 'contains a link to the issue note' do
- is_expected.to have_body_text /#{note_on_issue_path}/
+ it 'has the correct subject and body' do
+ aggregate_failures do
+ is_expected.to have_referable_subject(issue, reply: true)
+ is_expected.to have_body_text(note_on_issue_path)
+ end
end
end
end
context 'items that are noteable, emails for a note on a diff' do
+ let(:project) { create(:project, :repository) }
let(:note_author) { create(:user, name: 'author_name') }
before :each do
@@ -698,31 +649,31 @@ describe Notify do
let(:note) { create(model, project: project, author: note_author) }
it "includes diffs with character-level highlighting" do
- is_expected.to have_body_text /<span class=\"p\">}<\/span><\/span>/
+ is_expected.to have_body_text '<span class="p">}</span></span>'
end
it 'contains a link to the diff file' do
- is_expected.to have_body_text /#{note.diff_file.file_path}/
+ is_expected.to have_body_text note.diff_file.file_path
end
it_behaves_like 'it should have Gmail Actions links'
- it 'is sent as the author' do
+ it 'is sent to the given recipient 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
+ aggregate_failures do
+ expect(sender.display_name).to eq(note_author.name)
+ expect(sender.address).to eq(gitlab_sender)
+ expect(subject).to deliver_to(recipient.notification_email)
+ end
end
it 'contains the message from the note' do
- is_expected.to have_body_text /#{note.note}/
+ is_expected.to have_html_escaped_body_text note.note
end
it 'does not contain note author' do
- is_expected.not_to have_body_text /wrote\:/
+ is_expected.not_to have_body_text 'wrote:'
end
context 'when enabled email_author_in_body' do
@@ -731,8 +682,8 @@ describe Notify do
end
it 'contains a link to note author' do
- is_expected.to have_body_text note.author_name
- is_expected.to have_body_text /wrote\:/
+ is_expected.to have_html_escaped_body_text note.author_name
+ is_expected.to have_body_text 'wrote:'
end
end
end
@@ -777,9 +728,9 @@ describe Notify do
it 'contains all the useful information' do
is_expected.to have_subject "Request to join the #{group.name} group"
- is_expected.to have_body_text /#{group.name}/
- is_expected.to have_body_text /#{group_group_members_url(group)}/
- is_expected.to have_body_text /#{group_member.human_access}/
+ is_expected.to have_html_escaped_body_text group.name
+ is_expected.to have_body_text group_group_members_url(group)
+ is_expected.to have_body_text group_member.human_access
end
end
@@ -798,8 +749,8 @@ describe Notify do
it 'contains all the useful information' do
is_expected.to have_subject "Access to the #{group.name} group was denied"
- is_expected.to have_body_text /#{group.name}/
- is_expected.to have_body_text /#{group.web_url}/
+ is_expected.to have_html_escaped_body_text group.name
+ is_expected.to have_body_text group.web_url
end
end
@@ -816,9 +767,9 @@ describe Notify do
it 'contains all the useful information' do
is_expected.to have_subject "Access to the #{group.name} group was granted"
- is_expected.to have_body_text /#{group.name}/
- is_expected.to have_body_text /#{group.web_url}/
- is_expected.to have_body_text /#{group_member.human_access}/
+ is_expected.to have_html_escaped_body_text group.name
+ is_expected.to have_body_text group.web_url
+ is_expected.to have_body_text group_member.human_access
end
end
@@ -847,10 +798,10 @@ describe Notify do
it 'contains all the useful information' do
is_expected.to have_subject "Invitation to join the #{group.name} group"
- is_expected.to have_body_text /#{group.name}/
- 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}/
+ is_expected.to have_html_escaped_body_text group.name
+ 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
end
end
@@ -872,10 +823,10 @@ describe Notify do
it 'contains all the useful information' do
is_expected.to have_subject 'Invitation accepted'
- is_expected.to have_body_text /#{group.name}/
- is_expected.to have_body_text /#{group.web_url}/
- is_expected.to have_body_text /#{group_member.invite_email}/
- is_expected.to have_body_text /#{invited_user.name}/
+ is_expected.to have_html_escaped_body_text group.name
+ is_expected.to have_body_text group.web_url
+ is_expected.to have_body_text group_member.invite_email
+ is_expected.to have_html_escaped_body_text invited_user.name
end
end
@@ -896,9 +847,9 @@ describe Notify do
it 'contains all the useful information' do
is_expected.to have_subject 'Invitation declined'
- is_expected.to have_body_text /#{group.name}/
- is_expected.to have_body_text /#{group.web_url}/
- is_expected.to have_body_text /#{group_member.invite_email}/
+ is_expected.to have_html_escaped_body_text group.name
+ is_expected.to have_body_text group.web_url
+ is_expected.to have_body_text group_member.invite_email
end
end
end
@@ -924,21 +875,20 @@ describe Notify do
is_expected.to deliver_to 'new-email@mail.com'
end
- it 'has the correct subject' do
- is_expected.to have_subject /^Confirmation instructions/
- end
-
- it 'includes a link to the site' do
- is_expected.to have_body_text /#{example_site_path}/
+ it 'has the correct subject and body' do
+ aggregate_failures do
+ is_expected.to have_subject('Confirmation instructions | A Nice Suffix')
+ is_expected.to have_body_text(example_site_path)
+ end
end
end
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") }
+ let(:tree_path) { namespace_project_tree_path(project.namespace, project, "empty-branch") }
- subject { Notify.repository_push_email(project.id, author_id: user.id, ref: 'refs/heads/master', action: :create) }
+ subject { Notify.repository_push_email(project.id, author_id: user.id, ref: 'refs/heads/empty-branch', action: :create) }
it_behaves_like 'it should not have Gmail Actions links'
it_behaves_like 'a user cannot unsubscribe through footer link'
@@ -951,12 +901,11 @@ describe Notify do
expect(sender.address).to eq(gitlab_sender)
end
- it 'has the correct subject' do
- is_expected.to have_subject /Pushed new branch master/
- end
-
- it 'contains a link to the branch' do
- is_expected.to have_body_text /#{tree_path}/
+ it 'has the correct subject and body' do
+ aggregate_failures do
+ is_expected.to have_subject("[Git][#{project.full_path}] Pushed new branch empty-branch")
+ is_expected.to have_body_text(tree_path)
+ end
end
end
@@ -978,12 +927,11 @@ describe Notify do
expect(sender.address).to eq(gitlab_sender)
end
- it 'has the correct subject' do
- is_expected.to have_subject /Pushed new tag v1\.0/
- end
-
- it 'contains a link to the tag' do
- is_expected.to have_body_text /#{tree_path}/
+ it 'has the correct subject and body' do
+ aggregate_failures do
+ is_expected.to have_subject("[Git][#{project.full_path}] Pushed new tag v1.0")
+ is_expected.to have_body_text(tree_path)
+ end
end
end
@@ -1005,7 +953,7 @@ describe Notify do
end
it 'has the correct subject' do
- is_expected.to have_subject /Deleted branch master/
+ is_expected.to have_subject "[Git][#{project.full_path}] Deleted branch master"
end
end
@@ -1027,11 +975,12 @@ describe Notify do
end
it 'has the correct subject' do
- is_expected.to have_subject /Deleted tag v1\.0/
+ is_expected.to have_subject "[Git][#{project.full_path}] Deleted tag v1.0"
end
end
describe 'email on push with multiple commits' do
+ let(:project) { create(:project, :repository) }
let(:example_site_path) { root_path }
let(:user) { create(:user) }
let(:raw_compare) { Gitlab::Git::Compare.new(project.repository.raw_repository, sample_image_commit.id, sample_commit.id) }
@@ -1054,24 +1003,14 @@ describe Notify do
expect(sender.address).to eq(gitlab_sender)
end
- it 'has the correct subject' do
- is_expected.to have_subject /\[#{project.path_with_namespace}\]\[master\] #{commits.length} commits:/
- end
-
- it 'includes commits list' do
- is_expected.to have_body_text /Change some files/
- end
-
- it 'includes diffs with character-level highlighting' do
- is_expected.to have_body_text /def<\/span> <span class=\"nf\">archive_formats_regex/
- end
-
- it 'contains a link to the diff' do
- is_expected.to have_body_text /#{diff_path}/
- end
-
- it 'does not contain the misleading footer' do
- is_expected.not_to have_body_text /you are a member of/
+ it 'has the correct subject and body' do
+ aggregate_failures do
+ is_expected.to have_subject("[Git][#{project.full_path}][master] #{commits.length} commits: Ruby files modified")
+ is_expected.to have_body_text('Change some files')
+ is_expected.to have_body_text('def</span> <span class="nf">archive_formats_regex')
+ is_expected.to have_body_text(diff_path)
+ is_expected.not_to have_body_text('you are a member of')
+ end
end
context "when set to send from committer email if domain matches" do
@@ -1088,13 +1027,13 @@ describe Notify do
end
it "is sent from the committer email" do
- sender = subject.header[:from].addrs[0]
- expect(sender.address).to eq(user.email)
- end
+ from = subject.header[:from].addrs.first
+ reply = subject.header[:reply_to].addrs.first
- it "is set to reply to the committer email" do
- sender = subject.header[:reply_to].addrs[0]
- expect(sender.address).to eq(user.email)
+ aggregate_failures do
+ expect(from.address).to eq(user.email)
+ expect(reply.address).to eq(user.email)
+ end
end
end
@@ -1105,13 +1044,13 @@ describe Notify do
end
it "is sent from the default email" do
- sender = subject.header[:from].addrs[0]
- expect(sender.address).to eq(gitlab_sender)
- end
+ from = subject.header[:from].addrs.first
+ reply = subject.header[:reply_to].addrs.first
- 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)
+ aggregate_failures do
+ expect(from.address).to eq(gitlab_sender)
+ expect(reply.address).to eq(gitlab_sender_reply_to)
+ end
end
end
@@ -1122,19 +1061,20 @@ describe Notify do
end
it "is sent from the default email" do
- sender = subject.header[:from].addrs[0]
- expect(sender.address).to eq(gitlab_sender)
- end
+ from = subject.header[:from].addrs.first
+ reply = subject.header[:reply_to].addrs.first
- 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)
+ aggregate_failures do
+ expect(from.address).to eq(gitlab_sender)
+ expect(reply.address).to eq(gitlab_sender_reply_to)
+ end
end
end
end
end
describe 'email on push with a single commit' do
+ let(:project) { create(:project, :repository) }
let(:example_site_path) { root_path }
let(:user) { create(:user) }
let(:raw_compare) { Gitlab::Git::Compare.new(project.repository.raw_repository, sample_commit.parent_id, sample_commit.id) }
@@ -1156,25 +1096,18 @@ describe Notify do
expect(sender.address).to eq(gitlab_sender)
end
- it 'has the correct subject' do
- is_expected.to have_subject /#{commits.first.title}/
- end
-
- it 'includes commits list' do
- is_expected.to have_body_text /Change some files/
- end
-
- it 'includes diffs with character-level highlighting' do
- is_expected.to have_body_text /def<\/span> <span class=\"nf\">archive_formats_regex/
- end
-
- it 'contains a link to the diff' do
- is_expected.to have_body_text /#{diff_path}/
+ it 'has the correct subject and body' do
+ aggregate_failures do
+ is_expected.to have_subject("[Git][#{project.full_path}][master] #{commits.first.title}")
+ is_expected.to have_body_text('Change some files')
+ is_expected.to have_body_text('def</span> <span class="nf">archive_formats_regex')
+ is_expected.to have_body_text(diff_path)
+ end
end
end
describe 'HTML emails setting' do
- let(:project) { create(:project) }
+ let(:project) { create(:empty_project) }
let(:user) { create(:user) }
let(:multipart_mail) { Notify.project_was_moved_email(project.id, user.id, "gitlab/gitlab") }