2018-11-20 20:47:30 +05:30
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2016-09-13 17:45:13 +05:30
|
|
|
require 'spec_helper'
|
|
|
|
|
2017-09-10 17:25:29 +05:30
|
|
|
describe Gitlab::Email::Handler::CreateIssueHandler do
|
2016-09-13 17:45:13 +05:30
|
|
|
include_context :email_shared_context
|
2017-08-17 22:00:37 +05:30
|
|
|
it_behaves_like :reply_processing_shared_examples
|
2016-09-13 17:45:13 +05:30
|
|
|
|
|
|
|
before do
|
|
|
|
stub_incoming_email_setting(enabled: true, address: "incoming+%{key}@appmail.adventuretime.ooo")
|
|
|
|
stub_config_setting(host: 'localhost')
|
|
|
|
end
|
|
|
|
|
2019-02-15 15:39:39 +05:30
|
|
|
let(:email_raw) { email_fixture('emails/valid_new_issue.eml') }
|
2016-09-13 17:45:13 +05:30
|
|
|
let(:namespace) { create(:namespace, path: 'gitlabhq') }
|
|
|
|
|
2017-09-10 17:25:29 +05:30
|
|
|
let!(:project) { create(:project, :public, namespace: namespace, path: 'gitlabhq') }
|
2016-09-13 17:45:13 +05:30
|
|
|
let!(:user) do
|
|
|
|
create(
|
|
|
|
:user,
|
|
|
|
email: 'jake@adventuretime.ooo',
|
2017-08-17 22:00:37 +05:30
|
|
|
incoming_email_token: 'auth_token'
|
2016-09-13 17:45:13 +05:30
|
|
|
)
|
|
|
|
end
|
|
|
|
|
2019-02-15 15:39:39 +05:30
|
|
|
context "when email key" do
|
|
|
|
let(:mail) { Mail::Message.new(email_raw) }
|
|
|
|
|
|
|
|
it "matches the new format" do
|
|
|
|
handler = described_class.new(mail, "gitlabhq-gitlabhq-#{project.project_id}-#{user.incoming_email_token}-issue")
|
|
|
|
|
|
|
|
expect(handler.instance_variable_get(:@project_id)).to eq project.project_id
|
|
|
|
expect(handler.instance_variable_get(:@project_slug)).to eq project.full_path_slug
|
|
|
|
expect(handler.instance_variable_get(:@incoming_email_token)).to eq user.incoming_email_token
|
|
|
|
expect(handler.can_handle?).to be_truthy
|
|
|
|
end
|
|
|
|
|
|
|
|
it "matches the legacy format" do
|
|
|
|
handler = described_class.new(mail, "h5bp/html5-boilerplate+#{user.incoming_email_token}")
|
|
|
|
|
|
|
|
expect(handler.instance_variable_get(:@project_path)).to eq 'h5bp/html5-boilerplate'
|
|
|
|
expect(handler.instance_variable_get(:@incoming_email_token)).to eq user.incoming_email_token
|
|
|
|
expect(handler.can_handle?).to be_truthy
|
|
|
|
end
|
|
|
|
|
|
|
|
it "doesn't match either format" do
|
|
|
|
handler = described_class.new(mail, "h5bp-html5-boilerplate+something+invalid")
|
|
|
|
|
|
|
|
expect(handler.can_handle?).to be_falsey
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-09-13 17:45:13 +05:30
|
|
|
context "when everything is fine" do
|
2019-02-15 15:39:39 +05:30
|
|
|
shared_examples "a new issue" do
|
|
|
|
it "creates a new issue" do
|
|
|
|
setup_attachment
|
2016-09-13 17:45:13 +05:30
|
|
|
|
2019-02-15 15:39:39 +05:30
|
|
|
expect { receiver.execute }.to change { project.issues.count }.by(1)
|
|
|
|
issue = project.issues.last
|
|
|
|
|
|
|
|
expect(issue.author).to eq(user)
|
|
|
|
expect(issue.title).to eq('New Issue by email')
|
|
|
|
expect(issue.description).to include('reply by email')
|
|
|
|
expect(issue.description).to include(markdown)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
it_behaves_like "a new issue"
|
2016-09-13 17:45:13 +05:30
|
|
|
|
2019-02-15 15:39:39 +05:30
|
|
|
context "creates a new issue with legacy email address" do
|
|
|
|
let(:email_raw) { fixture_file('emails/valid_new_issue_legacy.eml') }
|
|
|
|
|
|
|
|
it_behaves_like "a new issue"
|
2016-09-13 17:45:13 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
context "when the reply is blank" do
|
2019-02-15 15:39:39 +05:30
|
|
|
let(:email_raw) { email_fixture("emails/valid_new_issue_empty.eml") }
|
2016-09-13 17:45:13 +05:30
|
|
|
|
|
|
|
it "creates a new issue" do
|
|
|
|
expect { receiver.execute }.to change { project.issues.count }.by(1)
|
|
|
|
issue = project.issues.last
|
|
|
|
|
|
|
|
expect(issue.author).to eq(user)
|
|
|
|
expect(issue.title).to eq('New Issue by email')
|
|
|
|
expect(issue.description).to eq('')
|
|
|
|
end
|
|
|
|
end
|
2018-11-08 19:23:39 +05:30
|
|
|
|
|
|
|
context "when there are quotes in email" do
|
2019-02-15 15:39:39 +05:30
|
|
|
let(:email_raw) { email_fixture("emails/valid_new_issue_with_quote.eml") }
|
2018-11-08 19:23:39 +05:30
|
|
|
|
|
|
|
it "creates a new issue" do
|
|
|
|
expect { receiver.execute }.to change { project.issues.count }.by(1)
|
|
|
|
issue = project.issues.last
|
|
|
|
|
|
|
|
expect(issue.author).to eq(user)
|
|
|
|
expect(issue.title).to eq('New Issue by email')
|
|
|
|
expect(issue.description).to include('reply by email')
|
|
|
|
expect(issue.description).to include('> this is a quote')
|
|
|
|
end
|
|
|
|
end
|
2016-09-13 17:45:13 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
context "something is wrong" do
|
|
|
|
context "when the issue could not be saved" do
|
|
|
|
before do
|
|
|
|
allow_any_instance_of(Issue).to receive(:persisted?).and_return(false)
|
|
|
|
end
|
|
|
|
|
|
|
|
it "raises an InvalidIssueError" do
|
|
|
|
expect { receiver.execute }.to raise_error(Gitlab::Email::InvalidIssueError)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-08-17 22:00:37 +05:30
|
|
|
context "when we can't find the incoming_email_token" do
|
2019-02-15 15:39:39 +05:30
|
|
|
let(:email_raw) { email_fixture("emails/wrong_issue_incoming_email_token.eml") }
|
2016-09-13 17:45:13 +05:30
|
|
|
|
|
|
|
it "raises an UserNotFoundError" do
|
|
|
|
expect { receiver.execute }.to raise_error(Gitlab::Email::UserNotFoundError)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context "when project is private" do
|
|
|
|
let(:project) { create(:project, :private, namespace: namespace) }
|
|
|
|
|
|
|
|
it "raises a ProjectNotFound if the user is not a member" do
|
|
|
|
expect { receiver.execute }.to raise_error(Gitlab::Email::ProjectNotFound)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2019-02-15 15:39:39 +05:30
|
|
|
|
|
|
|
def email_fixture(path)
|
|
|
|
fixture_file(path).gsub('project_id', project.project_id.to_s)
|
|
|
|
end
|
2016-09-13 17:45:13 +05:30
|
|
|
end
|