Use new issue email address format
We now use `-issue` in order to support catch all email addresses
This commit is contained in:
parent
34dd6196e3
commit
2e51431403
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: No longer require email subaddressing for issue creation by email
|
||||
merge_request: 23523
|
||||
author:
|
||||
type: changed
|
|
@ -2,21 +2,30 @@
|
|||
|
||||
require 'gitlab/email/handler/base_handler'
|
||||
|
||||
# handles issue creation emails with these formats:
|
||||
# incoming+gitlab-org-gitlab-ce-20-Author_Token12345678-issue@incoming.gitlab.com
|
||||
# incoming+gitlab-org/gitlab-ce+Author_Token12345678@incoming.gitlab.com (legacy)
|
||||
module Gitlab
|
||||
module Email
|
||||
module Handler
|
||||
class CreateIssueHandler < BaseHandler
|
||||
include ReplyProcessing
|
||||
attr_reader :project_path, :incoming_email_token
|
||||
|
||||
HANDLER_REGEX = /\A.+-(?<project_id>.+)-(?<incoming_email_token>.+)-issue\z/.freeze
|
||||
HANDLER_REGEX_LEGACY = /\A(?<project_path>[^\+]*)\+(?<incoming_email_token>.*)\z/.freeze
|
||||
|
||||
def initialize(mail, mail_key)
|
||||
super(mail, mail_key)
|
||||
@project_path, @incoming_email_token =
|
||||
mail_key && mail_key.split('+', 2)
|
||||
|
||||
if matched = HANDLER_REGEX.match(mail_key.to_s)
|
||||
@project_id, @incoming_email_token = matched.captures
|
||||
elsif matched = HANDLER_REGEX_LEGACY.match(mail_key.to_s)
|
||||
@project_path, @incoming_email_token = matched.captures
|
||||
end
|
||||
end
|
||||
|
||||
def can_handle?
|
||||
!incoming_email_token.nil? && !incoming_email_token.include?("+") && !mail_key.include?(Gitlab::IncomingEmail::UNSUBSCRIBE_SUFFIX)
|
||||
incoming_email_token && (project_id || can_handle_legacy_format?)
|
||||
end
|
||||
|
||||
def execute
|
||||
|
@ -37,11 +46,17 @@ module Gitlab
|
|||
# rubocop: enable CodeReuse/ActiveRecord
|
||||
|
||||
def project
|
||||
@project ||= Project.find_by_full_path(project_path)
|
||||
@project ||= if project_id
|
||||
Project.find_by_id(project_id)
|
||||
else
|
||||
Project.find_by_full_path(project_path)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
attr_reader :project_id, :project_path, :incoming_email_token
|
||||
|
||||
def create_issue
|
||||
Issues::CreateService.new(
|
||||
project,
|
||||
|
@ -50,6 +65,10 @@ module Gitlab
|
|||
description: message_including_reply
|
||||
).execute
|
||||
end
|
||||
|
||||
def can_handle_legacy_format?
|
||||
project_path && !incoming_email_token.include?('+') && !mail_key.include?(Gitlab::IncomingEmail::UNSUBSCRIBE_SUFFIX_LEGACY)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
require 'gitlab/email/handler/base_handler'
|
||||
require 'gitlab/email/handler/reply_processing'
|
||||
|
||||
# handles merge request creation emails with these forms:
|
||||
# handles merge request creation emails with these formats:
|
||||
# incoming+gitlab-org-gitlab-ce-20-Author_Token12345678-merge-request@incoming.gitlab.com
|
||||
# incoming+gitlab-org/gitlab-ce+merge-request+Author_Token12345678@incoming.gitlab.com (legacy)
|
||||
module Gitlab
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
require 'gitlab/email/handler/base_handler'
|
||||
require 'gitlab/email/handler/reply_processing'
|
||||
|
||||
# handles note/reply creation emails with these formats:
|
||||
# incoming+1234567890abcdef1234567890abcdef@incoming.gitlab.com
|
||||
module Gitlab
|
||||
module Email
|
||||
module Handler
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'gitlab/email/handler/base_handler'
|
||||
|
||||
# handles unsubscribe emails with these forms:
|
||||
# handles unsubscribe emails with these formats:
|
||||
# incoming+1234567890abcdef1234567890abcdef-unsubscribe@incoming.gitlab.com
|
||||
# incoming+1234567890abcdef1234567890abcdef+unsubscribe@incoming.gitlab.com (legacy)
|
||||
module Gitlab
|
||||
|
@ -11,14 +11,14 @@ module Gitlab
|
|||
class UnsubscribeHandler < BaseHandler
|
||||
delegate :project, to: :sent_notification, allow_nil: true
|
||||
|
||||
HANDLER_REGEX = /\A(?<replytoken>\w+)#{Gitlab::IncomingEmail::UNSUBSCRIBE_SUFFIX}\z/.freeze
|
||||
HANDLER_REGEX_LEGACY = /\A(?<replytoken>\w+)#{Regexp.escape(Gitlab::IncomingEmail::UNSUBSCRIBE_SUFFIX_OLD)}\z/.freeze
|
||||
HANDLER_REGEX = /\A(?<reply_token>\w+)#{Gitlab::IncomingEmail::UNSUBSCRIBE_SUFFIX}\z/.freeze
|
||||
HANDLER_REGEX_LEGACY = /\A(?<reply_token>\w+)#{Regexp.escape(Gitlab::IncomingEmail::UNSUBSCRIBE_SUFFIX_LEGACY)}\z/.freeze
|
||||
|
||||
def initialize(mail, mail_key)
|
||||
super(mail, mail_key)
|
||||
|
||||
matched = HANDLER_REGEX.match(mail_key.to_s) || HANDLER_REGEX_LEGACY.match(mail_key.to_s)
|
||||
@reply_token = matched[:replytoken] if matched
|
||||
@reply_token = matched[:reply_token] if matched
|
||||
end
|
||||
|
||||
def can_handle?
|
||||
|
|
|
@ -2,9 +2,9 @@
|
|||
|
||||
module Gitlab
|
||||
module IncomingEmail
|
||||
UNSUBSCRIBE_SUFFIX = '-unsubscribe'.freeze
|
||||
UNSUBSCRIBE_SUFFIX_OLD = '+unsubscribe'.freeze
|
||||
WILDCARD_PLACEHOLDER = '%{key}'.freeze
|
||||
UNSUBSCRIBE_SUFFIX = '-unsubscribe'.freeze
|
||||
UNSUBSCRIBE_SUFFIX_LEGACY = '+unsubscribe'.freeze
|
||||
WILDCARD_PLACEHOLDER = '%{key}'.freeze
|
||||
|
||||
class << self
|
||||
def enabled?
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
Return-Path: <jake@adventuretime.ooo>
|
||||
Received: from iceking.adventuretime.ooo ([unix socket]) by iceking (Cyrus v2.2.13-Debian-2.2.13-19+squeeze3) with LMTPA; Thu, 13 Jun 2013 17:03:50 -0400
|
||||
Received: from mail-ie0-x234.google.com (mail-ie0-x234.google.com [IPv6:2607:f8b0:4001:c03::234]) by iceking.adventuretime.ooo (8.14.3/8.14.3/Debian-9.4) with ESMTP id r5DL3nFJ016967 (version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT) for <incoming+gitlabhq/gitlabhq@appmail.adventuretime.ooo>; Thu, 13 Jun 2013 17:03:50 -0400
|
||||
Received: by mail-ie0-f180.google.com with SMTP id f4so21977375iea.25 for <incoming+gitlabhq/gitlabhq@appmail.adventuretime.ooo>; Thu, 13 Jun 2013 14:03:48 -0700
|
||||
Received: by mail-ie0-f180.google.com with SMTP id f4so21977375iea.25 for <incoming+gitlabhq-gitlabhq@appmail.adventuretime.ooo>; Thu, 13 Jun 2013 14:03:48 -0700
|
||||
Received: by 10.0.0.1 with HTTP; Thu, 13 Jun 2013 14:03:48 -0700
|
||||
Date: Thu, 13 Jun 2013 17:03:48 -0400
|
||||
From: Jake the Dog <jake@adventuretime.ooo>
|
||||
To: incoming+gitlabhq/gitlabhq+auth_token@appmail.adventuretime.ooo
|
||||
To: incoming+gitlabhq-gitlabhq-project_id-auth_token-issue@appmail.adventuretime.ooo
|
||||
Message-ID: <CADkmRc+rNGAGGbV2iE5p918UVy4UyJqVcXRO2=otppgzduJSg@mail.gmail.com>
|
||||
Subject: New Issue by email
|
||||
Mime-Version: 1.0
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
Return-Path: <jake@adventuretime.ooo>
|
||||
Received: from iceking.adventuretime.ooo ([unix socket]) by iceking (Cyrus v2.2.13-Debian-2.2.13-19+squeeze3) with LMTPA; Thu, 13 Jun 2013 17:03:50 -0400
|
||||
Received: from mail-ie0-x234.google.com (mail-ie0-x234.google.com [IPv6:2607:f8b0:4001:c03::234]) by iceking.adventuretime.ooo (8.14.3/8.14.3/Debian-9.4) with ESMTP id r5DL3nFJ016967 (version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT) for <incoming+gitlabhq/gitlabhq@appmail.adventuretime.ooo>; Thu, 13 Jun 2013 17:03:50 -0400
|
||||
Received: by mail-ie0-f180.google.com with SMTP id f4so21977375iea.25 for <incoming+gitlabhq/gitlabhq@appmail.adventuretime.ooo>; Thu, 13 Jun 2013 14:03:48 -0700
|
||||
Received: by mail-ie0-f180.google.com with SMTP id f4so21977375iea.25 for <incoming+gitlabhq-gitlabhq@appmail.adventuretime.ooo>; Thu, 13 Jun 2013 14:03:48 -0700
|
||||
Received: by 10.0.0.1 with HTTP; Thu, 13 Jun 2013 14:03:48 -0700
|
||||
Date: Thu, 13 Jun 2013 17:03:48 -0400
|
||||
From: Jake the Dog <jake@adventuretime.ooo>
|
||||
To: incoming+gitlabhq/gitlabhq+auth_token@appmail.adventuretime.ooo
|
||||
To: incoming+gitlabhq-gitlabhq-project_id-auth_token-issue@appmail.adventuretime.ooo
|
||||
Message-ID: <CADkmRc+rNGAGGbV2iE5p918UVy4UyJqVcXRO2=otppgzduJSg@mail.gmail.com>
|
||||
Subject: New Issue by email
|
||||
Mime-Version: 1.0
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
Return-Path: <jake@adventuretime.ooo>
|
||||
Received: from iceking.adventuretime.ooo ([unix socket]) by iceking (Cyrus v2.2.13-Debian-2.2.13-19+squeeze3) with LMTPA; Thu, 13 Jun 2013 17:03:50 -0400
|
||||
Received: from mail-ie0-x234.google.com (mail-ie0-x234.google.com [IPv6:2607:f8b0:4001:c03::234]) by iceking.adventuretime.ooo (8.14.3/8.14.3/Debian-9.4) with ESMTP id r5DL3nFJ016967 (version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT) for <incoming+gitlabhq/gitlabhq@appmail.adventuretime.ooo>; Thu, 13 Jun 2013 17:03:50 -0400
|
||||
Received: by mail-ie0-f180.google.com with SMTP id f4so21977375iea.25 for <incoming+gitlabhq/gitlabhq@appmail.adventuretime.ooo>; Thu, 13 Jun 2013 14:03:48 -0700
|
||||
Received: by 10.0.0.1 with HTTP; Thu, 13 Jun 2013 14:03:48 -0700
|
||||
Date: Thu, 13 Jun 2013 17:03:48 -0400
|
||||
From: Jake the Dog <jake@adventuretime.ooo>
|
||||
To: incoming+gitlabhq/gitlabhq+auth_token@appmail.adventuretime.ooo
|
||||
Message-ID: <CADkmRc+rNGAGGbV2iE5p918UVy4UyJqVcXRO2=otppgzduJSg@mail.gmail.com>
|
||||
Subject: New Issue by email
|
||||
Mime-Version: 1.0
|
||||
Content-Type: text/plain;
|
||||
charset=ISO-8859-1
|
||||
Content-Transfer-Encoding: 7bit
|
||||
X-Sieve: CMU Sieve 2.2
|
||||
X-Received: by 10.0.0.1 with SMTP id n7mr11234144ipb.85.1371157428600; Thu,
|
||||
13 Jun 2013 14:03:48 -0700 (PDT)
|
||||
X-Scanned-By: MIMEDefang 2.69 on IPv6:2001:470:1d:165::1
|
||||
|
||||
The reply by email functionality should be extended to allow creating a new issue by email.
|
||||
|
||||
* Allow an admin to specify which project the issue should be created under by checking the sender domain.
|
||||
* Possibly allow the use of regular expression matches within the subject/body to specify which project the issue should be created under.
|
|
@ -1,11 +1,11 @@
|
|||
Return-Path: <jake@adventuretime.ooo>
|
||||
Received: from iceking.adventuretime.ooo ([unix socket]) by iceking (Cyrus v2.2.13-Debian-2.2.13-19+squeeze3) with LMTPA; Thu, 13 Jun 2013 17:03:50 -0400
|
||||
Received: from mail-ie0-x234.google.com (mail-ie0-x234.google.com [IPv6:2607:f8b0:4001:c03::234]) by iceking.adventuretime.ooo (8.14.3/8.14.3/Debian-9.4) with ESMTP id r5DL3nFJ016967 (version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT) for <incoming+gitlabhq/gitlabhq@appmail.adventuretime.ooo>; Thu, 13 Jun 2013 17:03:50 -0400
|
||||
Received: by mail-ie0-f180.google.com with SMTP id f4so21977375iea.25 for <incoming+gitlabhq/gitlabhq@appmail.adventuretime.ooo>; Thu, 13 Jun 2013 14:03:48 -0700
|
||||
Received: by mail-ie0-f180.google.com with SMTP id f4so21977375iea.25 for <incoming+gitlabhq-gitlabhq@appmail.adventuretime.ooo>; Thu, 13 Jun 2013 14:03:48 -0700
|
||||
Received: by 10.0.0.1 with HTTP; Thu, 13 Jun 2013 14:03:48 -0700
|
||||
Date: Thu, 13 Jun 2013 17:03:48 -0400
|
||||
From: Jake the Dog <jake@adventuretime.ooo>
|
||||
To: incoming+gitlabhq/gitlabhq+auth_token@appmail.adventuretime.ooo
|
||||
To: incoming+gitlabhq-gitlabhq-project_id-auth_token-issue@appmail.adventuretime.ooo
|
||||
Message-ID: <CADkmRc+rNGAGGbV2iE5p918UVy4UyJqVcXRO2=otppgzduJSg@mail.gmail.com>
|
||||
Subject: New Issue by email
|
||||
Mime-Version: 1.0
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
Return-Path: <jake@adventuretime.ooo>
|
||||
Received: from iceking.adventuretime.ooo ([unix socket]) by iceking (Cyrus v2.2.13-Debian-2.2.13-19+squeeze3) with LMTPA; Thu, 13 Jun 2013 17:03:50 -0400
|
||||
Received: from mail-ie0-x234.google.com (mail-ie0-x234.google.com [IPv6:2607:f8b0:4001:c03::234]) by iceking.adventuretime.ooo (8.14.3/8.14.3/Debian-9.4) with ESMTP id r5DL3nFJ016967 (version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT) for <incoming+gitlabhq-gitlabhq@appmail.adventuretime.ooo>; Thu, 13 Jun 2013 17:03:50 -0400
|
||||
Received: by mail-ie0-f180.google.com with SMTP id f4so21977375iea.25 for <incoming+gitlabhq/gitlabhq@appmail.adventuretime.ooo>; Thu, 13 Jun 2013 14:03:48 -0700
|
||||
Received: by 10.0.0.1 with HTTP; Thu, 13 Jun 2013 14:03:48 -0700
|
||||
Date: Thu, 13 Jun 2013 17:03:48 -0400
|
||||
From: Jake the Dog <jake@adventuretime.ooo>
|
||||
To: incoming+gitlabhq/gitlabhq+merge-request+auth_token@appmail.adventuretime.ooo
|
||||
Message-ID: <CADkmRc+rNGAGGbV2iE5p918UVy4UyJqVcXRO2=otppgzduJSg@mail.gmail.com>
|
||||
Subject: feature
|
||||
Mime-Version: 1.0
|
||||
Content-Type: text/plain;
|
||||
charset=ISO-8859-1
|
||||
Content-Transfer-Encoding: 7bit
|
||||
X-Sieve: CMU Sieve 2.2
|
||||
X-Received: by 10.0.0.1 with SMTP id n7mr11234144ipb.85.1371157428600; Thu,
|
||||
13 Jun 2013 14:03:48 -0700 (PDT)
|
||||
X-Scanned-By: MIMEDefang 2.69 on IPv6:2001:470:1d:165::1
|
||||
|
||||
Merge request description
|
|
@ -0,0 +1,18 @@
|
|||
Return-Path: <jake@adventuretime.ooo>
|
||||
Received: from iceking.adventuretime.ooo ([unix socket]) by iceking (Cyrus v2.2.13-Debian-2.2.13-19+squeeze3) with LMTPA; Thu, 13 Jun 2013 17:03:50 -0400
|
||||
Received: from mail-ie0-x234.google.com (mail-ie0-x234.google.com [IPv6:2607:f8b0:4001:c03::234]) by iceking.adventuretime.ooo (8.14.3/8.14.3/Debian-9.4) with ESMTP id r5DL3nFJ016967 (version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT) for <incoming+gitlabhq/gitlabhq@appmail.adventuretime.ooo>; Thu, 13 Jun 2013 17:03:50 -0400
|
||||
Received: by mail-ie0-f180.google.com with SMTP id f4so21977375iea.25 for <incoming+gitlabhq-gitlabhq@appmail.adventuretime.ooo>; Thu, 13 Jun 2013 14:03:48 -0700
|
||||
Received: by 10.0.0.1 with HTTP; Thu, 13 Jun 2013 14:03:48 -0700
|
||||
Date: Thu, 13 Jun 2013 17:03:48 -0400
|
||||
From: Jake the Dog <jake@adventuretime.ooo>
|
||||
To: incoming+gitlabhq-gitlabhq-project_id-bad_token-issue@appmail.adventuretime.ooo
|
||||
Message-ID: <CADkmRc+rNGAGGbV2iE5p918UVy4UyJqVcXRO2=otppgzduJSg@mail.gmail.com>
|
||||
Subject: New Issue by email
|
||||
Mime-Version: 1.0
|
||||
Content-Type: text/plain;
|
||||
charset=ISO-8859-1
|
||||
Content-Transfer-Encoding: 7bit
|
||||
X-Sieve: CMU Sieve 2.2
|
||||
X-Received: by 10.0.0.1 with SMTP id n7mr11234144ipb.85.1371157428600; Thu,
|
||||
13 Jun 2013 14:03:48 -0700 (PDT)
|
||||
X-Scanned-By: MIMEDefang 2.69 on IPv6:2001:470:1d:165::1
|
|
@ -11,7 +11,7 @@ describe Gitlab::Email::Handler::CreateIssueHandler do
|
|||
stub_config_setting(host: 'localhost')
|
||||
end
|
||||
|
||||
let(:email_raw) { fixture_file('emails/valid_new_issue.eml') }
|
||||
let(:email_raw) { email_fixture('emails/valid_new_issue.eml') }
|
||||
let(:namespace) { create(:namespace, path: 'gitlabhq') }
|
||||
|
||||
let!(:project) { create(:project, :public, namespace: namespace, path: 'gitlabhq') }
|
||||
|
@ -23,21 +23,57 @@ describe Gitlab::Email::Handler::CreateIssueHandler do
|
|||
)
|
||||
end
|
||||
|
||||
context "when email key" do
|
||||
let(:mail) { Mail::Message.new(email_raw) }
|
||||
|
||||
it "matches the new format" do
|
||||
handler = described_class.new(mail, "h5bp-html5-boilerplate-#{project.project_id}-#{user.incoming_email_token}-issue")
|
||||
|
||||
expect(handler.instance_variable_get(:@project_id).to_i).to eq project.project_id
|
||||
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
|
||||
|
||||
context "when everything is fine" do
|
||||
it "creates a new issue" do
|
||||
setup_attachment
|
||||
shared_examples "a new issue" do
|
||||
it "creates a new issue" do
|
||||
setup_attachment
|
||||
|
||||
expect { receiver.execute }.to change { project.issues.count }.by(1)
|
||||
issue = project.issues.last
|
||||
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)
|
||||
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"
|
||||
|
||||
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"
|
||||
end
|
||||
|
||||
context "when the reply is blank" do
|
||||
let(:email_raw) { fixture_file("emails/valid_new_issue_empty.eml") }
|
||||
let(:email_raw) { email_fixture("emails/valid_new_issue_empty.eml") }
|
||||
|
||||
it "creates a new issue" do
|
||||
expect { receiver.execute }.to change { project.issues.count }.by(1)
|
||||
|
@ -50,7 +86,7 @@ describe Gitlab::Email::Handler::CreateIssueHandler do
|
|||
end
|
||||
|
||||
context "when there are quotes in email" do
|
||||
let(:email_raw) { fixture_file("emails/valid_new_issue_with_quote.eml") }
|
||||
let(:email_raw) { email_fixture("emails/valid_new_issue_with_quote.eml") }
|
||||
|
||||
it "creates a new issue" do
|
||||
expect { receiver.execute }.to change { project.issues.count }.by(1)
|
||||
|
@ -76,7 +112,7 @@ describe Gitlab::Email::Handler::CreateIssueHandler do
|
|||
end
|
||||
|
||||
context "when we can't find the incoming_email_token" do
|
||||
let(:email_raw) { fixture_file("emails/wrong_incoming_email_token.eml") }
|
||||
let(:email_raw) { email_fixture("emails/wrong_issue_incoming_email_token.eml") }
|
||||
|
||||
it "raises an UserNotFoundError" do
|
||||
expect { receiver.execute }.to raise_error(Gitlab::Email::UserNotFoundError)
|
||||
|
@ -91,4 +127,8 @@ describe Gitlab::Email::Handler::CreateIssueHandler do
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
def email_fixture(path)
|
||||
fixture_file(path).gsub('project_id', project.project_id.to_s)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -15,10 +15,10 @@ describe Gitlab::Email::Handler::CreateMergeRequestHandler do
|
|||
TestEnv.clean_test_path
|
||||
end
|
||||
|
||||
let(:email_raw) { email_fixture('emails/valid_new_merge_request.eml') }
|
||||
let(:namespace) { create(:namespace, path: 'gitlabhq') }
|
||||
|
||||
let!(:project) { create(:project, :public, :repository, namespace: namespace, path: 'gitlabhq') }
|
||||
let(:email_raw) { email_fixture('emails/valid_new_merge_request.eml') }
|
||||
let!(:user) do
|
||||
create(
|
||||
:user,
|
||||
|
@ -69,15 +69,25 @@ describe Gitlab::Email::Handler::CreateMergeRequestHandler do
|
|||
end
|
||||
|
||||
context "when everything is fine" do
|
||||
it "creates a new merge request" do
|
||||
expect { receiver.execute }.to change { project.merge_requests.count }.by(1)
|
||||
merge_request = project.merge_requests.last
|
||||
shared_examples "a new merge request" do
|
||||
it "creates a new merge request" do
|
||||
expect { receiver.execute }.to change { project.merge_requests.count }.by(1)
|
||||
merge_request = project.merge_requests.last
|
||||
|
||||
expect(merge_request.author).to eq(user)
|
||||
expect(merge_request.source_branch).to eq('feature')
|
||||
expect(merge_request.title).to eq('Feature added')
|
||||
expect(merge_request.description).to eq('Merge request description')
|
||||
expect(merge_request.target_branch).to eq(project.default_branch)
|
||||
expect(merge_request.author).to eq(user)
|
||||
expect(merge_request.source_branch).to eq('feature')
|
||||
expect(merge_request.title).to eq('Feature added')
|
||||
expect(merge_request.description).to eq('Merge request description')
|
||||
expect(merge_request.target_branch).to eq(project.default_branch)
|
||||
end
|
||||
end
|
||||
|
||||
it_behaves_like "a new merge request"
|
||||
|
||||
context "creates a new merge request with legacy email address" do
|
||||
let(:email_raw) { fixture_file('emails/valid_new_merge_request_legacy.eml') }
|
||||
|
||||
it_behaves_like "a new merge request"
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -17,6 +17,28 @@ describe Gitlab::Email::Handler::UnsubscribeHandler do
|
|||
|
||||
let!(:sent_notification) { SentNotification.record(noteable, user.id, mail_key) }
|
||||
|
||||
context "when email key" do
|
||||
let(:mail) { Mail::Message.new(email_raw) }
|
||||
|
||||
it "matches the new format" do
|
||||
handler = described_class.new(mail, "#{mail_key}#{Gitlab::IncomingEmail::UNSUBSCRIBE_SUFFIX}")
|
||||
|
||||
expect(handler.can_handle?).to be_truthy
|
||||
end
|
||||
|
||||
it "matches the legacy format" do
|
||||
handler = described_class.new(mail, "#{mail_key}#{Gitlab::IncomingEmail::UNSUBSCRIBE_SUFFIX_LEGACY}")
|
||||
|
||||
expect(handler.can_handle?).to be_truthy
|
||||
end
|
||||
|
||||
it "doesn't match either format" do
|
||||
handler = described_class.new(mail, "+#{mail_key}#{Gitlab::IncomingEmail::UNSUBSCRIBE_SUFFIX}")
|
||||
|
||||
expect(handler.can_handle?).to be_falsey
|
||||
end
|
||||
end
|
||||
|
||||
context 'when notification concerns a commit' do
|
||||
let(:commit) { create(:commit, project: project) }
|
||||
let!(:sent_notification) { SentNotification.record(commit, user.id, mail_key) }
|
||||
|
@ -42,7 +64,7 @@ describe Gitlab::Email::Handler::UnsubscribeHandler do
|
|||
end
|
||||
|
||||
context 'when using old style unsubscribe link' do
|
||||
let(:email_raw) { fixture_file('emails/valid_reply.eml').gsub(mail_key, "#{mail_key}#{Gitlab::IncomingEmail::UNSUBSCRIBE_SUFFIX_OLD}") }
|
||||
let(:email_raw) { fixture_file('emails/valid_reply.eml').gsub(mail_key, "#{mail_key}#{Gitlab::IncomingEmail::UNSUBSCRIBE_SUFFIX_LEGACY}") }
|
||||
|
||||
it 'unsubscribes user from notable' do
|
||||
expect { receiver.execute }.to change { noteable.subscribed?(user) }.from(true).to(false)
|
||||
|
|
|
@ -19,7 +19,8 @@ describe Gitlab::Email::Handler do
|
|||
|
||||
describe 'regexps are set properly' do
|
||||
let(:addresses) do
|
||||
%W(sent_notification_key#{Gitlab::IncomingEmail::UNSUBSCRIBE_SUFFIX} 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-project_id-user_email_token-merge-request path-to-project-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)
|
||||
end
|
||||
|
||||
it 'picks each handler at least once' do
|
||||
|
|
Loading…
Reference in New Issue