summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean McGivern <sean@gitlab.com>2017-03-03 14:25:52 +0000
committerSean McGivern <sean@gitlab.com>2017-03-06 14:18:49 +0000
commit9f612cc428c47a578bef8869e2e93966c021e655 (patch)
treeff03a6c9437a5a5b68219bf66978b756b514116c
parent86d1e42ab34d15a801b97d4d1b7812fb4259f7e5 (diff)
downloadgitlab-ce-9f612cc428c47a578bef8869e2e93966c021e655.tar.gz
Fix issues mentioned but not closed for JIRA
The `ReferenceExtractor` would return an array of `ExternalIssue` objects, and then perform `Array#-` to remove the issues closed. `ExternalIssue`s had `==` defined, but not `hash` or `eql?`, which are used by `Array#-`.
-rw-r--r--app/models/external_issue.rb5
-rw-r--r--changelogs/unreleased/fix-mentioned-issues-for-external-trackers.yml4
-rw-r--r--spec/factories/services.rb9
-rw-r--r--spec/models/external_issue_spec.rb8
-rw-r--r--spec/models/merge_request_spec.rb17
5 files changed, 43 insertions, 0 deletions
diff --git a/app/models/external_issue.rb b/app/models/external_issue.rb
index b973bbcd8da..e63f89a9f85 100644
--- a/app/models/external_issue.rb
+++ b/app/models/external_issue.rb
@@ -24,6 +24,11 @@ class ExternalIssue
def ==(other)
other.is_a?(self.class) && (to_s == other.to_s)
end
+ alias_method :eql?, :==
+
+ def hash
+ [self.class, to_s].hash
+ end
def project
@project
diff --git a/changelogs/unreleased/fix-mentioned-issues-for-external-trackers.yml b/changelogs/unreleased/fix-mentioned-issues-for-external-trackers.yml
new file mode 100644
index 00000000000..ee827b7c939
--- /dev/null
+++ b/changelogs/unreleased/fix-mentioned-issues-for-external-trackers.yml
@@ -0,0 +1,4 @@
+---
+title: Fix issues mentioned but not closed for external issue trackers
+merge_request:
+author:
diff --git a/spec/factories/services.rb b/spec/factories/services.rb
index 51335bdcf1d..88f6c265505 100644
--- a/spec/factories/services.rb
+++ b/spec/factories/services.rb
@@ -12,4 +12,13 @@ FactoryGirl.define do
token: 'a' * 40,
})
end
+
+ factory :jira_service do
+ project factory: :empty_project
+ active true
+ properties(
+ url: 'https://jira.example.com',
+ project_key: 'jira-key'
+ )
+ end
end
diff --git a/spec/models/external_issue_spec.rb b/spec/models/external_issue_spec.rb
index 2debe1289a3..cd50bda8996 100644
--- a/spec/models/external_issue_spec.rb
+++ b/spec/models/external_issue_spec.rb
@@ -42,4 +42,12 @@ describe ExternalIssue, models: true do
expect(issue.project_id).to eq(project.id)
end
end
+
+ describe '#hash' do
+ it 'returns the hash of its [class, to_s] pair' do
+ issue_2 = described_class.new(issue.to_s, project)
+
+ expect(issue.hash).to eq(issue_2.hash)
+ end
+ end
end
diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb
index e000d0d38b3..fcaf4c71182 100644
--- a/spec/models/merge_request_spec.rb
+++ b/spec/models/merge_request_spec.rb
@@ -346,6 +346,23 @@ describe MergeRequest, models: true do
expect(subject.issues_mentioned_but_not_closing(subject.author)).to match_array([mentioned_issue])
end
+
+ context 'when the project has an external issue tracker' do
+ before do
+ subject.project.team << [subject.author, :developer]
+ commit = double(:commit, safe_message: 'Fixes TEST-3')
+
+ create(:jira_service, project: subject.project)
+
+ allow(subject).to receive(:commits).and_return([commit])
+ allow(subject).to receive(:description).and_return('Is related to TEST-2 and TEST-3')
+ allow(subject.project).to receive(:default_branch).and_return(subject.target_branch)
+ end
+
+ it 'detects issues mentioned in description but not closed' do
+ expect(subject.issues_mentioned_but_not_closing(subject.author).map(&:to_s)).to match_array(['TEST-2'])
+ end
+ end
end
describe "#work_in_progress?" do