Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/lib/gitlab/email')
-rw-r--r--spec/lib/gitlab/email/attachment_uploader_spec.rb2
-rw-r--r--spec/lib/gitlab/email/handler/create_issue_handler_spec.rb2
-rw-r--r--spec/lib/gitlab/email/handler/create_merge_request_handler_spec.rb2
-rw-r--r--spec/lib/gitlab/email/handler/create_note_handler_spec.rb68
-rw-r--r--spec/lib/gitlab/email/handler/service_desk_handler_spec.rb311
-rw-r--r--spec/lib/gitlab/email/handler/unsubscribe_handler_spec.rb2
-rw-r--r--spec/lib/gitlab/email/handler_spec.rb44
-rw-r--r--spec/lib/gitlab/email/hook/additional_headers_interceptor_spec.rb2
-rw-r--r--spec/lib/gitlab/email/hook/delivery_metrics_observer_spec.rb2
-rw-r--r--spec/lib/gitlab/email/hook/disable_email_interceptor_spec.rb2
-rw-r--r--spec/lib/gitlab/email/hook/smime_signature_interceptor_spec.rb2
-rw-r--r--spec/lib/gitlab/email/message/repository_push_spec.rb2
-rw-r--r--spec/lib/gitlab/email/receiver_spec.rb2
-rw-r--r--spec/lib/gitlab/email/reply_parser_spec.rb2
-rw-r--r--spec/lib/gitlab/email/service_desk_receiver_spec.rb37
-rw-r--r--spec/lib/gitlab/email/smime/certificate_spec.rb2
-rw-r--r--spec/lib/gitlab/email/smime/signer_spec.rb2
17 files changed, 461 insertions, 25 deletions
diff --git a/spec/lib/gitlab/email/attachment_uploader_spec.rb b/spec/lib/gitlab/email/attachment_uploader_spec.rb
index 5104e0a3f8f..6beadb6e1a5 100644
--- a/spec/lib/gitlab/email/attachment_uploader_spec.rb
+++ b/spec/lib/gitlab/email/attachment_uploader_spec.rb
@@ -2,7 +2,7 @@
require "spec_helper"
-describe Gitlab::Email::AttachmentUploader do
+RSpec.describe Gitlab::Email::AttachmentUploader do
describe "#execute" do
let(:project) { create(:project) }
let(:message_raw) { fixture_file("emails/attachment.eml") }
diff --git a/spec/lib/gitlab/email/handler/create_issue_handler_spec.rb b/spec/lib/gitlab/email/handler/create_issue_handler_spec.rb
index 7833b9f387d..ee2173a9c8d 100644
--- a/spec/lib/gitlab/email/handler/create_issue_handler_spec.rb
+++ b/spec/lib/gitlab/email/handler/create_issue_handler_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Gitlab::Email::Handler::CreateIssueHandler do
+RSpec.describe Gitlab::Email::Handler::CreateIssueHandler do
include_context :email_shared_context
it_behaves_like :reply_processing_shared_examples
diff --git a/spec/lib/gitlab/email/handler/create_merge_request_handler_spec.rb b/spec/lib/gitlab/email/handler/create_merge_request_handler_spec.rb
index 9f5413f9607..75d5fc040cb 100644
--- a/spec/lib/gitlab/email/handler/create_merge_request_handler_spec.rb
+++ b/spec/lib/gitlab/email/handler/create_merge_request_handler_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Gitlab::Email::Handler::CreateMergeRequestHandler do
+RSpec.describe Gitlab::Email::Handler::CreateMergeRequestHandler do
include_context :email_shared_context
it_behaves_like :reply_processing_shared_examples
diff --git a/spec/lib/gitlab/email/handler/create_note_handler_spec.rb b/spec/lib/gitlab/email/handler/create_note_handler_spec.rb
index af963e1b695..e5598bbd10f 100644
--- a/spec/lib/gitlab/email/handler/create_note_handler_spec.rb
+++ b/spec/lib/gitlab/email/handler/create_note_handler_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Gitlab::Email::Handler::CreateNoteHandler do
+RSpec.describe Gitlab::Email::Handler::CreateNoteHandler do
include_context :email_shared_context
it_behaves_like :reply_processing_shared_examples
@@ -242,4 +242,70 @@ describe Gitlab::Email::Handler::CreateNoteHandler do
it_behaves_like 'a reply to existing comment'
end
+
+ context 'when the service desk' do
+ let(:project) { create(:project, :public, service_desk_enabled: true) }
+ let(:support_bot) { User.support_bot }
+ let(:noteable) { create(:issue, project: project, author: support_bot, title: 'service desk issue') }
+ let(:note) { create(:note, project: project, noteable: noteable) }
+ let(:email_raw) { fixture_file('emails/valid_reply_with_quick_actions.eml') }
+
+ let!(:sent_notification) do
+ SentNotification.record_note(note, support_bot.id, mail_key)
+ end
+
+ context 'is enabled' do
+ before do
+ allow(Gitlab::ServiceDesk).to receive(:enabled?).with(project: project).and_return(true)
+ project.project_feature.update!(issues_access_level: issues_access_level)
+ end
+
+ context 'when issues are enabled for everyone' do
+ let(:issues_access_level) { ProjectFeature::ENABLED }
+
+ it 'creates a comment' do
+ expect { receiver.execute }.to change { noteable.notes.count }.by(1)
+ end
+
+ context 'when quick actions are present' do
+ it 'encloses quick actions with code span markdown' do
+ receiver.execute
+ noteable.reload
+
+ note = Note.last
+ expect(note.note).to include("Jake out\n\n`/close`\n`/title test`")
+ expect(noteable.title).to eq('service desk issue')
+ expect(noteable).to be_opened
+ end
+ end
+ end
+
+ context 'when issues are protected members only' do
+ let(:issues_access_level) { ProjectFeature::PRIVATE }
+
+ it 'creates a comment' do
+ expect { receiver.execute }.to change { noteable.notes.count }.by(1)
+ end
+ end
+
+ context 'when issues are disabled' do
+ let(:issues_access_level) { ProjectFeature::DISABLED }
+
+ it 'does not create a comment' do
+ expect { receiver.execute }.to raise_error(Gitlab::Email::UserNotAuthorizedError)
+ end
+ end
+ end
+
+ context 'is disabled' do
+ before do
+ allow(Gitlab::ServiceDesk).to receive(:enabled?).and_return(false)
+ allow(Gitlab::ServiceDesk).to receive(:enabled?).with(project: project).and_return(false)
+ end
+
+ it 'does not create a comment' do
+ expect { receiver.execute }.to raise_error(Gitlab::Email::ProjectNotFound)
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/email/handler/service_desk_handler_spec.rb b/spec/lib/gitlab/email/handler/service_desk_handler_spec.rb
new file mode 100644
index 00000000000..a38fe2c51ca
--- /dev/null
+++ b/spec/lib/gitlab/email/handler/service_desk_handler_spec.rb
@@ -0,0 +1,311 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Email::Handler::ServiceDeskHandler do
+ include_context :email_shared_context
+
+ before do
+ stub_incoming_email_setting(enabled: true, address: "incoming+%{key}@appmail.adventuretime.ooo")
+ stub_config_setting(host: 'localhost')
+ end
+
+ let(:email_raw) { email_fixture('emails/service_desk.eml') }
+ let_it_be(:namespace) { create(:namespace, name: "email") }
+ let(:expected_description) do
+ "Service desk stuff!\n\n```\na = b\n```\n\n`/label ~label1`\n`/assign @user1`\n`/close`\n![image](uploads/image.png)"
+ end
+
+ context 'service desk is enabled for the project' do
+ let_it_be(:project) { create(:project, :repository, :public, namespace: namespace, path: 'test', service_desk_enabled: true) }
+
+ before do
+ allow(Gitlab::ServiceDesk).to receive(:supported?).and_return(true)
+ end
+
+ shared_examples 'a new issue request' do
+ before do
+ setup_attachment
+ end
+
+ it 'creates a new issue' do
+ expect { receiver.execute }.to change { Issue.count }.by(1)
+
+ new_issue = Issue.last
+
+ expect(new_issue.author).to eql(User.support_bot)
+ expect(new_issue.confidential?).to be true
+ expect(new_issue.all_references.all).to be_empty
+ expect(new_issue.title).to eq("Service Desk (from jake@adventuretime.ooo): The message subject! @all")
+ expect(new_issue.description).to eq(expected_description.strip)
+ end
+
+ it 'sends thank you email' do
+ expect { receiver.execute }.to have_enqueued_job.on_queue('mailers')
+ end
+ end
+
+ context 'when everything is fine' do
+ it_behaves_like 'a new issue request'
+
+ context 'with legacy incoming email address' do
+ let(:email_raw) { fixture_file('emails/service_desk_legacy.eml') }
+
+ it_behaves_like 'a new issue request'
+ end
+
+ context 'when using issue templates' do
+ let_it_be(:user) { create(:user) }
+
+ before do
+ setup_attachment
+ end
+
+ context 'and template is present' do
+ let_it_be(:settings) { create(:service_desk_setting, project: project) }
+
+ def set_template_file(file_name, content)
+ file_path = ".gitlab/issue_templates/#{file_name}.md"
+ project.repository.create_file(user, file_path, content, message: 'message', branch_name: 'master')
+ settings.update!(issue_template_key: file_name)
+ end
+
+ it 'appends template text to issue description' do
+ set_template_file('service_desk', 'text from template')
+
+ receiver.execute
+
+ issue_description = Issue.last.description
+ expect(issue_description).to include(expected_description)
+ expect(issue_description.lines.last).to eq('text from template')
+ end
+
+ context 'when quick actions are present' do
+ let(:label) { create(:label, project: project, title: 'label1') }
+ let(:milestone) { create(:milestone, project: project) }
+ let!(:user) { create(:user, username: 'user1') }
+
+ before do
+ project.add_developer(user)
+ end
+
+ it 'applies quick action commands present on templates' do
+ file_content = %(Text from template \n/label ~#{label.title} \n/milestone %"#{milestone.name}"")
+ set_template_file('with_slash_commands', file_content)
+
+ receiver.execute
+
+ issue = Issue.last
+ expect(issue.description).to include('Text from template')
+ expect(issue.label_ids).to include(label.id)
+ expect(issue.milestone).to eq(milestone)
+ end
+
+ it 'redacts quick actions present on user email body' do
+ set_template_file('service_desk1', 'text from template')
+
+ receiver.execute
+
+ issue = Issue.last
+ expect(issue).to be_opened
+ expect(issue.description).to include('`/label ~label1`')
+ expect(issue.description).to include('`/assign @user1`')
+ expect(issue.description).to include('`/close`')
+ expect(issue.assignees).to be_empty
+ expect(issue.milestone).to be_nil
+ end
+ end
+ end
+
+ context 'and template cannot be found' do
+ before do
+ service = ServiceDeskSetting.new(project_id: project.id, issue_template_key: 'unknown')
+ service.save!(validate: false)
+ end
+
+ it 'does not append template text to issue description' do
+ receiver.execute
+
+ new_issue = Issue.last
+
+ expect(new_issue.description).to eq(expected_description.strip)
+ end
+
+ it 'creates support bot note on issue' do
+ receiver.execute
+
+ note = Note.last
+
+ expect(note.note).to include("WARNING: The template file unknown.md used for service desk issues is empty or could not be found.")
+ expect(note.author).to eq(User.support_bot)
+ end
+
+ it 'does not send warning note email' do
+ ActionMailer::Base.deliveries = []
+
+ perform_enqueued_jobs do
+ expect { receiver.execute }.to change { ActionMailer::Base.deliveries.size }.by(1)
+ end
+
+ # Only sends created issue email
+ expect(ActionMailer::Base.deliveries.last.text_part.body).to include("Thank you for your support request!")
+ end
+ end
+ end
+
+ context 'when using service desk key' do
+ let_it_be(:service_desk_settings) { create(:service_desk_setting, project: project, project_key: 'mykey') }
+ let(:email_raw) { service_desk_fixture('emails/service_desk_custom_address.eml') }
+ let(:receiver) { Gitlab::Email::ServiceDeskReceiver.new(email_raw) }
+
+ before do
+ stub_service_desk_email_setting(enabled: true, address: 'support+%{key}@example.com')
+ end
+
+ it_behaves_like 'a new issue request'
+
+ context 'when there is no project with the key' do
+ let(:email_raw) { service_desk_fixture('emails/service_desk_custom_address.eml', key: 'some_key') }
+
+ it 'bounces the email' do
+ expect { receiver.execute }.to raise_error(Gitlab::Email::ProjectNotFound)
+ end
+ end
+
+ context 'when the project slug does not match' do
+ let(:email_raw) { service_desk_fixture('emails/service_desk_custom_address.eml', slug: 'some-slug') }
+
+ it 'bounces the email' do
+ expect { receiver.execute }.to raise_error(Gitlab::Email::ProjectNotFound)
+ end
+ end
+
+ context 'when service_desk_custom_address feature is disabled' do
+ before do
+ stub_feature_flags(service_desk_custom_address: false)
+ end
+
+ it 'bounces the email' do
+ expect { receiver.execute }.to raise_error(Gitlab::Email::ProjectNotFound)
+ end
+ end
+ end
+ end
+
+ describe '#can_handle?' do
+ let(:mail) { Mail::Message.new(email_raw) }
+
+ it 'handles the new email key format' do
+ handler = described_class.new(mail, "h5bp-html5-boilerplate-#{project.project_id}-issue-")
+
+ expect(handler.instance_variable_get(:@project_id).to_i).to eq project.project_id
+ expect(handler.can_handle?).to be_truthy
+ end
+
+ it 'handles the legacy email key format' do
+ handler = described_class.new(mail, "h5bp/html5-boilerplate")
+
+ expect(handler.instance_variable_get(:@project_path)).to eq 'h5bp/html5-boilerplate'
+ expect(handler.can_handle?).to be_truthy
+ end
+
+ it "doesn't handle invalid email key" do
+ handler = described_class.new(mail, "h5bp-html5-boilerplate-invalid")
+
+ expect(handler.can_handle?).to be_falsey
+ end
+ end
+
+ context 'when there is no from address' do
+ before do
+ allow_next_instance_of(described_class) do |instance|
+ allow(instance).to receive(:from_address).and_return(nil)
+ end
+ end
+
+ it "creates a new issue" do
+ expect { receiver.execute }.to change { Issue.count }.by(1)
+ end
+
+ it 'does not send thank you email' do
+ expect { receiver.execute }.not_to have_enqueued_job.on_queue('mailers')
+ end
+ end
+
+ context 'when there is a sender address and a from address' do
+ let(:email_raw) { email_fixture('emails/service_desk_sender_and_from.eml') }
+
+ it 'prefers the from address' do
+ setup_attachment
+
+ expect { receiver.execute }.to change { Issue.count }.by(1)
+
+ new_issue = Issue.last
+
+ expect(new_issue.service_desk_reply_to).to eq('finn@adventuretime.ooo')
+ end
+ end
+
+ context 'when service desk is not enabled for project' do
+ before do
+ allow(Gitlab::ServiceDesk).to receive(:enabled?).and_return(false)
+ end
+
+ it 'does not create an issue' do
+ expect { receiver.execute rescue nil }.not_to change { Issue.count }
+ end
+
+ it 'does not send thank you email' do
+ expect { receiver.execute rescue nil }.not_to have_enqueued_job.on_queue('mailers')
+ end
+ end
+
+ context 'when the email is forwarded through an alias' do
+ let(:email_raw) { email_fixture('emails/service_desk_forwarded.eml') }
+
+ it_behaves_like 'a new issue request'
+ end
+
+ context 'when the email is forwarded' do
+ let(:email_raw) { email_fixture('emails/service_desk_forwarded_new_issue.eml') }
+
+ it_behaves_like 'a new issue request' do
+ let(:expected_description) do
+ <<~EOF
+ Service desk stuff!
+
+ ---------- Forwarded message ---------
+ From: Jake the Dog <jake@adventuretime.ooo>
+ To: <jake@adventuretime.ooo>
+
+
+ forwarded content
+
+ ![image](uploads/image.png)
+ EOF
+ end
+ end
+ end
+ end
+
+ context 'service desk is disabled for the project' do
+ let(:project) { create(:project, :public, namespace: namespace, path: 'test', service_desk_enabled: false) }
+
+ it 'bounces the email' do
+ expect { receiver.execute }.to raise_error(Gitlab::Email::ProcessingError)
+ end
+
+ it "doesn't create an issue" do
+ expect { receiver.execute rescue nil }.not_to change { Issue.count }
+ end
+ end
+
+ def email_fixture(path)
+ fixture_file(path).gsub('project_id', project.project_id.to_s)
+ end
+
+ def service_desk_fixture(path, slug: nil, key: 'mykey')
+ slug ||= project.full_path_slug.to_s
+ fixture_file(path).gsub('project_slug', slug).gsub('project_key', key)
+ end
+end
diff --git a/spec/lib/gitlab/email/handler/unsubscribe_handler_spec.rb b/spec/lib/gitlab/email/handler/unsubscribe_handler_spec.rb
index dcddd00df59..13ad9ddd8ef 100644
--- a/spec/lib/gitlab/email/handler/unsubscribe_handler_spec.rb
+++ b/spec/lib/gitlab/email/handler/unsubscribe_handler_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Gitlab::Email::Handler::UnsubscribeHandler do
+RSpec.describe Gitlab::Email::Handler::UnsubscribeHandler do
include_context :email_shared_context
before do
diff --git a/spec/lib/gitlab/email/handler_spec.rb b/spec/lib/gitlab/email/handler_spec.rb
index 6dbf069f07c..2cd8c31e6b2 100644
--- a/spec/lib/gitlab/email/handler_spec.rb
+++ b/spec/lib/gitlab/email/handler_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Gitlab::Email::Handler do
+RSpec.describe Gitlab::Email::Handler do
let(:email) { Mail.new { body 'email' } }
describe '.for' do
@@ -33,12 +33,40 @@ describe Gitlab::Email::Handler do
it 'returns nil if provided email is nil' do
expect(described_class.for(nil, '')).to be_nil
end
+
+ context 'new issue email' do
+ def handler_for(fixture, mail_key)
+ described_class.for(fixture_file(fixture), mail_key)
+ end
+
+ before do
+ stub_incoming_email_setting(enabled: true, address: "incoming+%{key}@appmail.adventuretime.ooo")
+ stub_config_setting(host: 'localhost')
+ end
+
+ let!(:user) { create(:user, email: 'jake@adventuretime.ooo', incoming_email_token: 'auth_token') }
+
+ context 'a Service Desk email' do
+ it 'uses the Service Desk handler' do
+ expect(handler_for('emails/service_desk.eml', 'some/project')).to be_instance_of(Gitlab::Email::Handler::ServiceDeskHandler)
+ end
+ end
+
+ it 'return new issue handler' do
+ expect(handler_for('emails/valid_new_issue.eml', 'some/project+auth_token')).to be_instance_of(Gitlab::Email::Handler::CreateIssueHandler)
+ end
+ end
end
describe 'regexps are set properly' do
let(:addresses) do
- %W(sent_notification_key#{Gitlab::IncomingEmail::UNSUBSCRIBE_SUFFIX} sent_notification_key path-to-project-123-user_email_token-merge-request path-to-project-123-user_email_token-issue) +
- %W(sent_notification_key#{Gitlab::IncomingEmail::UNSUBSCRIBE_SUFFIX_LEGACY} sent_notification_key path/to/project+merge-request+user_email_token path/to/project+user_email_token)
+ %W(sent_notification_key#{Gitlab::IncomingEmail::UNSUBSCRIBE_SUFFIX} sent_notification_key path-to-project-123-user_email_token-merge-request) +
+ %W(sent_notification_key#{Gitlab::IncomingEmail::UNSUBSCRIBE_SUFFIX_LEGACY} sent_notification_key path-to-project-123-user_email_token-issue) +
+ %w(path/to/project+user_email_token path/to/project+merge-request+user_email_token some/project)
+ end
+
+ before do
+ allow(Gitlab::ServiceDesk).to receive(:supported?).and_return(true)
end
it 'picks each handler at least once' do
@@ -46,12 +74,12 @@ describe Gitlab::Email::Handler do
described_class.for(email, address).class
end
- expect(matched_handlers.uniq).to match_array(ce_handlers)
+ expect(matched_handlers.uniq).to match_array(Gitlab::Email::Handler.handlers)
end
it 'can pick exactly one handler for each address' do
addresses.each do |address|
- matched_handlers = ce_handlers.select do |handler|
+ matched_handlers = Gitlab::Email::Handler.handlers.select do |handler|
handler.new(email, address).can_handle?
end
@@ -59,10 +87,4 @@ describe Gitlab::Email::Handler do
end
end
end
-
- def ce_handlers
- @ce_handlers ||= Gitlab::Email::Handler.handlers.reject do |handler|
- handler.name.start_with?('Gitlab::Email::Handler::EE::')
- end
- end
end
diff --git a/spec/lib/gitlab/email/hook/additional_headers_interceptor_spec.rb b/spec/lib/gitlab/email/hook/additional_headers_interceptor_spec.rb
index 65e4e27d56f..deaa086d689 100644
--- a/spec/lib/gitlab/email/hook/additional_headers_interceptor_spec.rb
+++ b/spec/lib/gitlab/email/hook/additional_headers_interceptor_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Gitlab::Email::Hook::AdditionalHeadersInterceptor do
+RSpec.describe Gitlab::Email::Hook::AdditionalHeadersInterceptor do
let(:mail) do
ActionMailer::Base.mail(to: 'test@mail.com', from: 'info@mail.com', body: 'hello')
end
diff --git a/spec/lib/gitlab/email/hook/delivery_metrics_observer_spec.rb b/spec/lib/gitlab/email/hook/delivery_metrics_observer_spec.rb
index 24da47c42ac..73a0573be26 100644
--- a/spec/lib/gitlab/email/hook/delivery_metrics_observer_spec.rb
+++ b/spec/lib/gitlab/email/hook/delivery_metrics_observer_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Gitlab::Email::Hook::DeliveryMetricsObserver do
+RSpec.describe Gitlab::Email::Hook::DeliveryMetricsObserver do
let(:email) do
ActionMailer::Base.mail(to: 'test@example.com',
from: 'info@example.com',
diff --git a/spec/lib/gitlab/email/hook/disable_email_interceptor_spec.rb b/spec/lib/gitlab/email/hook/disable_email_interceptor_spec.rb
index c8ed12523d0..47f6015c6f8 100644
--- a/spec/lib/gitlab/email/hook/disable_email_interceptor_spec.rb
+++ b/spec/lib/gitlab/email/hook/disable_email_interceptor_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Gitlab::Email::Hook::DisableEmailInterceptor do
+RSpec.describe Gitlab::Email::Hook::DisableEmailInterceptor do
before do
Mail.register_interceptor(described_class)
end
diff --git a/spec/lib/gitlab/email/hook/smime_signature_interceptor_spec.rb b/spec/lib/gitlab/email/hook/smime_signature_interceptor_spec.rb
index 31ba48e9df1..56cf58dcf92 100644
--- a/spec/lib/gitlab/email/hook/smime_signature_interceptor_spec.rb
+++ b/spec/lib/gitlab/email/hook/smime_signature_interceptor_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Gitlab::Email::Hook::SmimeSignatureInterceptor do
+RSpec.describe Gitlab::Email::Hook::SmimeSignatureInterceptor do
include SmimeHelper
# certs generation is an expensive operation and they are used read-only,
diff --git a/spec/lib/gitlab/email/message/repository_push_spec.rb b/spec/lib/gitlab/email/message/repository_push_spec.rb
index 9e95d31f41c..10586527239 100644
--- a/spec/lib/gitlab/email/message/repository_push_spec.rb
+++ b/spec/lib/gitlab/email/message/repository_push_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Gitlab::Email::Message::RepositoryPush do
+RSpec.describe Gitlab::Email::Message::RepositoryPush do
include RepoHelpers
let!(:group) { create(:group, name: 'my_group') }
diff --git a/spec/lib/gitlab/email/receiver_spec.rb b/spec/lib/gitlab/email/receiver_spec.rb
index d860968ab98..592d3f3f0e4 100644
--- a/spec/lib/gitlab/email/receiver_spec.rb
+++ b/spec/lib/gitlab/email/receiver_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Gitlab::Email::Receiver do
+RSpec.describe Gitlab::Email::Receiver do
include_context :email_shared_context
shared_examples 'correctly finds the mail key' do
diff --git a/spec/lib/gitlab/email/reply_parser_spec.rb b/spec/lib/gitlab/email/reply_parser_spec.rb
index 646575b2edd..575ff7f357b 100644
--- a/spec/lib/gitlab/email/reply_parser_spec.rb
+++ b/spec/lib/gitlab/email/reply_parser_spec.rb
@@ -3,7 +3,7 @@
require "spec_helper"
# Inspired in great part by Discourse's Email::Receiver
-describe Gitlab::Email::ReplyParser do
+RSpec.describe Gitlab::Email::ReplyParser do
describe '#execute' do
def test_parse_body(mail_string, params = {})
described_class.new(Mail::Message.new(mail_string), params).execute
diff --git a/spec/lib/gitlab/email/service_desk_receiver_spec.rb b/spec/lib/gitlab/email/service_desk_receiver_spec.rb
new file mode 100644
index 00000000000..6ba58ad5e93
--- /dev/null
+++ b/spec/lib/gitlab/email/service_desk_receiver_spec.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Email::ServiceDeskReceiver do
+ let(:email) { fixture_file('emails/service_desk_custom_address.eml') }
+ let(:receiver) { described_class.new(email) }
+
+ context 'when the email contains a valid email address' do
+ before do
+ stub_service_desk_email_setting(enabled: true, address: 'support+%{key}@example.com')
+ end
+
+ it 'finds the service desk key' do
+ handler = double(execute: true, metrics_event: true, metrics_params: true)
+ expected_params = [
+ an_instance_of(Mail::Message), nil,
+ { service_desk_key: 'project_slug-project_key' }
+ ]
+
+ expect(Gitlab::Email::Handler::ServiceDeskHandler)
+ .to receive(:new).with(*expected_params).and_return(handler)
+
+ receiver.execute
+ end
+ end
+
+ context 'when the email does not contain a valid email address' do
+ before do
+ stub_service_desk_email_setting(enabled: true, address: 'other_support+%{key}@example.com')
+ end
+
+ it 'raises an error' do
+ expect { receiver.execute }.to raise_error(Gitlab::Email::UnknownIncomingEmail)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/email/smime/certificate_spec.rb b/spec/lib/gitlab/email/smime/certificate_spec.rb
index 07b8c1e4de1..e4a085d971b 100644
--- a/spec/lib/gitlab/email/smime/certificate_spec.rb
+++ b/spec/lib/gitlab/email/smime/certificate_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Gitlab::Email::Smime::Certificate do
+RSpec.describe Gitlab::Email::Smime::Certificate do
include SmimeHelper
# cert generation is an expensive operation and they are used read-only,
diff --git a/spec/lib/gitlab/email/smime/signer_spec.rb b/spec/lib/gitlab/email/smime/signer_spec.rb
index d891b86da08..217c0d62950 100644
--- a/spec/lib/gitlab/email/smime/signer_spec.rb
+++ b/spec/lib/gitlab/email/smime/signer_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-describe Gitlab::Email::Smime::Signer do
+RSpec.describe Gitlab::Email::Smime::Signer do
include SmimeHelper
let_it_be(:root_ca) { generate_root }