From 9882802a8b70e998ff6850a3d096b3b52730ab85 Mon Sep 17 00:00:00 2001
From: Grzegorz Bizon <grzesiek.bizon@gmail.com>
Date: Tue, 16 Feb 2016 11:47:00 +0100
Subject: [PATCH] Improve system notes that are added when issue is moved

---
 app/services/issues/move_service.rb       |  4 +-
 app/services/system_note_service.rb       | 25 +++++++----
 spec/services/issues/move_service_spec.rb |  6 ++-
 spec/services/system_note_service_spec.rb | 51 +++++++++++++++++++----
 4 files changed, 66 insertions(+), 20 deletions(-)

diff --git a/app/services/issues/move_service.rb b/app/services/issues/move_service.rb
index 49ec9609e1f..e2ab06ac332 100644
--- a/app/services/issues/move_service.rb
+++ b/app/services/issues/move_service.rb
@@ -4,6 +4,7 @@ module Issues
       @issue_old = issue_old
       @issue_new = issue_old.dup
       @project_new = project_new
+      @project_old = @project
 
       open_new_issue
       rewrite_notes
@@ -33,10 +34,11 @@ module Issues
     end
 
     def add_note_moved_from
+      SystemNoteService.noteable_moved(:from, @issue_new, @project_new, @issue_old, @current_user)
     end
 
     def add_note_moved_to
-      SystemNoteService.issue_moved_to_another_project(@issue_old, @project, @project_new, @current_user)
+      SystemNoteService.noteable_moved(:to, @issue_old, @project_old, @issue_new, @current_user)
     end
   end
 end
diff --git a/app/services/system_note_service.rb b/app/services/system_note_service.rb
index 95379d260f1..a8d6555dec3 100644
--- a/app/services/system_note_service.rb
+++ b/app/services/system_note_service.rb
@@ -3,6 +3,7 @@
 # Used for creating system notes (e.g., when a user references a merge request
 # from an issue, an issue's assignee changes, an issue is closed, etc.)
 class SystemNoteService
+  extend GitlabMarkdownHelper
   # Called when commits are added to a Merge Request
   #
   # noteable         - Noteable object
@@ -388,20 +389,26 @@ class SystemNoteService
     create_note(noteable: noteable, project: project, author: author, note: body)
   end
 
-  # Called when issue has been moved to another project
+  # Called when noteable has been moved to another project
   #
-  # issue          - Issue that has been moved to another project
-  # project_from   - Source project of the issue
-  # project_to     - Destination project for the issue
-  # author         - User performing the move
+  # direction    - symbol, :to or :from
+  # noteable     - Noteable object
+  # noteable_ref - Referenced noteable
+  # author       - User performing the move
   #
   # Example Note text:
   #
-  #   "This issue has been moved to SomeNamespace / SomeProject"
+  #   "Moved to project_new/#11"
   #
   # Returns the created Note object
-  def self.issue_moved_to_another_project(issue, project_from, project_to, author)
-    body = "This issue has been moved to #{project_to.to_reference} by #{author.to_reference}"
-    create_note(noteable: issue, project: project_from, author: author, note: body)
+  def self.noteable_moved(direction, noteable, project, noteable_ref, author)
+    unless [:to, :from].include?(direction)
+      raise StandardError, "Invalid direction `#{direction}`"
+    end
+
+    cross_reference = cross_project_reference(noteable_ref.project, noteable_ref)
+
+    body = "Moved #{direction} #{cross_reference}"
+    create_note(noteable: noteable, project: project, author: author, note: body)
   end
 end
diff --git a/spec/services/issues/move_service_spec.rb b/spec/services/issues/move_service_spec.rb
index 25dacb2068b..569e155e617 100644
--- a/spec/services/issues/move_service_spec.rb
+++ b/spec/services/issues/move_service_spec.rb
@@ -20,7 +20,11 @@ describe Issues::MoveService, services: true do
     end
 
     it 'should add system note to old issue' do
-      expect(issue.notes.last.note).to match /This issue has been moved to/
+      expect(issue.notes.last.note).to match /^Moved to/
+    end
+
+    it 'should add system note to new issue' do
+      expect(new_issue.notes.last.note).to match /^Moved from/
     end
   end
 end
diff --git a/spec/services/system_note_service_spec.rb b/spec/services/system_note_service_spec.rb
index 9074d3dbe19..e0ae49ab37c 100644
--- a/spec/services/system_note_service_spec.rb
+++ b/spec/services/system_note_service_spec.rb
@@ -441,23 +441,56 @@ describe SystemNoteService, services: true do
     end
   end
 
-  describe '.issue_moved_to_another_project' do
+  describe '.noteable_moved' do
+    let(:new_project) { create(:project) }
+    let(:new_noteable) { create(:issue, project: new_project) }
+
     subject do
-      described_class.issue_moved_to_another_project(noteable, project, new_project, author)
+      described_class.noteable_moved(direction, noteable, project, new_noteable, author)
     end
 
-    let(:new_project) { create(:project) }
+    shared_examples 'cross project mentionable' do
+      include GitlabMarkdownHelper
+
+      it 'should contain cross reference to new noteable' do
+        expect(subject.note).to include cross_project_reference(new_project, new_noteable)
+      end
+
+      it 'should mention referenced noteable' do
+        expect(subject.note).to include new_noteable.to_reference
+      end
+
+      it 'should mention referenced project' do
+        expect(subject.note).to include new_project.to_reference
+      end
+    end
+
+    context 'moved to' do
+      let(:direction) { :to }
+
+      it_behaves_like 'cross project mentionable'
 
-    it 'should notify about issue being moved' do
-      expect(subject.note).to match /This issue has been moved to/
+      it 'should notify about noteable being moved to' do
+        expect(subject.note).to match /Moved to/
+      end
     end
 
-    it 'should mention destination project' do
-      expect(subject.note).to include new_project.to_reference
+    context 'moved from' do
+      let(:direction) { :from }
+
+      it_behaves_like 'cross project mentionable'
+
+      it 'should notify about noteable being moved from' do
+        expect(subject.note).to match /Moved from/
+      end
     end
 
-    it 'should mention author of that change' do
-      expect(subject.note).to include author.to_reference
+    context 'invalid direction' do
+      let (:direction) { :invalid }
+
+      it 'should raise error' do
+        expect { subject }.to raise_error StandardError, /Invalid direction/
+      end
     end
   end
 
-- 
GitLab