Move build emails specs to separate file
This also extracts shared examples for notification emails to separate file.
This commit is contained in:
parent
349adab142
commit
055ec4dc0a
3 changed files with 186 additions and 177 deletions
65
spec/mailers/emails/builds_spec.rb
Normal file
65
spec/mailers/emails/builds_spec.rb
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
require 'spec_helper'
|
||||||
|
require 'email_spec'
|
||||||
|
require 'mailers/shared/notify'
|
||||||
|
|
||||||
|
describe Notify do
|
||||||
|
include EmailSpec::Matchers
|
||||||
|
|
||||||
|
include_context 'gitlab email notification'
|
||||||
|
|
||||||
|
describe 'build notification email' do
|
||||||
|
let(:build) { create(:ci_build) }
|
||||||
|
let(:project) { build.project }
|
||||||
|
|
||||||
|
shared_examples 'build email' do
|
||||||
|
it 'contains name of project' do
|
||||||
|
is_expected.to have_body_text build.project_name
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'contains link to project' do
|
||||||
|
is_expected.to have_body_text namespace_project_path(project.namespace, project)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
shared_examples 'an email with X-GitLab headers containing build details' do
|
||||||
|
it 'has X-GitLab-Build* headers' do
|
||||||
|
is_expected.to have_header 'X-GitLab-Build-Id', /#{build.id}/
|
||||||
|
is_expected.to have_header 'X-GitLab-Build-Ref', /#{build.ref}/
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'build success' do
|
||||||
|
subject { Notify.build_success_email(build.id, 'wow@example.com') }
|
||||||
|
before { build.success }
|
||||||
|
|
||||||
|
it_behaves_like 'build email'
|
||||||
|
it_behaves_like 'an email with X-GitLab headers containing build details'
|
||||||
|
it_behaves_like 'an email with X-GitLab headers containing project details'
|
||||||
|
|
||||||
|
it 'has header indicating build status' do
|
||||||
|
is_expected.to have_header 'X-GitLab-Build-Status', 'success'
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'has the correct subject' do
|
||||||
|
is_expected.to have_subject /Build success for/
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'build fail' do
|
||||||
|
subject { Notify.build_fail_email(build.id, 'wow@example.com') }
|
||||||
|
before { build.drop }
|
||||||
|
|
||||||
|
it_behaves_like 'build email'
|
||||||
|
it_behaves_like 'an email with X-GitLab headers containing build details'
|
||||||
|
it_behaves_like 'an email with X-GitLab headers containing project details'
|
||||||
|
|
||||||
|
it 'has header indicating build status' do
|
||||||
|
is_expected.to have_header 'X-GitLab-Build-Status', 'failed'
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'has the correct subject' do
|
||||||
|
is_expected.to have_subject /Build failed for/
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,131 +1,13 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
require 'email_spec'
|
require 'email_spec'
|
||||||
|
require 'mailers/shared/notify'
|
||||||
|
|
||||||
describe Notify do
|
describe Notify do
|
||||||
include EmailSpec::Helpers
|
include EmailSpec::Helpers
|
||||||
include EmailSpec::Matchers
|
include EmailSpec::Matchers
|
||||||
include RepoHelpers
|
include RepoHelpers
|
||||||
|
|
||||||
new_user_address = 'newguy@example.com'
|
include_context 'gitlab email notification'
|
||||||
|
|
||||||
let(:gitlab_sender_display_name) { Gitlab.config.gitlab.email_display_name }
|
|
||||||
let(:gitlab_sender) { Gitlab.config.gitlab.email_from }
|
|
||||||
let(:gitlab_sender_reply_to) { Gitlab.config.gitlab.email_reply_to }
|
|
||||||
let(:recipient) { create(:user, email: 'recipient@example.com') }
|
|
||||||
let(:project) { create(:project) }
|
|
||||||
|
|
||||||
before(:each) do
|
|
||||||
ActionMailer::Base.deliveries.clear
|
|
||||||
email = recipient.emails.create(email: "notifications@example.com")
|
|
||||||
recipient.update_attribute(:notification_email, email.email)
|
|
||||||
end
|
|
||||||
|
|
||||||
shared_examples 'a multiple recipients email' do
|
|
||||||
it 'is sent to the given recipient' do
|
|
||||||
is_expected.to deliver_to recipient.notification_email
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
shared_examples 'an email sent from GitLab' do
|
|
||||||
it 'is sent from GitLab' do
|
|
||||||
sender = subject.header[:from].addrs[0]
|
|
||||||
expect(sender.display_name).to eq(gitlab_sender_display_name)
|
|
||||||
expect(sender.address).to eq(gitlab_sender)
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'has a Reply-To address' do
|
|
||||||
reply_to = subject.header[:reply_to].addresses
|
|
||||||
expect(reply_to).to eq([gitlab_sender_reply_to])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
shared_examples 'an email with X-GitLab headers containing project details' do
|
|
||||||
it 'has X-GitLab-Project* headers' do
|
|
||||||
is_expected.to have_header 'X-GitLab-Project', /#{project.name}/
|
|
||||||
is_expected.to have_header 'X-GitLab-Project-Id', /#{project.id}/
|
|
||||||
is_expected.to have_header 'X-GitLab-Project-Path', /#{project.path_with_namespace}/
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
shared_examples 'an email that contains a header with author username' do
|
|
||||||
it 'has X-GitLab-Author header containing author\'s username' do
|
|
||||||
is_expected.to have_header 'X-GitLab-Author', user.username
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
shared_examples 'an email starting a new thread' do |message_id_prefix|
|
|
||||||
include_examples 'an email with X-GitLab headers containing project details'
|
|
||||||
|
|
||||||
it 'has a discussion identifier' do
|
|
||||||
is_expected.to have_header 'Message-ID', /<#{message_id_prefix}(.*)@#{Gitlab.config.gitlab.host}>/
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
shared_examples 'an answer to an existing thread' do |thread_id_prefix|
|
|
||||||
include_examples 'an email with X-GitLab headers containing project details'
|
|
||||||
|
|
||||||
it 'has a subject that begins with Re: ' do
|
|
||||||
is_expected.to have_subject /^Re: /
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'has headers that reference an existing thread' do
|
|
||||||
is_expected.to have_header 'Message-ID', /<(.*)@#{Gitlab.config.gitlab.host}>/
|
|
||||||
is_expected.to have_header 'References', /<#{thread_id_prefix}(.*)@#{Gitlab.config.gitlab.host}>/
|
|
||||||
is_expected.to have_header 'In-Reply-To', /<#{thread_id_prefix}(.*)@#{Gitlab.config.gitlab.host}>/
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
shared_examples 'a new user email' do |user_email, site_path|
|
|
||||||
it 'is sent to the new user' do
|
|
||||||
is_expected.to deliver_to user_email
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'has the correct subject' do
|
|
||||||
is_expected.to have_subject /^Account was created for you$/i
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'contains the new user\'s login name' do
|
|
||||||
is_expected.to have_body_text /#{user_email}/
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'includes a link to the site' do
|
|
||||||
is_expected.to have_body_text /#{site_path}/
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
shared_examples 'it should have Gmail Actions links' do
|
|
||||||
it { is_expected.to have_body_text /ViewAction/ }
|
|
||||||
end
|
|
||||||
|
|
||||||
shared_examples 'it should not have Gmail Actions links' do
|
|
||||||
it { is_expected.to_not have_body_text /ViewAction/ }
|
|
||||||
end
|
|
||||||
|
|
||||||
shared_examples 'it should show Gmail Actions View Issue link' do
|
|
||||||
it_behaves_like 'it should have Gmail Actions links'
|
|
||||||
|
|
||||||
it { is_expected.to have_body_text /View Issue/ }
|
|
||||||
end
|
|
||||||
|
|
||||||
shared_examples 'it should show Gmail Actions View Merge request link' do
|
|
||||||
it_behaves_like 'it should have Gmail Actions links'
|
|
||||||
|
|
||||||
it { is_expected.to have_body_text /View Merge request/ }
|
|
||||||
end
|
|
||||||
|
|
||||||
shared_examples 'it should show Gmail Actions View Commit link' do
|
|
||||||
it_behaves_like 'it should have Gmail Actions links'
|
|
||||||
|
|
||||||
it { is_expected.to have_body_text /View Commit/ }
|
|
||||||
end
|
|
||||||
|
|
||||||
shared_examples 'an unsubscribeable thread' do
|
|
||||||
it { is_expected.to have_body_text /unsubscribe/ }
|
|
||||||
end
|
|
||||||
|
|
||||||
shared_examples "a user cannot unsubscribe through footer link" do
|
|
||||||
it { is_expected.not_to have_body_text /unsubscribe/ }
|
|
||||||
end
|
|
||||||
|
|
||||||
describe 'for new users, the email' do
|
describe 'for new users, the email' do
|
||||||
let(:example_site_path) { root_path }
|
let(:example_site_path) { root_path }
|
||||||
|
@ -136,7 +18,7 @@ describe Notify do
|
||||||
subject { Notify.new_user_email(new_user.id, token) }
|
subject { Notify.new_user_email(new_user.id, token) }
|
||||||
|
|
||||||
it_behaves_like 'an email sent from GitLab'
|
it_behaves_like 'an email sent from GitLab'
|
||||||
it_behaves_like 'a new user email', new_user_address
|
it_behaves_like 'a new user email'
|
||||||
it_behaves_like 'it should not have Gmail Actions links'
|
it_behaves_like 'it should not have Gmail Actions links'
|
||||||
it_behaves_like 'a user cannot unsubscribe through footer link'
|
it_behaves_like 'a user cannot unsubscribe through footer link'
|
||||||
|
|
||||||
|
@ -165,7 +47,7 @@ describe Notify do
|
||||||
subject { Notify.new_user_email(new_user.id) }
|
subject { Notify.new_user_email(new_user.id) }
|
||||||
|
|
||||||
it_behaves_like 'an email sent from GitLab'
|
it_behaves_like 'an email sent from GitLab'
|
||||||
it_behaves_like 'a new user email', new_user_address
|
it_behaves_like 'a new user email'
|
||||||
it_behaves_like 'it should not have Gmail Actions links'
|
it_behaves_like 'it should not have Gmail Actions links'
|
||||||
it_behaves_like 'a user cannot unsubscribe through footer link'
|
it_behaves_like 'a user cannot unsubscribe through footer link'
|
||||||
|
|
||||||
|
@ -963,59 +845,4 @@ describe Notify do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'build notification email' do
|
|
||||||
let(:build) { create(:ci_build) }
|
|
||||||
let(:project) { build.project }
|
|
||||||
|
|
||||||
shared_examples 'build email' do
|
|
||||||
it 'contains name of project' do
|
|
||||||
is_expected.to have_body_text build.project_name
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'contains link to project' do
|
|
||||||
is_expected.to have_body_text namespace_project_path(project.namespace, project)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
shared_examples 'an email with X-GitLab headers containing build details' do
|
|
||||||
it 'has X-GitLab-Build* headers' do
|
|
||||||
is_expected.to have_header 'X-GitLab-Build-Id', /#{build.id}/
|
|
||||||
is_expected.to have_header 'X-GitLab-Build-Ref', /#{build.ref}/
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe 'build success' do
|
|
||||||
subject { Notify.build_success_email(build.id, 'wow@example.com') }
|
|
||||||
before { build.success }
|
|
||||||
|
|
||||||
it_behaves_like 'build email'
|
|
||||||
it_behaves_like 'an email with X-GitLab headers containing build details'
|
|
||||||
it_behaves_like 'an email with X-GitLab headers containing project details'
|
|
||||||
|
|
||||||
it 'has header indicating build status' do
|
|
||||||
is_expected.to have_header 'X-GitLab-Build-Status', 'success'
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'has the correct subject' do
|
|
||||||
is_expected.to have_subject /Build success for/
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe 'build fail' do
|
|
||||||
subject { Notify.build_fail_email(build.id, 'wow@example.com') }
|
|
||||||
before { build.drop }
|
|
||||||
|
|
||||||
it_behaves_like 'build email'
|
|
||||||
it_behaves_like 'an email with X-GitLab headers containing build details'
|
|
||||||
it_behaves_like 'an email with X-GitLab headers containing project details'
|
|
||||||
|
|
||||||
it 'has header indicating build status' do
|
|
||||||
is_expected.to have_header 'X-GitLab-Build-Status', 'failed'
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'has the correct subject' do
|
|
||||||
is_expected.to have_subject /Build failed for/
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
117
spec/mailers/shared/notify.rb
Normal file
117
spec/mailers/shared/notify.rb
Normal file
|
@ -0,0 +1,117 @@
|
||||||
|
shared_context 'gitlab email notification' do
|
||||||
|
let(:gitlab_sender_display_name) { Gitlab.config.gitlab.email_display_name }
|
||||||
|
let(:gitlab_sender) { Gitlab.config.gitlab.email_from }
|
||||||
|
let(:gitlab_sender_reply_to) { Gitlab.config.gitlab.email_reply_to }
|
||||||
|
let(:recipient) { create(:user, email: 'recipient@example.com') }
|
||||||
|
let(:project) { create(:project) }
|
||||||
|
let(:new_user_address) { 'newguy@example.com' }
|
||||||
|
|
||||||
|
before do
|
||||||
|
ActionMailer::Base.deliveries.clear
|
||||||
|
email = recipient.emails.create(email: "notifications@example.com")
|
||||||
|
recipient.update_attribute(:notification_email, email.email)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
shared_examples 'a multiple recipients email' do
|
||||||
|
it 'is sent to the given recipient' do
|
||||||
|
is_expected.to deliver_to recipient.notification_email
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
shared_examples 'an email sent from GitLab' do
|
||||||
|
it 'is sent from GitLab' do
|
||||||
|
sender = subject.header[:from].addrs[0]
|
||||||
|
expect(sender.display_name).to eq(gitlab_sender_display_name)
|
||||||
|
expect(sender.address).to eq(gitlab_sender)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'has a Reply-To address' do
|
||||||
|
reply_to = subject.header[:reply_to].addresses
|
||||||
|
expect(reply_to).to eq([gitlab_sender_reply_to])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
shared_examples 'an email that contains a header with author username' do
|
||||||
|
it 'has X-GitLab-Author header containing author\'s username' do
|
||||||
|
is_expected.to have_header 'X-GitLab-Author', user.username
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
shared_examples 'an email with X-GitLab headers containing project details' do
|
||||||
|
it 'has X-GitLab-Project* headers' do
|
||||||
|
is_expected.to have_header 'X-GitLab-Project', /#{project.name}/
|
||||||
|
is_expected.to have_header 'X-GitLab-Project-Id', /#{project.id}/
|
||||||
|
is_expected.to have_header 'X-GitLab-Project-Path', /#{project.path_with_namespace}/
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
shared_examples 'an email starting a new thread' do |message_id_prefix|
|
||||||
|
include_examples 'an email with X-GitLab headers containing project details'
|
||||||
|
|
||||||
|
it 'has a discussion identifier' do
|
||||||
|
is_expected.to have_header 'Message-ID', /<#{message_id_prefix}(.*)@#{Gitlab.config.gitlab.host}>/
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
shared_examples 'an answer to an existing thread' do |thread_id_prefix|
|
||||||
|
include_examples 'an email with X-GitLab headers containing project details'
|
||||||
|
|
||||||
|
it 'has a subject that begins with Re: ' do
|
||||||
|
is_expected.to have_subject /^Re: /
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'has headers that reference an existing thread' do
|
||||||
|
is_expected.to have_header 'Message-ID', /<(.*)@#{Gitlab.config.gitlab.host}>/
|
||||||
|
is_expected.to have_header 'References', /<#{thread_id_prefix}(.*)@#{Gitlab.config.gitlab.host}>/
|
||||||
|
is_expected.to have_header 'In-Reply-To', /<#{thread_id_prefix}(.*)@#{Gitlab.config.gitlab.host}>/
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
shared_examples 'a new user email' do
|
||||||
|
it 'is sent to the new user' do
|
||||||
|
is_expected.to deliver_to new_user_address
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'has the correct subject' do
|
||||||
|
is_expected.to have_subject /^Account was created for you$/i
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'contains the new user\'s login name' do
|
||||||
|
is_expected.to have_body_text /#{new_user_address}/
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
shared_examples 'it should have Gmail Actions links' do
|
||||||
|
it { is_expected.to have_body_text /ViewAction/ }
|
||||||
|
end
|
||||||
|
|
||||||
|
shared_examples 'it should not have Gmail Actions links' do
|
||||||
|
it { is_expected.to_not have_body_text /ViewAction/ }
|
||||||
|
end
|
||||||
|
|
||||||
|
shared_examples 'it should show Gmail Actions View Issue link' do
|
||||||
|
it_behaves_like 'it should have Gmail Actions links'
|
||||||
|
|
||||||
|
it { is_expected.to have_body_text /View Issue/ }
|
||||||
|
end
|
||||||
|
|
||||||
|
shared_examples 'it should show Gmail Actions View Merge request link' do
|
||||||
|
it_behaves_like 'it should have Gmail Actions links'
|
||||||
|
|
||||||
|
it { is_expected.to have_body_text /View Merge request/ }
|
||||||
|
end
|
||||||
|
|
||||||
|
shared_examples 'it should show Gmail Actions View Commit link' do
|
||||||
|
it_behaves_like 'it should have Gmail Actions links'
|
||||||
|
|
||||||
|
it { is_expected.to have_body_text /View Commit/ }
|
||||||
|
end
|
||||||
|
|
||||||
|
shared_examples 'an unsubscribeable thread' do
|
||||||
|
it { is_expected.to have_body_text /unsubscribe/ }
|
||||||
|
end
|
||||||
|
|
||||||
|
shared_examples "a user cannot unsubscribe through footer link" do
|
||||||
|
it { is_expected.not_to have_body_text /unsubscribe/ }
|
||||||
|
end
|
Loading…
Reference in a new issue