From ecea68eec542c77e3faa086fb740050f91287066 Mon Sep 17 00:00:00 2001
From: Patrick Derichs <pderichs@gitlab.com>
Date: Thu, 14 May 2020 16:05:53 +0200
Subject: [PATCH] Add #parent method to milestone

---
 app/models/milestone.rb                 |  8 ++++++++
 ee/app/services/burnup_chart_service.rb | 10 +---------
 spec/models/milestone_spec.rb           | 18 ++++++++++++++++++
 3 files changed, 27 insertions(+), 9 deletions(-)

diff --git a/app/models/milestone.rb b/app/models/milestone.rb
index da6490611fde6..0420aa90f526e 100644
--- a/app/models/milestone.rb
+++ b/app/models/milestone.rb
@@ -170,6 +170,14 @@ def author_id
   alias_method :group_milestone?, :group_timebox?
   alias_method :project_milestone?, :project_timebox?
 
+  def parent
+    if group_milestone?
+      group
+    else
+      project
+    end
+  end
+
   private
 
   def milestone_format_reference(format = :iid)
diff --git a/ee/app/services/burnup_chart_service.rb b/ee/app/services/burnup_chart_service.rb
index 31f427253d044..f42a95aec5b5a 100644
--- a/ee/app/services/burnup_chart_service.rb
+++ b/ee/app/services/burnup_chart_service.rb
@@ -41,15 +41,7 @@ def execute
   attr_reader :milestone, :start_date, :due_date, :end_date, :user
 
   def can_read_milestone?
-    Ability.allowed?(user, :read_milestone, milestone_parent)
-  end
-
-  def milestone_parent
-    if milestone.group_milestone?
-      milestone.group
-    else
-      milestone.project
-    end
+    Ability.allowed?(user, :read_milestone, milestone.parent)
   end
 
   def handle_added_milestone(event, assigned_milestones)
diff --git a/spec/models/milestone_spec.rb b/spec/models/milestone_spec.rb
index 9aaaf536351e6..e51108947a7ae 100644
--- a/spec/models/milestone_spec.rb
+++ b/spec/models/milestone_spec.rb
@@ -480,4 +480,22 @@
     it { is_expected.not_to match("#{Gitlab.config.gitlab.url}/gitlab-org/gitlab-foss/issues/123") }
     it { is_expected.not_to match("gitlab-org/gitlab-ce/milestones/123") }
   end
+
+  describe '#parent' do
+    context 'with group' do
+      it 'returns the expected parent' do
+        group = create(:group)
+
+        expect(build(:milestone, group: group).parent).to eq(group)
+      end
+    end
+
+    context 'with project' do
+      it 'returns the expected parent' do
+        project = create(:project)
+
+        expect(build(:milestone, project: project).parent).to eq(project)
+      end
+    end
+  end
 end
-- 
GitLab