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/handler/service_desk_handler_spec.rb123
-rw-r--r--spec/lib/gitlab/email/hook/smime_signature_interceptor_spec.rb2
-rw-r--r--spec/lib/gitlab/email/message/in_product_marketing/base_spec.rb25
-rw-r--r--spec/lib/gitlab/email/message/in_product_marketing/experience_spec.rb69
-rw-r--r--spec/lib/gitlab/email/message/in_product_marketing/invite_team_spec.rb39
-rw-r--r--spec/lib/gitlab/email/message/in_product_marketing_spec.rb13
-rw-r--r--spec/lib/gitlab/email/reply_parser_spec.rb24
7 files changed, 252 insertions, 43 deletions
diff --git a/spec/lib/gitlab/email/handler/service_desk_handler_spec.rb b/spec/lib/gitlab/email/handler/service_desk_handler_spec.rb
index 8cb1ccc065b..c579027788d 100644
--- a/spec/lib/gitlab/email/handler/service_desk_handler_spec.rb
+++ b/spec/lib/gitlab/email/handler/service_desk_handler_spec.rb
@@ -11,6 +11,7 @@ RSpec.describe Gitlab::Email::Handler::ServiceDeskHandler do
end
let(:email_raw) { email_fixture('emails/service_desk.eml') }
+ let(:author_email) { 'jake@adventuretime.ooo' }
let_it_be(:group) { create(:group, :private, name: "email") }
let(:expected_description) do
@@ -45,7 +46,7 @@ RSpec.describe Gitlab::Email::Handler::ServiceDeskHandler do
receiver.execute
new_issue = Issue.last
- expect(new_issue.issue_email_participants.first.email).to eq("jake@adventuretime.ooo")
+ expect(new_issue.issue_email_participants.first.email).to eq(author_email)
end
it 'sends thank you email' do
@@ -196,60 +197,123 @@ RSpec.describe Gitlab::Email::Handler::ServiceDeskHandler do
end
end
- context 'when using service desk key' do
- let_it_be(:service_desk_key) { 'mykey' }
+ context 'when all lines of email are quoted' do
+ let(:email_raw) { email_fixture('emails/service_desk_all_quoted.eml') }
- let(:email_raw) { service_desk_fixture('emails/service_desk_custom_address.eml') }
+ it 'creates email with correct body' do
+ receiver.execute
+
+ issue = Issue.last
+ expect(issue.description).to include('> This is an empty quote')
+ end
+ end
+
+ context 'when using custom service desk address' do
let(:receiver) { Gitlab::Email::ServiceDeskReceiver.new(email_raw) }
before do
stub_service_desk_email_setting(enabled: true, address: 'support+%{key}@example.com')
end
- before_all do
- create(:service_desk_setting, project: project, project_key: service_desk_key)
- end
+ context 'when using project key' do
+ let_it_be(:service_desk_key) { 'mykey' }
- it_behaves_like 'a new issue request'
+ let(:email_raw) { service_desk_fixture('emails/service_desk_custom_address.eml') }
+
+ before_all do
+ create(:service_desk_setting, project: project, project_key: service_desk_key)
+ 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 there are multiple projects with same key' do
+ let_it_be(:project_with_same_key) { create(:project, group: group, service_desk_enabled: true) }
+
+ let(:email_raw) { service_desk_fixture('emails/service_desk_custom_address.eml', slug: project_with_same_key.full_path_slug.to_s) }
- 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') }
+ before do
+ create(:service_desk_setting, project: project_with_same_key, project_key: service_desk_key)
+ end
- it 'bounces the email' do
- expect { receiver.execute }.to raise_error(Gitlab::Email::ProjectNotFound)
+ it 'process email for project with matching slug' do
+ expect { receiver.execute }.to change { Issue.count }.by(1)
+ expect(Issue.last.project).to eq(project_with_same_key)
+ end
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') }
+ context 'when project key is not set' do
+ let(:email_raw) { email_fixture('emails/service_desk_custom_address_no_key.eml') }
- it 'bounces the email' do
- expect { receiver.execute }.to raise_error(Gitlab::Email::ProjectNotFound)
+ before do
+ stub_service_desk_email_setting(enabled: true, address: 'support+%{key}@example.com')
end
+
+ it_behaves_like 'a new issue request'
end
+ end
+ end
- context 'when there are multiple projects with same key' do
- let_it_be(:project_with_same_key) { create(:project, group: group, service_desk_enabled: true) }
+ context 'when rate limiting is in effect', :freeze_time, :clean_gitlab_redis_rate_limiting do
+ let(:receiver) { Gitlab::Email::Receiver.new(email_raw) }
- let(:email_raw) { service_desk_fixture('emails/service_desk_custom_address.eml', slug: project_with_same_key.full_path_slug.to_s) }
+ subject { 2.times { receiver.execute } }
- before do
- create(:service_desk_setting, project: project_with_same_key, project_key: service_desk_key)
+ before do
+ stub_feature_flags(rate_limited_service_issues_create: true)
+ stub_application_setting(issues_create_limit: 1)
+ end
+
+ context 'when too many requests are sent by one user' do
+ it 'raises an error' do
+ expect { subject }.to raise_error(RateLimitedService::RateLimitedError)
+ end
+
+ it 'creates 1 issue' do
+ expect do
+ subject
+ rescue RateLimitedService::RateLimitedError
+ end.to change { Issue.count }.by(1)
+ end
+
+ context 'when requests are sent by different users' do
+ let(:email_raw_2) { email_fixture('emails/service_desk_forwarded.eml') }
+ let(:receiver2) { Gitlab::Email::Receiver.new(email_raw_2) }
+
+ subject do
+ receiver.execute
+ receiver2.execute
end
- it 'process email for project with matching slug' do
- expect { receiver.execute }.to change { Issue.count }.by(1)
- expect(Issue.last.project).to eq(project_with_same_key)
+ it 'creates 2 issues' do
+ expect { subject }.to change { Issue.count }.by(2)
end
end
end
- context 'when rate limiting is in effect' do
- it 'allows unlimited new issue creation' do
- stub_application_setting(issues_create_limit: 1)
- setup_attachment
+ context 'when limit is higher than sent emails' do
+ before do
+ stub_application_setting(issues_create_limit: 2)
+ end
- expect { 2.times { receiver.execute } }.to change { Issue.count }.by(2)
+ it 'creates 2 issues' do
+ expect { subject }.to change { Issue.count }.by(2)
end
end
end
@@ -323,6 +387,7 @@ RSpec.describe Gitlab::Email::Handler::ServiceDeskHandler do
end
context 'when the email is forwarded through an alias' do
+ let(:author_email) { 'jake.g@adventuretime.ooo' }
let(:email_raw) { email_fixture('emails/service_desk_forwarded.eml') }
it_behaves_like 'a new issue request'
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 0a1f04ed793..352eb596cd9 100644
--- a/spec/lib/gitlab/email/hook/smime_signature_interceptor_spec.rb
+++ b/spec/lib/gitlab/email/hook/smime_signature_interceptor_spec.rb
@@ -36,7 +36,7 @@ RSpec.describe Gitlab::Email::Hook::SmimeSignatureInterceptor do
end
before do
- allow(Gitlab::X509::Certificate).to receive_messages(from_files: certificate)
+ allow(Gitlab::Email::Hook::SmimeSignatureInterceptor).to receive(:certificate).and_return(certificate)
Mail.register_interceptor(described_class)
mail.deliver_now
diff --git a/spec/lib/gitlab/email/message/in_product_marketing/base_spec.rb b/spec/lib/gitlab/email/message/in_product_marketing/base_spec.rb
index 277f1158f8b..0521123f1ef 100644
--- a/spec/lib/gitlab/email/message/in_product_marketing/base_spec.rb
+++ b/spec/lib/gitlab/email/message/in_product_marketing/base_spec.rb
@@ -82,4 +82,29 @@ RSpec.describe Gitlab::Email::Message::InProductMarketing::Base do
it { is_expected.to include('This is email 1 of 3 in the Create series', Gitlab::Routing.url_helpers.profile_notifications_url) }
end
end
+
+ describe '#series?' do
+ using RSpec::Parameterized::TableSyntax
+
+ subject do
+ test_class = "Gitlab::Email::Message::InProductMarketing::#{track.to_s.classify}".constantize
+ test_class.new(group: group, user: user, series: series).series?
+ end
+
+ where(:track, :result) do
+ :create | true
+ :team_short | true
+ :trial_short | true
+ :admin_verify | true
+ :verify | true
+ :trial | true
+ :team | true
+ :experience | true
+ :invite_team | false
+ end
+
+ with_them do
+ it { is_expected.to eq result }
+ end
+ end
end
diff --git a/spec/lib/gitlab/email/message/in_product_marketing/experience_spec.rb b/spec/lib/gitlab/email/message/in_product_marketing/experience_spec.rb
index b742eff3f56..8cd2345822e 100644
--- a/spec/lib/gitlab/email/message/in_product_marketing/experience_spec.rb
+++ b/spec/lib/gitlab/email/message/in_product_marketing/experience_spec.rb
@@ -22,14 +22,36 @@ RSpec.describe Gitlab::Email::Message::InProductMarketing::Experience do
expect(message.cta_text).to be_nil
end
- describe '#feedback_link' do
- let(:member_count) { 2 }
+ describe 'feedback URL' do
+ before do
+ allow(message).to receive(:onboarding_progress).and_return(1)
+ allow(message).to receive(:show_invite_link).and_return(true)
+ end
+
+ subject do
+ message.feedback_link(1)
+ end
+
+ it { is_expected.to start_with(Gitlab::Saas.com_url) }
+
+ context 'when in development' do
+ let(:root_url) { 'http://example.com' }
+
+ before do
+ allow(message).to receive(:root_url).and_return(root_url)
+ stub_rails_env('development')
+ end
+
+ it { is_expected.to start_with(root_url) }
+ end
+ end
+
+ describe 'feedback URL show_invite_link query param' do
let(:user_access) { GroupMember::DEVELOPER }
let(:preferred_language) { 'en' }
before do
allow(message).to receive(:onboarding_progress).and_return(1)
- allow(group).to receive(:member_count).and_return(member_count)
allow(group).to receive(:max_member_access_for_user).and_return(user_access)
allow(user).to receive(:preferred_language).and_return(preferred_language)
end
@@ -41,12 +63,6 @@ RSpec.describe Gitlab::Email::Message::InProductMarketing::Experience do
it { is_expected.to eq('true') }
- context 'with only one member' do
- let(:member_count) { 1 }
-
- it { is_expected.to eq('false') }
- end
-
context 'with less than developer access' do
let(:user_access) { GroupMember::GUEST }
@@ -59,6 +75,41 @@ RSpec.describe Gitlab::Email::Message::InProductMarketing::Experience do
it { is_expected.to eq('false') }
end
end
+
+ describe 'feedback URL show_incentive query param' do
+ let(:show_invite_link) { true }
+ let(:member_count) { 2 }
+ let(:query) do
+ uri = URI.parse(message.feedback_link(1))
+ Rack::Utils.parse_query(uri.query).with_indifferent_access
+ end
+
+ before do
+ allow(message).to receive(:onboarding_progress).and_return(1)
+ allow(message).to receive(:show_invite_link).and_return(show_invite_link)
+ allow(group).to receive(:member_count).and_return(member_count)
+ end
+
+ subject { query[:show_incentive] }
+
+ it { is_expected.to eq('true') }
+
+ context 'with only one member' do
+ let(:member_count) { 1 }
+
+ it "is not present" do
+ expect(query).not_to have_key(:show_incentive)
+ end
+ end
+
+ context 'show_invite_link is false' do
+ let(:show_invite_link) { false }
+
+ it "is not present" do
+ expect(query).not_to have_key(:show_incentive)
+ end
+ end
+ end
end
end
end
diff --git a/spec/lib/gitlab/email/message/in_product_marketing/invite_team_spec.rb b/spec/lib/gitlab/email/message/in_product_marketing/invite_team_spec.rb
new file mode 100644
index 00000000000..8319560f594
--- /dev/null
+++ b/spec/lib/gitlab/email/message/in_product_marketing/invite_team_spec.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Email::Message::InProductMarketing::InviteTeam do
+ let_it_be(:group) { build(:group) }
+ let_it_be(:user) { build(:user) }
+
+ let(:series) { 0 }
+
+ subject(:message) { described_class.new(group: group, user: user, series: series) }
+
+ describe 'initialize' do
+ context 'when series is valid' do
+ it 'does not raise error' do
+ expect { subject }.not_to raise_error(ArgumentError)
+ end
+ end
+
+ context 'when series is invalid' do
+ let(:series) { 1 }
+
+ it 'raises error' do
+ expect { subject }.to raise_error(ArgumentError)
+ end
+ end
+ end
+
+ it 'contains the correct message', :aggregate_failures do
+ expect(message.subject_line).to eq 'Invite your teammates to GitLab'
+ expect(message.tagline).to be_empty
+ expect(message.title).to eq 'GitLab is better with teammates to help out!'
+ expect(message.subtitle).to be_empty
+ expect(message.body_line1).to eq 'Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running.'
+ expect(message.body_line2).to be_empty
+ expect(message.cta_text).to eq 'Invite your teammates to help'
+ expect(message.logo_path).to eq 'mailers/in_product_marketing/team-0.png'
+ end
+end
diff --git a/spec/lib/gitlab/email/message/in_product_marketing_spec.rb b/spec/lib/gitlab/email/message/in_product_marketing_spec.rb
index 9ffc4a340a3..594df7440bb 100644
--- a/spec/lib/gitlab/email/message/in_product_marketing_spec.rb
+++ b/spec/lib/gitlab/email/message/in_product_marketing_spec.rb
@@ -10,10 +10,15 @@ RSpec.describe Gitlab::Email::Message::InProductMarketing do
context 'when track exists' do
where(:track, :expected_class) do
- :create | described_class::Create
- :verify | described_class::Verify
- :trial | described_class::Trial
- :team | described_class::Team
+ :create | described_class::Create
+ :team_short | described_class::TeamShort
+ :trial_short | described_class::TrialShort
+ :admin_verify | described_class::AdminVerify
+ :verify | described_class::Verify
+ :trial | described_class::Trial
+ :team | described_class::Team
+ :experience | described_class::Experience
+ :invite_team | described_class::InviteTeam
end
with_them do
diff --git a/spec/lib/gitlab/email/reply_parser_spec.rb b/spec/lib/gitlab/email/reply_parser_spec.rb
index 3b01b568fb4..c0d177aff4d 100644
--- a/spec/lib/gitlab/email/reply_parser_spec.rb
+++ b/spec/lib/gitlab/email/reply_parser_spec.rb
@@ -21,6 +21,30 @@ RSpec.describe Gitlab::Email::ReplyParser do
expect(test_parse_body(fixture_file("emails/no_content_reply.eml"))).to eq("")
end
+ context 'when allow_only_quotes is true' do
+ it "returns quoted text from email" do
+ text = test_parse_body(fixture_file("emails/no_content_reply.eml"), allow_only_quotes: true)
+
+ expect(text).to eq(
+ <<-BODY.strip_heredoc.chomp
+ >
+ >
+ >
+ > eviltrout posted in 'Adventure Time Sux' on Discourse Meta:
+ >
+ > ---
+ > hey guys everyone knows adventure time sucks!
+ >
+ > ---
+ > Please visit this link to respond: http://localhost:3000/t/adventure-time-sux/1234/3
+ >
+ > To unsubscribe from these emails, visit your [user preferences](http://localhost:3000/user_preferences).
+ >
+ BODY
+ )
+ end
+ end
+
it "properly renders plaintext-only email" do
expect(test_parse_body(fixture_file("emails/plaintext_only.eml")))
.to eq(