diff options
Diffstat (limited to 'spec/lib/gitlab/email/receiver_spec.rb')
-rw-r--r-- | spec/lib/gitlab/email/receiver_spec.rb | 62 |
1 files changed, 55 insertions, 7 deletions
diff --git a/spec/lib/gitlab/email/receiver_spec.rb b/spec/lib/gitlab/email/receiver_spec.rb index 79476c63e66..9240d07fd59 100644 --- a/spec/lib/gitlab/email/receiver_spec.rb +++ b/spec/lib/gitlab/email/receiver_spec.rb @@ -5,11 +5,10 @@ require 'spec_helper' RSpec.describe Gitlab::Email::Receiver do include_context :email_shared_context + let_it_be(:project) { create(:project) } let(:metric_transaction) { instance_double(Gitlab::Metrics::WebTransaction) } shared_examples 'successful receive' do - let_it_be(:project) { create(:project) } - let(:handler) { double(:handler, project: project, execute: true, metrics_event: nil, metrics_params: nil) } let(:client_id) { 'email/jake@example.com' } @@ -39,7 +38,7 @@ RSpec.describe Gitlab::Email::Receiver do end end - shared_examples 'failed receive' do + shared_examples 'failed receive with event' do it 'adds metric event' do expect(::Gitlab::Metrics::BackgroundTransaction).to receive(:current).and_return(metric_transaction) expect(metric_transaction).to receive(:add_event).with('email_receiver_error', { error: expected_error.name }) @@ -48,6 +47,14 @@ RSpec.describe Gitlab::Email::Receiver do end end + shared_examples 'failed receive without event' do + it 'adds metric event' do + expect(::Gitlab::Metrics::BackgroundTransaction).not_to receive(:current) + + expect { receiver.execute }.to raise_error(expected_error) + end + end + context 'when the email contains a valid email address in a header' do before do stub_incoming_email_setting(enabled: true, address: "incoming+%{key}@appmail.example.com") @@ -100,21 +107,21 @@ RSpec.describe Gitlab::Email::Receiver do let(:email_raw) { fixture_file('emails/valid_reply.eml').gsub(mail_key, '!!!') } let(:expected_error) { Gitlab::Email::UnknownIncomingEmail } - it_behaves_like 'failed receive' + it_behaves_like 'failed receive with event' end context 'when the email is blank' do let(:email_raw) { '' } let(:expected_error) { Gitlab::Email::EmptyEmailError } - it_behaves_like 'failed receive' + it_behaves_like 'failed receive without event' end context 'when the email was auto generated with Auto-Submitted header' do let(:email_raw) { fixture_file('emails/auto_submitted.eml') } let(:expected_error) { Gitlab::Email::AutoGeneratedEmailError } - it_behaves_like 'failed receive' + it_behaves_like 'failed receive without event' end context "when the email's To field is blank" do @@ -164,7 +171,48 @@ RSpec.describe Gitlab::Email::Receiver do let(:email_raw) { fixture_file('emails/auto_reply.eml') } let(:expected_error) { Gitlab::Email::AutoGeneratedEmailError } - it_behaves_like 'failed receive' + it_behaves_like 'failed receive without event' + end + + describe 'event raising via errors' do + let(:handler) { double(:handler, project: project, execute: true, metrics_event: nil, metrics_params: nil) } + let(:email_raw) { "arbitrary text. could be anything really. we're going to raise an error anyway." } + + before do + allow(receiver).to receive(:handler).and_return(handler) + allow(handler).to receive(:execute).and_raise(expected_error) + end + + describe 'handling errors which do not raise events' do + where(:expected_error) do + [ + Gitlab::Email::AutoGeneratedEmailError, + Gitlab::Email::ProjectNotFound, + Gitlab::Email::EmptyEmailError, + Gitlab::Email::UserNotFoundError, + Gitlab::Email::UserBlockedError, + Gitlab::Email::UserNotAuthorizedError, + Gitlab::Email::NoteableNotFoundError, + Gitlab::Email::InvalidAttachment, + Gitlab::Email::InvalidRecordError, + Gitlab::Email::EmailTooLarge + ] + end + + with_them do + it_behaves_like 'failed receive without event' + end + end + + describe 'handling errors which do raise events' do + where(:expected_error) do + [Gitlab::Email::EmailUnparsableError, Gitlab::Email::UnknownIncomingEmail, ArgumentError, StandardError] + end + + with_them do + it_behaves_like 'failed receive with event' + end + end end it 'requires all handlers to have a unique metric_event' do |