summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandru Croitor <acroitor@gitlab.com>2019-05-23 17:16:21 +0300
committerAlexandru Croitor <acroitor@gitlab.com>2019-07-19 18:03:56 +0300
commit1b54d02dabd56e13abe090993e741dc4337818da (patch)
treea613af864a8d666342c271f9e0ebf82e21da8c56
parent8291a58124e8f0987b3e17a22ca1123b5dc14f1b (diff)
downloadgitlab-ce-39545-cleanup-dynamic-milestone-pages.tar.gz
Remove deprecated dashboard & group milestone pages39545-cleanup-dynamic-milestone-pages
Replaces legacy GroupMilestone, DashboardMilestone, GlobalMilestone models with Group model. Replaces dynamic milestones pages with corresponding project or group milestone pages. Other code cleanup related to dynamic milestone pages https://gitlab.com/gitlab-org/gitlab-ce/issues/39545
-rw-r--r--app/controllers/dashboard/milestones_controller.rb30
-rw-r--r--app/controllers/groups/milestones_controller.rb61
-rw-r--r--app/controllers/projects/milestones_controller.rb2
-rw-r--r--app/finders/milestones_finder.rb6
-rw-r--r--app/helpers/milestones_helper.rb21
-rw-r--r--app/models/concerns/milestoneish.rb16
-rw-r--r--app/models/dashboard_group_milestone.rb21
-rw-r--r--app/models/dashboard_milestone.rb15
-rw-r--r--app/models/global_milestone.rb102
-rw-r--r--app/models/group_milestone.rb43
-rw-r--r--app/views/dashboard/milestones/_milestone.html.haml1
-rw-r--r--app/views/dashboard/milestones/show.html.haml5
-rw-r--r--app/views/groups/milestones/_milestone.html.haml2
-rw-r--r--app/views/groups/milestones/index.html.haml5
-rw-r--r--app/views/groups/milestones/show.html.haml1
-rw-r--r--app/views/projects/milestones/_milestone.html.haml1
-rw-r--r--app/views/shared/milestones/_milestone.html.haml46
-rw-r--r--app/views/shared/milestones/_tabs.html.haml16
-rw-r--r--app/views/shared/milestones/_top.html.haml37
-rw-r--r--changelogs/unreleased/39545-cleanup-dynamic-milestone-pages.yml5
-rw-r--r--config/routes/dashboard.rb8
-rw-r--r--config/routes/group.rb8
-rw-r--r--spec/controllers/dashboard/milestones_controller_spec.rb26
-rw-r--r--spec/controllers/groups/milestones_controller_spec.rb120
-rw-r--r--spec/features/dashboard/milestone_tabs_spec.rb40
-rw-r--r--spec/features/groups/milestone_spec.rb35
-rw-r--r--spec/features/groups/milestones_sorting_spec.rb17
-rw-r--r--spec/features/milestone_spec.rb14
-rw-r--r--spec/models/global_milestone_spec.rb207
-rw-r--r--spec/models/group_milestone_spec.rb57
-rw-r--r--spec/support/shared_examples/milestone_tabs_examples.rb10
-rw-r--r--spec/views/shared/milestones/_top.html.haml.rb16
32 files changed, 98 insertions, 896 deletions
diff --git a/app/controllers/dashboard/milestones_controller.rb b/app/controllers/dashboard/milestones_controller.rb
index 912036da0ea..d2606fcde35 100644
--- a/app/controllers/dashboard/milestones_controller.rb
+++ b/app/controllers/dashboard/milestones_controller.rb
@@ -1,48 +1,32 @@
# frozen_string_literal: true
class Dashboard::MilestonesController < Dashboard::ApplicationController
- include MilestoneActions
-
before_action :projects
before_action :groups, only: :index
- before_action :milestone, only: [:show, :merge_requests, :participants, :labels]
def index
respond_to do |format|
format.html do
@milestone_states = Milestone.states_count(@projects.select(:id), @groups.select(:id))
- @milestones = Kaminari.paginate_array(milestones).page(params[:page])
+ @milestones = milestones.page(params[:page])
end
format.json do
- render json: milestones
+ render json: milestones.to_json(only: [:id, :title], methods: :name)
end
end
end
- def show
- end
-
private
- def group_milestones
- DashboardGroupMilestone.build_collection(groups, params)
- end
-
- # See [#39545](https://gitlab.com/gitlab-org/gitlab-ce/issues/39545) for info about the deprecation of dynamic milestones
- def dynamic_milestones
- DashboardMilestone.build_collection(@projects, params)
- end
-
def milestones
- @milestones = group_milestones + dynamic_milestones
- end
-
- def milestone
- @milestone = DashboardMilestone.build(@projects, params[:title])
- render_404 unless @milestone
+ MilestonesFinder.new(search_params).execute
end
def groups
@groups ||= GroupsFinder.new(current_user, all_available: false).execute
end
+
+ def search_params
+ params.permit(:state, :search_title).merge(group_ids: groups.map(&:id), project_ids: projects)
+ end
end
diff --git a/app/controllers/groups/milestones_controller.rb b/app/controllers/groups/milestones_controller.rb
index 7ed4384089b..3c8a99131d4 100644
--- a/app/controllers/groups/milestones_controller.rb
+++ b/app/controllers/groups/milestones_controller.rb
@@ -1,20 +1,18 @@
# frozen_string_literal: true
class Groups::MilestonesController < Groups::ApplicationController
- include MilestoneActions
-
before_action :group_projects
- before_action :milestone, only: [:edit, :show, :update, :merge_requests, :participants, :labels, :destroy]
+ before_action :milestone, only: [:edit, :show, :update, :destroy]
before_action :authorize_admin_milestones!, only: [:edit, :new, :create, :update, :destroy]
def index
respond_to do |format|
format.html do
@milestone_states = Milestone.states_count(group_projects, [group])
- @milestones = Kaminari.paginate_array(milestones).page(params[:page])
+ @milestones = milestones.page(params[:page])
end
format.json do
- render json: milestones.map { |m| m.for_display.slice(:id, :title, :name) }
+ render json: milestones.to_json(only: [:id, :title], methods: :name)
end
end
end
@@ -27,7 +25,7 @@ class Groups::MilestonesController < Groups::ApplicationController
@milestone = Milestones::CreateService.new(group, current_user, milestone_params).execute
if @milestone.persisted?
- redirect_to milestone_path
+ redirect_to milestone_path(@milestone)
else
render "new"
end
@@ -37,23 +35,15 @@ class Groups::MilestonesController < Groups::ApplicationController
end
def edit
- render_404 if @milestone.legacy_group_milestone?
end
def update
- # Keep this compatible with legacy group milestones where we have to update
- # all projects milestones states at once.
- milestones, update_params = get_milestones_for_update
- milestones.each do |milestone|
- Milestones::UpdateService.new(milestone.parent, current_user, update_params).execute(milestone)
- end
+ Milestones::UpdateService.new(@milestone.parent, current_user, milestone_params).execute(@milestone)
- redirect_to milestone_path
+ redirect_to milestone_path(@milestone)
end
def destroy
- return render_404 if @milestone.legacy_group_milestone?
-
Milestones::DestroyService.new(group, current_user).execute(@milestone)
respond_to do |format|
@@ -64,14 +54,6 @@ class Groups::MilestonesController < Groups::ApplicationController
private
- def get_milestones_for_update
- if @milestone.legacy_group_milestone?
- [@milestone.milestones, legacy_milestone_params]
- else
- [[@milestone], milestone_params]
- end
- end
-
def authorize_admin_milestones!
return render_404 unless can?(current_user, :admin_milestone, group)
end
@@ -80,41 +62,18 @@ class Groups::MilestonesController < Groups::ApplicationController
params.require(:milestone).permit(:title, :description, :start_date, :due_date, :state_event)
end
- def legacy_milestone_params
- params.require(:milestone).permit(:state_event)
- end
-
- def milestone_path
- if @milestone.legacy_group_milestone?
- group_milestone_path(group, @milestone.safe_title, title: @milestone.title)
- else
- group_milestone_path(group, @milestone.iid)
- end
- end
-
def milestones
- milestones = MilestonesFinder.new(search_params).execute
-
- @sort = params[:sort] || 'due_date_asc'
- MilestoneArray.sort(milestones + legacy_milestones, @sort)
- end
-
- def legacy_milestones
- GroupMilestone.build_collection(group, group_projects, params)
+ MilestonesFinder.new(search_params).execute
end
def milestone
- @milestone =
- if params[:title]
- GroupMilestone.build(group, group_projects, params[:title])
- else
- group.milestones.find_by_iid(params[:id])
- end
+ @milestone = group.milestones.find_by_iid(params[:id])
render_404 unless @milestone
end
def search_params
- params.permit(:state, :search_title).merge(group_ids: group.id)
+ @sort = params[:sort] || 'due_date_asc'
+ params.permit(:state, :search_title).merge(sort: @sort, group_ids: group.id, project_ids: group_projects)
end
end
diff --git a/app/controllers/projects/milestones_controller.rb b/app/controllers/projects/milestones_controller.rb
index f6f61b6e5fb..06bcedb5e3a 100644
--- a/app/controllers/projects/milestones_controller.rb
+++ b/app/controllers/projects/milestones_controller.rb
@@ -32,7 +32,7 @@ class Projects::MilestonesController < Projects::ApplicationController
@milestones = @milestones.page(params[:page])
end
format.json do
- render json: @milestones.to_json(methods: :name)
+ render json: @milestones.to_json(only: [:id, :title], methods: :name)
end
end
end
diff --git a/app/finders/milestones_finder.rb b/app/finders/milestones_finder.rb
index 77b55cbb838..441d4d16978 100644
--- a/app/finders/milestones_finder.rb
+++ b/app/finders/milestones_finder.rb
@@ -56,10 +56,8 @@ class MilestonesFinder
Milestone.filter_by_state(items, params[:state])
end
- # rubocop: disable CodeReuse/ActiveRecord
def order(items)
- order_statement = Gitlab::Database.nulls_last_order('due_date', 'ASC')
- items.reorder(order_statement).order('title ASC')
+ sort_by = params[:sort].presence || 'due_date_asc'
+ items.sort_by_attribute(sort_by).order('title ASC') # rubocop: disable CodeReuse/ActiveRecord
end
- # rubocop: enable CodeReuse/ActiveRecord
end
diff --git a/app/helpers/milestones_helper.rb b/app/helpers/milestones_helper.rb
index c1a04640688..017efd68e06 100644
--- a/app/helpers/milestones_helper.rb
+++ b/app/helpers/milestones_helper.rb
@@ -226,27 +226,6 @@ module MilestonesHelper
end
end
- def group_milestone_route(milestone, params = {})
- params = nil if params.empty?
-
- if milestone.legacy_group_milestone?
- group_milestone_path(@group, milestone.safe_title, title: milestone.title, milestone: params)
- else
- group_milestone_path(@group, milestone.iid, milestone: params)
- end
- end
-
- def group_or_project_milestone_path(milestone)
- params =
- if milestone.group_milestone?
- { milestone: { title: milestone.title } }
- else
- { title: milestone.title }
- end
-
- milestone_path(milestone.milestone, params)
- end
-
def can_admin_project_milestones?
strong_memoize(:can_admin_project_milestones) do
can?(current_user, :admin_milestone, @project)
diff --git a/app/models/concerns/milestoneish.rb b/app/models/concerns/milestoneish.rb
index 3deb86da6cf..743cdbed04d 100644
--- a/app/models/concerns/milestoneish.rb
+++ b/app/models/concerns/milestoneish.rb
@@ -83,22 +83,6 @@ module Milestoneish
due_date && due_date.past?
end
- def group_milestone?
- false
- end
-
- def project_milestone?
- false
- end
-
- def legacy_group_milestone?
- false
- end
-
- def dashboard_milestone?
- false
- end
-
def total_issue_time_spent
@total_issue_time_spent ||= issues.joins(:timelogs).sum(:time_spent)
end
diff --git a/app/models/dashboard_group_milestone.rb b/app/models/dashboard_group_milestone.rb
deleted file mode 100644
index ec52f1ed370..00000000000
--- a/app/models/dashboard_group_milestone.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-# Dashboard Group Milestones are milestones that allow us to pull more info out for the UI that the Milestone object doesn't allow for
-class DashboardGroupMilestone < GlobalMilestone
- extend ::Gitlab::Utils::Override
-
- attr_reader :group_name
-
- def initialize(milestone)
- super
-
- @group_name = milestone.group.full_name
- end
-
- def self.build_collection(groups, params)
- milestones = Milestone.of_groups(groups.select(:id))
- .reorder_by_due_date_asc
- .order_by_name_asc
- milestones = milestones.search_title(params[:search_title]) if params[:search_title].present?
- Milestone.filter_by_state(milestones, params[:state]).map { |m| new(m) }
- end
-end
diff --git a/app/models/dashboard_milestone.rb b/app/models/dashboard_milestone.rb
deleted file mode 100644
index 9b377b70e5b..00000000000
--- a/app/models/dashboard_milestone.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class DashboardMilestone < GlobalMilestone
- attr_reader :project_name
-
- def initialize(milestone)
- super
-
- @project_name = milestone.project.full_name
- end
-
- def project_milestone?
- true
- end
-end
diff --git a/app/models/global_milestone.rb b/app/models/global_milestone.rb
deleted file mode 100644
index 59f5a7703e2..00000000000
--- a/app/models/global_milestone.rb
+++ /dev/null
@@ -1,102 +0,0 @@
-# frozen_string_literal: true
-# Global Milestones are milestones that can be shared across multiple projects
-class GlobalMilestone
- include Milestoneish
-
- STATE_COUNT_HASH = { opened: 0, closed: 0, all: 0 }.freeze
-
- attr_reader :milestone
- alias_attribute :name, :title
-
- delegate :title, :state, :due_date, :start_date, :participants, :project,
- :group, :expires_at, :closed?, :iid, :group_milestone?, :safe_title,
- :milestoneish_id, :parent, to: :milestone
-
- def to_hash
- {
- name: title,
- title: title,
- group_name: group&.full_name,
- project_name: project&.full_name
- }
- end
-
- def for_display
- @milestone
- end
-
- def self.build_collection(projects, params)
- items = Milestone.of_projects(projects)
- .reorder_by_due_date_asc
- .order_by_name_asc
- items = items.search_title(params[:search_title]) if params[:search_title].present?
-
- Milestone.filter_by_state(items, params[:state]).map { |m| new(m) }
- end
-
- # necessary for legacy milestones
- def self.build(projects, title)
- milestones = Milestone.of_projects(projects).where(title: title)
- return if milestones.blank?
-
- new(milestones.first)
- end
-
- def self.states_count(projects, group = nil)
- legacy_group_milestones_count = legacy_group_milestone_states_count(projects)
- group_milestones_count = group_milestones_states_count(group)
-
- legacy_group_milestones_count.merge(group_milestones_count) do |k, legacy_group_milestones_count, group_milestones_count|
- legacy_group_milestones_count + group_milestones_count
- end
- end
-
- def self.group_milestones_states_count(group)
- return STATE_COUNT_HASH unless group
-
- counts_by_state = Milestone.of_groups(group).count_by_state
-
- {
- opened: counts_by_state['active'] || 0,
- closed: counts_by_state['closed'] || 0,
- all: counts_by_state.values.sum
- }
- end
-
- def self.legacy_group_milestone_states_count(projects)
- return STATE_COUNT_HASH unless projects
-
- # We need to reorder(nil) on the projects, because the controller passes them in sorted.
- relation = Milestone.of_projects(projects.reorder(nil)).count_by_state
-
- {
- opened: relation['active'] || 0,
- closed: relation['closed'] || 0,
- all: relation.values.sum
- }
- end
-
- def initialize(milestone)
- @milestone = milestone
- end
-
- def active?
- state == 'active'
- end
-
- def closed?
- state == 'closed'
- end
-
- def issues
- @issues ||= Issue.of_milestones(milestone).includes(:project, :assignees, :labels)
- end
-
- def merge_requests
- @merge_requests ||= MergeRequest.of_milestones(milestone).includes(:target_project, :assignee, :labels)
- end
-
- def labels
- @labels ||= GlobalLabel.build_collection(milestone.labels).sort_by!(&:title)
- end
-end
diff --git a/app/models/group_milestone.rb b/app/models/group_milestone.rb
deleted file mode 100644
index 97cb26c6ea9..00000000000
--- a/app/models/group_milestone.rb
+++ /dev/null
@@ -1,43 +0,0 @@
-# frozen_string_literal: true
-# Group Milestones are milestones that can be shared among many projects within the same group
-class GroupMilestone < GlobalMilestone
- attr_reader :group, :milestones
-
- def self.build_collection(group, projects, params)
- params =
- { state: params[:state], search_title: params[:search_title] }
-
- project_milestones = Milestone.of_projects(projects)
- project_milestones = project_milestones.search_title(params[:search_title]) if params[:search_title].present?
- child_milestones = Milestone.filter_by_state(project_milestones, params[:state])
- grouped_milestones = child_milestones.group_by(&:title)
-
- grouped_milestones.map do |title, grouped|
- new(title, grouped, group)
- end
- end
-
- def self.build(group, projects, title)
- child_milestones = Milestone.of_projects(projects).where(title: title)
- return if child_milestones.blank?
-
- new(title, child_milestones, group)
- end
-
- def initialize(title, milestones, group)
- @milestones = milestones
- @group = group
- end
-
- def milestone
- @milestone ||= milestones.find { |m| m.description.present? } || milestones.first
- end
-
- def issues_finder_params
- { group_id: group.id }
- end
-
- def legacy_group_milestone?
- true
- end
-end
diff --git a/app/views/dashboard/milestones/_milestone.html.haml b/app/views/dashboard/milestones/_milestone.html.haml
index 89212eb6bf9..4921de32f65 100644
--- a/app/views/dashboard/milestones/_milestone.html.haml
+++ b/app/views/dashboard/milestones/_milestone.html.haml
@@ -1,5 +1,4 @@
= render 'shared/milestones/milestone',
- milestone_path: group_or_project_milestone_path(milestone),
issues_path: issues_dashboard_path(milestone_title: milestone.title),
merge_requests_path: merge_requests_dashboard_path(milestone_title: milestone.title),
milestone: milestone,
diff --git a/app/views/dashboard/milestones/show.html.haml b/app/views/dashboard/milestones/show.html.haml
deleted file mode 100644
index 2129920afd2..00000000000
--- a/app/views/dashboard/milestones/show.html.haml
+++ /dev/null
@@ -1,5 +0,0 @@
-- header_title "Milestones", dashboard_milestones_path
-
-= render 'shared/milestones/top', milestone: @milestone
-= render 'shared/milestones/tabs', milestone: @milestone, show_full_project_name: true
-= render 'shared/milestones/sidebar', milestone: @milestone, affix_offset: 51
diff --git a/app/views/groups/milestones/_milestone.html.haml b/app/views/groups/milestones/_milestone.html.haml
index bae8997e24c..b73626dab81 100644
--- a/app/views/groups/milestones/_milestone.html.haml
+++ b/app/views/groups/milestones/_milestone.html.haml
@@ -1,6 +1,4 @@
-
= render 'shared/milestones/milestone',
- milestone_path: group_milestone_route(milestone),
issues_path: issues_group_path(@group, milestone_title: milestone.title),
merge_requests_path: merge_requests_group_path(@group, milestone_title: milestone.title),
milestone: milestone
diff --git a/app/views/groups/milestones/index.html.haml b/app/views/groups/milestones/index.html.haml
index b6fb908c8f6..6fbfdc6ce0f 100644
--- a/app/views/groups/milestones/index.html.haml
+++ b/app/views/groups/milestones/index.html.haml
@@ -16,5 +16,8 @@
.nothing-here-block No milestones to show
- else
- @milestones.each do |milestone|
- = render 'milestone', milestone: milestone
+ - if milestone.project
+ = render 'projects/milestones/milestone', milestone: milestone
+ - else
+ = render 'milestone', milestone: milestone
= paginate @milestones, theme: "gitlab"
diff --git a/app/views/groups/milestones/show.html.haml b/app/views/groups/milestones/show.html.haml
index 23b1a22240f..8711f8583de 100644
--- a/app/views/groups/milestones/show.html.haml
+++ b/app/views/groups/milestones/show.html.haml
@@ -1,4 +1,3 @@
= render "header_title"
= render 'shared/milestones/top', milestone: @milestone, group: @group
-= render 'shared/milestones/tabs', milestone: @milestone, show_project_name: true if @milestone.legacy_group_milestone?
= render 'shared/milestones/sidebar', milestone: @milestone, affix_offset: 102
diff --git a/app/views/projects/milestones/_milestone.html.haml b/app/views/projects/milestones/_milestone.html.haml
index bc82b45f902..00937c5bf73 100644
--- a/app/views/projects/milestones/_milestone.html.haml
+++ b/app/views/projects/milestones/_milestone.html.haml
@@ -1,5 +1,4 @@
= render 'shared/milestones/milestone',
- milestone_path: project_milestone_path(milestone.project, milestone),
issues_path: project_issues_path(milestone.project, milestone_title: milestone.title),
merge_requests_path: project_merge_requests_path(milestone.project, milestone_title: milestone.title),
milestone: milestone
diff --git a/app/views/shared/milestones/_milestone.html.haml b/app/views/shared/milestones/_milestone.html.haml
index e99aa3f1ee4..e5521f3a3a4 100644
--- a/app/views/shared/milestones/_milestone.html.haml
+++ b/app/views/shared/milestones/_milestone.html.haml
@@ -6,27 +6,21 @@
.row
.col-sm-6
.append-bottom-5
- %strong= link_to truncate(milestone.title, length: 100), milestone_path
+ %strong= link_to truncate(milestone.title, length: 100), milestone_path(milestone)
- if @group
= " - #{milestone_type}"
- - if @project || milestone.is_a?(GlobalMilestone) || milestone.group_milestone?
- - if milestone.due_date || milestone.start_date
- .milestone-range.append-bottom-5
- = milestone_date_range(milestone)
- %div
- = render('shared/milestone_expired', milestone: milestone)
- - if milestone.group_milestone?
- .label-badge.label-badge-blue.d-inline-block
- = milestone.group.full_name
- - if milestone.legacy_group_milestone?
- .projects
- - link_to milestone_path(milestone.milestone) do
- %span.label-badge.label-badge-blue.d-inline-block.append-bottom-5
- = dashboard ? milestone.project.full_name : milestone.project.name
- - if milestone.project
- .label-badge.label-badge-gray.d-inline-block
- = milestone.project.full_name
+ - if milestone.due_date || milestone.start_date
+ .milestone-range.append-bottom-5
+ = milestone_date_range(milestone)
+ %div
+ = render('shared/milestone_expired', milestone: milestone)
+ - if milestone.group_milestone?
+ .label-badge.label-badge-blue.d-inline-block
+ = milestone.group.full_name
+ - if milestone.project
+ .label-badge.label-badge-gray.d-inline-block
+ = milestone.project.full_name
.col-sm-4.milestone-progress
= milestone_progress_bar(milestone)
@@ -49,16 +43,12 @@
container: 'body',
toggle: 'modal' } }
= sprite_icon('level-up', size: 14)
-
- = link_to 'Close Milestone', project_milestone_path(@project, milestone, milestone: {state_event: :close }), method: :put, remote: true, class: "btn btn-sm btn-close btn-grouped"
- - unless milestone.active?
- = link_to 'Reopen Milestone', project_milestone_path(@project, milestone, milestone: {state_event: :activate }), method: :put, class: "btn btn-grouped btn-reopen"
- - if @group
- - if can?(current_user, :admin_milestone, @group)
- - if milestone.closed?
- = link_to 'Reopen Milestone', group_milestone_route(milestone, {state_event: :activate }), method: :put, class: "btn btn-sm btn-grouped btn-reopen"
- - else
- = link_to 'Close Milestone', group_milestone_route(milestone, {state_event: :close }), method: :put, class: "btn btn-sm btn-grouped btn-close"
- if dashboard
.label-badge.label-badge-gray
= milestone_type
+ - else
+ - if can?(current_user, :admin_milestone, milestone.parent)
+ - if milestone.closed?
+ = link_to 'Reopen Milestone', milestone_path(milestone, milestone: {state_event: :activate }), method: :put, class: "btn btn-sm btn-grouped btn-reopen"
+ - else
+ = link_to 'Close Milestone', milestone_path(milestone, milestone: {state_event: :close }), method: :put, class: "btn btn-sm btn-grouped btn-close"
diff --git a/app/views/shared/milestones/_tabs.html.haml b/app/views/shared/milestones/_tabs.html.haml
index b877f66c71e..8db34da10fb 100644
--- a/app/views/shared/milestones/_tabs.html.haml
+++ b/app/views/shared/milestones/_tabs.html.haml
@@ -1,4 +1,5 @@
-- issues_accessible = milestone.is_a?(GlobalMilestone) || can?(current_user, :read_issue, @project)
+- issues_accessible = can?(current_user, :read_issue, @project)
+- mr_active_css_class = 'active' unless issues_accessible
.scrolling-tabs-container.inner-page-scroll-tabs.is-smaller
.fade-left= icon('angle-left')
@@ -9,15 +10,10 @@
= link_to '#tab-issues', class: 'nav-link active', 'data-toggle' => 'tab', 'data-show' => '.tab-issues-buttons' do
Issues
%span.badge.badge-pill= milestone.issues_visible_to_user(current_user).size
- %li.nav-item
- = link_to '#tab-merge-requests', class: 'nav-link', 'data-toggle' => 'tab', 'data-endpoint': milestone_merge_request_tab_path(milestone) do
- Merge Requests
- %span.badge.badge-pill= milestone.merge_requests_visible_to_user(current_user).size
- - else
- %li.nav-item
- = link_to '#tab-merge-requests', class: 'nav-link active', 'data-toggle' => 'tab', 'data-endpoint': milestone_merge_request_tab_path(milestone) do
- Merge Requests
- %span.badge.badge-pill= milestone.merge_requests.size
+ %li.nav-item
+ = link_to '#tab-merge-requests', class: "nav-link #{mr_active_css_class}", 'data-toggle' => 'tab', 'data-endpoint': milestone_merge_request_tab_path(milestone) do
+ Merge Requests
+ %span.badge.badge-pill= milestone.merge_requests.size
%li.nav-item
= link_to '#tab-participants', class: 'nav-link', 'data-toggle' => 'tab', 'data-endpoint': milestone_participants_tab_path(milestone) do
Participants
diff --git a/app/views/shared/milestones/_top.html.haml b/app/views/shared/milestones/_top.html.haml
index 43503e1d08a..cbb2c6c0656 100644
--- a/app/views/shared/milestones/_top.html.haml
+++ b/app/views/shared/milestones/_top.html.haml
@@ -1,8 +1,7 @@
- page_title milestone.title
-- @breadcrumb_link = dashboard_milestone_path(milestone.safe_title, title: milestone.title)
+- @breadcrumb_link = milestone_path(milestone)
- group = local_assigns[:group]
-- is_dynamic_milestone = milestone.legacy_group_milestone? || milestone.dashboard_milestone?
.detail-page-header.milestone-page-header
.status-box{ class: "status-box-#{milestone.closed? ? 'closed' : 'open'}" }
@@ -28,18 +27,14 @@
= link_to edit_group_milestone_path(group, milestone), class: "btn btn btn-grouped" do
Edit
- if milestone.active?
- = link_to 'Close Milestone', group_milestone_route(milestone, {state_event: :close }), method: :put, class: "btn btn-grouped btn-close"
+ = link_to 'Close Milestone', milestone_path(milestone, milestone: {state_event: :close }), method: :put, class: "btn btn-grouped btn-close"
- else
- = link_to 'Reopen Milestone', group_milestone_route(milestone, {state_event: :activate }), method: :put, class: "btn btn-grouped btn-reopen"
-
- - unless is_dynamic_milestone
- = render 'shared/milestones/delete_button'
+ = link_to 'Reopen Milestone', milestone_path(milestone, milestone: {state_event: :activate }), method: :put, class: "btn btn-grouped btn-reopen"
+ = render 'shared/milestones/delete_button'
%a.btn.btn-default.btn-grouped.float-right.d-block.d-sm-none.js-sidebar-toggle{ href: "#" }
= icon('angle-double-left')
-= render 'shared/milestones/deprecation_message' if is_dynamic_milestone
-
.detail-page-description.milestone-detail
%h2.title
= markdown_field(milestone, :title)
@@ -55,29 +50,7 @@
= render_if_exists 'shared/milestones/burndown', milestone: @milestone, project: @project
-- if is_dynamic_milestone
- .table-holder
- %table.table
- %thead
- %tr
- %th Project
- %th Open issues
- %th State
- %th Due date
- %tr
- %td
- - project_name = group ? milestone.project.name : milestone.project.full_name
- = link_to project_name, milestone_path(milestone.milestone)
- %td
- = milestone.milestone.issues_visible_to_user(current_user).opened.count
- %td
- - if milestone.closed?
- Closed
- - else
- Open
- %td
- = milestone.expires_at
-- elsif milestone.group_milestone?
+- if milestone.group_milestone?
%br
View
= link_to 'Issues', issues_group_path(@group, milestone_title: milestone.title)
diff --git a/changelogs/unreleased/39545-cleanup-dynamic-milestone-pages.yml b/changelogs/unreleased/39545-cleanup-dynamic-milestone-pages.yml
new file mode 100644
index 00000000000..ba00d69cecf
--- /dev/null
+++ b/changelogs/unreleased/39545-cleanup-dynamic-milestone-pages.yml
@@ -0,0 +1,5 @@
+---
+title: Remove deprecated dashboard & group milestone pages
+merge_request: 28668
+author:
+type: removed
diff --git a/config/routes/dashboard.rb b/config/routes/dashboard.rb
index f1e8c2b9d82..7e29a36f020 100644
--- a/config/routes/dashboard.rb
+++ b/config/routes/dashboard.rb
@@ -5,13 +5,7 @@ resource :dashboard, controller: 'dashboard', only: [] do
get :activity
scope module: :dashboard do
- resources :milestones, only: [:index, :show] do
- member do
- get :merge_requests
- get :participants
- get :labels
- end
- end
+ resources :milestones, only: [:index]
resources :labels, only: [:index]
resources :groups, only: [:index]
diff --git a/config/routes/group.rb b/config/routes/group.rb
index 2cf9eb82447..6550bd991ee 100644
--- a/config/routes/group.rb
+++ b/config/routes/group.rb
@@ -45,13 +45,7 @@ constraints(::Constraints::GroupUrlConstrainer.new) do
post :toggle_subscription, on: :member
end
- resources :milestones, constraints: { id: %r{[^/]+} } do
- member do
- get :merge_requests
- get :participants
- get :labels
- end
- end
+ resources :milestones, constraints: { id: %r{[^/]+} }
resource :avatar, only: [:destroy]
diff --git a/spec/controllers/dashboard/milestones_controller_spec.rb b/spec/controllers/dashboard/milestones_controller_spec.rb
index 67939aa4e6a..5a5ff835549 100644
--- a/spec/controllers/dashboard/milestones_controller_spec.rb
+++ b/spec/controllers/dashboard/milestones_controller_spec.rb
@@ -8,12 +8,7 @@ describe Dashboard::MilestonesController do
let(:user) { create(:user) }
let(:project_milestone) { create(:milestone, project: project) }
let(:group_milestone) { create(:milestone, group: group) }
- let(:milestone) do
- DashboardMilestone.build(
- [project],
- project_milestone.title
- )
- end
+ let(:milestone) { create(:milestone, group: group) }
let(:issue) { create(:issue, project: project, milestone: project_milestone) }
let(:group_issue) { create(:issue, milestone: group_milestone, project: create(:project, group: group)) }
@@ -28,22 +23,6 @@ describe Dashboard::MilestonesController do
group.add_developer(user)
end
- it_behaves_like 'milestone tabs'
-
- describe "#show" do
- render_views
-
- def view_milestone
- get :show, params: { id: milestone.safe_title, title: milestone.title }
- end
-
- it 'shows milestone page' do
- view_milestone
-
- expect(response).to have_gitlab_http_status(200)
- end
- end
-
describe "#index" do
let(:public_group) { create(:group, :public) }
let!(:public_milestone) { create(:milestone, group: public_group) }
@@ -57,8 +36,7 @@ describe Dashboard::MilestonesController do
expect(response).to have_gitlab_http_status(200)
expect(json_response.size).to eq(2)
- expect(json_response.map { |i| i["name"] }).to match_array([group_milestone.name, project_milestone.name])
- expect(json_response.map { |i| i["group_name"] }.compact).to match_array(group.name)
+ expect(json_response.map { |i| i["title"] }).to match_array([group_milestone.title, project_milestone.title])
end
it 'returns closed group and project milestones to which the user belongs' do
diff --git a/spec/controllers/groups/milestones_controller_spec.rb b/spec/controllers/groups/milestones_controller_spec.rb
index bf164aeed38..48a77ac43c1 100644
--- a/spec/controllers/groups/milestones_controller_spec.rb
+++ b/spec/controllers/groups/milestones_controller_spec.rb
@@ -8,15 +8,7 @@ describe Groups::MilestonesController do
let!(:project2) { create(:project, group: group) }
let(:user) { create(:user) }
let(:title) { '肯定不是中文的问题' }
- let(:milestone) do
- project_milestone = create(:milestone, project: project)
-
- GroupMilestone.build(
- group,
- [project],
- project_milestone.title
- )
- end
+ let(:milestone) { create(:milestone, project: project) }
let(:milestone_path) { group_milestone_path(group, milestone.safe_title, title: milestone.title) }
let(:milestone_params) do
@@ -67,17 +59,16 @@ describe Groups::MilestonesController do
context 'as JSON' do
let!(:milestone) { create(:milestone, group: group, title: 'group milestone') }
- let!(:legacy_milestone1) { create(:milestone, project: project, title: 'legacy') }
- let!(:legacy_milestone2) { create(:milestone, project: project2, title: 'legacy') }
+ let!(:project_milestone1) { create(:milestone, project: project, title: 'same name') }
+ let!(:project_milestone2) { create(:milestone, project: project2, title: 'same name') }
- it 'lists legacy group milestones and group milestones' do
+ it 'lists project and group milestones' do
get :index, params: { group_id: group.to_param }, format: :json
milestones = json_response
- expect(milestones.count).to eq(2)
- expect(milestones.first["title"]).to eq("group milestone")
- expect(milestones.second["title"]).to eq("legacy")
+ expect(milestones.count).to eq(3)
+ expect(milestones.collect { |m| m['title'] }).to match_array(['same name', 'same name', 'group milestone'])
expect(response).to have_gitlab_http_status(200)
expect(response.content_type).to eq 'application/json'
end
@@ -91,31 +82,18 @@ describe Groups::MilestonesController do
end
describe '#show' do
- let(:milestone1) { create(:milestone, project: project, title: 'legacy') }
- let(:milestone2) { create(:milestone, project: project, title: 'legacy') }
- let(:group_milestone) { create(:milestone, group: group) }
+ render_views
- context 'when there is a title parameter' do
- it 'searches for a legacy group milestone' do
- expect(GroupMilestone).to receive(:build)
- expect(Milestone).not_to receive(:find_by_iid)
+ let!(:group_milestone) { create(:milestone, group: group) }
- get :show, params: { group_id: group.to_param, id: title, title: milestone1.safe_title }
- end
- end
+ it 'renders for a group milestone' do
+ get :show, params: { group_id: group.to_param, id: group_milestone.iid }
- context 'when there is not a title parameter' do
- it 'searches for a group milestone' do
- expect(GlobalMilestone).not_to receive(:build)
- expect(Milestone).to receive(:find_by_iid)
-
- get :show, params: { group_id: group.to_param, id: group_milestone.id }
- end
+ expect(response).to have_gitlab_http_status(200)
+ expect(response.body).to include(group_milestone.title)
end
end
- it_behaves_like 'milestone tabs'
-
describe "#create" do
it "creates group milestone with Chinese title" do
post :create,
@@ -150,34 +128,6 @@ describe Groups::MilestonesController do
expect(response).to redirect_to(group_milestone_path(group, milestone.iid))
expect(milestone.title).to eq("title changed")
end
-
- context "legacy group milestones" do
- let!(:milestone1) { create(:milestone, project: project, title: 'legacy milestone', description: "old description") }
- let!(:milestone2) { create(:milestone, project: project2, title: 'legacy milestone', description: "old description") }
-
- it "updates only group milestones state" do
- milestone_params[:title] = "title changed"
- milestone_params[:description] = "description changed"
- milestone_params[:state_event] = "close"
-
- put :update,
- params: {
- id: milestone1.title.to_slug.to_s,
- group_id: group.to_param,
- milestone: milestone_params,
- title: milestone1.title
- }
-
- expect(response).to redirect_to(group_milestone_path(group, milestone1.safe_title, title: milestone1.title))
-
- [milestone1, milestone2].each do |milestone|
- milestone.reload
- expect(milestone.title).to eq("legacy milestone")
- expect(milestone.description).to eq("old description")
- expect(milestone.state).to eq("closed")
- end
- end
- end
end
describe "#destroy" do
@@ -236,52 +186,6 @@ describe Groups::MilestonesController do
end
end
end
-
- context 'when requesting a redirected path' do
- let(:redirect_route) { group.redirect_routes.create(path: 'old-path') }
-
- it 'redirects to the canonical path' do
- get :merge_requests, params: { group_id: redirect_route.path, id: title }
-
- expect(response).to redirect_to(merge_requests_group_milestone_path(group.to_param, title))
- expect(controller).to set_flash[:notice].to(group_moved_message(redirect_route, group))
- end
-
- context 'when the old group path is a substring of the scheme or host' do
- let(:redirect_route) { group.redirect_routes.create(path: 'http') }
-
- it 'does not modify the requested host' do
- get :merge_requests, params: { group_id: redirect_route.path, id: title }
-
- expect(response).to redirect_to(merge_requests_group_milestone_path(group.to_param, title))
- expect(controller).to set_flash[:notice].to(group_moved_message(redirect_route, group))
- end
- end
-
- context 'when the old group path is substring of groups' do
- # I.e. /groups/oups should not become /grfoo/oups
- let(:redirect_route) { group.redirect_routes.create(path: 'oups') }
-
- it 'does not modify the /groups part of the path' do
- get :merge_requests, params: { group_id: redirect_route.path, id: title }
-
- expect(response).to redirect_to(merge_requests_group_milestone_path(group.to_param, title))
- expect(controller).to set_flash[:notice].to(group_moved_message(redirect_route, group))
- end
- end
-
- context 'when the old group path is substring of groups plus the new path' do
- # I.e. /groups/oups/oup should not become /grfoos
- let(:redirect_route) { group.redirect_routes.create(path: 'oups/oup') }
-
- it 'does not modify the /groups part of the path' do
- get :merge_requests, params: { group_id: redirect_route.path, id: title }
-
- expect(response).to redirect_to(merge_requests_group_milestone_path(group.to_param, title))
- expect(controller).to set_flash[:notice].to(group_moved_message(redirect_route, group))
- end
- end
- end
end
end
diff --git a/spec/features/dashboard/milestone_tabs_spec.rb b/spec/features/dashboard/milestone_tabs_spec.rb
deleted file mode 100644
index 21de7c2f06f..00000000000
--- a/spec/features/dashboard/milestone_tabs_spec.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-require 'spec_helper'
-
-describe 'Dashboard milestone tabs', :js do
- let(:user) { create(:user) }
- let(:project) { create(:project) }
- let!(:label) { create(:label, project: project) }
- let(:project_milestone) { create(:milestone, project: project) }
- let(:milestone) do
- DashboardMilestone.build(
- [project],
- project_milestone.title
- )
- end
- let!(:merge_request) { create(:labeled_merge_request, source_project: project, target_project: project, milestone: project_milestone, labels: [label]) }
-
- before do
- project.add_maintainer(user)
- sign_in(user)
-
- visit dashboard_milestone_path(milestone.safe_title, title: milestone.title)
- end
-
- it 'loads merge requests async' do
- click_link 'Merge Requests'
-
- expect(page).to have_selector('.milestone-merge_requests-list')
- end
-
- it 'loads participants async' do
- click_link 'Participants'
-
- expect(page).to have_selector('#tab-participants .bordered-list')
- end
-
- it 'loads labels async' do
- click_link 'Labels'
-
- expect(page).to have_selector('#tab-labels .bordered-list')
- end
-end
diff --git a/spec/features/groups/milestone_spec.rb b/spec/features/groups/milestone_spec.rb
index d57eb87ca77..95d947854c5 100644
--- a/spec/features/groups/milestone_spec.rb
+++ b/spec/features/groups/milestone_spec.rb
@@ -100,11 +100,9 @@ describe 'Group milestones' do
expect(find('.top-area .all .badge').text).to eq("6")
end
- it 'lists legacy group milestones and group milestones' do
- legacy_milestone = GroupMilestone.build_collection(group, group.projects, { state: 'active' }).first
-
+ it 'lists group and project milestones' do
expect(page).to have_selector("#milestone_#{active_group_milestone.id}", count: 1)
- expect(page).to have_selector("#milestone_#{legacy_milestone.milestone.id}", count: 1)
+ expect(page).to have_selector("#milestone_#{active_project_milestone2.id}", count: 1)
end
it 'shows milestone detail and supports its edit' do
@@ -124,22 +122,29 @@ describe 'Group milestones' do
expect(page).to have_content('v1.1')
expect(page).to have_content('GL-113')
expect(page).to have_link(
+ 'v1.0',
+ href: project_milestone_path(project, active_project_milestone1)
+ )
+ expect(page).to have_link(
'1 Issue',
- href: issues_group_path(group, milestone_title: 'v1.0')
+ href: project_issues_path(project, milestone_title: 'v1.0')
)
expect(page).to have_link(
'0 Merge Requests',
- href: merge_requests_group_path(group, milestone_title: 'v1.0')
+ href: project_merge_requests_path(project, milestone_title: 'v1.0')
+ )
+ expect(page).to have_link(
+ 'GL-113',
+ href: group_milestone_path(group, active_group_milestone)
+ )
+ expect(page).to have_link(
+ '0 Issues',
+ href: issues_group_path(group, milestone_title: 'GL-113')
+ )
+ expect(page).to have_link(
+ '0 Merge Requests',
+ href: merge_requests_group_path(group, milestone_title: 'GL-113')
)
- end
-
- it 'renders group milestone details' do
- click_link 'v1.0'
-
- expect(page).to have_content('expires on Aug 20, 2114')
- expect(page).to have_content('v1.0')
- expect(page).to have_content('Issues 1 Open: 1 Closed: 0')
- expect(page).to have_link(issue.title, href: project_issue_path(issue.project, issue))
end
describe 'labels' do
diff --git a/spec/features/groups/milestones_sorting_spec.rb b/spec/features/groups/milestones_sorting_spec.rb
index 7bc015ea28f..633849b3c56 100644
--- a/spec/features/groups/milestones_sorting_spec.rb
+++ b/spec/features/groups/milestones_sorting_spec.rb
@@ -22,21 +22,12 @@ describe 'Milestones sorting', :js do
# assert default sorting
within '.milestones' do
- expect(page.all('ul.content-list > li').first.text).to include('v2.0')
- expect(page.all('ul.content-list > li')[1].text).to include('v3.0')
- expect(page.all('ul.content-list > li').last.text).to include('v1.0')
+ expect(page.all('ul.content-list > li strong > a').map(&:text)).to eq(['v2.0', 'v2.0', 'v3.0', 'v1.0', 'v1.0'])
end
click_button 'Due soon'
- sort_options = find('ul.dropdown-menu-sort li').all('a').collect(&:text)
-
- expect(sort_options[0]).to eq('Due soon')
- expect(sort_options[1]).to eq('Due later')
- expect(sort_options[2]).to eq('Start soon')
- expect(sort_options[3]).to eq('Start later')
- expect(sort_options[4]).to eq('Name, ascending')
- expect(sort_options[5]).to eq('Name, descending')
+ expect(find('ul.dropdown-menu-sort li').all('a').map(&:text)).to eq(['Due soon', 'Due later', 'Start soon', 'Start later', 'Name, ascending', 'Name, descending'])
click_link 'Due later'
@@ -44,9 +35,7 @@ describe 'Milestones sorting', :js do
# assert descending sorting
within '.milestones' do
- expect(page.all('ul.content-list > li').first.text).to include('v1.0')
- expect(page.all('ul.content-list > li')[1].text).to include('v3.0')
- expect(page.all('ul.content-list > li').last.text).to include('v2.0')
+ expect(page.all('ul.content-list > li strong > a').map(&:text)).to eq(['v1.0', 'v1.0', 'v3.0', 'v2.0', 'v2.0'])
end
end
end
diff --git a/spec/features/milestone_spec.rb b/spec/features/milestone_spec.rb
index adac59b89ef..749f9a59209 100644
--- a/spec/features/milestone_spec.rb
+++ b/spec/features/milestone_spec.rb
@@ -109,20 +109,6 @@ describe 'Milestone' do
end
end
- describe 'deprecation popover', :js do
- it 'opens deprecation popover' do
- milestone = create(:milestone, project: project)
-
- visit group_milestone_path(group, milestone, title: milestone.title)
-
- expect(page).to have_selector('.milestone-deprecation-message')
-
- find('.milestone-deprecation-message .js-popover-link').click
-
- expect(page).to have_selector('.popover')
- end
- end
-
describe 'reopen closed milestones' do
before do
create(:milestone, :closed, project: project)
diff --git a/spec/models/global_milestone_spec.rb b/spec/models/global_milestone_spec.rb
deleted file mode 100644
index 9d901d01a52..00000000000
--- a/spec/models/global_milestone_spec.rb
+++ /dev/null
@@ -1,207 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-describe GlobalMilestone do
- let(:user) { create(:user) }
- let(:user2) { create(:user) }
- let(:group) { create(:group) }
- let(:project1) { create(:project, group: group) }
- let(:project2) { create(:project, path: 'gitlab-ci', group: group) }
- let(:project3) { create(:project, path: 'cookbook-gitlab', group: group) }
-
- describe '.build_collection' do
- let(:milestone1_due_date) { 2.weeks.from_now.to_date }
-
- let!(:milestone1_project1) do
- create(
- :milestone,
- title: "Milestone v1.2",
- project: project1,
- due_date: milestone1_due_date
- )
- end
-
- let!(:milestone1_project2) do
- create(
- :milestone,
- title: "Milestone v1.2",
- project: project2,
- due_date: milestone1_due_date
- )
- end
-
- let!(:milestone1_project3) do
- create(
- :milestone,
- title: "Milestone v1.2",
- project: project3,
- due_date: milestone1_due_date
- )
- end
-
- let!(:milestone2_project1) do
- create(
- :milestone,
- title: "VD-123",
- project: project1,
- due_date: nil
- )
- end
-
- let!(:milestone2_project2) do
- create(
- :milestone,
- title: "VD-123",
- project: project2,
- due_date: nil
- )
- end
-
- let!(:milestone2_project3) do
- create(
- :milestone,
- title: "VD-123",
- project: project3,
- due_date: nil
- )
- end
-
- let!(:projects) do
- [
- project1,
- project2,
- project3
- ]
- end
-
- let!(:global_milestones) { described_class.build_collection(projects, {}) }
-
- context 'when building a collection of milestones' do
- it 'has all project milestones' do
- expect(global_milestones.count).to eq(6)
- end
-
- it 'has all project milestones titles' do
- expect(global_milestones.map(&:title)).to match_array(['Milestone v1.2', 'Milestone v1.2', 'Milestone v1.2', 'VD-123', 'VD-123', 'VD-123'])
- end
-
- it 'has all project milestones' do
- expect(global_milestones.size).to eq(6)
- end
-
- it 'sorts collection by due date' do
- expect(global_milestones.map(&:due_date)).to eq [milestone1_due_date, milestone1_due_date, milestone1_due_date, nil, nil, nil]
- end
-
- it 'filters milestones by search_title when params[:search_title] is present' do
- global_milestones = described_class.build_collection(projects, { search_title: 'v1.2' })
-
- expect(global_milestones.map(&:title)).to match_array(['Milestone v1.2', 'Milestone v1.2', 'Milestone v1.2'])
- end
- end
-
- context 'when adding new milestones' do
- it 'does not add more queries' do
- control_count = ActiveRecord::QueryRecorder.new do
- described_class.build_collection(projects, {})
- end.count
-
- create_list(:milestone, 3, project: project3)
-
- expect do
- described_class.build_collection(projects, {})
- end.not_to exceed_all_query_limit(control_count)
- end
- end
- end
-
- describe '.states_count' do
- context 'when the projects have milestones' do
- before do
- create(:closed_milestone, title: 'Active Group Milestone', project: project3)
- create(:active_milestone, title: 'Active Group Milestone', project: project1)
- create(:active_milestone, title: 'Active Group Milestone', project: project2)
- create(:closed_milestone, title: 'Closed Group Milestone', project: project1)
- create(:closed_milestone, title: 'Closed Group Milestone', project: project2)
- create(:closed_milestone, title: 'Closed Group Milestone', project: project3)
- create(:closed_milestone, title: 'Closed Group Milestone 4', group: group)
- end
-
- it 'returns the quantity of global milestones and group milestones in each possible state' do
- expected_count = { opened: 2, closed: 5, all: 7 }
-
- count = described_class.states_count(Project.all, group)
-
- expect(count).to eq(expected_count)
- end
-
- it 'returns the quantity of global milestones in each possible state' do
- expected_count = { opened: 2, closed: 4, all: 6 }
-
- count = described_class.states_count(Project.all)
-
- expect(count).to eq(expected_count)
- end
- end
-
- context 'when the projects do not have milestones' do
- before do
- project1
- end
-
- it 'returns 0 as the quantity of global milestones in each state' do
- expected_count = { opened: 0, closed: 0, all: 0 }
-
- count = described_class.states_count(Project.all)
-
- expect(count).to eq(expected_count)
- end
- end
- end
-
- describe '#initialize' do
- let(:milestone1_project1) { create(:milestone, title: "Milestone v1.2", project: project1) }
- subject(:global_milestone) { described_class.new(milestone1_project1) }
-
- it 'has exactly one group milestone' do
- expect(global_milestone.title).to eq('Milestone v1.2')
- end
-
- it 'has all project milestones with the same title' do
- expect(global_milestone.milestone).to eq(milestone1_project1)
- end
- end
-
- describe '#safe_title' do
- let(:milestone) { create(:milestone, title: "git / test", project: project1) }
-
- it 'strips out slashes and spaces' do
- global_milestone = described_class.new(milestone)
-
- expect(global_milestone.safe_title).to eq('git-test')
- end
- end
-
- describe '#state' do
- context 'when at least one milestone is active' do
- it 'returns active' do
- title = 'Active Group Milestone'
-
- global_milestone = described_class.new(create(:active_milestone, title: title))
-
- expect(global_milestone.state).to eq('active')
- end
- end
-
- context 'when all milestones are closed' do
- it 'returns closed' do
- title = 'Closed Group Milestone'
-
- global_milestone = described_class.new(create(:closed_milestone, title: title))
-
- expect(global_milestone.state).to eq('closed')
- end
- end
- end
-end
diff --git a/spec/models/group_milestone_spec.rb b/spec/models/group_milestone_spec.rb
deleted file mode 100644
index 01856870fe0..00000000000
--- a/spec/models/group_milestone_spec.rb
+++ /dev/null
@@ -1,57 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-describe GroupMilestone do
- let(:group) { create(:group) }
- let(:project) { create(:project, group: group) }
- let(:project_milestone) do
- create(:milestone, title: "Milestone v1.2", project: project)
- end
-
- describe '.build' do
- it 'returns milestone with group assigned' do
- milestone = described_class.build(
- group,
- [project],
- project_milestone.title
- )
-
- expect(milestone.group).to eq group
- end
- end
-
- describe '.build_collection' do
- let(:group) { create(:group) }
- let(:project1) { create(:project, group: group) }
- let(:project2) { create(:project, path: 'gitlab-ci', group: group) }
- let(:project3) { create(:project, path: 'cookbook-gitlab', group: group) }
-
- let!(:projects) do
- [
- project1,
- project2,
- project3
- ]
- end
-
- it 'returns array of milestones, each with group assigned' do
- milestones = described_class.build_collection(group, [project], {})
- expect(milestones).to all(have_attributes(group: group))
- end
-
- context 'when adding new milestones' do
- it 'does not add more queries' do
- control_count = ActiveRecord::QueryRecorder.new do
- described_class.build_collection(group, projects, {})
- end.count
-
- create(:milestone, title: 'This title', project: project1)
-
- expect do
- described_class.build_collection(group, projects, {})
- end.not_to exceed_all_query_limit(control_count)
- end
- end
- end
-end
diff --git a/spec/support/shared_examples/milestone_tabs_examples.rb b/spec/support/shared_examples/milestone_tabs_examples.rb
index 8b757586941..d43ac12cf6b 100644
--- a/spec/support/shared_examples/milestone_tabs_examples.rb
+++ b/spec/support/shared_examples/milestone_tabs_examples.rb
@@ -1,14 +1,6 @@
shared_examples 'milestone tabs' do
def go(path, extra_params = {})
- params =
- case milestone
- when DashboardMilestone
- { id: milestone.safe_title, title: milestone.title }
- when GroupMilestone
- { group_id: group.to_param, id: milestone.safe_title, title: milestone.title }
- else
- { namespace_id: project.namespace.to_param, project_id: project, id: milestone.iid }
- end
+ params = { namespace_id: project.namespace.to_param, project_id: project, id: milestone.iid }
get path, params: params.merge(extra_params)
end
diff --git a/spec/views/shared/milestones/_top.html.haml.rb b/spec/views/shared/milestones/_top.html.haml.rb
index 516d81c87ac..045d7e6dcad 100644
--- a/spec/views/shared/milestones/_top.html.haml.rb
+++ b/spec/views/shared/milestones/_top.html.haml.rb
@@ -9,22 +9,6 @@ describe 'shared/milestones/_top.html.haml' do
allow(milestone).to receive(:milestones) { [] }
end
- it 'renders a deprecation message for a legacy milestone' do
- allow(milestone).to receive(:legacy_group_milestone?) { true }
-
- render 'shared/milestones/top', milestone: milestone
-
- expect(rendered).to have_css('.milestone-deprecation-message')
- end
-
- it 'renders a deprecation message for a dashboard milestone' do
- allow(milestone).to receive(:dashboard_milestone?) { true }
-
- render 'shared/milestones/top', milestone: milestone
-
- expect(rendered).to have_css('.milestone-deprecation-message')
- end
-
it 'does not render a deprecation message for a non-legacy and non-dashboard milestone' do
assign :group, group