debian-mirror-gitlab/spec/workers/emails_on_push_worker_spec.rb

196 lines
6.1 KiB
Ruby
Raw Normal View History

2019-07-07 11:18:12 +05:30
# frozen_string_literal: true
2015-09-25 12:07:36 +05:30
require 'spec_helper'
2020-07-28 23:09:34 +05:30
RSpec.describe EmailsOnPushWorker, :mailer do
2015-09-25 12:07:36 +05:30
include RepoHelpers
2016-09-13 17:45:13 +05:30
include EmailSpec::Matchers
2015-09-25 12:07:36 +05:30
2017-08-17 22:00:37 +05:30
let(:project) { create(:project, :repository) }
2015-09-25 12:07:36 +05:30
let(:user) { create(:user) }
2016-09-13 17:45:13 +05:30
let(:data) { Gitlab::DataBuilder::Push.build_sample(project, user) }
2016-06-02 11:05:42 +05:30
let(:recipients) { user.email }
let(:perform) { subject.perform(project.id, recipients, data.stringify_keys) }
2016-09-13 17:45:13 +05:30
let(:email) { ActionMailer::Base.deliveries.last }
2015-09-25 12:07:36 +05:30
2017-08-17 22:00:37 +05:30
subject { described_class.new }
2015-09-25 12:07:36 +05:30
describe "#perform" do
2016-08-24 12:49:21 +05:30
context "when push is a new branch" do
before do
data_new_branch = data.stringify_keys.merge("before" => Gitlab::Git::BLANK_SHA)
subject.perform(project.id, recipients, data_new_branch)
end
it "sends a mail with the correct subject" do
expect(email.subject).to include("Pushed new branch")
end
it "sends the mail to the correct recipient" do
expect(email.to).to eq([user.email])
end
end
context "when push is a deleted branch" do
before do
data_deleted_branch = data.stringify_keys.merge("after" => Gitlab::Git::BLANK_SHA)
subject.perform(project.id, recipients, data_deleted_branch)
end
it "sends a mail with the correct subject" do
expect(email.subject).to include("Deleted branch")
end
it "sends the mail to the correct recipient" do
expect(email.to).to eq([user.email])
end
end
2016-09-13 17:45:13 +05:30
context "when push is a force push to delete commits" do
before do
data_force_push = data.stringify_keys.merge(
"after" => data[:before],
"before" => data[:after]
)
subject.perform(project.id, recipients, data_force_push)
end
it "sends a mail with the correct subject" do
2016-11-03 12:29:30 +05:30
expect(email.subject).to include('adds bar folder and branch-test text file')
2016-09-13 17:45:13 +05:30
end
2016-06-02 11:05:42 +05:30
2016-09-13 17:45:13 +05:30
it "mentions force pushing in the body" do
expect(email).to have_body_text("force push")
end
it "sends the mail to the correct recipient" do
expect(email.to).to eq([user.email])
end
end
context "when there are no errors in sending" do
2017-09-10 17:25:29 +05:30
before do
perform
end
2015-09-25 12:07:36 +05:30
2016-06-02 11:05:42 +05:30
it "sends a mail with the correct subject" do
2016-11-03 12:29:30 +05:30
expect(email.subject).to include('adds bar folder and branch-test text file')
2016-06-02 11:05:42 +05:30
end
2016-09-13 17:45:13 +05:30
it "does not mention force pushing in the body" do
expect(email).not_to have_body_text("force push")
end
2016-06-02 11:05:42 +05:30
it "sends the mail to the correct recipient" do
expect(email.to).to eq([user.email])
end
2015-09-25 12:07:36 +05:30
end
2016-06-02 11:05:42 +05:30
context "when there is an SMTP error" do
before do
allow(Notify).to receive(:repository_push_email).and_raise(Net::SMTPFatalError)
2016-09-13 17:45:13 +05:30
allow(subject).to receive_message_chain(:logger, :info)
2016-06-02 11:05:42 +05:30
perform
end
it "gracefully handles an input SMTP error" do
2021-04-17 20:07:23 +05:30
expect(ActionMailer::Base.deliveries).to be_empty
2016-06-02 11:05:42 +05:30
end
end
context "when there are multiple recipients" do
before do
2019-02-15 15:39:39 +05:30
# This is a hack because we modify the mail object before sending, for efficiency,
2016-06-02 11:05:42 +05:30
# but the TestMailer adapter just appends the objects to an array. To clone a mail
# object, create a new one!
# https://github.com/mikel/mail/issues/314#issuecomment-12750108
allow_any_instance_of(Mail::TestMailer).to receive(:deliver!).and_wrap_original do |original, mail|
original.call(Mail.new(mail.encoded))
end
end
2015-09-25 12:07:36 +05:30
2021-04-17 20:07:23 +05:30
context "with mixed-case recipient" do
let(:recipients) { user.email.upcase }
it "retains the case" do
perform
expect(email_recipients).to contain_exactly(recipients)
end
end
2018-11-18 11:00:15 +05:30
context "when the recipient addresses are a list of email addresses" do
let(:recipients) do
1.upto(5).map { |i| user.email.sub('@', "+#{i}@") }.join("\n")
end
it "sends the mail to each of the recipients" do
perform
expect(email_recipients).to contain_exactly(*recipients.split)
end
it "only generates the mail once" do
expect(Notify).to receive(:repository_push_email).once.and_call_original
expect(Premailer::Rails::CustomizedPremailer).to receive(:new).once.and_call_original
perform
end
2016-06-02 11:05:42 +05:30
end
2015-09-25 12:07:36 +05:30
2021-04-17 20:07:23 +05:30
context "when recipients are invalid" do
let(:recipients) { "invalid\n\nrecipients" }
it "ignores them" do
perform
expect(ActionMailer::Base.deliveries).to be_empty
end
end
2018-11-18 11:00:15 +05:30
context "when the recipient addresses contains angle brackets and are separated by spaces" do
let(:recipients) { "John Doe <johndoe@example.com> Jane Doe <janedoe@example.com>" }
it "accepts emails separated by whitespace" do
perform
expect(email_recipients).to contain_exactly("johndoe@example.com", "janedoe@example.com")
end
end
context "when the recipient addresses contain a mix of emails with and without angle brackets" do
let(:recipients) { "johndoe@example.com Jane Doe <janedoe@example.com>" }
it "accepts both kind of emails" do
perform
expect(email_recipients).to contain_exactly("johndoe@example.com", "janedoe@example.com")
end
end
context "when the recipient addresses contains angle brackets and are separated by newlines" do
let(:recipients) { "John Doe <johndoe@example.com>\nJane Doe <janedoe@example.com>" }
it "accepts emails separated by newlines" do
perform
expect(email_recipients).to contain_exactly("johndoe@example.com", "janedoe@example.com")
end
2016-06-02 11:05:42 +05:30
end
2021-04-17 20:07:23 +05:30
context 'when the recipient addresses contains duplicates' do
let(:recipients) { 'non@dubplicate.com Duplic@te.com duplic@te.com Duplic@te.com duplic@Te.com' }
it 'deduplicates recipients while treating the domain part as case-insensitive' do
perform
expect(email_recipients).to contain_exactly('non@dubplicate.com', 'Duplic@te.com')
end
end
2015-09-25 12:07:36 +05:30
end
end
end