From 82768cc75200e1417f3bbdcce90658ca4e78acf8 Mon Sep 17 00:00:00 2001 From: ulferts Date: Mon, 20 Apr 2026 17:47:11 +0200 Subject: [PATCH 1/7] remove sprint.rb and move agile/sprint.rb --- .../move_to_sprint_dialog_component.html.erb | 2 +- .../move_to_sprint_dialog_component.rb | 2 +- .../backlogs/sprint_header_component.rb | 2 +- .../app/contracts/sprints/base_contract.rb | 2 +- .../app/contracts/sprints/finish_contract.rb | 2 +- .../app/contracts/sprints/start_contract.rb | 2 +- .../move_between_sprints_contract.rb | 4 +- .../backlogs/backlog_controller.rb | 8 +- .../controllers/backlogs/base_controller.rb | 2 +- .../controllers/backlogs/inbox_controller.rb | 4 +- .../backlogs/sprints_controller.rb | 10 +- .../backlogs/work_packages_controller.rb | 4 +- modules/backlogs/app/models/agile/sprint.rb | 110 ------------------ .../app/models/{agile => }/backlog_bucket.rb | 0 .../queries/agile/sprints/sprint_query.rb | 38 ------ .../queries/sprints/filters/sprint_filter.rb | 4 +- .../models/queries/sprints/sprint_query.rb | 4 +- .../work_packages/filter/sprint_filter.rb | 2 +- modules/backlogs/app/models/sprint.rb | 75 +++++++++++- .../{agile => }/sprints/scopes/for_project.rb | 2 +- .../sprints/scopes/native_to_sprint_source.rb | 2 +- .../sprints/scopes/not_completed.rb | 2 +- .../sprints/scopes/order_by_date.rb | 2 +- .../sprints/scopes/receiving_projects.rb | 2 +- .../{agile => }/sprints/scopes/visible.rb | 2 +- .../app/services/sprints/create_service.rb | 2 +- .../app/services/sprints/finish_service.rb | 2 +- .../app/services/sprints/start_service.rb | 2 +- .../app/services/sprints/update_service.rb | 2 +- .../backlogs/backlog/_backlog_list.html.erb | 10 +- modules/backlogs/config/locales/en.yml | 28 ++--- ...60313164539_migrate_versions_to_sprints.rb | 2 +- .../lib/api/v3/sprints/sprint_representer.rb | 2 +- .../lib/api/v3/sprints/sprints_api.rb | 6 +- .../api/v3/sprints/sprints_by_project_api.rb | 2 +- .../lib/open_project/backlogs/engine.rb | 1 - .../resource_link_generator_patch.rb | 47 -------- .../backlogs/patches/base_contract_patch.rb | 2 +- .../backlogs/patches/project_patch.rb | 4 +- .../backlogs/patches/work_package_patch.rb | 2 +- .../backlogs/work_package_sprint_select.rb | 4 +- .../move_to_sprint_dialog_component_spec.rb | 12 +- .../backlogs/sprint_component_spec.rb | 10 +- .../backlogs/sprint_header_component_spec.rb | 12 +- .../backlogs/sprint_menu_component_spec.rb | 8 +- .../sprint_page_header_component_spec.rb | 8 +- .../backlogs/story_component_spec.rb | 4 +- .../story_menu_list_component_spec.rb | 4 +- .../contracts/sprints/create_contract_spec.rb | 2 +- .../contracts/sprints/finish_contract_spec.rb | 2 +- .../contracts/sprints/start_contract_spec.rb | 10 +- .../contracts/sprints/update_contract_spec.rb | 2 +- .../work_packages/shared_contract_examples.rb | 8 +- .../backlogs/backlog_controller_spec.rb | 2 +- .../burndown_chart_controller_spec.rb | 2 +- .../backlogs/inbox_controller_spec.rb | 12 +- .../backlogs/sprints_controller_spec.rb | 20 ++-- .../backlogs/taskboard_controller_spec.rb | 4 +- .../backlogs/work_packages_controller_spec.rb | 86 +++++++------- .../backlogs/spec/factories/sprint_factory.rb | 7 -- .../spec/features/backlogs/create_spec.rb | 6 +- .../spec/features/backlogs/edit_spec.rb | 6 +- .../features/backlogs/sprint_list_spec.rb | 2 +- .../features/backlogs/start_finish_spec.rb | 10 +- .../spec/features/burndown/show_spec.rb | 2 +- .../spec/features/inbox_column_spec.rb | 12 +- .../work_packages/create_work_package_spec.rb | 4 +- .../work_packages/drag_in_sprint_spec.rb | 4 +- .../features/work_packages/filter_spec.rb | 4 +- .../work_packages/sprints_on_wp_table_spec.rb | 10 +- .../work_packages/sprints_on_wp_view_spec.rb | 4 +- .../sprint_representer_rendering_spec.rb | 8 +- .../utilities/resource_link_generator_spec.rb | 42 ------- .../checksum_integration_spec.rb | 4 +- ...work_package_representer_rendering_spec.rb | 2 +- .../migrate_versions_to_sprints_spec.rb | 34 +++--- .../models/{agile => }/backlog_bucket_spec.rb | 0 modules/backlogs/spec/models/backlog_spec.rb | 4 +- modules/backlogs/spec/models/burndown_spec.rb | 4 +- modules/backlogs/spec/models/project_spec.rb | 2 +- .../sprints/filters/name_filter_spec.rb | 2 +- .../sprints/filters/typeahead_filter_spec.rb | 2 +- .../sprints/sprint_query_integration_spec.rb | 6 +- .../filter/sprint_filter_spec.rb | 8 +- .../spec/models/{agile => }/sprint_spec.rb | 32 ++--- .../sprints/scopes/for_project_spec.rb | 50 ++++---- .../scopes/native_to_sprint_source_spec.rb | 50 ++++---- .../sprints/scopes/receiving_projects_spec.rb | 6 +- .../sprints/scopes/visible_spec.rb | 10 +- .../backlogs/spec/models/work_package_spec.rb | 2 +- .../models/work_packages/position_spec.rb | 4 +- .../work_packages/sprint_journaling_spec.rb | 4 +- .../api/v3/sprints/index_resource_spec.rb | 6 +- .../v3/sprints/project_index_resource_spec.rb | 6 +- .../api/v3/sprints/show_resource_spec.rb | 2 +- .../v3/work_packages/create_resource_spec.rb | 6 +- .../v3/work_packages/update_resource_spec.rb | 6 +- .../spec/requests/backlogs/backlog_spec.rb | 6 +- .../requests/backlogs/burndown_chart_spec.rb | 2 +- .../spec/requests/backlogs/sprints_spec.rb | 2 +- .../spec/requests/backlogs/taskboard_spec.rb | 2 +- .../services/sprints/create_service_spec.rb | 4 +- .../services/sprints/finish_service_spec.rb | 8 +- .../sprints/set_attributes_service_spec.rb | 42 +++---- .../services/sprints/start_service_spec.rb | 8 +- ...uild_positions_service_integration_spec.rb | 6 +- ...update_service_sprint_preservation_spec.rb | 4 +- .../backlogs/spec/support/pages/backlog.rb | 4 +- .../spec/support/pages/backlog_spec.rb | 2 +- .../backlogs/burndown_chart/show_spec.rb | 10 +- ...igrate_version_sprint_journals_job_spec.rb | 4 +- .../sprint_task_board_create_service.rb | 2 +- .../sprint_task_board_create_service_spec.rb | 4 +- .../copy_service_sprint_board_spec.rb | 2 +- .../pdf_export/work_package_to_pdf_spec.rb | 2 +- 115 files changed, 463 insertions(+), 639 deletions(-) delete mode 100644 modules/backlogs/app/models/agile/sprint.rb rename modules/backlogs/app/models/{agile => }/backlog_bucket.rb (100%) delete mode 100644 modules/backlogs/app/models/queries/agile/sprints/sprint_query.rb rename modules/backlogs/app/models/{agile => }/sprints/scopes/for_project.rb (97%) rename modules/backlogs/app/models/{agile => }/sprints/scopes/native_to_sprint_source.rb (96%) rename modules/backlogs/app/models/{agile => }/sprints/scopes/not_completed.rb (96%) rename modules/backlogs/app/models/{agile => }/sprints/scopes/order_by_date.rb (97%) rename modules/backlogs/app/models/{agile => }/sprints/scopes/receiving_projects.rb (98%) rename modules/backlogs/app/models/{agile => }/sprints/scopes/visible.rb (98%) delete mode 100644 modules/backlogs/lib/open_project/backlogs/patches/api/v3/utilities/resource_link_generator_patch.rb delete mode 100644 modules/backlogs/spec/lib/api/v3/utilities/resource_link_generator_spec.rb rename modules/backlogs/spec/models/{agile => }/backlog_bucket_spec.rb (100%) rename modules/backlogs/spec/models/{agile => }/sprint_spec.rb (92%) rename modules/backlogs/spec/models/{agile => }/sprints/scopes/for_project_spec.rb (72%) rename modules/backlogs/spec/models/{agile => }/sprints/scopes/native_to_sprint_source_spec.rb (71%) rename modules/backlogs/spec/models/{agile => }/sprints/scopes/receiving_projects_spec.rb (95%) rename modules/backlogs/spec/models/{agile => }/sprints/scopes/visible_spec.rb (93%) diff --git a/modules/backlogs/app/components/backlogs/move_to_sprint_dialog_component.html.erb b/modules/backlogs/app/components/backlogs/move_to_sprint_dialog_component.html.erb index 0cae2963a3be..e97ec73c14f7 100644 --- a/modules/backlogs/app/components/backlogs/move_to_sprint_dialog_component.html.erb +++ b/modules/backlogs/app/components/backlogs/move_to_sprint_dialog_component.html.erb @@ -41,7 +41,7 @@ See COPYRIGHT and LICENSE files for more details. render( Primer::Alpha::Select.new( name: "target_id", - label: Agile::Sprint.human_model_name, + label: Sprint.human_model_name, visually_hide_label: true ) ) do |select| diff --git a/modules/backlogs/app/components/backlogs/move_to_sprint_dialog_component.rb b/modules/backlogs/app/components/backlogs/move_to_sprint_dialog_component.rb index a26ddda55b01..1ef53119ba04 100644 --- a/modules/backlogs/app/components/backlogs/move_to_sprint_dialog_component.rb +++ b/modules/backlogs/app/components/backlogs/move_to_sprint_dialog_component.rb @@ -44,7 +44,7 @@ def initialize(work_package:, project:, move_action:) @work_package = work_package @project = project @move_action = move_action - @sprints = Agile::Sprint.for_project(@project).not_completed.order_by_date + @sprints = Sprint.for_project(@project).not_completed.order_by_date @sprints = @sprints.where.not(id: work_package.sprint_id) if work_package.sprint_id end end diff --git a/modules/backlogs/app/components/backlogs/sprint_header_component.rb b/modules/backlogs/app/components/backlogs/sprint_header_component.rb index 18204575e6a1..b153e0b7c2d3 100644 --- a/modules/backlogs/app/components/backlogs/sprint_header_component.rb +++ b/modules/backlogs/app/components/backlogs/sprint_header_component.rb @@ -122,7 +122,7 @@ def start_sprint_disabled_reason end def resolved_active_sprint_ids - active_sprint_ids || Agile::Sprint.for_project(sprint.project).active.pluck(:id) + active_sprint_ids || Sprint.for_project(sprint.project).active.pluck(:id) end end end diff --git a/modules/backlogs/app/contracts/sprints/base_contract.rb b/modules/backlogs/app/contracts/sprints/base_contract.rb index 65eea61d7d77..99ad623d18b2 100644 --- a/modules/backlogs/app/contracts/sprints/base_contract.rb +++ b/modules/backlogs/app/contracts/sprints/base_contract.rb @@ -33,7 +33,7 @@ class BaseContract < ::ModelContract validate :user_authorized def self.model - Agile::Sprint + Sprint end attribute :name diff --git a/modules/backlogs/app/contracts/sprints/finish_contract.rb b/modules/backlogs/app/contracts/sprints/finish_contract.rb index 8c1be1ae537c..c68ffc27b033 100644 --- a/modules/backlogs/app/contracts/sprints/finish_contract.rb +++ b/modules/backlogs/app/contracts/sprints/finish_contract.rb @@ -35,7 +35,7 @@ class FinishContract < ModelContract validate :no_unfinished_work_packages def self.model - Agile::Sprint + Sprint end private diff --git a/modules/backlogs/app/contracts/sprints/start_contract.rb b/modules/backlogs/app/contracts/sprints/start_contract.rb index bd0fdc9ec61b..db4f89f943a2 100644 --- a/modules/backlogs/app/contracts/sprints/start_contract.rb +++ b/modules/backlogs/app/contracts/sprints/start_contract.rb @@ -67,7 +67,7 @@ def validate_dates_present def validate_no_other_active_sprint return unless model.in_planning? - return unless Agile::Sprint.where(project: model.project).active.where.not(id: model.id).exists? + return unless Sprint.where(project: model.project).active.where.not(id: model.id).exists? errors.add :status, :only_one_active_sprint_allowed end diff --git a/modules/backlogs/app/contracts/work_packages/move_between_sprints_contract.rb b/modules/backlogs/app/contracts/work_packages/move_between_sprints_contract.rb index eae3d3c5f6c7..abb22ab60dd1 100644 --- a/modules/backlogs/app/contracts/work_packages/move_between_sprints_contract.rb +++ b/modules/backlogs/app/contracts/work_packages/move_between_sprints_contract.rb @@ -41,8 +41,8 @@ class MoveBetweenSprintsContract < ModelContract private def active_sprint_in_sharer_project - unless Agile::Sprint - .native_to_sprint_source(Agile::Sprint.find_by(id: model.sprint_id_was).project) + unless Sprint + .native_to_sprint_source(Sprint.find_by(id: model.sprint_id_was).project) .in_planning .exists?(id: model.sprint_id) errors.add(:sprint, :not_eligible_for_moving) diff --git a/modules/backlogs/app/controllers/backlogs/backlog_controller.rb b/modules/backlogs/app/controllers/backlogs/backlog_controller.rb index 2de5b6ecb05c..ebc119f37c23 100644 --- a/modules/backlogs/app/controllers/backlogs/backlog_controller.rb +++ b/modules/backlogs/app/controllers/backlogs/backlog_controller.rb @@ -68,10 +68,10 @@ def load_backlogs @backlog_buckets = Agile::BacklogBucket.for_project(@project) end - @sprints = Agile::Sprint.for_project(@project) - .not_completed - .order_by_date - .includes(:project, :task_boards) + @sprints = Sprint.for_project(@project) + .not_completed + .order_by_date + .includes(:project, :task_boards) @stories_by_sprint_id = WorkPackage .where(sprint: @sprints, project: @project) diff --git a/modules/backlogs/app/controllers/backlogs/base_controller.rb b/modules/backlogs/app/controllers/backlogs/base_controller.rb index 1cb47da26a87..8e367d5c16d2 100644 --- a/modules/backlogs/app/controllers/backlogs/base_controller.rb +++ b/modules/backlogs/app/controllers/backlogs/base_controller.rb @@ -54,7 +54,7 @@ def load_sprint @sprint_id = params.delete(:sprint_id) return unless @sprint_id - @sprint = Agile::Sprint.for_project(@project).visible.find(@sprint_id) + @sprint = Sprint.for_project(@project).visible.find(@sprint_id) end end end diff --git a/modules/backlogs/app/controllers/backlogs/inbox_controller.rb b/modules/backlogs/app/controllers/backlogs/inbox_controller.rb index 8c7fab102d60..223399f8d6df 100644 --- a/modules/backlogs/app/controllers/backlogs/inbox_controller.rb +++ b/modules/backlogs/app/controllers/backlogs/inbox_controller.rb @@ -44,7 +44,7 @@ def menu end max_position = backlog_items_scope.maximum(:position) || 0 - open_sprints_exist = Agile::Sprint.for_project(@project).visible.not_completed.exists? + open_sprints_exist = Sprint.for_project(@project).visible.not_completed.exists? render(Backlogs::InboxMenuComponent.new( work_package: @work_package, @@ -115,7 +115,7 @@ def replace_inbox_component_via_turbo_stream end def replace_sprint_component_via_turbo_stream(sprint_id) - sprint = Agile::Sprint.for_project(@project).visible.find(sprint_id) + sprint = Sprint.for_project(@project).visible.find(sprint_id) replace_via_turbo_stream( component: Backlogs::SprintComponent.new(sprint:, project: @project), method: :morph diff --git a/modules/backlogs/app/controllers/backlogs/sprints_controller.rb b/modules/backlogs/app/controllers/backlogs/sprints_controller.rb index b9b60e13fe32..db2918e09594 100644 --- a/modules/backlogs/app/controllers/backlogs/sprints_controller.rb +++ b/modules/backlogs/app/controllers/backlogs/sprints_controller.rb @@ -48,7 +48,7 @@ class SprintsController < BaseController def new_dialog call = ::Sprints::SetAttributesService.new( user: current_user, - model: Agile::Sprint.new, + model: Sprint.new, contract_class: ::EmptyContract ).call(attributes: converted_sprint_params) @@ -56,14 +56,14 @@ def new_dialog end def edit_dialog - @sprint = Agile::Sprint.for_project(@project).visible.find(params[:sprint_id]) + @sprint = Sprint.for_project(@project).visible.find(params[:sprint_id]) respond_with_dialog Backlogs::NewSprintDialogComponent.new(sprint: @sprint, state: :edit) end def refresh_form id = edit_sprint_params.dig(:sprint, :id) - sprint = id.present? ? Agile::Sprint.for_project(@project).visible.find(id) : Agile::Sprint.new + sprint = id.present? ? Sprint.for_project(@project).visible.find(id) : Sprint.new call = ::Sprints::SetAttributesService.new( user: current_user, @@ -156,7 +156,7 @@ def show_finish_sprint_dialog Backlogs::FinishSprintDialogComponent.new( sprint: @sprint, project: @project, - available_sprints: Agile::Sprint.native_to_sprint_source(@project).in_planning.where.not(id: @sprint.id).order_by_date + available_sprints: Sprint.native_to_sprint_source(@project).in_planning.where.not(id: @sprint.id).order_by_date ) ) end @@ -165,7 +165,7 @@ def load_sprint_and_project load_project sprint_id = params[:sprint_id] - @sprint = Agile::Sprint.for_project(@project).visible.find(sprint_id) if sprint_id + @sprint = Sprint.for_project(@project).visible.find(sprint_id) if sprint_id end def sprint_params diff --git a/modules/backlogs/app/controllers/backlogs/work_packages_controller.rb b/modules/backlogs/app/controllers/backlogs/work_packages_controller.rb index c7157a26dfc7..37da2843ecc5 100644 --- a/modules/backlogs/app/controllers/backlogs/work_packages_controller.rb +++ b/modules/backlogs/app/controllers/backlogs/work_packages_controller.rb @@ -38,7 +38,7 @@ class WorkPackagesController < BaseController # Deferred ActionMenu items (Primer include-fragment). def menu max_position = @allowed_stories.maximum(:position) || 0 - open_sprints_exist = Agile::Sprint.for_project(@project).visible.not_completed.where.not(id: @sprint.id).exists? + open_sprints_exist = Sprint.for_project(@project).visible.not_completed.where.not(id: @sprint.id).exists? render(Backlogs::StoryMenuListComponent.new( story: @story, @@ -51,7 +51,7 @@ def menu layout: false) end - # Move a story from an Agile::Sprint to another Agile::Sprint, or the Inbox. + # Move a story from an Sprint to another Sprint, or the Inbox. def move # The update service reloads the story internally (via #move_after), # so we memoize the previous sprint_id before the call. diff --git a/modules/backlogs/app/models/agile/sprint.rb b/modules/backlogs/app/models/agile/sprint.rb deleted file mode 100644 index 0815e99d053e..000000000000 --- a/modules/backlogs/app/models/agile/sprint.rb +++ /dev/null @@ -1,110 +0,0 @@ -# frozen_string_literal: true - -#-- copyright -# OpenProject is an open source project management software. -# Copyright (C) the OpenProject GmbH -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License version 3. -# -# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: -# Copyright (C) 2006-2013 Jean-Philippe Lang -# Copyright (C) 2010-2013 the ChiliProject Team -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# See COPYRIGHT and LICENSE files for more details. -#++ - -# Intended to eventually replace the `Sprint` model from models/sprint.rb -# Namespaced for now so that the rest of the application can keep using the old model. -# Remove this namespace and the old class once all usages have been replaced. -module Agile - class Sprint < ApplicationRecord - self.table_name = "sprints" - - include ::Scopes::Scoped - - belongs_to :project - has_many :work_packages, inverse_of: :sprint, dependent: :nullify - has_many :task_boards, - as: :linked, - class_name: "Boards::Grid", - inverse_of: :linked, - dependent: :nullify - - scopes :for_project, - :not_completed, - :order_by_date, - :receiving_projects, - :visible, - :native_to_sprint_source - - enum :status, - { - in_planning: "in_planning", - active: "active", - completed: "completed" - }, - default: "in_planning", - validate: true - - validates :name, :project, presence: true - validates :start_date, :finish_date, presence: true, if: :active? - validates :finish_date, - comparison: { greater_than_or_equal_to: :start_date }, - if: :date_range_set? - - validates :status, - uniqueness: { - scope: :project_id, - conditions: -> { active }, - message: :only_one_active_sprint_allowed - }, - if: :active? - - def date_range_set? - start_date? && finish_date? - end - - def duration - return nil unless date_range_set? - - Day.working.from_range(from: start_date, to: finish_date).count - end - - def task_board_for(project) - task_boards.find { it.project_id == project.id } - end - - def work_packages_for(project) - work_packages.where(project:).order_by_position - end - - def owned_by?(project) - project_id == project.id - end - - def shared_with?(project) - self.class.for_project(project).exists?(id:) && !owned_by?(project) - end - - def visible_to?(project) - self.class.for_project(project).exists?(id:) - end - - def to_s = name - end -end diff --git a/modules/backlogs/app/models/agile/backlog_bucket.rb b/modules/backlogs/app/models/backlog_bucket.rb similarity index 100% rename from modules/backlogs/app/models/agile/backlog_bucket.rb rename to modules/backlogs/app/models/backlog_bucket.rb diff --git a/modules/backlogs/app/models/queries/agile/sprints/sprint_query.rb b/modules/backlogs/app/models/queries/agile/sprints/sprint_query.rb deleted file mode 100644 index 3ed8311a2c20..000000000000 --- a/modules/backlogs/app/models/queries/agile/sprints/sprint_query.rb +++ /dev/null @@ -1,38 +0,0 @@ -# frozen_string_literal: true - -# -- copyright -# OpenProject is an open source project management software. -# Copyright (C) the OpenProject GmbH -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License version 3. -# -# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: -# Copyright (C) 2006-2013 Jean-Philippe Lang -# Copyright (C) 2010-2013 the ChiliProject Team -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# See COPYRIGHT and LICENSE files for more details. -# ++ - -module Queries - module Agile - module Sprints - # Alias to allow auto-discovery by ParamsToQueryService for the Agile::Sprint model. - SprintQuery = ::Queries::Sprints::SprintQuery - end - end -end diff --git a/modules/backlogs/app/models/queries/sprints/filters/sprint_filter.rb b/modules/backlogs/app/models/queries/sprints/filters/sprint_filter.rb index 167d2481c2e2..b834c31a6df9 100644 --- a/modules/backlogs/app/models/queries/sprints/filters/sprint_filter.rb +++ b/modules/backlogs/app/models/queries/sprints/filters/sprint_filter.rb @@ -29,9 +29,9 @@ # ++ class Queries::Sprints::Filters::SprintFilter < Queries::Filters::Base - self.model = ::Agile::Sprint + self.model = ::Sprint def human_name - ::Agile::Sprint.human_attribute_name(name) + ::Sprint.human_attribute_name(name) end end diff --git a/modules/backlogs/app/models/queries/sprints/sprint_query.rb b/modules/backlogs/app/models/queries/sprints/sprint_query.rb index 93395b9d8ae3..8b81b35b78d0 100644 --- a/modules/backlogs/app/models/queries/sprints/sprint_query.rb +++ b/modules/backlogs/app/models/queries/sprints/sprint_query.rb @@ -35,11 +35,11 @@ class SprintQuery include ::Queries::UnpersistedQuery def self.model - ::Agile::Sprint + ::Sprint end def default_scope - ::Agile::Sprint.visible(User.current) + ::Sprint.visible(User.current) end end end diff --git a/modules/backlogs/app/models/queries/work_packages/filter/sprint_filter.rb b/modules/backlogs/app/models/queries/work_packages/filter/sprint_filter.rb index 3ba25a9ca787..f14934b4f713 100644 --- a/modules/backlogs/app/models/queries/work_packages/filter/sprint_filter.rb +++ b/modules/backlogs/app/models/queries/work_packages/filter/sprint_filter.rb @@ -73,7 +73,7 @@ def allowed? def sprints @sprints ||= begin - scope = Agile::Sprint.visible + scope = Sprint.visible project ? scope.for_project(project) : scope end end diff --git a/modules/backlogs/app/models/sprint.rb b/modules/backlogs/app/models/sprint.rb index a28e9d3c3130..aefb5c0bab9c 100644 --- a/modules/backlogs/app/models/sprint.rb +++ b/modules/backlogs/app/models/sprint.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + #-- copyright # OpenProject is an open source project management software. # Copyright (C) the OpenProject GmbH @@ -26,5 +28,76 @@ # See COPYRIGHT and LICENSE files for more details. #++ -class Sprint < Version +class Sprint < ApplicationRecord + include ::Scopes::Scoped + + belongs_to :project + has_many :work_packages, inverse_of: :sprint, dependent: :nullify + has_many :task_boards, + as: :linked, + class_name: "Boards::Grid", + inverse_of: :linked, + dependent: :nullify + + scopes :for_project, + :not_completed, + :order_by_date, + :receiving_projects, + :visible, + :native_to_sprint_source + + enum :status, + { + in_planning: "in_planning", + active: "active", + completed: "completed" + }, + default: "in_planning", + validate: true + + validates :name, :project, presence: true + validates :start_date, :finish_date, presence: true, if: :active? + validates :finish_date, + comparison: { greater_than_or_equal_to: :start_date }, + if: :date_range_set? + + validates :status, + uniqueness: { + scope: :project_id, + conditions: -> { active }, + message: :only_one_active_sprint_allowed + }, + if: :active? + + def date_range_set? + start_date? && finish_date? + end + + def duration + return nil unless date_range_set? + + Day.working.from_range(from: start_date, to: finish_date).count + end + + def task_board_for(project) + task_boards.find { it.project_id == project.id } + end + + def work_packages_for(project) + work_packages.where(project:).order_by_position + end + + def owned_by?(project) + project_id == project.id + end + + def shared_with?(project) + self.class.for_project(project).exists?(id:) && !owned_by?(project) + end + + def visible_to?(project) + self.class.for_project(project).exists?(id:) + end + + def to_s = name end diff --git a/modules/backlogs/app/models/agile/sprints/scopes/for_project.rb b/modules/backlogs/app/models/sprints/scopes/for_project.rb similarity index 97% rename from modules/backlogs/app/models/agile/sprints/scopes/for_project.rb rename to modules/backlogs/app/models/sprints/scopes/for_project.rb index 717d3cc3da3e..b8dccd653263 100644 --- a/modules/backlogs/app/models/agile/sprints/scopes/for_project.rb +++ b/modules/backlogs/app/models/sprints/scopes/for_project.rb @@ -28,7 +28,7 @@ # See COPYRIGHT and LICENSE files for more details. #++ -module Agile::Sprints::Scopes::ForProject +module Sprints::Scopes::ForProject extend ActiveSupport::Concern class_methods do diff --git a/modules/backlogs/app/models/agile/sprints/scopes/native_to_sprint_source.rb b/modules/backlogs/app/models/sprints/scopes/native_to_sprint_source.rb similarity index 96% rename from modules/backlogs/app/models/agile/sprints/scopes/native_to_sprint_source.rb rename to modules/backlogs/app/models/sprints/scopes/native_to_sprint_source.rb index 4697f29e4205..41e5d252f9c2 100644 --- a/modules/backlogs/app/models/agile/sprints/scopes/native_to_sprint_source.rb +++ b/modules/backlogs/app/models/sprints/scopes/native_to_sprint_source.rb @@ -28,7 +28,7 @@ # See COPYRIGHT and LICENSE files for more details. # ++ -module Agile::Sprints::Scopes::NativeToSprintSource +module Sprints::Scopes::NativeToSprintSource extend ActiveSupport::Concern class_methods do diff --git a/modules/backlogs/app/models/agile/sprints/scopes/not_completed.rb b/modules/backlogs/app/models/sprints/scopes/not_completed.rb similarity index 96% rename from modules/backlogs/app/models/agile/sprints/scopes/not_completed.rb rename to modules/backlogs/app/models/sprints/scopes/not_completed.rb index 2e68e7f1230e..64391c426445 100644 --- a/modules/backlogs/app/models/agile/sprints/scopes/not_completed.rb +++ b/modules/backlogs/app/models/sprints/scopes/not_completed.rb @@ -28,7 +28,7 @@ # See COPYRIGHT and LICENSE files for more details. #++ -module Agile::Sprints::Scopes::NotCompleted +module Sprints::Scopes::NotCompleted extend ActiveSupport::Concern def not_completed # rubocop:disable Naming/PredicateMethod diff --git a/modules/backlogs/app/models/agile/sprints/scopes/order_by_date.rb b/modules/backlogs/app/models/sprints/scopes/order_by_date.rb similarity index 97% rename from modules/backlogs/app/models/agile/sprints/scopes/order_by_date.rb rename to modules/backlogs/app/models/sprints/scopes/order_by_date.rb index b6aed82b9a1e..a9e50508d540 100644 --- a/modules/backlogs/app/models/agile/sprints/scopes/order_by_date.rb +++ b/modules/backlogs/app/models/sprints/scopes/order_by_date.rb @@ -28,7 +28,7 @@ # See COPYRIGHT and LICENSE files for more details. #++ -module Agile::Sprints::Scopes::OrderByDate +module Sprints::Scopes::OrderByDate extend ActiveSupport::Concern class_methods do diff --git a/modules/backlogs/app/models/agile/sprints/scopes/receiving_projects.rb b/modules/backlogs/app/models/sprints/scopes/receiving_projects.rb similarity index 98% rename from modules/backlogs/app/models/agile/sprints/scopes/receiving_projects.rb rename to modules/backlogs/app/models/sprints/scopes/receiving_projects.rb index 89054e94ddc1..8970239f728c 100644 --- a/modules/backlogs/app/models/agile/sprints/scopes/receiving_projects.rb +++ b/modules/backlogs/app/models/sprints/scopes/receiving_projects.rb @@ -28,7 +28,7 @@ # See COPYRIGHT and LICENSE files for more details. #++ -module Agile::Sprints::Scopes::ReceivingProjects +module Sprints::Scopes::ReceivingProjects extend ActiveSupport::Concern class_methods do diff --git a/modules/backlogs/app/models/agile/sprints/scopes/visible.rb b/modules/backlogs/app/models/sprints/scopes/visible.rb similarity index 98% rename from modules/backlogs/app/models/agile/sprints/scopes/visible.rb rename to modules/backlogs/app/models/sprints/scopes/visible.rb index 282f643a6a23..b441a9987218 100644 --- a/modules/backlogs/app/models/agile/sprints/scopes/visible.rb +++ b/modules/backlogs/app/models/sprints/scopes/visible.rb @@ -28,7 +28,7 @@ # See COPYRIGHT and LICENSE files for more details. #++ -module Agile::Sprints::Scopes +module Sprints::Scopes module Visible extend ActiveSupport::Concern diff --git a/modules/backlogs/app/services/sprints/create_service.rb b/modules/backlogs/app/services/sprints/create_service.rb index 0feb2e40ad2e..e5ae08d08c13 100644 --- a/modules/backlogs/app/services/sprints/create_service.rb +++ b/modules/backlogs/app/services/sprints/create_service.rb @@ -30,6 +30,6 @@ class Sprints::CreateService < BaseServices::Create def instance_class - Agile::Sprint + Sprint end end diff --git a/modules/backlogs/app/services/sprints/finish_service.rb b/modules/backlogs/app/services/sprints/finish_service.rb index e9768eb2edff..82f8bd8caae1 100644 --- a/modules/backlogs/app/services/sprints/finish_service.rb +++ b/modules/backlogs/app/services/sprints/finish_service.rb @@ -39,7 +39,7 @@ def initialize(user:, model:) def before_perform(service_call) case params[:unfinished_action] when "move_to_sprint" - @target_sprint = Agile::Sprint.find_by(id: params[:move_to_sprint_id]) + @target_sprint = Sprint.find_by(id: params[:move_to_sprint_id]) move_to_sprint(@target_sprint).each { |result| service_call.add_dependent!(result) } when "move_to_top_of_backlog" move_to_backlog(position: 1).each { |result| service_call.add_dependent!(result) } diff --git a/modules/backlogs/app/services/sprints/start_service.rb b/modules/backlogs/app/services/sprints/start_service.rb index 51d70a2da184..ed7f6a61602d 100644 --- a/modules/backlogs/app/services/sprints/start_service.rb +++ b/modules/backlogs/app/services/sprints/start_service.rb @@ -52,7 +52,7 @@ def persist(service_call) end def ensure_task_boards(service_call) - projects = Agile::Sprint.receiving_projects(model) + projects = Sprint.receiving_projects(model) projects.each do |project| next if model.task_board_for(project).present? diff --git a/modules/backlogs/app/services/sprints/update_service.rb b/modules/backlogs/app/services/sprints/update_service.rb index d6f618cc6e11..f66e804e5727 100644 --- a/modules/backlogs/app/services/sprints/update_service.rb +++ b/modules/backlogs/app/services/sprints/update_service.rb @@ -30,6 +30,6 @@ class Sprints::UpdateService < BaseServices::Update def instance_class - Agile::Sprint + Sprint end end diff --git a/modules/backlogs/app/views/backlogs/backlog/_backlog_list.html.erb b/modules/backlogs/app/views/backlogs/backlog/_backlog_list.html.erb index 7faafe82c4dd..059b727e9ea2 100644 --- a/modules/backlogs/app/views/backlogs/backlog/_backlog_list.html.erb +++ b/modules/backlogs/app/views/backlogs/backlog/_backlog_list.html.erb @@ -45,13 +45,13 @@ See COPYRIGHT and LICENSE files for more details. data-generic-drag-and-drop-target="scrollContainer"> <%= render(Primer::Beta::Subhead.new(hide_border: true, pb: 0)) do |head| - head.with_heading(tag: :h3, size: :medium, font_weight: :bold) { Agile::Sprint.human_model_name.pluralize } + head.with_heading(tag: :h3, size: :medium, font_weight: :bold) { Sprint.human_model_name.pluralize } if allow_sprint_creation?(@project) head.with_actions do render Primer::Beta::Button.new( tag: :a, - label: Agile::Sprint.human_model_name, + label: Sprint.human_model_name, href: new_dialog_project_backlogs_sprints_path(@project, all_backlogs_params), data: { controller: "async-dialog", @@ -59,7 +59,7 @@ See COPYRIGHT and LICENSE files for more details. } ) do |button| button.with_leading_visual_icon(icon: :plus) - Agile::Sprint.human_model_name + Sprint.human_model_name end end end @@ -70,7 +70,7 @@ See COPYRIGHT and LICENSE files for more details. if allow_sprint_creation?(@project) subheader.with_action_button( leading_icon: :plus, - label: Agile::Sprint.human_model_name, + label: Sprint.human_model_name, tag: :a, href: new_dialog_project_backlogs_sprints_path(@project), data: { @@ -78,7 +78,7 @@ See COPYRIGHT and LICENSE files for more details. test_selector: "op-sprints--new-sprint-button" } ) do - Agile::Sprint.human_model_name + Sprint.human_model_name end end end %> diff --git a/modules/backlogs/config/locales/en.yml b/modules/backlogs/config/locales/en.yml index a2846924746e..927f75a2262c 100644 --- a/modules/backlogs/config/locales/en.yml +++ b/modules/backlogs/config/locales/en.yml @@ -34,7 +34,9 @@ en: activerecord: attributes: - agile/sprint: + project: + sprint_sharing: "Sprint sharing" + sprint: duration: "Duration" finish_date: "Finish date" goal: "Sprint goal" @@ -44,10 +46,6 @@ en: in_planning: "In planning" active: "Active" completed: "Completed" - project: - sprint_sharing: "Sprint sharing" - sprint: - duration: "Sprint duration" user_preference: backlogs_versions_default_fold_state: "Show sprints folded" work_package: @@ -69,6 +67,15 @@ en: sprint_sharing: share_all_projects_already_taken: "cannot be set because project \"%{name}\" is already sharing with all projects." share_all_projects_already_taken_anonymous: "cannot be set because another project is already sharing with all projects." + sprint: + attributes: + base: + unfinished_work_packages: + one: "There is %{count} work package that was not completed in this sprint." + other: "There are %{count} work packages that were not completed in this sprint." + format: "%{message}" + status: + not_active: "is not active so it cannot be closed." work_package: backlog_bucket_xor_sprint: "cannot be assigned to both a sprint and a backlog bucket." attributes: @@ -82,17 +89,6 @@ en: sprint: not_shared_with_project: "is not shared with the project the work package is in." not_eligible_for_moving: "is not an active sprint in the project which holds the sprint the work package is moved out of." - agile/sprint: - attributes: - base: - unfinished_work_packages: - one: "There is %{count} work package that was not completed in this sprint." - other: "There are %{count} work packages that were not completed in this sprint." - format: "%{message}" - status: - not_active: "is not active so it cannot be closed." - sprint: - cannot_end_before_it_starts: "Sprint cannot end before it starts." models: sprint: "Sprint" diff --git a/modules/backlogs/db/migrate/20260313164539_migrate_versions_to_sprints.rb b/modules/backlogs/db/migrate/20260313164539_migrate_versions_to_sprints.rb index 626ae842efcc..67ca13575bdf 100644 --- a/modules/backlogs/db/migrate/20260313164539_migrate_versions_to_sprints.rb +++ b/modules/backlogs/db/migrate/20260313164539_migrate_versions_to_sprints.rb @@ -59,7 +59,7 @@ def sprint_versions_with_work_package_ids end def create_sprint(version) - Agile::Sprint.create!( + Sprint.create!( name: version.name, project_id: version.project_id, status: version.status == "open" ? "in_planning" : "completed", diff --git a/modules/backlogs/lib/api/v3/sprints/sprint_representer.rb b/modules/backlogs/lib/api/v3/sprints/sprint_representer.rb index 0cd185cbb6f6..d5b38400139d 100644 --- a/modules/backlogs/lib/api/v3/sprints/sprint_representer.rb +++ b/modules/backlogs/lib/api/v3/sprints/sprint_representer.rb @@ -44,7 +44,7 @@ class SprintRepresenter < ::API::Decorators::Single link :status do { href: "#{::API::V3::URN_PREFIX}sprints:status:#{represented.status}", - title: I18n.t("activerecord.attributes.agile/sprint.statuses.#{represented.status}") + title: I18n.t("activerecord.attributes.sprint.statuses.#{represented.status}") } end diff --git a/modules/backlogs/lib/api/v3/sprints/sprints_api.rb b/modules/backlogs/lib/api/v3/sprints/sprints_api.rb index cac5ab771802..807b4b08d50e 100644 --- a/modules/backlogs/lib/api/v3/sprints/sprints_api.rb +++ b/modules/backlogs/lib/api/v3/sprints/sprints_api.rb @@ -34,15 +34,15 @@ module Sprints class SprintsAPI < ::API::OpenProjectAPI resources :sprints do get &::API::V3::Utilities::Endpoints::Index - .new(model: Agile::Sprint) + .new(model: Sprint) .mount route_param :id, type: Integer, desc: "Sprint ID" do after_validation do - @sprint = Agile::Sprint.visible(current_user).find(params[:id]) + @sprint = Sprint.visible(current_user).find(params[:id]) end - get &::API::V3::Utilities::Endpoints::Show.new(model: Agile::Sprint).mount + get &::API::V3::Utilities::Endpoints::Show.new(model: Sprint).mount end end end diff --git a/modules/backlogs/lib/api/v3/sprints/sprints_by_project_api.rb b/modules/backlogs/lib/api/v3/sprints/sprints_by_project_api.rb index fe798ccc80c5..0b103bb49af4 100644 --- a/modules/backlogs/lib/api/v3/sprints/sprints_by_project_api.rb +++ b/modules/backlogs/lib/api/v3/sprints/sprints_by_project_api.rb @@ -39,7 +39,7 @@ class SprintsByProjectAPI < ::API::OpenProjectAPI get &::API::V3::Utilities::Endpoints::Index .new( - model: Agile::Sprint, + model: Sprint, scope: -> { @project.assignable_sprints } ) .mount diff --git a/modules/backlogs/lib/open_project/backlogs/engine.rb b/modules/backlogs/lib/open_project/backlogs/engine.rb index 9e72211079b7..d2e277df597d 100644 --- a/modules/backlogs/lib/open_project/backlogs/engine.rb +++ b/modules/backlogs/lib/open_project/backlogs/engine.rb @@ -140,7 +140,6 @@ def self.settings patch_with_namespace :WorkPackages, :UpdateContract patch_with_namespace :API, :V3, :WorkPackages, :EagerLoading, :Checksum patch_with_namespace :API, :V3, :WorkPackages, :Schema, :SpecificWorkPackageSchema - patch_with_namespace :API, :V3, :Utilities, :ResourceLinkGenerator config.to_prepare do next if Versions::BaseContract.include?(OpenProject::Backlogs::Patches::Versions::BaseContractPatch) diff --git a/modules/backlogs/lib/open_project/backlogs/patches/api/v3/utilities/resource_link_generator_patch.rb b/modules/backlogs/lib/open_project/backlogs/patches/api/v3/utilities/resource_link_generator_patch.rb deleted file mode 100644 index bb807597a5b5..000000000000 --- a/modules/backlogs/lib/open_project/backlogs/patches/api/v3/utilities/resource_link_generator_patch.rb +++ /dev/null @@ -1,47 +0,0 @@ -# frozen_string_literal: true - -#-- copyright -# OpenProject is an open source project management software. -# Copyright (C) the OpenProject GmbH -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License version 3. -# -# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: -# Copyright (C) 2006-2013 Jean-Philippe Lang -# Copyright (C) 2010-2013 the ChiliProject Team -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# See COPYRIGHT and LICENSE files for more details. -#++ - -module OpenProject::Backlogs::Patches::API::V3::Utilities::ResourceLinkGeneratorPatch - extend ActiveSupport::Concern - - included do - singleton_class.prepend(ClassMethods) - end - - module ClassMethods - private - - def determine_path_method(record) - return :sprint if record.is_a?(Agile::Sprint) - - super - end - end -end diff --git a/modules/backlogs/lib/open_project/backlogs/patches/base_contract_patch.rb b/modules/backlogs/lib/open_project/backlogs/patches/base_contract_patch.rb index 3d5be1e80147..2418d4e1ebbd 100644 --- a/modules/backlogs/lib/open_project/backlogs/patches/base_contract_patch.rb +++ b/modules/backlogs/lib/open_project/backlogs/patches/base_contract_patch.rb @@ -72,7 +72,7 @@ def validate_sprint_is_assignable def sprint_shared_with_project return if model.sprint.nil? || - Agile::Sprint.for_project(model.project).exists?(id: model.sprint_id) + Sprint.for_project(model.project).exists?(id: model.sprint_id) errors.add :sprint, :not_shared_with_project end diff --git a/modules/backlogs/lib/open_project/backlogs/patches/project_patch.rb b/modules/backlogs/lib/open_project/backlogs/patches/project_patch.rb index d7780f790990..40c91d916a4e 100644 --- a/modules/backlogs/lib/open_project/backlogs/patches/project_patch.rb +++ b/modules/backlogs/lib/open_project/backlogs/patches/project_patch.rb @@ -35,7 +35,7 @@ module OpenProject::Backlogs::Patches::ProjectPatch included do has_and_belongs_to_many :done_statuses, join_table: :done_statuses_for_project, class_name: "::Status" has_many :backlog_buckets, class_name: "Agile::BacklogBucket", dependent: :destroy - has_many :sprints, class_name: "Agile::Sprint", dependent: :destroy + has_many :sprints, class_name: "Sprint", dependent: :destroy end def backlogs_enabled? @@ -43,7 +43,7 @@ def backlogs_enabled? end def assignable_sprints - @assignable_sprints ||= Agile::Sprint.for_project(self).visible.not_completed + @assignable_sprints ||= Sprint.for_project(self).visible.not_completed end end diff --git a/modules/backlogs/lib/open_project/backlogs/patches/work_package_patch.rb b/modules/backlogs/lib/open_project/backlogs/patches/work_package_patch.rb index 7c36d10a703c..8221ed1588b7 100644 --- a/modules/backlogs/lib/open_project/backlogs/patches/work_package_patch.rb +++ b/modules/backlogs/lib/open_project/backlogs/patches/work_package_patch.rb @@ -44,7 +44,7 @@ module OpenProject::Backlogs::Patches::WorkPackagePatch if: -> { backlogs_enabled? } belongs_to :backlog_bucket, class_name: "Agile::BacklogBucket", optional: true - belongs_to :sprint, class_name: "Agile::Sprint", optional: true + belongs_to :sprint, optional: true include OpenProject::Backlogs::List end diff --git a/modules/backlogs/lib/open_project/backlogs/work_package_sprint_select.rb b/modules/backlogs/lib/open_project/backlogs/work_package_sprint_select.rb index 001e8b0dd930..de3ba9673e1e 100644 --- a/modules/backlogs/lib/open_project/backlogs/work_package_sprint_select.rb +++ b/modules/backlogs/lib/open_project/backlogs/work_package_sprint_select.rb @@ -98,9 +98,9 @@ def sprint_join_with_permissions def visible_sprints if @project - Agile::Sprint.for_project(@project) + Sprint.for_project(@project) else - Agile::Sprint + Sprint end .visible end diff --git a/modules/backlogs/spec/components/backlogs/move_to_sprint_dialog_component_spec.rb b/modules/backlogs/spec/components/backlogs/move_to_sprint_dialog_component_spec.rb index 78d9d3a5241a..f0682b34ab83 100644 --- a/modules/backlogs/spec/components/backlogs/move_to_sprint_dialog_component_spec.rb +++ b/modules/backlogs/spec/components/backlogs/move_to_sprint_dialog_component_spec.rb @@ -87,8 +87,8 @@ def render_component end context "when in_planning and active sprints exist" do - let!(:planning_sprint) { create(:agile_sprint, project:, name: "Planning Sprint", status: "in_planning") } - let!(:active_sprint) { create(:agile_sprint, project:, name: "Active Sprint", status: "active") } + let!(:planning_sprint) { create(:sprint, project:, name: "Planning Sprint", status: "in_planning") } + let!(:active_sprint) { create(:sprint, project:, name: "Active Sprint", status: "active") } it "lists them as select options with sprint: prefix values" do render_component @@ -99,7 +99,7 @@ def render_component end context "when a completed sprint exists" do - let!(:completed_sprint) { create(:agile_sprint, project:, name: "Old Sprint", status: "completed") } + let!(:completed_sprint) { create(:sprint, project:, name: "Old Sprint", status: "completed") } it "does not list the completed sprint" do render_component @@ -109,7 +109,7 @@ def render_component end context "when a sprint belongs to a different project" do - let!(:other_sprint) { create(:agile_sprint, project: create(:project), name: "Other Sprint") } + let!(:other_sprint) { create(:sprint, project: create(:project), name: "Other Sprint") } it "does not list sprints from other projects" do render_component @@ -119,8 +119,8 @@ def render_component end context "when the work package is already in a sprint" do - let!(:current_sprint) { create(:agile_sprint, project:, name: "Current Sprint") } - let!(:target_sprint) { create(:agile_sprint, project:, name: "Target Sprint") } + let!(:current_sprint) { create(:sprint, project:, name: "Current Sprint") } + let!(:target_sprint) { create(:sprint, project:, name: "Target Sprint") } let(:work_package) { create(:work_package, project:, sprint: current_sprint) } it "excludes that sprint from the options" do diff --git a/modules/backlogs/spec/components/backlogs/sprint_component_spec.rb b/modules/backlogs/spec/components/backlogs/sprint_component_spec.rb index a6ce97bbe5e1..b274d0573a7d 100644 --- a/modules/backlogs/spec/components/backlogs/sprint_component_spec.rb +++ b/modules/backlogs/spec/components/backlogs/sprint_component_spec.rb @@ -41,7 +41,7 @@ current_user { user } let(:project) { create(:project, types: [type_feature, type_task]) } - let(:sprint) { create(:agile_sprint, project:, name: "Sprint 1", start_date: Date.yesterday, finish_date: Date.tomorrow) } + let(:sprint) { create(:sprint, project:, name: "Sprint 1", start_date: Date.yesterday, finish_date: Date.tomorrow) } def render_component render_inline(described_class.new(sprint:, project:, current_user: user)) @@ -57,7 +57,7 @@ def render_component priority: default_priority, story_points: 5, position: 1, - sprint: sprint) + sprint:) end let!(:story2) do create(:work_package, @@ -67,7 +67,7 @@ def render_component priority: default_priority, story_points: 3, position: 2, - sprint: sprint) + sprint:) end it "renders a Primer::Beta::BorderBox" do @@ -79,7 +79,7 @@ def render_component it "has the sprint ID in the DOM id" do render_component - expect(page).to have_css(".Box#agile_sprint_#{sprint.id}") + expect(page).to have_css(".Box#sprint_#{sprint.id}") end it "renders SprintHeaderComponent in header" do @@ -91,7 +91,7 @@ def render_component it "renders a stable id on the sprint header" do render_component - expect(page).to have_element(:div, class: "Box-header", id: /\Aagile_sprint_#{sprint.id}_header\z/) + expect(page).to have_element(:div, class: "Box-header", id: /\Asprint_#{sprint.id}_header\z/) end it "renders StoryComponent for each story" do diff --git a/modules/backlogs/spec/components/backlogs/sprint_header_component_spec.rb b/modules/backlogs/spec/components/backlogs/sprint_header_component_spec.rb index e28e001ee57f..3499dc7b3bcf 100644 --- a/modules/backlogs/spec/components/backlogs/sprint_header_component_spec.rb +++ b/modules/backlogs/spec/components/backlogs/sprint_header_component_spec.rb @@ -41,7 +41,7 @@ let(:project) { create(:project, types: [type_feature, type_task]) } let(:start_date) { Date.new(2024, 1, 15) } let(:finish_date) { Date.new(2024, 1, 29) } - let(:sprint) { create(:agile_sprint, project:, name: "Sprint 1", start_date:, finish_date:) } + let(:sprint) { create(:sprint, project:, name: "Sprint 1", start_date:, finish_date:) } let(:state) { :show } let(:folded) { false } @@ -121,7 +121,7 @@ def render_component(folded: false, active_sprint_ids: nil) it "renders a stable id on the sprint menu trigger" do render_component - expect(page).to have_element(:button, id: /\Aagile_sprint_#{sprint.id}_menu-button\z/) + expect(page).to have_element(:button, id: /\Asprint_#{sprint.id}_menu-button\z/) end end @@ -142,7 +142,7 @@ def render_component(folded: false, active_sprint_ids: nil) end context "when sprint has no dates" do - let(:sprint) { build_stubbed(:agile_sprint, project:, name: "Sprint 1", start_date: nil, finish_date: nil) } + let(:sprint) { build_stubbed(:sprint, project:, name: "Sprint 1", start_date: nil, finish_date: nil) } it "renders without date range or calendar icon" do render_component @@ -170,7 +170,7 @@ def render_component(folded: false, active_sprint_ids: nil) context "when another sprint is already active" do let!(:active_sprint) do - create(:agile_sprint, project:, name: "Active Sprint", status: "active", + create(:sprint, project:, name: "Active Sprint", status: "active", start_date: Date.yesterday, finish_date: Date.tomorrow) end @@ -207,7 +207,7 @@ def render_component(folded: false, active_sprint_ids: nil) context "when the sprint is active and the user can finish it" do let(:sprint) do - create(:agile_sprint, project:, name: "Sprint 1", status: "active", + create(:sprint, project:, name: "Sprint 1", status: "active", start_date:, finish_date:) end @@ -227,7 +227,7 @@ def render_component(folded: false, active_sprint_ids: nil) context "when the sprint is completed" do let(:sprint) do - create(:agile_sprint, project:, name: "Sprint 1", status: "completed", + create(:sprint, project:, name: "Sprint 1", status: "completed", start_date:, finish_date:) end diff --git a/modules/backlogs/spec/components/backlogs/sprint_menu_component_spec.rb b/modules/backlogs/spec/components/backlogs/sprint_menu_component_spec.rb index 8cabee08346b..f858aa5a5137 100644 --- a/modules/backlogs/spec/components/backlogs/sprint_menu_component_spec.rb +++ b/modules/backlogs/spec/components/backlogs/sprint_menu_component_spec.rb @@ -35,7 +35,7 @@ shared_let(:type_task) { create(:type_task) } let(:project) { create(:project, types: [type_feature, type_task]) } - let(:sprint) { create(:agile_sprint, project:, name: "Sprint 1", start_date: Date.yesterday, finish_date: Date.tomorrow) } + let(:sprint) { create(:sprint, project:, name: "Sprint 1", start_date: Date.yesterday, finish_date: Date.tomorrow) } let(:user) { create(:user) } let(:permissions) { [] } @@ -106,7 +106,7 @@ def menu_items context "when the sprint is active and has a task board" do let(:sprint) do - create(:agile_sprint, + create(:sprint, project:, name: "Sprint 1", start_date: Date.yesterday, @@ -133,7 +133,7 @@ def menu_items context "when the sprint is completed and has a task board" do let(:sprint) do - create(:agile_sprint, + create(:sprint, project:, name: "Sprint 1", start_date: Date.yesterday, @@ -153,7 +153,7 @@ def menu_items let(:source_project) { create(:project, sprint_sharing: "share_all_projects", types: [type_feature, type_task]) } let(:project) { create(:project, sprint_sharing: "receive_shared", types: [type_feature, type_task]) } let(:sprint) do - create(:agile_sprint, + create(:sprint, project: source_project, name: "Shared Sprint", start_date: Date.yesterday, diff --git a/modules/backlogs/spec/components/backlogs/sprint_page_header_component_spec.rb b/modules/backlogs/spec/components/backlogs/sprint_page_header_component_spec.rb index e26271d4de3f..5dddfd4ca280 100644 --- a/modules/backlogs/spec/components/backlogs/sprint_page_header_component_spec.rb +++ b/modules/backlogs/spec/components/backlogs/sprint_page_header_component_spec.rb @@ -34,7 +34,7 @@ let(:project) { create(:project, name: "Test Project") } let(:start_date) { Date.new(2024, 1, 15) } let(:finish_date) { Date.new(2024, 1, 29) } - let(:sprint) { create(:agile_sprint, project:, name: "Sprint 1", start_date:, finish_date:) } + let(:sprint) { create(:sprint, project:, name: "Sprint 1", start_date:, finish_date:) } def render_component render_inline(described_class.new(sprint:, project:)) @@ -89,7 +89,7 @@ def render_component describe "date handling" do context "when sprint has only start_date" do - let(:sprint) { create(:agile_sprint, project:, name: "Sprint 1", start_date:, finish_date: nil) } + let(:sprint) { create(:sprint, project:, name: "Sprint 1", start_date:, finish_date: nil) } it "renders only start date" do render_component @@ -100,7 +100,7 @@ def render_component end context "when sprint has only finish_date" do - let(:sprint) { create(:agile_sprint, project:, name: "Sprint 1", start_date: nil, finish_date:) } + let(:sprint) { create(:sprint, project:, name: "Sprint 1", start_date: nil, finish_date:) } it "renders only finish date" do render_component @@ -111,7 +111,7 @@ def render_component end context "when sprint has no dates" do - let(:sprint) { create(:agile_sprint, project:, name: "Sprint 1", start_date: nil, finish_date: nil) } + let(:sprint) { create(:sprint, project:, name: "Sprint 1", start_date: nil, finish_date: nil) } it "renders no time elements" do render_component diff --git a/modules/backlogs/spec/components/backlogs/story_component_spec.rb b/modules/backlogs/spec/components/backlogs/story_component_spec.rb index 409d4e3c81f6..5ff5e6f69ccb 100644 --- a/modules/backlogs/spec/components/backlogs/story_component_spec.rb +++ b/modules/backlogs/spec/components/backlogs/story_component_spec.rb @@ -39,7 +39,7 @@ current_user { user } let(:project) { create(:project, types: [type_feature, type_task]) } - let(:sprint) { create(:agile_sprint, project:, name: "Sprint 1", start_date: Date.yesterday, finish_date: Date.tomorrow) } + let(:sprint) { create(:sprint, project:, name: "Sprint 1", start_date: Date.yesterday, finish_date: Date.tomorrow) } let(:story_points) { 5 } let(:story) do create(:work_package, @@ -50,7 +50,7 @@ priority: default_priority, story_points:, position: 1, - sprint: sprint) + sprint:) end let(:permissions) { %i[manage_sprint_items] } diff --git a/modules/backlogs/spec/components/backlogs/story_menu_list_component_spec.rb b/modules/backlogs/spec/components/backlogs/story_menu_list_component_spec.rb index 706857d35926..2a4f8774aef7 100644 --- a/modules/backlogs/spec/components/backlogs/story_menu_list_component_spec.rb +++ b/modules/backlogs/spec/components/backlogs/story_menu_list_component_spec.rb @@ -39,7 +39,7 @@ current_user { user } let(:project) { create(:project, types: [type_feature, type_task]) } - let(:sprint) { create(:agile_sprint, project:, name: "Sprint 1", start_date: Date.yesterday, finish_date: Date.tomorrow) } + let(:sprint) { create(:sprint, project:, name: "Sprint 1", start_date: Date.yesterday, finish_date: Date.tomorrow) } let(:position) { 2 } let(:max_position) { 3 } let(:story) do @@ -51,7 +51,7 @@ priority: default_priority, story_points: 5, position:, - sprint: sprint) + sprint:) end def render_component(position: 2, max_position: 3, open_sprints_exist: true) diff --git a/modules/backlogs/spec/contracts/sprints/create_contract_spec.rb b/modules/backlogs/spec/contracts/sprints/create_contract_spec.rb index 7cd354fb5d1e..20b4bd72aa5b 100644 --- a/modules/backlogs/spec/contracts/sprints/create_contract_spec.rb +++ b/modules/backlogs/spec/contracts/sprints/create_contract_spec.rb @@ -35,7 +35,7 @@ include_context "as sprint contract" let(:sprint) do - Agile::Sprint.new(name: sprint_name, + Sprint.new(name: sprint_name, project: sprint_project, start_date: sprint_start_date, finish_date: sprint_finish_date, diff --git a/modules/backlogs/spec/contracts/sprints/finish_contract_spec.rb b/modules/backlogs/spec/contracts/sprints/finish_contract_spec.rb index 02a73297a87b..ff453054170f 100644 --- a/modules/backlogs/spec/contracts/sprints/finish_contract_spec.rb +++ b/modules/backlogs/spec/contracts/sprints/finish_contract_spec.rb @@ -36,7 +36,7 @@ let(:project) { build_stubbed(:project) } let(:user) { build_stubbed(:user) } - let(:sprint) { build_stubbed(:agile_sprint, project:, status: sprint_status) } + let(:sprint) { build_stubbed(:sprint, project:, status: sprint_status) } let(:sprint_status) { "active" } let(:unfinished_count) { 0 } let(:permissions) { [:start_complete_sprint] } diff --git a/modules/backlogs/spec/contracts/sprints/start_contract_spec.rb b/modules/backlogs/spec/contracts/sprints/start_contract_spec.rb index 4a994b94052a..af669d35bb46 100644 --- a/modules/backlogs/spec/contracts/sprints/start_contract_spec.rb +++ b/modules/backlogs/spec/contracts/sprints/start_contract_spec.rb @@ -34,7 +34,7 @@ let(:project) { create(:project) } let(:user) { create(:user) } let(:sprint) do - create(:agile_sprint, + create(:sprint, project:, status: sprint_status) end @@ -84,7 +84,7 @@ end context "when the sprint has no start date" do - let(:sprint) { create(:agile_sprint, project:, status: sprint_status, start_date: nil) } + let(:sprint) { create(:sprint, project:, status: sprint_status, start_date: nil) } it "is invalid" do expect(contract.validate).to be(false) @@ -93,7 +93,7 @@ end context "when the sprint has no finish date" do - let(:sprint) { create(:agile_sprint, project:, status: sprint_status, finish_date: nil) } + let(:sprint) { create(:sprint, project:, status: sprint_status, finish_date: nil) } it "is invalid" do expect(contract.validate).to be(false) @@ -103,7 +103,7 @@ context "when another active sprint exists in the project" do before do - create(:agile_sprint, + create(:sprint, project:, status: "active") end @@ -116,7 +116,7 @@ context "when an active sprint exists in a different project" do before do - create(:agile_sprint, + create(:sprint, project: create(:project), status: "active") end diff --git a/modules/backlogs/spec/contracts/sprints/update_contract_spec.rb b/modules/backlogs/spec/contracts/sprints/update_contract_spec.rb index 4d25ae983118..ad9dfcd91fe3 100644 --- a/modules/backlogs/spec/contracts/sprints/update_contract_spec.rb +++ b/modules/backlogs/spec/contracts/sprints/update_contract_spec.rb @@ -35,7 +35,7 @@ include_context "as sprint contract" let(:sprint) do - build_stubbed(:agile_sprint, + build_stubbed(:sprint, name: sprint_name, project: sprint_project, start_date: sprint_start_date, diff --git a/modules/backlogs/spec/contracts/work_packages/shared_contract_examples.rb b/modules/backlogs/spec/contracts/work_packages/shared_contract_examples.rb index 7a9492ec5bf4..ab7220369b7a 100644 --- a/modules/backlogs/spec/contracts/work_packages/shared_contract_examples.rb +++ b/modules/backlogs/spec/contracts/work_packages/shared_contract_examples.rb @@ -37,7 +37,7 @@ let(:work_package_priority) { build_stubbed(:priority) } let(:work_package_author) { build_stubbed(:user) } let(:work_package_story_points) { 5 } - let(:work_package_sprint) { build_stubbed(:agile_sprint) } + let(:work_package_sprint) { build_stubbed(:sprint) } let(:work_package_position) { 5 } let(:shared_sprints) { [work_package_sprint] } let(:backlogs_enabled) { true } @@ -61,7 +61,7 @@ before do shared_sprints_scope = instance_double(ActiveRecord::Relation) - allow(Agile::Sprint) + allow(Sprint) .to receive(:for_project) .with(work_package.project) .and_return(shared_sprints_scope) @@ -126,12 +126,12 @@ end context "when sprint is completed (shared with project but not assignable)" do - let(:completed_sprint) { build_stubbed(:agile_sprint, status: :completed) } + let(:completed_sprint) { build_stubbed(:sprint, status: :completed) } let(:work_package_sprint) { completed_sprint } before do # The sprint is still shared with the project (the outer before mock makes - # `Agile::Sprint.for_project.exists?` return true), so `sprint_shared_with_project` + # `Sprint.for_project.exists?` return true), so `sprint_shared_with_project` # passes. We stub assignable_sprints to exclude it, simulating the `.not_completed` # scope, so only `validate_sprint_is_assignable` fires. allow(work_package_project).to receive(:assignable_sprints).and_return([]) diff --git a/modules/backlogs/spec/controllers/backlogs/backlog_controller_spec.rb b/modules/backlogs/spec/controllers/backlogs/backlog_controller_spec.rb index 4ec803a198db..342255da3ceb 100644 --- a/modules/backlogs/spec/controllers/backlogs/backlog_controller_spec.rb +++ b/modules/backlogs/spec/controllers/backlogs/backlog_controller_spec.rb @@ -36,7 +36,7 @@ shared_let(:user) { create(:admin) } shared_let(:project) { create(:project) } shared_let(:status) { create(:status, name: "status 1", is_default: true) } - shared_let(:sprint) { create(:agile_sprint, project:) } + shared_let(:sprint) { create(:sprint, project:) } shared_let(:backlog_bucket) { create(:backlog_bucket, project:) } shared_let(:work_package) { create(:work_package, project:, status:) } diff --git a/modules/backlogs/spec/controllers/backlogs/burndown_chart_controller_spec.rb b/modules/backlogs/spec/controllers/backlogs/burndown_chart_controller_spec.rb index d8207046564d..242dbeaff534 100644 --- a/modules/backlogs/spec/controllers/backlogs/burndown_chart_controller_spec.rb +++ b/modules/backlogs/spec/controllers/backlogs/burndown_chart_controller_spec.rb @@ -36,7 +36,7 @@ shared_let(:user) { create(:admin) } shared_let(:project) { create(:project) } shared_let(:status) { create(:status, name: "status 1", is_default: true) } - shared_let(:sprint) { create(:agile_sprint, project:) } + shared_let(:sprint) { create(:sprint, project:) } current_user { user } diff --git a/modules/backlogs/spec/controllers/backlogs/inbox_controller_spec.rb b/modules/backlogs/spec/controllers/backlogs/inbox_controller_spec.rb index 0d9f5a2cb743..68ec68333d90 100644 --- a/modules/backlogs/spec/controllers/backlogs/inbox_controller_spec.rb +++ b/modules/backlogs/spec/controllers/backlogs/inbox_controller_spec.rb @@ -140,8 +140,8 @@ end describe "PUT #move" do - let(:agile_sprint) { create(:agile_sprint, name: "Sprint 1", project:) } - let(:target_id) { "sprint:#{agile_sprint.id}" } + let(:sprint) { create(:sprint, name: "Sprint 1", project:) } + let(:target_id) { "sprint:#{sprint.id}" } let(:prev_id) { 1 } subject do @@ -155,13 +155,13 @@ format: :turbo_stream end - context "when moving to an Agile::Sprint" do + context "when moving to an Sprint" do it "replaces both the inbox and target sprint components", :aggregate_failures do expect(response).to be_successful expect(response).to have_turbo_stream action: "replace", target: "backlogs-backlogs-component-#{project.id}" expect(response).to have_turbo_stream action: "replace", - target: "backlogs-sprint-component-#{agile_sprint.id}" + target: "backlogs-sprint-component-#{sprint.id}" # Flash message is omitted here on purpose (#73600) expect(response).not_to have_turbo_stream action: "flash", target: "op-primer-flash-component" @@ -190,7 +190,7 @@ end context "when no prev_id is provided" do - let!(:work_packages) { create_list(:work_package, 5, project:, sprint: agile_sprint) } + let!(:work_packages) { create_list(:work_package, 5, project:, sprint:) } let(:prev_id) { nil } it "places the work package at the top of the sprint" do @@ -410,7 +410,7 @@ end describe "GET #move_to_sprint_dialog" do - let!(:sprint) { create(:agile_sprint, name: "Sprint 1", project:) } + let!(:sprint) { create(:sprint, name: "Sprint 1", project:) } subject do get :move_to_sprint_dialog, diff --git a/modules/backlogs/spec/controllers/backlogs/sprints_controller_spec.rb b/modules/backlogs/spec/controllers/backlogs/sprints_controller_spec.rb index a0321b723356..487a8ddc8587 100644 --- a/modules/backlogs/spec/controllers/backlogs/sprints_controller_spec.rb +++ b/modules/backlogs/spec/controllers/backlogs/sprints_controller_spec.rb @@ -67,7 +67,7 @@ end describe "GET #edit_dialog" do - let!(:sprint) { create(:agile_sprint, project:) } + let!(:sprint) { create(:sprint, project:) } it "responds with success", :aggregate_failures do get :edit_dialog, params: { project_id: project.id, sprint_id: sprint.id }, format: :turbo_stream @@ -134,7 +134,7 @@ end describe "PUT #update" do - let!(:sprint) { create(:agile_sprint, name: "Original sprint name", project:) } + let!(:sprint) { create(:sprint, name: "Original sprint name", project:) } let(:params) do { @@ -171,7 +171,7 @@ end describe "POST #start" do - let!(:sprint) { create(:agile_sprint, project:) } + let!(:sprint) { create(:sprint, project:) } let(:service_result) { ServiceResult.success(result: sprint.tap { it.status = "active" }) } let(:service) { instance_double(Sprints::StartService, call: service_result) } let(:request_params) { { project_id: project.id, sprint_id: sprint.id } } @@ -186,7 +186,7 @@ context "when the sprint is rendered in a receiving project" do let(:source_project) { create(:project, sprint_sharing: "share_all_projects") } let(:project) { create(:project, sprint_sharing: "receive_shared") } - let!(:sprint) { create(:agile_sprint, project: source_project) } + let!(:sprint) { create(:sprint, project: source_project) } let(:source_permissions) { %i[view_sprints start_complete_sprint] } let!(:board) { create(:board_grid_with_query, project:, linked: sprint) } @@ -294,7 +294,7 @@ end context "when another sprint is already active" do - let!(:active_sprint) { create(:agile_sprint, project:, status: "active") } + let!(:active_sprint) { create(:sprint, project:, status: "active") } let(:service_result) do ServiceResult.failure( result: sprint, @@ -323,7 +323,7 @@ end context "when the sprint is already active" do - let!(:sprint) { create(:agile_sprint, project:, status: "active") } + let!(:sprint) { create(:sprint, project:, status: "active") } let(:service_result) { ServiceResult.failure } it "redirects back with the default start failure message", :aggregate_failures do @@ -337,7 +337,7 @@ end describe "POST #finish" do - let!(:sprint) { create(:agile_sprint, project:, status: "active") } + let!(:sprint) { create(:sprint, project:, status: "active") } let(:request_params) { { project_id: project.id, sprint_id: sprint.id } } let(:service_result) do ServiceResult.success( @@ -356,7 +356,7 @@ context "when the sprint is rendered in a receiving project" do let(:source_project) { create(:project, sprint_sharing: "share_all_projects") } let(:project) { create(:project, sprint_sharing: "receive_shared") } - let!(:sprint) { create(:agile_sprint, project: source_project, status: "active") } + let!(:sprint) { create(:sprint, project: source_project, status: "active") } let(:source_permissions) { %i[view_sprints start_complete_sprint] } before do @@ -441,7 +441,7 @@ end context "when the sprint is already completed" do - let!(:sprint) { create(:agile_sprint, project:, status: "completed") } + let!(:sprint) { create(:sprint, project:, status: "completed") } let(:service_result) { ServiceResult.failure } it "redirects back with the default finish failure message", :aggregate_failures do @@ -511,7 +511,7 @@ end context "when refreshing the form in edit mode by passing a sprint id" do - let!(:sprint) { create(:agile_sprint, project:) } + let!(:sprint) { create(:sprint, project:) } let(:params) do { project_id: project.id, diff --git a/modules/backlogs/spec/controllers/backlogs/taskboard_controller_spec.rb b/modules/backlogs/spec/controllers/backlogs/taskboard_controller_spec.rb index 5a06903faf7b..e52b5aef8979 100644 --- a/modules/backlogs/spec/controllers/backlogs/taskboard_controller_spec.rb +++ b/modules/backlogs/spec/controllers/backlogs/taskboard_controller_spec.rb @@ -42,7 +42,7 @@ current_user { user } describe "GET show" do - let(:sprint) { create(:agile_sprint, project:) } + let(:sprint) { create(:sprint, project:) } context "when the board exists" do let!(:other_project) { create(:project) } @@ -91,7 +91,7 @@ member_with_permissions: { user => permissions }) end let(:permissions) { %i[view_sprints view_work_packages] } - let(:sprint) { create(:agile_sprint, project: source_project) } + let(:sprint) { create(:sprint, project: source_project) } before do create(:board_grid_with_query, project: source_project, linked: sprint) diff --git a/modules/backlogs/spec/controllers/backlogs/work_packages_controller_spec.rb b/modules/backlogs/spec/controllers/backlogs/work_packages_controller_spec.rb index 78da8c36ac81..e14927103090 100644 --- a/modules/backlogs/spec/controllers/backlogs/work_packages_controller_spec.rb +++ b/modules/backlogs/spec/controllers/backlogs/work_packages_controller_spec.rb @@ -39,8 +39,8 @@ let(:user) { create(:admin) } let(:project) { create(:project) } let(:status) { create(:status, name: "status 1", is_default: true) } - let(:agile_sprint) { create(:agile_sprint, name: "Agile Sprint 1", project:) } - let(:story) { create(:work_package, status:, sprint: agile_sprint, project:) } + let(:sprint) { create(:sprint, name: "Agile Sprint 1", project:) } + let(:story) { create(:work_package, status:, sprint:, project:) } describe "load_story" do subject do @@ -52,7 +52,7 @@ let(:load_story_id) { story.id } context "when the work package is in the requested sprint" do - let(:requested_sprint) { agile_sprint } + let(:requested_sprint) { sprint } it "assigns the visible work package", :aggregate_failures do subject @@ -63,7 +63,7 @@ end context "when the work package is not in the requested sprint" do - let(:requested_sprint) { create(:agile_sprint, name: "Other Sprint load_story", project:) } + let(:requested_sprint) { create(:sprint, name: "Other Sprint load_story", project:) } it { is_expected.to have_http_status :not_found } end @@ -71,15 +71,15 @@ describe "POST #reorder" do it "responds with success", :aggregate_failures do - post :reorder, params: { project_id: project.id, sprint_id: agile_sprint.id, id: story.id, direction: "highest" }, + post :reorder, params: { project_id: project.id, sprint_id: sprint.id, id: story.id, direction: "highest" }, format: :turbo_stream expect(response).to be_successful expect(response).to have_http_status :ok - expect(response).to have_turbo_stream action: "replace", target: "backlogs-sprint-component-#{agile_sprint.id}" - assert_select %(turbo-stream[action="replace"][target="backlogs-sprint-component-#{agile_sprint.id}"][method="morph"]) + expect(response).to have_turbo_stream action: "replace", target: "backlogs-sprint-component-#{sprint.id}" + assert_select %(turbo-stream[action="replace"][target="backlogs-sprint-component-#{sprint.id}"][method="morph"]) expect(assigns(:project)).to eq(project) - expect(assigns(:sprint)).to eq(agile_sprint) + expect(assigns(:sprint)).to eq(sprint) expect(assigns(:story)).to eq(story) end @@ -95,42 +95,42 @@ end it "renders an error flash with 422", :aggregate_failures do - post :reorder, params: { project_id: project.id, sprint_id: agile_sprint.id, id: story.id, direction: "highest" }, + post :reorder, params: { project_id: project.id, sprint_id: sprint.id, id: story.id, direction: "highest" }, format: :turbo_stream expect(response).to have_http_status :unprocessable_entity expect(response).to have_turbo_stream action: "flash", target: "op-primer-flash-component" - expect(response).not_to have_turbo_stream action: "replace", target: "backlogs-sprint-component-#{agile_sprint.id}" + expect(response).not_to have_turbo_stream action: "replace", target: "backlogs-sprint-component-#{sprint.id}" end end end describe "PUT #move" do - let(:story_in_agile_sprint) { create(:work_package, status:, sprint: agile_sprint, project:) } + let(:story_in_sprint) { create(:work_package, status:, sprint:, project:) } - context "with another Agile::Sprint as target" do - let(:other_agile_sprint) { create(:agile_sprint, name: "Agile Sprint 2", project:) } + context "with another Sprint as target" do + let(:other_sprint) { create(:sprint, name: "Agile Sprint 2", project:) } - it "responds with success and moves story to another Agile::Sprint", :aggregate_failures do + it "responds with success and moves story to another Sprint", :aggregate_failures do put :move, params: { project_id: project.id, - sprint_id: agile_sprint.id, - id: story_in_agile_sprint.id, - target_id: "sprint:#{other_agile_sprint.id}", + sprint_id: sprint.id, + id: story_in_sprint.id, + target_id: "sprint:#{other_sprint.id}", prev_id: nil }, format: :turbo_stream expect(response).to be_successful expect(response).to have_http_status :ok - expect(response).to have_turbo_stream action: "replace", target: "backlogs-sprint-component-#{agile_sprint.id}" - expect(response).to have_turbo_stream action: "replace", target: "backlogs-sprint-component-#{other_agile_sprint.id}" - assert_select %(turbo-stream[action="replace"][target="backlogs-sprint-component-#{agile_sprint.id}"]) - assert_select %(turbo-stream[action="replace"][target="backlogs-sprint-component-#{other_agile_sprint.id}"]) + expect(response).to have_turbo_stream action: "replace", target: "backlogs-sprint-component-#{sprint.id}" + expect(response).to have_turbo_stream action: "replace", target: "backlogs-sprint-component-#{other_sprint.id}" + assert_select %(turbo-stream[action="replace"][target="backlogs-sprint-component-#{sprint.id}"]) + assert_select %(turbo-stream[action="replace"][target="backlogs-sprint-component-#{other_sprint.id}"]) expect(response).to have_turbo_stream action: "flash", target: "op-primer-flash-component" expect(assigns(:project)).to eq(project) - expect(assigns(:sprint)).to eq(agile_sprint) - expect(assigns(:story)).to eq(story_in_agile_sprint) + expect(assigns(:sprint)).to eq(sprint) + expect(assigns(:story)).to eq(story_in_sprint) end end @@ -140,8 +140,8 @@ it "responds with success and moves story to Inbox at the given position", :aggregate_failures do put :move, params: { project_id: project.id, - sprint_id: agile_sprint.id, - id: story_in_agile_sprint.id, + sprint_id: sprint.id, + id: story_in_sprint.id, target_id: "inbox", prev_id: existing_inbox_item.id }, @@ -149,16 +149,16 @@ expect(response).to be_successful expect(response).to have_http_status :ok - expect(response).to have_turbo_stream action: "replace", target: "backlogs-sprint-component-#{agile_sprint.id}" + expect(response).to have_turbo_stream action: "replace", target: "backlogs-sprint-component-#{sprint.id}" expect(response).to have_turbo_stream action: "replace", target: "backlogs-backlogs-component-#{project.id}" - assert_select %(turbo-stream[action="replace"][target="backlogs-sprint-component-#{agile_sprint.id}"]) + assert_select %(turbo-stream[action="replace"][target="backlogs-sprint-component-#{sprint.id}"]) assert_select %(turbo-stream[action="replace"][target="backlogs-backlogs-component-#{project.id}"][method="morph"]) expect(response).to have_turbo_stream action: "flash", target: "op-primer-flash-component" expect(assigns(:project)).to eq(project) - expect(assigns(:sprint)).to eq(agile_sprint) - expect(assigns(:story)).to eq(story_in_agile_sprint) - expect(story_in_agile_sprint.reload.sprint).to be_nil - expect(story_in_agile_sprint.reload.position).to eq(2) + expect(assigns(:sprint)).to eq(sprint) + expect(assigns(:story)).to eq(story_in_sprint) + expect(story_in_sprint.reload.sprint).to be_nil + expect(story_in_sprint.reload.position).to eq(2) end context "when all=1 with an inbox over the pagination threshold" do @@ -170,8 +170,8 @@ it "replaces the inbox without a show-more row in the stream" do put :move, params: { project_id: project.id, - sprint_id: agile_sprint.id, - id: story_in_agile_sprint.id, + sprint_id: sprint.id, + id: story_in_sprint.id, target_id: "inbox", prev_id: existing_inbox_item.id, all: "1" @@ -185,7 +185,7 @@ end context "when service call fails" do - let(:other_agile_sprint) { create(:agile_sprint, name: "Agile Sprint 2", project:) } + let(:other_sprint) { create(:sprint, name: "Agile Sprint 2", project:) } let(:service_result) { ServiceResult.failure(message: "Something went wrong") } before do @@ -199,23 +199,23 @@ it "renders an error flash with 422", :aggregate_failures do put :move, params: { project_id: project.id, - sprint_id: agile_sprint.id, - id: story_in_agile_sprint.id, - target_id: "sprint:#{other_agile_sprint.id}", + sprint_id: sprint.id, + id: story_in_sprint.id, + target_id: "sprint:#{other_sprint.id}", position: 1 }, format: :turbo_stream expect(response).to have_http_status :unprocessable_entity expect(response).to have_turbo_stream action: "flash", target: "op-primer-flash-component" - expect(response).not_to have_turbo_stream action: "replace", target: "backlogs-sprint-component-#{agile_sprint.id}" + expect(response).not_to have_turbo_stream action: "replace", target: "backlogs-sprint-component-#{sprint.id}" end end end describe "GET #menu" do subject do - get :menu, params: { project_id: project.id, sprint_id: agile_sprint.id, id: story.id }, format: :html + get :menu, params: { project_id: project.id, sprint_id: sprint.id, id: story.id }, format: :html end it "returns deferred action menu list HTML", :aggregate_failures do @@ -227,7 +227,7 @@ context "when all=1 is in params" do subject do get :menu, - params: { project_id: project.id, sprint_id: agile_sprint.id, id: story.id, all: "1" }, + params: { project_id: project.id, sprint_id: sprint.id, id: story.id, all: "1" }, format: :html end @@ -238,7 +238,7 @@ end context "when another open sprint exists" do - let!(:other_open_sprint) { create(:agile_sprint, name: "Sprint 2", project:) } + let!(:other_open_sprint) { create(:sprint, name: "Sprint 2", project:) } before { allow(Backlogs::StoryMenuListComponent).to receive(:new).and_call_original } @@ -276,7 +276,7 @@ describe "GET #move_to_sprint_dialog" do subject do get :move_to_sprint_dialog, - params: { project_id: project.id, sprint_id: agile_sprint.id, id: story.id }, + params: { project_id: project.id, sprint_id: sprint.id, id: story.id }, format: :turbo_stream end @@ -291,7 +291,7 @@ context "when all=1 is in params" do subject do get :move_to_sprint_dialog, - params: { project_id: project.id, sprint_id: agile_sprint.id, id: story.id, all: "1" }, + params: { project_id: project.id, sprint_id: sprint.id, id: story.id, all: "1" }, format: :turbo_stream end diff --git a/modules/backlogs/spec/factories/sprint_factory.rb b/modules/backlogs/spec/factories/sprint_factory.rb index cec8db2817f5..026fe2540f80 100644 --- a/modules/backlogs/spec/factories/sprint_factory.rb +++ b/modules/backlogs/spec/factories/sprint_factory.rb @@ -30,13 +30,6 @@ FactoryBot.define do factory :sprint do - name { "version" } - effective_date { Date.today + 14.days } - sharing { "none" } - status { "open" } - end - - factory :agile_sprint, class: "Agile::Sprint" do sequence(:name) { |n| "Sprint #{n}" } project status { "in_planning" } diff --git a/modules/backlogs/spec/features/backlogs/create_spec.rb b/modules/backlogs/spec/features/backlogs/create_spec.rb index 4b1481d43851..6188b36a779f 100644 --- a/modules/backlogs/spec/features/backlogs/create_spec.rb +++ b/modules/backlogs/spec/features/backlogs/create_spec.rb @@ -34,7 +34,7 @@ RSpec.describe "Create", :js do shared_let(:project) { create(:project) } shared_let(:initial_sprint) do - create(:agile_sprint, + create(:sprint, project:, name: "Initial sprint", start_date: Date.new(2025, 9, 5), @@ -152,7 +152,7 @@ describe "proposed sprint names" do before do - Agile::Sprint.delete_all + Sprint.delete_all end it "prefilled with 'Sprint 1' if there are no previous sprints" do @@ -167,7 +167,7 @@ context "with a previous sprint" do before do - create(:agile_sprint, name: "Be ambitious 42", project:) + create(:sprint, name: "Be ambitious 42", project:) planning_page.visit! planning_page.open_create_sprint_dialog diff --git a/modules/backlogs/spec/features/backlogs/edit_spec.rb b/modules/backlogs/spec/features/backlogs/edit_spec.rb index c6963ee9bce6..1376abc86b00 100644 --- a/modules/backlogs/spec/features/backlogs/edit_spec.rb +++ b/modules/backlogs/spec/features/backlogs/edit_spec.rb @@ -45,7 +45,7 @@ let(:planning_page) { Pages::Backlog.new(project) } let!(:closed_sprint) do - create(:agile_sprint, + create(:sprint, project:, status: "completed", start_date: Date.new(2025, 8, 25), @@ -53,14 +53,14 @@ end let!(:first_sprint) do - create(:agile_sprint, + create(:sprint, project:, start_date: Date.new(2025, 9, 5), finish_date: Date.new(2025, 9, 15)) end let!(:second_sprint) do - create(:agile_sprint, + create(:sprint, project:, start_date: Date.new(2025, 9, 16), finish_date: Date.new(2025, 9, 26)) diff --git a/modules/backlogs/spec/features/backlogs/sprint_list_spec.rb b/modules/backlogs/spec/features/backlogs/sprint_list_spec.rb index 1fffdb7962c9..2fb25d14c7fa 100644 --- a/modules/backlogs/spec/features/backlogs/sprint_list_spec.rb +++ b/modules/backlogs/spec/features/backlogs/sprint_list_spec.rb @@ -36,7 +36,7 @@ shared_let(:other_project) { create(:project) } shared_let(:user) { create(:user, member_with_permissions: { project => %i[view_sprints view_work_packages] }) } shared_let(:sprint) do - create(:agile_sprint, project:, + create(:sprint, project:, start_date: Date.new(2025, 9, 1), finish_date: Date.new(2025, 9, 14)) end diff --git a/modules/backlogs/spec/features/backlogs/start_finish_spec.rb b/modules/backlogs/spec/features/backlogs/start_finish_spec.rb index 9290e7229cce..c0e55551438c 100644 --- a/modules/backlogs/spec/features/backlogs/start_finish_spec.rb +++ b/modules/backlogs/spec/features/backlogs/start_finish_spec.rb @@ -56,19 +56,19 @@ end let(:task_statuses) { task_type.statuses } let!(:first_sprint) do - create(:agile_sprint, + create(:sprint, project:, start_date: Date.new(2025, 9, 5), finish_date: Date.new(2025, 9, 15)) end let!(:second_sprint) do - create(:agile_sprint, + create(:sprint, project:, start_date: Date.new(2025, 9, 16), finish_date: Date.new(2025, 9, 26)) end let!(:closed_sprint) do - create(:agile_sprint, + create(:sprint, project:, status: "completed", start_date: Date.new(2025, 8, 25), @@ -126,7 +126,7 @@ context "when the sprint is active" do let!(:first_sprint) do - create(:agile_sprint, + create(:sprint, project:, status: "active", start_date: Date.new(2025, 9, 5), @@ -181,7 +181,7 @@ # because of work packages but not because they are genuinely shared, are not options to move # work packages to. let!(:sprint_from_other_project) do - create(:agile_sprint, + create(:sprint, project: create(:project), start_date: Date.new(2025, 9, 5), finish_date: Date.new(2025, 9, 15)) do |sprint| diff --git a/modules/backlogs/spec/features/burndown/show_spec.rb b/modules/backlogs/spec/features/burndown/show_spec.rb index bf1427d428fa..5575c2dd660c 100644 --- a/modules/backlogs/spec/features/burndown/show_spec.rb +++ b/modules/backlogs/spec/features/burndown/show_spec.rb @@ -35,7 +35,7 @@ include Redmine::I18n shared_let(:project) { create(:project, enabled_module_names: %w(backlogs)) } - shared_let(:sprint) { create(:agile_sprint, status: "active", project:, start_date: 1.week.ago, finish_date: 1.week.from_now) } + shared_let(:sprint) { create(:sprint, status: "active", project:, start_date: 1.week.ago, finish_date: 1.week.from_now) } let(:planning_page) { Pages::Backlog.new(project) } let(:role) do diff --git a/modules/backlogs/spec/features/inbox_column_spec.rb b/modules/backlogs/spec/features/inbox_column_spec.rb index aaf54434e7bb..e9c2caf59584 100644 --- a/modules/backlogs/spec/features/inbox_column_spec.rb +++ b/modules/backlogs/spec/features/inbox_column_spec.rb @@ -70,7 +70,7 @@ end context "when the inbox has no work packages" do - let!(:sprint) { create(:agile_sprint, name: "Sprint 1", project:) } + let!(:sprint) { create(:sprint, name: "Sprint 1", project:) } before { planning_page.visit! } @@ -183,7 +183,7 @@ types: [type], enabled_module_names: %w[work_package_tracking backlogs]) end - let!(:shared_sprint) { create(:agile_sprint, name: "Shared Sprint", project: source_project) } + let!(:shared_sprint) { create(:sprint, name: "Shared Sprint", project: source_project) } before { planning_page.visit! } @@ -195,7 +195,7 @@ end context "when a sprint is present" do - let!(:sprint) { create(:agile_sprint, name: "Sprint 1", project:) } + let!(:sprint) { create(:sprint, name: "Sprint 1", project:) } before { planning_page.visit! } @@ -206,7 +206,7 @@ end context "with work packages in the inbox" do - let!(:sprint) { create(:agile_sprint, name: "Sprint 1", project:) } + let!(:sprint) { create(:sprint, name: "Sprint 1", project:) } let!(:inbox_wp1) { create(:work_package, project:) } let!(:inbox_wp2) { create(:work_package, project:) } let!(:inbox_wp3) { create(:work_package, project:) } @@ -264,7 +264,7 @@ end describe "moving backlog items to a sprint via the 'Move to sprint' menu item" do - let!(:sprint2) { create(:agile_sprint, name: "Sprint 2", project:) } + let!(:sprint2) { create(:sprint, name: "Sprint 2", project:) } let!(:sprint_wp) { create(:work_package, project:, sprint:) } before { planning_page.visit! } @@ -418,7 +418,7 @@ end describe "retaining the 'show all' state" do - let!(:sprint) { create(:agile_sprint, name: "Sprint 1", project:) } + let!(:sprint) { create(:sprint, name: "Sprint 1", project:) } let!(:inbox_items) { create_list(:work_package, 5, project:, type:) } let!(:sprint_wp1) { create(:work_package, project:, sprint:, type:) } let!(:sprint_wp2) { create(:work_package, project:, sprint:, type:) } diff --git a/modules/backlogs/spec/features/work_packages/create_work_package_spec.rb b/modules/backlogs/spec/features/work_packages/create_work_package_spec.rb index 747507100d47..237745055e56 100644 --- a/modules/backlogs/spec/features/work_packages/create_work_package_spec.rb +++ b/modules/backlogs/spec/features/work_packages/create_work_package_spec.rb @@ -57,8 +57,8 @@ let!(:priority) { create(:default_priority) } let!(:status) { create(:default_status) } - let!(:sprint1) { create(:agile_sprint, project:) } - let!(:sprint2) { create(:agile_sprint, project:) } + let!(:sprint1) { create(:sprint, project:) } + let!(:sprint2) { create(:sprint, project:) } let!(:sprint1_wp1) { create(:work_package, sprint: sprint1, type:, project:) } let!(:sprint1_wp2) { create(:work_package, sprint: sprint1, type:, project:) } diff --git a/modules/backlogs/spec/features/work_packages/drag_in_sprint_spec.rb b/modules/backlogs/spec/features/work_packages/drag_in_sprint_spec.rb index 5e6c11855779..919bd3b48de5 100644 --- a/modules/backlogs/spec/features/work_packages/drag_in_sprint_spec.rb +++ b/modules/backlogs/spec/features/work_packages/drag_in_sprint_spec.rb @@ -55,8 +55,8 @@ let(:type) { create(:type) } - let!(:sprint1) { create(:agile_sprint, project:) } - let!(:sprint2) { create(:agile_sprint, project:) } + let!(:sprint1) { create(:sprint, project:) } + let!(:sprint2) { create(:sprint, project:) } let!(:sprint1_wp1) { create(:work_package, sprint: sprint1, type:, project:) } let!(:sprint1_wp2) { create(:work_package, sprint: sprint1, type:, project:) } diff --git a/modules/backlogs/spec/features/work_packages/filter_spec.rb b/modules/backlogs/spec/features/work_packages/filter_spec.rb index 1d018872153a..091b126c82f3 100644 --- a/modules/backlogs/spec/features/work_packages/filter_spec.rb +++ b/modules/backlogs/spec/features/work_packages/filter_spec.rb @@ -45,8 +45,8 @@ parent: work_package_with_story_type, project:) end - shared_let(:own_sprint) { create(:agile_sprint, project:) } - shared_let(:shared_sprint) { create(:agile_sprint, project: create(:project)) } + shared_let(:own_sprint) { create(:sprint, project:) } + shared_let(:shared_sprint) { create(:sprint, project: create(:project)) } shared_let(:work_package_in_own_sprint) { create(:work_package, type: task_type, project:, sprint: own_sprint) } shared_let(:work_package_in_shared_sprint) { create(:work_package, type: task_type, project:, sprint: shared_sprint) } diff --git a/modules/backlogs/spec/features/work_packages/sprints_on_wp_table_spec.rb b/modules/backlogs/spec/features/work_packages/sprints_on_wp_table_spec.rb index 79ce48eb03a1..cb1aa85481f7 100644 --- a/modules/backlogs/spec/features/work_packages/sprints_on_wp_table_spec.rb +++ b/modules/backlogs/spec/features/work_packages/sprints_on_wp_table_spec.rb @@ -36,16 +36,16 @@ let(:finish_date) { Date.new(2025, 10, 25) } let(:other_start_date) { start_date + 20.days } let(:other_finish_date) { finish_date + 20.days } - let(:sprint) { create(:agile_sprint, project:, name: "Sprint", start_date:, finish_date:) } + let(:sprint) { create(:sprint, project:, name: "Sprint", start_date:, finish_date:) } let(:other_sprint_name) { "Other sprint" } let(:other_sprint) do - create(:agile_sprint, + create(:sprint, project:, name: other_sprint_name, start_date: other_start_date, finish_date: other_finish_date) end - let(:sprint_from_other_project) { create(:agile_sprint, project: another_project, name: "Sprint from other project") } + let(:sprint_from_other_project) { create(:sprint, project: another_project, name: "Sprint from other project") } let(:project) { create(:project, name: "Project", enabled_module_names:) } let(:project_sharing) do create(:project, @@ -294,7 +294,7 @@ def visit_page! context "without being a member in a project at all" do let!(:query) { build(:global_query, user: current_user) } let!(:project_where_user_is_no_member) { create(:project) } - let!(:sprint_that_user_cannot_see) { create(:agile_sprint, project: project_where_user_is_no_member) } + let!(:sprint_that_user_cannot_see) { create(:sprint, project: project_where_user_is_no_member) } let!(:work_package_that_user_cannot_see) do create(:work_package, project: project_where_user_is_no_member, sprint: sprint_that_user_cannot_see) end @@ -315,7 +315,7 @@ def visit_page! end context "when a sprint is shared" do - let(:shared_sprint) { create(:agile_sprint, project: project_sharing, name: "Shared sprint") } + let(:shared_sprint) { create(:sprint, project: project_sharing, name: "Shared sprint") } let!(:query) { build(:global_query, user: current_user) } let!(:wp_with_shared_sprint) do create(:work_package, diff --git a/modules/backlogs/spec/features/work_packages/sprints_on_wp_view_spec.rb b/modules/backlogs/spec/features/work_packages/sprints_on_wp_view_spec.rb index b1fe96a25904..d6915f2e92df 100644 --- a/modules/backlogs/spec/features/work_packages/sprints_on_wp_view_spec.rb +++ b/modules/backlogs/spec/features/work_packages/sprints_on_wp_view_spec.rb @@ -32,8 +32,8 @@ RSpec.describe "Sprint displayed and selectable on work package view", :js do shared_let(:project) { create(:project) } - shared_let(:sprint) { create(:agile_sprint, project:) } - shared_let(:other_sprint) { create(:agile_sprint, project:) } + shared_let(:sprint) { create(:sprint, project:) } + shared_let(:other_sprint) { create(:sprint, project:) } shared_let(:work_package) { create(:work_package, project:, sprint:) } let(:permissions) { %i(view_work_packages view_sprints manage_sprint_items) } diff --git a/modules/backlogs/spec/lib/api/v3/sprints/sprint_representer_rendering_spec.rb b/modules/backlogs/spec/lib/api/v3/sprints/sprint_representer_rendering_spec.rb index 43604995db88..71d662f1e49d 100644 --- a/modules/backlogs/spec/lib/api/v3/sprints/sprint_representer_rendering_spec.rb +++ b/modules/backlogs/spec/lib/api/v3/sprints/sprint_representer_rendering_spec.rb @@ -38,7 +38,7 @@ let(:finish_date) { Date.new(2024, 1, 10) } let(:status) { "in_planning" } let(:sprint) do - build_stubbed(:agile_sprint, + build_stubbed(:sprint, project: workspace, status:, name: "Sprint 1", @@ -80,7 +80,7 @@ context "with in_planning value" do it_behaves_like "has a titled link" do let(:href) { "urn:openproject-org:api:v3:sprints:status:in_planning" } - let(:title) { I18n.t("activerecord.attributes.agile/sprint.statuses.in_planning") } + let(:title) { I18n.t("activerecord.attributes.sprint.statuses.in_planning") } end end @@ -89,7 +89,7 @@ it_behaves_like "has a titled link" do let(:href) { "urn:openproject-org:api:v3:sprints:status:active" } - let(:title) { I18n.t("activerecord.attributes.agile/sprint.statuses.active") } + let(:title) { I18n.t("activerecord.attributes.sprint.statuses.active") } end end @@ -98,7 +98,7 @@ it_behaves_like "has a titled link" do let(:href) { "urn:openproject-org:api:v3:sprints:status:completed" } - let(:title) { I18n.t("activerecord.attributes.agile/sprint.statuses.completed") } + let(:title) { I18n.t("activerecord.attributes.sprint.statuses.completed") } end end end diff --git a/modules/backlogs/spec/lib/api/v3/utilities/resource_link_generator_spec.rb b/modules/backlogs/spec/lib/api/v3/utilities/resource_link_generator_spec.rb deleted file mode 100644 index 66d05e7ff26a..000000000000 --- a/modules/backlogs/spec/lib/api/v3/utilities/resource_link_generator_spec.rb +++ /dev/null @@ -1,42 +0,0 @@ -# frozen_string_literal: true - -#-- copyright -# OpenProject is an open source project management software. -# Copyright (C) the OpenProject GmbH -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License version 3. -# -# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: -# Copyright (C) 2006-2013 Jean-Philippe Lang -# Copyright (C) 2010-2013 the ChiliProject Team -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# See COPYRIGHT and LICENSE files for more details. -#++ - -require "spec_helper" - -RSpec.describe API::V3::Utilities::ResourceLinkGenerator do - include API::V3::Utilities::PathHelper - - describe ".make_link" do - it "resolves an Agile::Sprint to the sprint API path" do - sprint = build_stubbed(:agile_sprint) - expect(described_class.make_link(sprint)).to eql api_v3_paths.sprint(sprint.id) - end - end -end diff --git a/modules/backlogs/spec/lib/api/v3/work_packages/eager_loading/checksum_integration_spec.rb b/modules/backlogs/spec/lib/api/v3/work_packages/eager_loading/checksum_integration_spec.rb index 8e066a19872f..2d13254e4cd1 100644 --- a/modules/backlogs/spec/lib/api/v3/work_packages/eager_loading/checksum_integration_spec.rb +++ b/modules/backlogs/spec/lib/api/v3/work_packages/eager_loading/checksum_integration_spec.rb @@ -33,8 +33,8 @@ RSpec.describe API::V3::WorkPackages::EagerLoading::Checksum, "integration" do shared_let(:project) { create(:project) } - shared_let(:sprint) { create(:agile_sprint, project:) } - shared_let(:other_sprint) { create(:agile_sprint, project:) } + shared_let(:sprint) { create(:sprint, project:) } + shared_let(:other_sprint) { create(:sprint, project:) } shared_let(:work_package) do create(:work_package, project:, diff --git a/modules/backlogs/spec/lib/api/v3/work_packages/work_package_representer_rendering_spec.rb b/modules/backlogs/spec/lib/api/v3/work_packages/work_package_representer_rendering_spec.rb index 4374382ebdca..b6af7bd445bf 100644 --- a/modules/backlogs/spec/lib/api/v3/work_packages/work_package_representer_rendering_spec.rb +++ b/modules/backlogs/spec/lib/api/v3/work_packages/work_package_representer_rendering_spec.rb @@ -51,7 +51,7 @@ let(:story_points) { 23 } let(:position) { 123 } - let(:sprint) { build_stubbed(:agile_sprint) } + let(:sprint) { build_stubbed(:sprint) } let(:embed_links) { true } let(:representer) do described_class.create(work_package, current_user:, embed_links:) diff --git a/modules/backlogs/spec/migrations/migrate_versions_to_sprints_spec.rb b/modules/backlogs/spec/migrations/migrate_versions_to_sprints_spec.rb index 85265db215dc..911367da7e94 100644 --- a/modules/backlogs/spec/migrations/migrate_versions_to_sprints_spec.rb +++ b/modules/backlogs/spec/migrations/migrate_versions_to_sprints_spec.rb @@ -62,12 +62,12 @@ def use_version(as:, version: self.version, project: self.project) context "when all criteria are met (used in the backlog and work package present)" do context "when version is used as a sprint (DISPLAY_LEFT)" do it "creates one sprint" do - expect { migrate }.to change(Agile::Sprint, :count).by(1) + expect { migrate }.to change(Sprint, :count).by(1) end it "copies name, start_date and finish_date" do migrate - sprint = Agile::Sprint.last + sprint = Sprint.last expect(sprint.name).to eq("Test Sprint") expect(sprint.start_date).to eq(Date.new(2026, 1, 1)) expect(sprint.finish_date).to eq(Date.new(2026, 1, 14)) @@ -78,12 +78,12 @@ def use_version(as:, version: self.version, project: self.project) let(:version_type) { :backlog } it "creates one sprint" do - expect { migrate }.to change(Agile::Sprint, :count).by(1) + expect { migrate }.to change(Sprint, :count).by(1) end it "copies name, start_date and finish_date" do migrate - sprint = Agile::Sprint.last + sprint = Sprint.last expect(sprint.name).to eq("Test Sprint") expect(sprint.start_date).to eq(Date.new(2026, 1, 1)) expect(sprint.finish_date).to eq(Date.new(2026, 1, 14)) @@ -95,7 +95,7 @@ def use_version(as:, version: self.version, project: self.project) let(:version_type) { :display_none } it "does not create a sprint" do - expect { migrate }.not_to change(Agile::Sprint, :count) + expect { migrate }.not_to change(Sprint, :count) end end @@ -103,7 +103,7 @@ def use_version(as:, version: self.version, project: self.project) let!(:wp1) { nil } it "does not create a sprint" do - expect { migrate }.not_to change(Agile::Sprint, :count) + expect { migrate }.not_to change(Sprint, :count) end end end @@ -111,8 +111,8 @@ def use_version(as:, version: self.version, project: self.project) describe "date handling" do context "when both start_date and effective_date are null" do it "creates a sprint with nil dates" do - expect { migrate }.to change(Agile::Sprint, :count).by(1) - sprint = Agile::Sprint.last + expect { migrate }.to change(Sprint, :count).by(1) + sprint = Sprint.last expect(sprint.start_date).to be_nil expect(sprint.finish_date).to be_nil end @@ -123,7 +123,7 @@ def use_version(as:, version: self.version, project: self.project) it "sets effective_date for finish_date" do migrate - sprint = Agile::Sprint.last + sprint = Sprint.last expect(sprint.start_date).to be_nil expect(sprint.finish_date).to eq(Date.new(2026, 2, 28)) end @@ -134,7 +134,7 @@ def use_version(as:, version: self.version, project: self.project) it "sets start_date for start_date" do migrate - sprint = Agile::Sprint.last + sprint = Sprint.last expect(sprint.start_date).to eq(Date.new(2026, 2, 1)) expect(sprint.finish_date).to be_nil end @@ -147,7 +147,7 @@ def use_version(as:, version: self.version, project: self.project) it "creates sprint with in_planning status" do migrate - expect(Agile::Sprint.last.status).to eq("in_planning") + expect(Sprint.last.status).to eq("in_planning") end end @@ -156,7 +156,7 @@ def use_version(as:, version: self.version, project: self.project) it "creates sprint with completed status" do migrate - expect(Agile::Sprint.last.status).to eq("completed") + expect(Sprint.last.status).to eq("completed") end end @@ -165,7 +165,7 @@ def use_version(as:, version: self.version, project: self.project) it "creates sprint with completed status" do migrate - expect(Agile::Sprint.last.status).to eq("completed") + expect(Sprint.last.status).to eq("completed") end end end @@ -175,7 +175,7 @@ def use_version(as:, version: self.version, project: self.project) it "sets sprint_id on all associated work packages" do migrate - sprint = Agile::Sprint.last + sprint = Sprint.last expect(wp1.reload.sprint_id).to eq(sprint.id) expect(wp2.reload.sprint_id).to eq(sprint.id) end @@ -194,7 +194,7 @@ def use_version(as:, version: self.version, project: self.project) it "assigns work packages to their respective sprints" do migrate - sprints = Agile::Sprint.all.index_by(&:name) + sprints = Sprint.all.index_by(&:name) expect(wp1.reload.sprint_id).to eq(sprints[version.name].id) expect(wp2.reload.sprint_id).to eq(sprints[version.name].id) expect(wp3.reload.sprint_id).to eq(sprints[version2.name].id) @@ -209,7 +209,7 @@ def use_version(as:, version: self.version, project: self.project) it "assigns work packages from both projects" do migrate - sprint = Agile::Sprint.last + sprint = Sprint.last expect(wp1.reload.sprint_id).to eq(sprint.id) expect(wp2.reload.sprint_id).to eq(sprint.id) expect(wp_in_other_project.reload.sprint_id).to eq(sprint.id) @@ -224,7 +224,7 @@ def use_version(as:, version: self.version, project: self.project) it "only assigns work packages from the sprint project" do migrate - sprint = Agile::Sprint.last + sprint = Sprint.last expect(wp1.reload.sprint_id).to eq(sprint.id) expect(wp2.reload.sprint_id).to eq(sprint.id) expect(wp_in_other_project.reload.sprint_id).to be_nil diff --git a/modules/backlogs/spec/models/agile/backlog_bucket_spec.rb b/modules/backlogs/spec/models/backlog_bucket_spec.rb similarity index 100% rename from modules/backlogs/spec/models/agile/backlog_bucket_spec.rb rename to modules/backlogs/spec/models/backlog_bucket_spec.rb diff --git a/modules/backlogs/spec/models/backlog_spec.rb b/modules/backlogs/spec/models/backlog_spec.rb index 7ff38a76ad8b..9e65d6b1b423 100644 --- a/modules/backlogs/spec/models/backlog_spec.rb +++ b/modules/backlogs/spec/models/backlog_spec.rb @@ -40,7 +40,7 @@ let(:project) { create(:project) } let(:open_status) { create(:status, is_closed: false) } let(:closed_status) { create(:status, is_closed: true) } - let(:agile_sprint) { create(:agile_sprint, project:) } + let(:sprint) { create(:sprint, project:) } before { login_as create(:admin) } @@ -49,7 +49,7 @@ it "returns work packages with no sprint assigned and open status" do inbox_wp = create(:work_package, project:, status: open_status) create(:work_package, project:, status: closed_status) - create(:work_package, project:, status: open_status, sprint: agile_sprint) + create(:work_package, project:, status: open_status, sprint:) expect(inbox).to contain_exactly(inbox_wp) end diff --git a/modules/backlogs/spec/models/burndown_spec.rb b/modules/backlogs/spec/models/burndown_spec.rb index 48b7eca804fe..ad7eaaac5a80 100644 --- a/modules/backlogs/spec/models/burndown_spec.rb +++ b/modules/backlogs/spec/models/burndown_spec.rb @@ -61,7 +61,7 @@ def set_attribute_journalized(story, attribute, value, day) subject(:burndown) { described_class.new(sprint, project) } describe "for an agile sprint" do - let(:sprint) { create(:agile_sprint, project:) } + let(:sprint) { create(:sprint, project:) } describe "WITH the today date fixed to April 4th, 2011 and having a 10 (working days) sprint" do around do |example| @@ -191,7 +191,7 @@ def set_attribute_journalized(story, attribute, value, day) end context "without dates on the sprint" do - let(:sprint) { create(:agile_sprint, project:, start_date: nil, finish_date: nil) } + let(:sprint) { create(:sprint, project:, start_date: nil, finish_date: nil) } let(:story) do build(:story, :created_in_past, diff --git a/modules/backlogs/spec/models/project_spec.rb b/modules/backlogs/spec/models/project_spec.rb index afc36e4dade6..1bd800f101dd 100644 --- a/modules/backlogs/spec/models/project_spec.rb +++ b/modules/backlogs/spec/models/project_spec.rb @@ -33,6 +33,6 @@ RSpec.describe Project do describe "associations" do it { is_expected.to have_many(:backlog_buckets).class_name("Agile::BacklogBucket").dependent(:destroy) } - it { is_expected.to have_many(:sprints).class_name("Agile::Sprint").dependent(:destroy) } + it { is_expected.to have_many(:sprints).class_name("Sprint").dependent(:destroy) } end end diff --git a/modules/backlogs/spec/models/queries/sprints/filters/name_filter_spec.rb b/modules/backlogs/spec/models/queries/sprints/filters/name_filter_spec.rb index 77c90ba54376..b78fed03b910 100644 --- a/modules/backlogs/spec/models/queries/sprints/filters/name_filter_spec.rb +++ b/modules/backlogs/spec/models/queries/sprints/filters/name_filter_spec.rb @@ -35,7 +35,7 @@ let(:class_key) { :name } let(:human_name) { I18n.t(:label_name) } let(:type) { :string } - let(:model) { Agile::Sprint } + let(:model) { Sprint } describe "#allowed_values" do it "is nil" do diff --git a/modules/backlogs/spec/models/queries/sprints/filters/typeahead_filter_spec.rb b/modules/backlogs/spec/models/queries/sprints/filters/typeahead_filter_spec.rb index 0f9219238ba8..b874bb6ce0c8 100644 --- a/modules/backlogs/spec/models/queries/sprints/filters/typeahead_filter_spec.rb +++ b/modules/backlogs/spec/models/queries/sprints/filters/typeahead_filter_spec.rb @@ -35,6 +35,6 @@ let(:class_key) { :typeahead } let(:human_name) { I18n.t(:label_search) } let(:type) { :search } - let(:model) { Agile::Sprint } + let(:model) { Sprint } end end diff --git a/modules/backlogs/spec/models/queries/sprints/sprint_query_integration_spec.rb b/modules/backlogs/spec/models/queries/sprints/sprint_query_integration_spec.rb index cfdb3d46890e..6e1de23c81ab 100644 --- a/modules/backlogs/spec/models/queries/sprints/sprint_query_integration_spec.rb +++ b/modules/backlogs/spec/models/queries/sprints/sprint_query_integration_spec.rb @@ -34,9 +34,9 @@ shared_let(:project) { create(:project, public: false) } shared_let(:other_project) { create(:project, public: false) } shared_let(:project_without_permission) { create(:project, public: false) } - shared_let(:sprint) { create(:agile_sprint, project:, name: "Alpha Sprint") } - shared_let(:other_sprint) { create(:agile_sprint, project: other_project, name: "Beta Sprint") } - shared_let(:sprint_without_permission) { create(:agile_sprint, project: project_without_permission) } + shared_let(:sprint) { create(:sprint, project:, name: "Alpha Sprint") } + shared_let(:other_sprint) { create(:sprint, project: other_project, name: "Beta Sprint") } + shared_let(:sprint_without_permission) { create(:sprint, project: project_without_permission) } let(:instance) { described_class.new } let(:permissions) { %i[view_sprints] } diff --git a/modules/backlogs/spec/models/queries/work_packages/filter/sprint_filter_spec.rb b/modules/backlogs/spec/models/queries/work_packages/filter/sprint_filter_spec.rb index 7005e1d4d3a5..9c64040740e4 100644 --- a/modules/backlogs/spec/models/queries/work_packages/filter/sprint_filter_spec.rb +++ b/modules/backlogs/spec/models/queries/work_packages/filter/sprint_filter_spec.rb @@ -38,7 +38,7 @@ def for_project(_project); end def pluck(*_args); end end end - let(:sprint) { build_stubbed(:agile_sprint) } + let(:sprint) { build_stubbed(:sprint) } it_behaves_like "basic query filter" do let(:type) { :list_optional } @@ -53,7 +53,7 @@ def pluck(*_args); end current_user { build_stubbed(:user) } before do - allow(Agile::Sprint) + allow(Sprint) .to receive(:visible) .and_return(visible_scope) @@ -126,8 +126,8 @@ def pluck(*_args); end end describe "#value_objects" do - let(:sprint1) { build_stubbed(:agile_sprint) } - let(:sprint2) { build_stubbed(:agile_sprint) } + let(:sprint1) { build_stubbed(:sprint) } + let(:sprint2) { build_stubbed(:sprint) } before do allow(visible_scope) diff --git a/modules/backlogs/spec/models/agile/sprint_spec.rb b/modules/backlogs/spec/models/sprint_spec.rb similarity index 92% rename from modules/backlogs/spec/models/agile/sprint_spec.rb rename to modules/backlogs/spec/models/sprint_spec.rb index 4fa907fc657b..0839b9c39ffd 100644 --- a/modules/backlogs/spec/models/agile/sprint_spec.rb +++ b/modules/backlogs/spec/models/sprint_spec.rb @@ -30,7 +30,7 @@ require "spec_helper" -RSpec.describe Agile::Sprint do +RSpec.describe Sprint do let(:project) { create(:project) } let(:sprint_status) { "in_planning" } @@ -91,14 +91,14 @@ end it "prevents multiple active sprints in the same project" do - create(:agile_sprint, project:, status: "active") + create(:sprint, project:, status: "active") expect(sprint).not_to be_valid expect(sprint.errors[:status]).to include("only one active sprint is allowed per project.") end it "allows multiple active sprints in different projects" do other_project = create(:project) - create(:agile_sprint, project: other_project, status: "active") + create(:sprint, project: other_project, status: "active") expect(sprint).to be_valid end @@ -109,8 +109,8 @@ end it "allows multiple non-active sprints in the same project" do - create(:agile_sprint, project:, status: "completed") - create(:agile_sprint, project:, status: "in_planning") + create(:sprint, project:, status: "completed") + create(:sprint, project:, status: "in_planning") sprint.status = "in_planning" expect(sprint).to be_valid end @@ -134,7 +134,7 @@ end describe "#task_board_for" do - let(:sprint) { create(:agile_sprint, project:) } + let(:sprint) { create(:sprint, project:) } let(:other_project) { create(:project) } context "when a sprint task board exists" do @@ -182,7 +182,7 @@ end describe "work_package association" do - let(:sprint) { create(:agile_sprint, project:) } + let(:sprint) { create(:sprint, project:) } let(:work_package) { create(:work_package, project:, sprint:) } it "can have work packages associated" do @@ -197,7 +197,7 @@ end describe "#work_packages_for" do - let(:sprint) { create(:agile_sprint, project:) } + let(:sprint) { create(:sprint, project:) } let(:other_project) { create(:project) } let!(:wp1) { create(:work_package, project:, sprint:) } let!(:wp2) { create(:work_package, project:, sprint:) } @@ -240,7 +240,7 @@ end describe "#owned_by?" do - let(:sprint) { create(:agile_sprint, project:) } + let(:sprint) { create(:sprint, project:) } let(:other_project) { create(:project) } it "returns true when the sprint belongs to the given project" do @@ -253,7 +253,7 @@ end describe "#shared_with?" do - let(:sprint) { create(:agile_sprint, project:) } + let(:sprint) { create(:sprint, project:) } let(:receiver_project) { create(:project, sprint_sharing: "receive_shared") } let(:other_project) { create(:project, sprint_sharing: "no_sharing") } @@ -282,7 +282,7 @@ context "with subproject sharing" do let(:parent_project) { create(:project, sprint_sharing: "share_subprojects") } let(:child_project) { create(:project, parent: parent_project, sprint_sharing: "receive_shared") } - let(:parent_sprint) { create(:agile_sprint, project: parent_project) } + let(:parent_sprint) { create(:sprint, project: parent_project) } it "returns true when sprint is shared from parent to child" do expect(parent_sprint.shared_with?(child_project)).to be true @@ -294,7 +294,7 @@ end context "with work package assignment to unrelated project" do - let(:unrelated_sprint) { create(:agile_sprint, project: other_project) } + let(:unrelated_sprint) { create(:sprint, project: other_project) } before do create(:work_package, project:, sprint: unrelated_sprint) @@ -307,7 +307,7 @@ end describe "#visible_to?" do - let(:sprint) { create(:agile_sprint, project:) } + let(:sprint) { create(:sprint, project:) } let(:receiver_project) { create(:project, sprint_sharing: "receive_shared") } let(:other_project) { create(:project, sprint_sharing: "no_sharing") } @@ -335,7 +335,7 @@ context "with global sharing" do let(:global_sharer) { create(:project, sprint_sharing: "share_all_projects") } - let(:global_sprint) { create(:agile_sprint, project: global_sharer) } + let(:global_sprint) { create(:sprint, project: global_sharer) } it "returns true for projects that receive shared sprints" do expect(global_sprint.visible_to?(receiver_project)).to be true @@ -354,7 +354,7 @@ let(:parent_project) { create(:project, sprint_sharing: "share_subprojects") } let(:child_project) { create(:project, parent: parent_project, sprint_sharing: "receive_shared") } let(:grandchild_project) { create(:project, parent: child_project, sprint_sharing: "receive_shared") } - let(:parent_sprint) { create(:agile_sprint, project: parent_project) } + let(:parent_sprint) { create(:sprint, project: parent_project) } it "returns true for direct child receiving shared sprints" do expect(parent_sprint.visible_to?(child_project)).to be true @@ -371,7 +371,7 @@ context "with work package assignment" do let(:unrelated_project) { create(:project, sprint_sharing: "no_sharing") } - let(:unrelated_sprint) { create(:agile_sprint, project: unrelated_project) } + let(:unrelated_sprint) { create(:sprint, project: unrelated_project) } before do create(:work_package, project:, sprint: unrelated_sprint) diff --git a/modules/backlogs/spec/models/agile/sprints/scopes/for_project_spec.rb b/modules/backlogs/spec/models/sprints/scopes/for_project_spec.rb similarity index 72% rename from modules/backlogs/spec/models/agile/sprints/scopes/for_project_spec.rb rename to modules/backlogs/spec/models/sprints/scopes/for_project_spec.rb index bd45f4578ae5..6e74b0ac96cb 100644 --- a/modules/backlogs/spec/models/agile/sprints/scopes/for_project_spec.rb +++ b/modules/backlogs/spec/models/sprints/scopes/for_project_spec.rb @@ -30,18 +30,18 @@ require "spec_helper" -RSpec.describe Agile::Sprints::Scopes::ForProject do +RSpec.describe Sprints::Scopes::ForProject do let(:sprint_sharing) { "no_sharing" } let(:project) { create(:project, sprint_sharing:) } let(:global_sharer) { create(:project, sprint_sharing: "share_all_projects") } let(:other_project) { create(:project) } - let!(:sprint_in_project) { create(:agile_sprint, project:) } - let!(:global_sprint) { create(:agile_sprint, project: global_sharer) } - let!(:sprint_in_other_project) { create(:agile_sprint, project: other_project) } + let!(:sprint_in_project) { create(:sprint, project:) } + let!(:global_sprint) { create(:sprint, project: global_sharer) } + let!(:sprint_in_other_project) { create(:sprint, project: other_project) } shared_examples "executes a single SQL query" do it "resolves for_project in a single query" do - expect { Agile::Sprint.for_project(project).load }.to have_a_query_limit(1) + expect { Sprint.for_project(project).load }.to have_a_query_limit(1) end end @@ -53,24 +53,24 @@ context "and there are no work package assignments" do it "returns only the project's own sprint" do - expect(Agile::Sprint.for_project(project)).to contain_exactly(sprint_in_project) + expect(Sprint.for_project(project)).to contain_exactly(sprint_in_project) end end context "and the project has a work package assigned to a sprint from another project" do - let!(:cross_project_sprint) { create(:agile_sprint, project: other_project) } + let!(:cross_project_sprint) { create(:sprint, project: other_project) } let!(:work_package) { create(:work_package, project:, sprint: cross_project_sprint) } it "returns both the own sprint and the sprint assigned via work package" do - expect(Agile::Sprint.for_project(project)).to contain_exactly(sprint_in_project, cross_project_sprint) + expect(Sprint.for_project(project)).to contain_exactly(sprint_in_project, cross_project_sprint) end context "when the cross-project sprint is completed" do - let!(:completed_sprint) { create(:agile_sprint, project: other_project, status: "completed") } + let!(:completed_sprint) { create(:sprint, project: other_project, status: "completed") } let!(:work_package) { create(:work_package, project:, sprint: completed_sprint) } it "returns the completed sprint among the sprints" do - expect(Agile::Sprint.for_project(project)).to include(completed_sprint) + expect(Sprint.for_project(project)).to include(completed_sprint) end end end @@ -83,16 +83,16 @@ context "and there are no work package assignments" do it "returns only the project's own sprint" do - expect(Agile::Sprint.for_project(project)).to contain_exactly(sprint_in_project) + expect(Sprint.for_project(project)).to contain_exactly(sprint_in_project) end end context "and a work package in the project is assigned to a sprint from another project" do - let!(:cross_project_sprint) { create(:agile_sprint, project: other_project) } + let!(:cross_project_sprint) { create(:sprint, project: other_project) } let!(:work_package) { create(:work_package, project:, sprint: cross_project_sprint) } it "returns both the own sprint and the cross-project sprint" do - expect(Agile::Sprint.for_project(project)).to contain_exactly(sprint_in_project, cross_project_sprint) + expect(Sprint.for_project(project)).to contain_exactly(sprint_in_project, cross_project_sprint) end end end @@ -104,16 +104,16 @@ context "and there are no work package assignments" do it "returns only the project's own sprint" do - expect(Agile::Sprint.for_project(project)).to contain_exactly(sprint_in_project) + expect(Sprint.for_project(project)).to contain_exactly(sprint_in_project) end end context "and a work package in the project is assigned to a sprint from another project" do - let!(:cross_project_sprint) { create(:agile_sprint, project: other_project) } + let!(:cross_project_sprint) { create(:sprint, project: other_project) } let!(:work_package) { create(:work_package, project:, sprint: cross_project_sprint) } it "returns both the own sprint and the cross-project sprint" do - expect(Agile::Sprint.for_project(project)).to contain_exactly(sprint_in_project, cross_project_sprint) + expect(Sprint.for_project(project)).to contain_exactly(sprint_in_project, cross_project_sprint) end end end @@ -125,14 +125,14 @@ context "and there is only a global sharer" do it "returns only the sprints shared from the global sharer project" do - expect(Agile::Sprint.for_project(project)).to contain_exactly(global_sprint) + expect(Sprint.for_project(project)).to contain_exactly(global_sprint) end context "and a work package is assigned to the project's own sprint" do let!(:work_package) { create(:work_package, project:, sprint: sprint_in_project) } it "returns both the global shared sprint and the project's own sprint" do - expect(Agile::Sprint.for_project(project)).to contain_exactly(global_sprint, sprint_in_project) + expect(Sprint.for_project(project)).to contain_exactly(global_sprint, sprint_in_project) end end @@ -140,7 +140,7 @@ let!(:work_package) { create(:work_package, project:, sprint: global_sprint) } it "returns the shared sprint only once" do - expect(Agile::Sprint.for_project(project)).to contain_exactly(global_sprint) + expect(Sprint.for_project(project)).to contain_exactly(global_sprint) end end @@ -148,7 +148,7 @@ let!(:work_package) { create(:work_package, project:, sprint: sprint_in_other_project) } it "returns the global shared sprint and the unrelated project's sprint" do - expect(Agile::Sprint.for_project(project)).to contain_exactly(global_sprint, sprint_in_other_project) + expect(Sprint.for_project(project)).to contain_exactly(global_sprint, sprint_in_other_project) end end end @@ -156,17 +156,17 @@ context "and there is a subproject-sharing ancestor" do let(:subproject_sharer) { create(:project, sprint_sharing: "share_subprojects") } let(:project) { create(:project, parent: subproject_sharer, sprint_sharing:) } - let!(:subproject_sprint) { create(:agile_sprint, project: subproject_sharer) } + let!(:subproject_sprint) { create(:sprint, project: subproject_sharer) } it "returns only the sprints shared from the closest subproject-sharing ancestor" do - expect(Agile::Sprint.for_project(project)).to contain_exactly(subproject_sprint) + expect(Sprint.for_project(project)).to contain_exactly(subproject_sprint) end context "and a work package is assigned to the project's own sprint" do let!(:work_package) { create(:work_package, project:, sprint: sprint_in_project) } it "returns both the ancestor's shared sprint and the project's own sprint" do - expect(Agile::Sprint.for_project(project)).to contain_exactly(subproject_sprint, sprint_in_project) + expect(Sprint.for_project(project)).to contain_exactly(subproject_sprint, sprint_in_project) end end @@ -174,7 +174,7 @@ let!(:work_package) { create(:work_package, project:, sprint: subproject_sprint) } it "returns the ancestor's shared sprint only once" do - expect(Agile::Sprint.for_project(project)).to contain_exactly(subproject_sprint) + expect(Sprint.for_project(project)).to contain_exactly(subproject_sprint) end end @@ -182,7 +182,7 @@ let!(:work_package) { create(:work_package, project:, sprint: global_sprint) } it "returns both the ancestor's shared sprint and the global sharer's sprint" do - expect(Agile::Sprint.for_project(project)).to contain_exactly(subproject_sprint, global_sprint) + expect(Sprint.for_project(project)).to contain_exactly(subproject_sprint, global_sprint) end end end diff --git a/modules/backlogs/spec/models/agile/sprints/scopes/native_to_sprint_source_spec.rb b/modules/backlogs/spec/models/sprints/scopes/native_to_sprint_source_spec.rb similarity index 71% rename from modules/backlogs/spec/models/agile/sprints/scopes/native_to_sprint_source_spec.rb rename to modules/backlogs/spec/models/sprints/scopes/native_to_sprint_source_spec.rb index 7dac454b85a1..265d13c23678 100644 --- a/modules/backlogs/spec/models/agile/sprints/scopes/native_to_sprint_source_spec.rb +++ b/modules/backlogs/spec/models/sprints/scopes/native_to_sprint_source_spec.rb @@ -30,18 +30,18 @@ require "spec_helper" -RSpec.describe Agile::Sprints::Scopes::NativeToSprintSource do +RSpec.describe Sprints::Scopes::NativeToSprintSource do let(:sprint_sharing) { "no_sharing" } let(:project) { create(:project, sprint_sharing:) } let(:global_sharer) { create(:project, sprint_sharing: "share_all_projects") } let(:other_project) { create(:project) } - let!(:sprint_in_project) { create(:agile_sprint, project:) } - let!(:global_sprint) { create(:agile_sprint, project: global_sharer) } - let!(:sprint_in_other_project) { create(:agile_sprint, project: other_project) } + let!(:sprint_in_project) { create(:sprint, project:) } + let!(:global_sprint) { create(:sprint, project: global_sharer) } + let!(:sprint_in_other_project) { create(:sprint, project: other_project) } shared_examples "executes a single SQL query" do it "resolves native_to_sprint_source in a single query" do - expect { Agile::Sprint.native_to_sprint_source(project).load }.to have_a_query_limit(1) + expect { Sprint.native_to_sprint_source(project).load }.to have_a_query_limit(1) end end @@ -53,24 +53,24 @@ context "and there are no work package assignments" do it "returns only the project's own sprint" do - expect(Agile::Sprint.native_to_sprint_source(project)).to contain_exactly(sprint_in_project) + expect(Sprint.native_to_sprint_source(project)).to contain_exactly(sprint_in_project) end end context "and the project has a work package assigned to a sprint from another project" do - let!(:cross_project_sprint) { create(:agile_sprint, project: other_project) } + let!(:cross_project_sprint) { create(:sprint, project: other_project) } let!(:work_package) { create(:work_package, project:, sprint: cross_project_sprint) } it "returns only the project's own sprint" do - expect(Agile::Sprint.native_to_sprint_source(project)).to contain_exactly(sprint_in_project) + expect(Sprint.native_to_sprint_source(project)).to contain_exactly(sprint_in_project) end context "when the cross-project sprint is completed" do - let!(:completed_sprint) { create(:agile_sprint, project: other_project, status: "completed") } + let!(:completed_sprint) { create(:sprint, project: other_project, status: "completed") } let!(:work_package) { create(:work_package, project:, sprint: completed_sprint) } it "returns only the project's own sprint" do - expect(Agile::Sprint.native_to_sprint_source(project)).to contain_exactly(sprint_in_project) + expect(Sprint.native_to_sprint_source(project)).to contain_exactly(sprint_in_project) end end end @@ -83,16 +83,16 @@ context "and there are no work package assignments" do it "returns only the project's own sprint" do - expect(Agile::Sprint.native_to_sprint_source(project)).to contain_exactly(sprint_in_project) + expect(Sprint.native_to_sprint_source(project)).to contain_exactly(sprint_in_project) end end context "and a work package in the project is assigned to a sprint from another project" do - let!(:cross_project_sprint) { create(:agile_sprint, project: other_project) } + let!(:cross_project_sprint) { create(:sprint, project: other_project) } let!(:work_package) { create(:work_package, project:, sprint: cross_project_sprint) } it "returns only the project's own sprint" do - expect(Agile::Sprint.native_to_sprint_source(project)).to contain_exactly(sprint_in_project) + expect(Sprint.native_to_sprint_source(project)).to contain_exactly(sprint_in_project) end end end @@ -104,16 +104,16 @@ context "and there are no work package assignments" do it "returns only the project's own sprint" do - expect(Agile::Sprint.native_to_sprint_source(project)).to contain_exactly(sprint_in_project) + expect(Sprint.native_to_sprint_source(project)).to contain_exactly(sprint_in_project) end end context "and a work package in the project is assigned to a sprint from another project" do - let!(:cross_project_sprint) { create(:agile_sprint, project: other_project) } + let!(:cross_project_sprint) { create(:sprint, project: other_project) } let!(:work_package) { create(:work_package, project:, sprint: cross_project_sprint) } it "returns only the project's own sprint" do - expect(Agile::Sprint.native_to_sprint_source(project)).to contain_exactly(sprint_in_project) + expect(Sprint.native_to_sprint_source(project)).to contain_exactly(sprint_in_project) end end end @@ -125,14 +125,14 @@ context "and there is only a global sharer" do it "returns only the sprints shared from the global sharer project" do - expect(Agile::Sprint.native_to_sprint_source(project)).to contain_exactly(global_sprint) + expect(Sprint.native_to_sprint_source(project)).to contain_exactly(global_sprint) end context "and a work package is assigned to the project's own sprint" do let!(:work_package) { create(:work_package, project:, sprint: sprint_in_project) } it "returns only the sprints shared from the global sharer project" do - expect(Agile::Sprint.native_to_sprint_source(project)).to contain_exactly(global_sprint) + expect(Sprint.native_to_sprint_source(project)).to contain_exactly(global_sprint) end end @@ -140,7 +140,7 @@ let!(:work_package) { create(:work_package, project:, sprint: global_sprint) } it "returns the shared sprint only once" do - expect(Agile::Sprint.native_to_sprint_source(project)).to contain_exactly(global_sprint) + expect(Sprint.native_to_sprint_source(project)).to contain_exactly(global_sprint) end end @@ -148,7 +148,7 @@ let!(:work_package) { create(:work_package, project:, sprint: sprint_in_other_project) } it "returns only the sprints shared from the global sharer project" do - expect(Agile::Sprint.native_to_sprint_source(project)).to contain_exactly(global_sprint) + expect(Sprint.native_to_sprint_source(project)).to contain_exactly(global_sprint) end end end @@ -156,17 +156,17 @@ context "and there is a subproject-sharing ancestor" do let(:subproject_sharer) { create(:project, sprint_sharing: "share_subprojects") } let(:project) { create(:project, parent: subproject_sharer, sprint_sharing:) } - let!(:subproject_sprint) { create(:agile_sprint, project: subproject_sharer) } + let!(:subproject_sprint) { create(:sprint, project: subproject_sharer) } it "returns only the sprints shared from the closest subproject-sharing ancestor" do - expect(Agile::Sprint.native_to_sprint_source(project)).to contain_exactly(subproject_sprint) + expect(Sprint.native_to_sprint_source(project)).to contain_exactly(subproject_sprint) end context "and a work package is assigned to the project's own sprint" do let!(:work_package) { create(:work_package, project:, sprint: sprint_in_project) } it "returns only the sprints shared from the closest subproject-sharing ancestor" do - expect(Agile::Sprint.native_to_sprint_source(project)).to contain_exactly(subproject_sprint) + expect(Sprint.native_to_sprint_source(project)).to contain_exactly(subproject_sprint) end end @@ -174,7 +174,7 @@ let!(:work_package) { create(:work_package, project:, sprint: subproject_sprint) } it "returns the ancestor's shared sprint only once" do - expect(Agile::Sprint.native_to_sprint_source(project)).to contain_exactly(subproject_sprint) + expect(Sprint.native_to_sprint_source(project)).to contain_exactly(subproject_sprint) end end @@ -182,7 +182,7 @@ let!(:work_package) { create(:work_package, project:, sprint: global_sprint) } it "returns only the sprints shared from the closest subproject-sharing ancestor" do - expect(Agile::Sprint.native_to_sprint_source(project)).to contain_exactly(subproject_sprint) + expect(Sprint.native_to_sprint_source(project)).to contain_exactly(subproject_sprint) end end end diff --git a/modules/backlogs/spec/models/agile/sprints/scopes/receiving_projects_spec.rb b/modules/backlogs/spec/models/sprints/scopes/receiving_projects_spec.rb similarity index 95% rename from modules/backlogs/spec/models/agile/sprints/scopes/receiving_projects_spec.rb rename to modules/backlogs/spec/models/sprints/scopes/receiving_projects_spec.rb index 54622cc87835..cb0dce11d7c6 100644 --- a/modules/backlogs/spec/models/agile/sprints/scopes/receiving_projects_spec.rb +++ b/modules/backlogs/spec/models/sprints/scopes/receiving_projects_spec.rb @@ -30,13 +30,13 @@ require "spec_helper" -RSpec.describe Agile::Sprints::Scopes::ReceivingProjects do +RSpec.describe Sprints::Scopes::ReceivingProjects do let(:source_project) { create(:project, sprint_sharing: source_sharing) } let(:source_sharing) { "no_sharing" } - let(:sprint) { create(:agile_sprint, project: source_project) } + let(:sprint) { create(:sprint, project: source_project) } describe ".receiving_projects" do - subject(:scope) { Agile::Sprint.receiving_projects(sprint) } + subject(:scope) { Sprint.receiving_projects(sprint) } it "resolves in a single query" do sprint diff --git a/modules/backlogs/spec/models/agile/sprints/scopes/visible_spec.rb b/modules/backlogs/spec/models/sprints/scopes/visible_spec.rb similarity index 93% rename from modules/backlogs/spec/models/agile/sprints/scopes/visible_spec.rb rename to modules/backlogs/spec/models/sprints/scopes/visible_spec.rb index db7e3178ef05..81dc31ac4b01 100644 --- a/modules/backlogs/spec/models/agile/sprints/scopes/visible_spec.rb +++ b/modules/backlogs/spec/models/sprints/scopes/visible_spec.rb @@ -30,17 +30,17 @@ require "spec_helper" -RSpec.describe Agile::Sprints::Scopes::Visible do +RSpec.describe Sprints::Scopes::Visible do shared_let(:project_globally_sharing) { create(:project, sprint_sharing: "share_all_projects") } shared_let(:project_receiving) { create(:project, sprint_sharing: "receive_shared") } - shared_let(:sprint_in_global_sharer) { create(:agile_sprint, project: project_globally_sharing) } + shared_let(:sprint_in_global_sharer) { create(:sprint, project: project_globally_sharing) } shared_let(:project_with_own_sprint) { create(:project) } - shared_let(:sprint_own) { create(:agile_sprint, project: project_with_own_sprint) } + shared_let(:sprint_own) { create(:sprint, project: project_with_own_sprint) } shared_let(:project_with_referenced_by_wp_sprint) { create(:project) } shared_let(:sprint_referenced_by_wp) do - create(:agile_sprint, project: create(:project)) do |sprint| + create(:sprint, project: create(:project)) do |sprint| create(:work_package, sprint:, project: project_with_referenced_by_wp_sprint) end end @@ -85,7 +85,7 @@ end shared_let(:user_without_membership) { create(:user) } - subject { Agile::Sprint.visible(current_user) } + subject { Sprint.visible(current_user) } context "for a user with view_sprints in project with own sprint" do current_user { user_with_permission_in_project_with_own_sprint } diff --git a/modules/backlogs/spec/models/work_package_spec.rb b/modules/backlogs/spec/models/work_package_spec.rb index d385a7231ea0..1a17553e497c 100644 --- a/modules/backlogs/spec/models/work_package_spec.rb +++ b/modules/backlogs/spec/models/work_package_spec.rb @@ -33,7 +33,7 @@ RSpec.describe WorkPackage do describe "associations" do it { is_expected.to belong_to(:backlog_bucket).class_name("Agile::BacklogBucket").optional(true) } - it { is_expected.to belong_to(:sprint).class_name("Agile::Sprint").optional(true) } + it { is_expected.to belong_to(:sprint).class_name("Sprint").optional(true) } end describe ".order_by_position" do diff --git a/modules/backlogs/spec/models/work_packages/position_spec.rb b/modules/backlogs/spec/models/work_packages/position_spec.rb index c3c3f678ba00..51de707e9f23 100644 --- a/modules/backlogs/spec/models/work_packages/position_spec.rb +++ b/modules/backlogs/spec/models/work_packages/position_spec.rb @@ -37,8 +37,8 @@ def create_work_package(options) shared_let(:project) { create(:project) } shared_let(:type) { create(:type) } - shared_let(:sprint1) { create(:agile_sprint, project:, name: "Sprint 1") } - shared_let(:sprint2) { create(:agile_sprint, project:, name: "Sprint 2") } + shared_let(:sprint1) { create(:sprint, project:, name: "Sprint 1") } + shared_let(:sprint2) { create(:sprint, project:, name: "Sprint 2") } let!(:sprint1_wp1) { create_work_package(subject: "Sprint 1 WorkPackage 1", sprint: sprint1) } let!(:sprint1_wp2) { create_work_package(subject: "Sprint 1 WorkPackage 2", sprint: sprint1) } diff --git a/modules/backlogs/spec/models/work_packages/sprint_journaling_spec.rb b/modules/backlogs/spec/models/work_packages/sprint_journaling_spec.rb index 260a3d975203..923c022a9c8e 100644 --- a/modules/backlogs/spec/models/work_packages/sprint_journaling_spec.rb +++ b/modules/backlogs/spec/models/work_packages/sprint_journaling_spec.rb @@ -33,8 +33,8 @@ RSpec.describe "WorkPackage sprint association journaling", # rubocop:disable RSpec/DescribeClass with_settings: { journal_aggregation_time_minutes: 0 } do shared_let(:project) { create(:project) } - shared_let(:sprint1) { create(:agile_sprint, name: "Sprint 1", project:) } - shared_let(:sprint2) { create(:agile_sprint, name: "Sprint 2", project:) } + shared_let(:sprint1) { create(:sprint, name: "Sprint 1", project:) } + shared_let(:sprint2) { create(:sprint, name: "Sprint 2", project:) } shared_let(:work_package_with_sprint) do create(:work_package, :created_in_past, created_at: 1.day.ago, project:, sprint: sprint1) end diff --git a/modules/backlogs/spec/requests/api/v3/sprints/index_resource_spec.rb b/modules/backlogs/spec/requests/api/v3/sprints/index_resource_spec.rb index 4d725f3aeeda..879b2499e582 100644 --- a/modules/backlogs/spec/requests/api/v3/sprints/index_resource_spec.rb +++ b/modules/backlogs/spec/requests/api/v3/sprints/index_resource_spec.rb @@ -38,9 +38,9 @@ shared_let(:project) { create(:project, public: false) } shared_let(:other_project) { create(:project, public: false) } shared_let(:project_without_permission) { create(:project, public: false) } - shared_let(:sprint) { create(:agile_sprint, project:) } - shared_let(:other_sprint) { create(:agile_sprint, project: other_project) } - shared_let(:sprint_without_permission) { create(:agile_sprint, project: project_without_permission) } + shared_let(:sprint) { create(:sprint, project:) } + shared_let(:other_sprint) { create(:sprint, project: other_project) } + shared_let(:sprint_without_permission) { create(:sprint, project: project_without_permission) } let(:permissions) { %i[view_sprints] } diff --git a/modules/backlogs/spec/requests/api/v3/sprints/project_index_resource_spec.rb b/modules/backlogs/spec/requests/api/v3/sprints/project_index_resource_spec.rb index 5c585e15707f..36ef0f5e6f28 100644 --- a/modules/backlogs/spec/requests/api/v3/sprints/project_index_resource_spec.rb +++ b/modules/backlogs/spec/requests/api/v3/sprints/project_index_resource_spec.rb @@ -38,9 +38,9 @@ shared_let(:project) { create(:project, public: false) } shared_let(:other_project) { create(:project, public: false) } shared_let(:project_without_permission) { create(:project, public: false) } - shared_let(:sprint) { create(:agile_sprint, project:) } - shared_let(:other_sprint) { create(:agile_sprint, project: other_project) } - shared_let(:sprint_without_permission) { create(:agile_sprint, project: project_without_permission) } + shared_let(:sprint) { create(:sprint, project:) } + shared_let(:other_sprint) { create(:sprint, project: other_project) } + shared_let(:sprint_without_permission) { create(:sprint, project: project_without_permission) } let(:permissions) { %i[view_sprints] } diff --git a/modules/backlogs/spec/requests/api/v3/sprints/show_resource_spec.rb b/modules/backlogs/spec/requests/api/v3/sprints/show_resource_spec.rb index c2697842c9c8..6b63c8a5887b 100644 --- a/modules/backlogs/spec/requests/api/v3/sprints/show_resource_spec.rb +++ b/modules/backlogs/spec/requests/api/v3/sprints/show_resource_spec.rb @@ -36,7 +36,7 @@ include API::V3::Utilities::PathHelper shared_let(:project) { create(:project, public: false) } - shared_let(:sprint) { create(:agile_sprint, project:) } + shared_let(:sprint) { create(:sprint, project:) } let(:permissions) { %i[view_sprints] } diff --git a/modules/backlogs/spec/requests/api/v3/work_packages/create_resource_spec.rb b/modules/backlogs/spec/requests/api/v3/work_packages/create_resource_spec.rb index d697a95fd4f0..d5b0135e1529 100644 --- a/modules/backlogs/spec/requests/api/v3/work_packages/create_resource_spec.rb +++ b/modules/backlogs/spec/requests/api/v3/work_packages/create_resource_spec.rb @@ -39,9 +39,9 @@ shared_let(:type) { project.types.first } shared_let(:status) { create(:status, is_default: true) } shared_let(:priority) { create(:priority, is_default: true) } - shared_let(:sprint) { create(:agile_sprint, project:) } - shared_let(:completed_sprint) { create(:agile_sprint, project:, status: :completed) } - shared_let(:outside_sprint) { create(:agile_sprint, project: create(:project)) } + shared_let(:sprint) { create(:sprint, project:) } + shared_let(:completed_sprint) { create(:sprint, project:, status: :completed) } + shared_let(:outside_sprint) { create(:sprint, project: create(:project)) } let(:role) { create(:project_role, permissions:) } let(:permissions) { %i[add_work_packages view_work_packages manage_sprint_items view_sprints] } diff --git a/modules/backlogs/spec/requests/api/v3/work_packages/update_resource_spec.rb b/modules/backlogs/spec/requests/api/v3/work_packages/update_resource_spec.rb index fe151c809344..f3b15824f2fa 100644 --- a/modules/backlogs/spec/requests/api/v3/work_packages/update_resource_spec.rb +++ b/modules/backlogs/spec/requests/api/v3/work_packages/update_resource_spec.rb @@ -40,9 +40,9 @@ shared_let(:type) { project.types.first } shared_let(:status) { create(:status, is_default: true) } shared_let(:priority) { create(:priority, is_default: true) } - shared_let(:sprint) { create(:agile_sprint, project:) } - shared_let(:completed_sprint) { create(:agile_sprint, project:, status: :completed) } - shared_let(:outside_sprint) { create(:agile_sprint, project: other_project) } + shared_let(:sprint) { create(:sprint, project:) } + shared_let(:completed_sprint) { create(:sprint, project:, status: :completed) } + shared_let(:outside_sprint) { create(:sprint, project: other_project) } shared_let(:work_package) { create(:work_package, project:, type:, status:, priority:) } let(:role) { create(:project_role, permissions:) } diff --git a/modules/backlogs/spec/requests/backlogs/backlog_spec.rb b/modules/backlogs/spec/requests/backlogs/backlog_spec.rb index ae505299c9ed..d0eb3d3534e2 100644 --- a/modules/backlogs/spec/requests/backlogs/backlog_spec.rb +++ b/modules/backlogs/spec/requests/backlogs/backlog_spec.rb @@ -38,7 +38,7 @@ shared_let(:user) { create(:admin) } shared_let(:project) { create(:project) } shared_let(:status) { create(:status, name: "status 1", is_default: true) } - shared_let(:sprint) { create(:agile_sprint, project:) } + shared_let(:sprint) { create(:sprint, project:) } shared_let(:story) { create(:work_package, status:, sprint:, project:) } current_user { user } @@ -91,10 +91,10 @@ context "with no sprints available" do before do - allow(Agile::Sprint) + allow(Sprint) .to receive(:for_project) .with(project) - .and_return(Agile::Sprint.none) + .and_return(Sprint.none) end it "still renders the sprint planning container for turbo-frame requests" do diff --git a/modules/backlogs/spec/requests/backlogs/burndown_chart_spec.rb b/modules/backlogs/spec/requests/backlogs/burndown_chart_spec.rb index 9a651d83329d..2a356830dcb6 100644 --- a/modules/backlogs/spec/requests/backlogs/burndown_chart_spec.rb +++ b/modules/backlogs/spec/requests/backlogs/burndown_chart_spec.rb @@ -36,7 +36,7 @@ shared_let(:user) { create(:admin) } shared_let(:project) { create(:project) } shared_let(:status) { create(:status, name: "status 1", is_default: true) } - shared_let(:sprint) { create(:agile_sprint, project:) } + shared_let(:sprint) { create(:sprint, project:) } current_user { user } diff --git a/modules/backlogs/spec/requests/backlogs/sprints_spec.rb b/modules/backlogs/spec/requests/backlogs/sprints_spec.rb index 2a4c8a58a788..e41f7ee61a8e 100644 --- a/modules/backlogs/spec/requests/backlogs/sprints_spec.rb +++ b/modules/backlogs/spec/requests/backlogs/sprints_spec.rb @@ -36,7 +36,7 @@ shared_let(:user) { create(:admin) } shared_let(:project) { create(:project) } shared_let(:status) { create(:status, name: "status 1", is_default: true) } - shared_let(:sprint) { create(:agile_sprint, name: "Original sprint name", project:) } + shared_let(:sprint) { create(:sprint, name: "Original sprint name", project:) } current_user { user } diff --git a/modules/backlogs/spec/requests/backlogs/taskboard_spec.rb b/modules/backlogs/spec/requests/backlogs/taskboard_spec.rb index 5708ccb43d5b..8c463d7e7bec 100644 --- a/modules/backlogs/spec/requests/backlogs/taskboard_spec.rb +++ b/modules/backlogs/spec/requests/backlogs/taskboard_spec.rb @@ -32,7 +32,7 @@ RSpec.describe "Backlogs::Taskboard", type: :rails_request do shared_let(:project) { create(:project) } - shared_let(:sprint) { create(:agile_sprint, project:) } + shared_let(:sprint) { create(:sprint, project:) } describe "legacy (version 17.3) sprint taskboard route" do it "redirects to the namespaced taskboard route" do diff --git a/modules/backlogs/spec/services/sprints/create_service_spec.rb b/modules/backlogs/spec/services/sprints/create_service_spec.rb index 0971ecf565d0..8c6909fd8b56 100644 --- a/modules/backlogs/spec/services/sprints/create_service_spec.rb +++ b/modules/backlogs/spec/services/sprints/create_service_spec.rb @@ -33,7 +33,7 @@ RSpec.describe Sprints::CreateService, type: :model do it_behaves_like "BaseServices create service" do - let(:model_class) { Agile::Sprint } - let(:factory) { :agile_sprint } + let(:model_class) { Sprint } + let(:factory) { :sprint } end end diff --git a/modules/backlogs/spec/services/sprints/finish_service_spec.rb b/modules/backlogs/spec/services/sprints/finish_service_spec.rb index b055d6ecccc3..554947398a6c 100644 --- a/modules/backlogs/spec/services/sprints/finish_service_spec.rb +++ b/modules/backlogs/spec/services/sprints/finish_service_spec.rb @@ -42,7 +42,7 @@ project => %i[view_work_packages view_sprints manage_sprint_items start_complete_sprint] }) end - let(:sprint) { create(:agile_sprint, project:, status: sprint_status) } + let(:sprint) { create(:sprint, project:, status: sprint_status) } let(:sprint_status) { "active" } let(:instance) { described_class.new(user:, model: sprint) } let(:call_params) { {} } @@ -83,7 +83,7 @@ end context "when specifying a target sprint to move the work packages to" do - let(:target_sprint) { create(:agile_sprint, project:, status: "in_planning") } + let(:target_sprint) { create(:sprint, project:, status: "in_planning") } let(:call_params) { { unfinished_action: "move_to_sprint", move_to_sprint_id: target_sprint.id } } @@ -96,7 +96,7 @@ context "when specifying a target sprint not shared with the project" do let(:other_project) { create(:project, enabled_module_names: %w[backlogs work_package_tracking]) } - let(:target_sprint) { create(:agile_sprint, project: other_project, status: "in_planning") } + let(:target_sprint) { create(:sprint, project: other_project, status: "in_planning") } let(:call_params) { { unfinished_action: "move_to_sprint", move_to_sprint_id: target_sprint.id } } @@ -139,7 +139,7 @@ end context "when the sprint has multiple unfinished work packages also in other projects and a target sprint is given" do - let(:target_sprint) { create(:agile_sprint, project:, status: "in_planning") } + let(:target_sprint) { create(:sprint, project:, status: "in_planning") } # Permissions are not necessary for this. The change is carried out regardless. let(:other_project) { create(:project) } let!(:open_wp1) do diff --git a/modules/backlogs/spec/services/sprints/set_attributes_service_spec.rb b/modules/backlogs/spec/services/sprints/set_attributes_service_spec.rb index 954f022e101e..16f63b6bcba2 100644 --- a/modules/backlogs/spec/services/sprints/set_attributes_service_spec.rb +++ b/modules/backlogs/spec/services/sprints/set_attributes_service_spec.rb @@ -57,7 +57,7 @@ contract_options: {}) end let(:project) { create(:project) } - let(:sprint) { Agile::Sprint.new } + let(:sprint) { Sprint.new } let(:params) { { project: } } subject(:service_call) { instance.call(params) } @@ -130,7 +130,7 @@ end describe "default attributes" do - let(:sprint) { Agile::Sprint.new } + let(:sprint) { Sprint.new } it "sets default status to in_planning" do service_call @@ -139,7 +139,7 @@ end context "when status is already set" do - let(:sprint) { Agile::Sprint.new(status: "active") } + let(:sprint) { Sprint.new(status: "active") } it "does not override the existing status" do service_call @@ -152,7 +152,7 @@ describe "assigning a name" do context "when sprint is not a new record" do - let(:sprint) { create(:agile_sprint, project:, name: "Existing Sprint") } + let(:sprint) { create(:sprint, project:, name: "Existing Sprint") } it "assigns the current name" do service_call @@ -162,7 +162,7 @@ end context "when sprint is a new record" do - let(:sprint) { Agile::Sprint.new(project:) } + let(:sprint) { Sprint.new(project:) } context "when there is no predecessor sprint" do it "assigns a default name for the first sprint" do @@ -175,42 +175,42 @@ context "when there is a predecessor sprint with a name ending in a number" do it "increments the number for single-digit numbers" do - create(:agile_sprint, project:, name: "Sprint 1") + create(:sprint, project:, name: "Sprint 1") service_call expect(sprint.name).to eq("Sprint 2") end it "increments the number for multi-digit numbers" do - create(:agile_sprint, project:, name: "Sprint 42") + create(:sprint, project:, name: "Sprint 42") service_call expect(sprint.name).to eq("Sprint 43") end it "increments the number for custom names ending in numbers" do - create(:agile_sprint, project:, name: "Be ambitious 42") + create(:sprint, project:, name: "Be ambitious 42") service_call expect(sprint.name).to eq("Be ambitious 43") end it "handles names with multiple spaces before the number" do - create(:agile_sprint, project:, name: "Release 99") + create(:sprint, project:, name: "Release 99") service_call expect(sprint.name).to eq("Release 100") end it "increments from 9 to 10" do - create(:agile_sprint, project:, name: "Sprint 9") + create(:sprint, project:, name: "Sprint 9") service_call expect(sprint.name).to eq("Sprint 10") end it "increments from 99 to 100" do - create(:agile_sprint, project:, name: "Sprint 99") + create(:sprint, project:, name: "Sprint 99") service_call expect(sprint.name).to eq("Sprint 100") @@ -219,21 +219,21 @@ context "when there is a predecessor sprint with a custom name not ending in a number" do it "assigns an empty string" do - create(:agile_sprint, project:, name: "Custom Sprint Name") + create(:sprint, project:, name: "Custom Sprint Name") service_call expect(sprint.name).to eq("") end it "assigns an empty string for names with numbers in the middle" do - create(:agile_sprint, project:, name: "Sprint 2023 Planning") + create(:sprint, project:, name: "Sprint 2023 Planning") service_call expect(sprint.name).to eq("") end it "assigns an empty string for names ending with non-numeric characters" do - create(:agile_sprint, project:, name: "Sprint Alpha") + create(:sprint, project:, name: "Sprint Alpha") service_call expect(sprint.name).to eq("") @@ -242,16 +242,16 @@ context "when there are multiple predecessor sprints" do it "uses the most recent sprint" do - create(:agile_sprint, project:, name: "Sprint 1", created_at: 2.days.ago) - create(:agile_sprint, project:, name: "Sprint 2", created_at: 1.day.ago) + create(:sprint, project:, name: "Sprint 1", created_at: 2.days.ago) + create(:sprint, project:, name: "Sprint 2", created_at: 1.day.ago) service_call expect(sprint.name).to eq("Sprint 3") end it "handles mixed naming patterns by using the most recent" do - create(:agile_sprint, project:, name: "Sprint 1", created_at: 2.days.ago) - create(:agile_sprint, project:, name: "Custom Name", created_at: 1.day.ago) + create(:sprint, project:, name: "Sprint 1", created_at: 2.days.ago) + create(:sprint, project:, name: "Custom Name", created_at: 1.day.ago) service_call expect(sprint.name).to eq("") @@ -262,15 +262,15 @@ let(:other_project) { create(:project) } it "ignores sprints from other projects" do - create(:agile_sprint, project: other_project, name: "Other Sprint 5") + create(:sprint, project: other_project, name: "Other Sprint 5") service_call expect(sprint.name).to eq("#{I18n.t('activerecord.models.sprint')} 1") end it "only considers sprints from the same project" do - create(:agile_sprint, project: other_project, name: "Other Sprint 5") - create(:agile_sprint, project:, name: "Sprint 3") + create(:sprint, project: other_project, name: "Other Sprint 5") + create(:sprint, project:, name: "Sprint 3") service_call expect(sprint.name).to eq("Sprint 4") diff --git a/modules/backlogs/spec/services/sprints/start_service_spec.rb b/modules/backlogs/spec/services/sprints/start_service_spec.rb index 1ad0ec999dd4..ac55f8811f8b 100644 --- a/modules/backlogs/spec/services/sprints/start_service_spec.rb +++ b/modules/backlogs/spec/services/sprints/start_service_spec.rb @@ -36,7 +36,7 @@ shared_let(:status2) { create(:status) } shared_let(:project) { create(:project, types: [type_task]) } let(:status) { "in_planning" } - let(:sprint) { create(:agile_sprint, project:, status:) } + let(:sprint) { create(:sprint, project:, status:) } let(:user) { create(:admin) } let(:instance) { described_class.new(user:, model: sprint) } @@ -98,7 +98,7 @@ end context "when the sprint has no start date" do - let(:sprint) { create(:agile_sprint, project:, start_date: nil) } + let(:sprint) { create(:sprint, project:, start_date: nil) } it "fails contract validation without activating the sprint", :aggregate_failures do expect(result).not_to be_success @@ -108,7 +108,7 @@ end context "when the sprint has no finish date" do - let(:sprint) { create(:agile_sprint, project:, finish_date: nil) } + let(:sprint) { create(:sprint, project:, finish_date: nil) } it "fails contract validation without activating the sprint", :aggregate_failures do expect(result).not_to be_success @@ -118,7 +118,7 @@ end context "when another active sprint exists in the project" do - let!(:active_sprint) { create(:agile_sprint, project:, status: "active") } + let!(:active_sprint) { create(:sprint, project:, status: "active") } it "fails contract validation without creating a board", :aggregate_failures do expect(result).not_to be_success diff --git a/modules/backlogs/spec/services/work_packages/rebuild_positions_service_integration_spec.rb b/modules/backlogs/spec/services/work_packages/rebuild_positions_service_integration_spec.rb index e9c438f3b249..7d5fe6e35649 100644 --- a/modules/backlogs/spec/services/work_packages/rebuild_positions_service_integration_spec.rb +++ b/modules/backlogs/spec/services/work_packages/rebuild_positions_service_integration_spec.rb @@ -40,9 +40,9 @@ def create_work_package(options) shared_let(:project1) { create(:project) } shared_let(:project2) { create(:project) } shared_let(:type) { create(:type) } - shared_let(:sprint1) { create(:agile_sprint, project: project1, name: "Sprint 1") } - shared_let(:sprint2) { create(:agile_sprint, project: project1, name: "Sprint 2") } - shared_let(:sprint3) { create(:agile_sprint, project: project2, name: "Sprint 2") } + shared_let(:sprint1) { create(:sprint, project: project1, name: "Sprint 1") } + shared_let(:sprint2) { create(:sprint, project: project1, name: "Sprint 2") } + shared_let(:sprint3) { create(:sprint, project: project2, name: "Sprint 2") } shared_let(:sprint1_wp1) { create_work_package(subject: "Sprint 1 WorkPackage 1", sprint: sprint1, position: nil) } shared_let(:sprint1_wp2) { create_work_package(subject: "Sprint 1 WorkPackage 2", sprint: sprint1, position: 1) } diff --git a/modules/backlogs/spec/services/work_packages/update_service_sprint_preservation_spec.rb b/modules/backlogs/spec/services/work_packages/update_service_sprint_preservation_spec.rb index f49e2822977c..8fd0439cd285 100644 --- a/modules/backlogs/spec/services/work_packages/update_service_sprint_preservation_spec.rb +++ b/modules/backlogs/spec/services/work_packages/update_service_sprint_preservation_spec.rb @@ -58,7 +58,7 @@ end let(:sprint_in_source_project) do - create(:agile_sprint, + create(:sprint, project: source_project, name: "Sprint 1", start_date: Time.zone.today, @@ -149,7 +149,7 @@ describe "Integration with sprint visibility logic" do context "when sprint is owned by the target project" do let(:sprint_in_target_project) do - create(:agile_sprint, + create(:sprint, project: target_project, name: "Target Sprint", start_date: Time.zone.today, diff --git a/modules/backlogs/spec/support/pages/backlog.rb b/modules/backlogs/spec/support/pages/backlog.rb index 87800f3bbb06..df02fbdbedb0 100644 --- a/modules/backlogs/spec/support/pages/backlog.rb +++ b/modules/backlogs/spec/support/pages/backlog.rb @@ -188,7 +188,7 @@ def expect_new_sprint_button within_sprint_backlogs do expect(page).to have_css( test_selector("op-sprints--new-sprint-button"), - text: Agile::Sprint.human_model_name + text: Sprint.human_model_name ) end end @@ -197,7 +197,7 @@ def expect_no_new_sprint_button within_sprint_backlogs do expect(page).to have_no_css( test_selector("op-sprints--new-sprint-button"), - text: Agile::Sprint.human_model_name + text: Sprint.human_model_name ) end end diff --git a/modules/backlogs/spec/support/pages/backlog_spec.rb b/modules/backlogs/spec/support/pages/backlog_spec.rb index 423d0237db03..7bf7c59cadf6 100644 --- a/modules/backlogs/spec/support/pages/backlog_spec.rb +++ b/modules/backlogs/spec/support/pages/backlog_spec.rb @@ -36,7 +36,7 @@ let(:project) { build_stubbed(:project) } let(:work_package) { build_stubbed(:work_package) } - let(:sprint) { build_stubbed(:agile_sprint) } + let(:sprint) { build_stubbed(:sprint) } describe "#drag_work_package" do it "raises when neither before nor into is provided" do diff --git a/modules/backlogs/spec/views/backlogs/burndown_chart/show_spec.rb b/modules/backlogs/spec/views/backlogs/burndown_chart/show_spec.rb index b80d7f703f86..fee6ba960b25 100644 --- a/modules/backlogs/spec/views/backlogs/burndown_chart/show_spec.rb +++ b/modules/backlogs/spec/views/backlogs/burndown_chart/show_spec.rb @@ -57,29 +57,29 @@ create(:work_package, status: statuses[0], project:, type: type_feature, - sprint: sprint, + sprint:, priority: issue_priority) end let(:story_b) do create(:work_package, status: statuses[1], project:, type: type_feature, - sprint: sprint, + sprint:, priority: issue_priority) end let(:story_c) do create(:work_package, status: statuses[2], project:, type: type_feature, - sprint: sprint, + sprint:, priority: issue_priority) end let(:stories) { [story_a, story_b, story_c] } let(:sprint) do - create(:agile_sprint, project:, start_date: Time.zone.today - 1.week, finish_date: Time.zone.today + 1.week) + create(:sprint, project:, start_date: Time.zone.today - 1.week, finish_date: Time.zone.today + 1.week) end let(:task) do - task = create(:task, project:, status: statuses[0], sprint: sprint, type: type_task) + task = create(:task, project:, status: statuses[0], sprint:, type: type_task) # This is necessary as for some unknown reason passing the parent directly # leads to the task searching for the parent with 'root_id' is NULL, which # is not the case as the story has its own id as root_id diff --git a/modules/backlogs/spec/workers/backlogs/migrate_version_sprint_journals_job_spec.rb b/modules/backlogs/spec/workers/backlogs/migrate_version_sprint_journals_job_spec.rb index fd0d68044247..33e9f5901052 100644 --- a/modules/backlogs/spec/workers/backlogs/migrate_version_sprint_journals_job_spec.rb +++ b/modules/backlogs/spec/workers/backlogs/migrate_version_sprint_journals_job_spec.rb @@ -34,8 +34,8 @@ shared_let(:project) { create(:project) } shared_let(:version_a) { create(:version, project:, name: "Version A") } shared_let(:version_b) { create(:version, project:, name: "Version B") } - shared_let(:sprint_a) { create(:agile_sprint, name: "Sprint A", project:) } - shared_let(:sprint_b) { create(:agile_sprint, name: "Sprint B", project:) } + shared_let(:sprint_a) { create(:sprint, name: "Sprint A", project:) } + shared_let(:sprint_b) { create(:sprint, name: "Sprint B", project:) } shared_let(:wp1) { create(:work_package, project:, version: version_a, sprint: sprint_a) } shared_let(:wp2) { create(:work_package, project:, version: version_b, sprint: sprint_b) } shared_let(:wp_no_version) { create(:work_package, project:, sprint: sprint_a) } diff --git a/modules/boards/app/services/boards/sprint_task_board_create_service.rb b/modules/boards/app/services/boards/sprint_task_board_create_service.rb index 12c9db13914a..28c4a6f16d29 100644 --- a/modules/boards/app/services/boards/sprint_task_board_create_service.rb +++ b/modules/boards/app/services/boards/sprint_task_board_create_service.rb @@ -78,7 +78,7 @@ def statuses def statuses_from_last_sprint_board last_board = Boards::Grid - .where(project: params[:project], linked_type: "Agile::Sprint") + .where(project: params[:project], linked_type: "Sprint") .order(created_at: :desc) .first diff --git a/modules/boards/spec/services/boards/sprint_task_board_create_service_spec.rb b/modules/boards/spec/services/boards/sprint_task_board_create_service_spec.rb index c15e23aebcf3..0e99ad14c515 100644 --- a/modules/boards/spec/services/boards/sprint_task_board_create_service_spec.rb +++ b/modules/boards/spec/services/boards/sprint_task_board_create_service_spec.rb @@ -36,7 +36,7 @@ shared_let(:status1) { create(:status) } shared_let(:status2) { create(:status) } shared_let(:project) { create(:project, types: [type_task]) } - shared_let(:sprint) { create(:agile_sprint, project:) } + shared_let(:sprint) { create(:sprint, project:) } let(:user) { create(:admin) } let(:instance) { described_class.new(user:) } @@ -91,7 +91,7 @@ describe "status columns" do context "when a sprint board already exists on the project" do let(:status3) { create(:status) } - let(:existing_sprint) { create(:agile_sprint, project:) } + let(:existing_sprint) { create(:sprint, project:) } let(:widget1) do build(:grid_widget, diff --git a/modules/boards/spec/services/projects/copy_service_sprint_board_spec.rb b/modules/boards/spec/services/projects/copy_service_sprint_board_spec.rb index 5afe343b2552..935315cd5aa4 100644 --- a/modules/boards/spec/services/projects/copy_service_sprint_board_spec.rb +++ b/modules/boards/spec/services/projects/copy_service_sprint_board_spec.rb @@ -57,7 +57,7 @@ create( :board_grid, project: source, - linked: create(:agile_sprint, project: source), + linked: create(:sprint, project: source), options: { "filters" => [{ "sprint_id" => { "operator" => "=", "values" => ["123"] } }] } diff --git a/spec/models/work_packages/pdf_export/work_package_to_pdf_spec.rb b/spec/models/work_packages/pdf_export/work_package_to_pdf_spec.rb index b86b0c3240f2..ce1184952704 100644 --- a/spec/models/work_packages/pdf_export/work_package_to_pdf_spec.rb +++ b/spec/models/work_packages/pdf_export/work_package_to_pdf_spec.rb @@ -632,7 +632,7 @@ def expected_description_second context "with the backlogs module enabled" do let(:enabled_module_names) { %i[backlogs] } - let(:sprint) { create(:agile_sprint, name: "Sprint name for export", project:) } + let(:sprint) { create(:sprint, name: "Sprint name for export", project:) } before do work_package.sprint = sprint From d4eb1fe7c7056e7d4f77a83e11c69c207fb7ba2b Mon Sep 17 00:00:00 2001 From: ulferts Date: Mon, 20 Apr 2026 18:41:07 +0200 Subject: [PATCH 2/7] remove version_settings.rb --- .../backlogs/app/models/version_setting.rb | 38 ------------ ...60313164539_migrate_versions_to_sprints.rb | 36 +++++++++-- .../20260420160236_remove_version_settings.rb | 13 ++++ .../lib/open_project/backlogs/engine.rb | 8 +-- .../backlogs/patches/project_seeder_patch.rb | 62 ------------------- .../backlogs/patches/version_patch.rb | 39 ------------ .../patches/versions/base_contract_patch.rb | 45 -------------- .../spec/factories/version_setting_factory.rb | 32 ---------- .../migrate_versions_to_sprints_spec.rb | 24 +++++-- .../spec/models/version_setting_spec.rb | 37 ----------- .../root_seeder_standard_edition_spec.rb | 2 - 11 files changed, 64 insertions(+), 272 deletions(-) delete mode 100644 modules/backlogs/app/models/version_setting.rb create mode 100644 modules/backlogs/db/migrate/20260420160236_remove_version_settings.rb delete mode 100644 modules/backlogs/lib/open_project/backlogs/patches/project_seeder_patch.rb delete mode 100644 modules/backlogs/lib/open_project/backlogs/patches/version_patch.rb delete mode 100644 modules/backlogs/lib/open_project/backlogs/patches/versions/base_contract_patch.rb delete mode 100644 modules/backlogs/spec/factories/version_setting_factory.rb delete mode 100644 modules/backlogs/spec/models/version_setting_spec.rb diff --git a/modules/backlogs/app/models/version_setting.rb b/modules/backlogs/app/models/version_setting.rb deleted file mode 100644 index 717dbd0b4d7b..000000000000 --- a/modules/backlogs/app/models/version_setting.rb +++ /dev/null @@ -1,38 +0,0 @@ -#-- copyright -# OpenProject is an open source project management software. -# Copyright (C) the OpenProject GmbH -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License version 3. -# -# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: -# Copyright (C) 2006-2013 Jean-Philippe Lang -# Copyright (C) 2010-2013 the ChiliProject Team -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# See COPYRIGHT and LICENSE files for more details. -#++ - -class VersionSetting < ApplicationRecord - belongs_to :project - belongs_to :version - - validates_presence_of :project - - DISPLAY_NONE = 1 - DISPLAY_LEFT = 2 - DISPLAY_RIGHT = 3 -end diff --git a/modules/backlogs/db/migrate/20260313164539_migrate_versions_to_sprints.rb b/modules/backlogs/db/migrate/20260313164539_migrate_versions_to_sprints.rb index 67ca13575bdf..aef50084af09 100644 --- a/modules/backlogs/db/migrate/20260313164539_migrate_versions_to_sprints.rb +++ b/modules/backlogs/db/migrate/20260313164539_migrate_versions_to_sprints.rb @@ -29,6 +29,29 @@ #++ class MigrateVersionsToSprints < ActiveRecord::Migration[8.0] + class MigrationVersionSetting < ApplicationRecord + self.table_name = "version_settings" + + DISPLAY_LEFT = 2 + DISPLAY_RIGHT = 3 + end + + class MigrationWorkPackage < ApplicationRecord + self.table_name = "work_packages" + end + + class MigrationVersion < ApplicationRecord + self.table_name = "versions" + + has_many :work_packages, + class_name: "MigrateVersionsToSprints::MigrationWorkPackage", + foreign_key: "version_id" + + has_many :version_settings, + class_name: "MigrateVersionsToSprints::MigrationVersionSetting", + foreign_key: "version_id" + end + def up return if sprint_versions_with_work_package_ids.none? @@ -50,12 +73,13 @@ def sprint_versions_with_work_package_ids # Load versions used as sprints including work package ids associated with the version. # Since the same version can be used as a sprint in one project but not in another, # the work package ids are filtered by projects where the version is used as a sprint. - display_versions = [VersionSetting::DISPLAY_LEFT, VersionSetting::DISPLAY_RIGHT] - Version.joins(:version_settings, :work_packages) - .where(version_settings: { display: display_versions }) - .where("work_packages.project_id = version_settings.project_id") - .group("versions.id") - .select("versions.*, array_agg(DISTINCT work_packages.id) AS wp_ids") + + MigrationVersion + .joins(:version_settings, :work_packages) + .where(version_settings: { display: [MigrationVersionSetting::DISPLAY_LEFT, MigrationVersionSetting::DISPLAY_RIGHT] }) + .where("work_packages.project_id = version_settings.project_id") + .group("versions.id") + .select("versions.*, array_agg(DISTINCT work_packages.id) AS wp_ids") end def create_sprint(version) diff --git a/modules/backlogs/db/migrate/20260420160236_remove_version_settings.rb b/modules/backlogs/db/migrate/20260420160236_remove_version_settings.rb new file mode 100644 index 000000000000..537cc7849424 --- /dev/null +++ b/modules/backlogs/db/migrate/20260420160236_remove_version_settings.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +class RemoveVersionSettings < ActiveRecord::Migration[8.1] + def up + drop_table :version_settings + end + + def down + require_relative "tables/version_settings" + + Tables::VersionSettings.table(self) + end +end diff --git a/modules/backlogs/lib/open_project/backlogs/engine.rb b/modules/backlogs/lib/open_project/backlogs/engine.rb index d2e277df597d..0129945736be 100644 --- a/modules/backlogs/lib/open_project/backlogs/engine.rb +++ b/modules/backlogs/lib/open_project/backlogs/engine.rb @@ -130,11 +130,9 @@ def self.settings patches %i[PermittedParams WorkPackage - Project - Version] + Project] patch_with_namespace :BasicData, :SettingSeeder - patch_with_namespace :DemoData, :ProjectSeeder patch_with_namespace :WorkPackages, :SetAttributesService patch_with_namespace :WorkPackages, :BaseContract patch_with_namespace :WorkPackages, :UpdateContract @@ -142,10 +140,6 @@ def self.settings patch_with_namespace :API, :V3, :WorkPackages, :Schema, :SpecificWorkPackageSchema config.to_prepare do - next if Versions::BaseContract.include?(OpenProject::Backlogs::Patches::Versions::BaseContractPatch) - - Versions::BaseContract.prepend(OpenProject::Backlogs::Patches::Versions::BaseContractPatch) - # Add available settings to the user preferences UserPreferences::Schema.merge!( "definitions/UserPreferences/properties", diff --git a/modules/backlogs/lib/open_project/backlogs/patches/project_seeder_patch.rb b/modules/backlogs/lib/open_project/backlogs/patches/project_seeder_patch.rb deleted file mode 100644 index 05ca3cbdd311..000000000000 --- a/modules/backlogs/lib/open_project/backlogs/patches/project_seeder_patch.rb +++ /dev/null @@ -1,62 +0,0 @@ -#-- copyright -# OpenProject is an open source project management software. -# Copyright (C) the OpenProject GmbH -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License version 3. -# -# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: -# Copyright (C) 2006-2013 Jean-Philippe Lang -# Copyright (C) 2010-2013 the ChiliProject Team -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# See COPYRIGHT and LICENSE files for more details. -#++ - -module OpenProject::Backlogs::Patches::ProjectSeederPatch - def self.included(base) # :nodoc: - base.prepend InstanceMethods - end - - module InstanceMethods - def seed_versions - super - - version_data = Array(project_data.lookup("versions")) - return if version_data.blank? - - versions = version_data - .filter_map { |data| Version.find_by(name: data["name"]) } - - versions.each do |version| - display = version_settings_display_map[version.name] || VersionSetting::DISPLAY_NONE - version.version_settings.create! display:, project: version.project - end - end - - ## - # This relies on the names from the core's `config/locales/en.seeders.yml`. - def version_settings_display_map - { - "Sprint 1" => VersionSetting::DISPLAY_LEFT, - "Sprint 2" => VersionSetting::DISPLAY_LEFT, - "Bug Backlog" => VersionSetting::DISPLAY_RIGHT, - "Product Backlog" => VersionSetting::DISPLAY_RIGHT, - "Wish List" => VersionSetting::DISPLAY_RIGHT - } - end - end -end diff --git a/modules/backlogs/lib/open_project/backlogs/patches/version_patch.rb b/modules/backlogs/lib/open_project/backlogs/patches/version_patch.rb deleted file mode 100644 index 5619807a47a3..000000000000 --- a/modules/backlogs/lib/open_project/backlogs/patches/version_patch.rb +++ /dev/null @@ -1,39 +0,0 @@ -# frozen_string_literal: true - -#-- copyright -# OpenProject is an open source project management software. -# Copyright (C) the OpenProject GmbH -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License version 3. -# -# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: -# Copyright (C) 2006-2013 Jean-Philippe Lang -# Copyright (C) 2010-2013 the ChiliProject Team -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# See COPYRIGHT and LICENSE files for more details. -#++ - -module OpenProject::Backlogs::Patches::VersionPatch - def self.included(base) - base.class_eval do - has_many :version_settings, dependent: :destroy - end - end -end - -Version.include OpenProject::Backlogs::Patches::VersionPatch diff --git a/modules/backlogs/lib/open_project/backlogs/patches/versions/base_contract_patch.rb b/modules/backlogs/lib/open_project/backlogs/patches/versions/base_contract_patch.rb deleted file mode 100644 index 1d501099c873..000000000000 --- a/modules/backlogs/lib/open_project/backlogs/patches/versions/base_contract_patch.rb +++ /dev/null @@ -1,45 +0,0 @@ -#-- copyright -# OpenProject is an open source project management software. -# Copyright (C) the OpenProject GmbH -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License version 3. -# -# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: -# Copyright (C) 2006-2013 Jean-Philippe Lang -# Copyright (C) 2010-2013 the ChiliProject Team -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# See COPYRIGHT and LICENSE files for more details. -#++ - -module OpenProject::Backlogs::Patches::Versions::BaseContractPatch - private - - def user_allowed_to_manage - changed_settings = model.version_settings.select(&:changed?) - - super unless !model.changed? && changed_settings.any? - - # Make sure the version_settings (column=left|right|none) can only be stored - # for projects the user has the :manage_versions permission in. - changed_settings.each do |version_setting| - unless user.allowed_in_project?(:manage_versions, Project.find_by(id: version_setting.project_id)) - errors.add :base, :error_unauthorized - end - end - end -end diff --git a/modules/backlogs/spec/factories/version_setting_factory.rb b/modules/backlogs/spec/factories/version_setting_factory.rb deleted file mode 100644 index 77a2a7a43ea9..000000000000 --- a/modules/backlogs/spec/factories/version_setting_factory.rb +++ /dev/null @@ -1,32 +0,0 @@ -#-- copyright -# OpenProject is an open source project management software. -# Copyright (C) the OpenProject GmbH -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License version 3. -# -# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: -# Copyright (C) 2006-2013 Jean-Philippe Lang -# Copyright (C) 2010-2013 the ChiliProject Team -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# See COPYRIGHT and LICENSE files for more details. -#++ - -FactoryBot.define do - factory :version_setting do - end -end diff --git a/modules/backlogs/spec/migrations/migrate_versions_to_sprints_spec.rb b/modules/backlogs/spec/migrations/migrate_versions_to_sprints_spec.rb index 911367da7e94..b0700810cc4e 100644 --- a/modules/backlogs/spec/migrations/migrate_versions_to_sprints_spec.rb +++ b/modules/backlogs/spec/migrations/migrate_versions_to_sprints_spec.rb @@ -30,6 +30,7 @@ require "spec_helper" require Rails.root.join("modules/backlogs/db/migrate/20260313164539_migrate_versions_to_sprints") +require Rails.root.join("modules/backlogs/db/migrate/20260420160236_remove_version_settings") RSpec.describe MigrateVersionsToSprints, type: :model do subject(:migrate) { ActiveRecord::Migration.suppress_messages { described_class.migrate(:up) } } @@ -46,11 +47,26 @@ def use_version(as:, version: self.version, project: self.project) display = case as - when :sprint then VersionSetting::DISPLAY_LEFT - when :backlog then VersionSetting::DISPLAY_RIGHT - else VersionSetting::DISPLAY_NONE + when :sprint then described_class::MigrationVersionSetting::DISPLAY_LEFT + when :backlog then described_class::MigrationVersionSetting::DISPLAY_RIGHT + else 1 end - create(:version_setting, version:, project:, display:) + + ActiveRecord::Migration.suppress_messages do + ActiveRecord::Migration.execute(<<~SQL.squish) + INSERT INTO version_settings + (project_id, version_id, display, created_at, updated_at) + VALUES (#{project.id}, #{version.id}, #{display}, NOW(), NOW()) + SQL + end + end + + around(:all) do |example| + # In this test: RemoveVersionSettings has already run. + # In production: RemoveVersionSettings runs after MigrateVersionsToSprints. + ActiveRecord::Migration.suppress_messages { RemoveVersionSettings.migrate(:down) } + example.run + ActiveRecord::Migration.suppress_messages { RemoveVersionSettings.migrate(:up) } end before { use_version(as: version_type) } diff --git a/modules/backlogs/spec/models/version_setting_spec.rb b/modules/backlogs/spec/models/version_setting_spec.rb deleted file mode 100644 index 925d7b706d0c..000000000000 --- a/modules/backlogs/spec/models/version_setting_spec.rb +++ /dev/null @@ -1,37 +0,0 @@ -#-- copyright -# OpenProject is an open source project management software. -# Copyright (C) the OpenProject GmbH -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License version 3. -# -# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: -# Copyright (C) 2006-2013 Jean-Philippe Lang -# Copyright (C) 2010-2013 the ChiliProject Team -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# See COPYRIGHT and LICENSE files for more details. -#++ - -require "spec_helper" - -RSpec.describe VersionSetting do - let(:version_setting) { build(:version_setting) } - - it { is_expected.to belong_to(:project) } - it { is_expected.to belong_to(:version) } - it { expect(VersionSetting.column_names).to include("display") } -end diff --git a/spec/seeders/root_seeder_standard_edition_spec.rb b/spec/seeders/root_seeder_standard_edition_spec.rb index 54099c6d3fc3..7d1a43d17347 100644 --- a/spec/seeders/root_seeder_standard_edition_spec.rb +++ b/spec/seeders/root_seeder_standard_edition_spec.rb @@ -66,7 +66,6 @@ expect(GlobalRole.count).to eq 2 expect(Grids::Overview.count).to eq 2 expect(Version.count).to eq 4 - expect(VersionSetting.count).to eq 4 expect(Boards::Grid.count).to eq 5 expect(Boards::Grid.count { |grid| grid.options.has_key?(:filters) }).to eq 1 expect(Project::PhaseDefinition.count).to eq 4 @@ -198,7 +197,6 @@ expect(GlobalRole.count).to eq 2 expect(Grids::Overview.count).to eq 2 expect(Version.count).to eq 4 - expect(VersionSetting.count).to eq 4 expect(Boards::Grid.count).to eq 5 expect(Project::PhaseDefinition.count).to eq 4 end From c03a249fb7adad81cfabdbdfd8096c22ad312722 Mon Sep 17 00:00:00 2001 From: ulferts Date: Tue, 21 Apr 2026 17:58:42 +0200 Subject: [PATCH 3/7] consolidate wp specs - remove done? method --- .../backlogs/patches/work_package_patch.rb | 4 - modules/backlogs/spec/models/issue_spec.rb | 137 ------------------ .../backlogs/spec/models/work_package_spec.rb | 77 ++++++++++ 3 files changed, 77 insertions(+), 141 deletions(-) delete mode 100644 modules/backlogs/spec/models/issue_spec.rb diff --git a/modules/backlogs/lib/open_project/backlogs/patches/work_package_patch.rb b/modules/backlogs/lib/open_project/backlogs/patches/work_package_patch.rb index 8221ed1588b7..07a81c8eb1c1 100644 --- a/modules/backlogs/lib/open_project/backlogs/patches/work_package_patch.rb +++ b/modules/backlogs/lib/open_project/backlogs/patches/work_package_patch.rb @@ -56,10 +56,6 @@ def order_by_position end module InstanceMethods - def done? - project.done_statuses.to_a.include?(status) - end - def backlogs_enabled? project&.backlogs_enabled? end diff --git a/modules/backlogs/spec/models/issue_spec.rb b/modules/backlogs/spec/models/issue_spec.rb deleted file mode 100644 index 0f324ca2a130..000000000000 --- a/modules/backlogs/spec/models/issue_spec.rb +++ /dev/null @@ -1,137 +0,0 @@ -#-- copyright -# OpenProject is an open source project management software. -# Copyright (C) the OpenProject GmbH -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License version 3. -# -# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: -# Copyright (C) 2006-2013 Jean-Philippe Lang -# Copyright (C) 2010-2013 the ChiliProject Team -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# See COPYRIGHT and LICENSE files for more details. -#++ - -require "spec_helper" - -RSpec.describe WorkPackage do - describe "validations" do - let(:work_package) do - build(:work_package) - end - - describe "story points" do - before do - work_package.project.enabled_module_names += ["backlogs"] - end - - it "allows empty values" do - expect(work_package.story_points).to be_nil - expect(work_package).to be_valid - end - - it "allows values greater than or equal to 0" do - work_package.story_points = "0" - expect(work_package).to be_valid - - work_package.story_points = "1" - expect(work_package).to be_valid - end - - it "allows values less than 10.000" do - work_package.story_points = "9999" - expect(work_package).to be_valid - end - - it "disallows negative values" do - work_package.story_points = "-1" - expect(work_package).not_to be_valid - end - - it "disallows greater or equal than 10.000" do - work_package.story_points = "10000" - expect(work_package).not_to be_valid - - work_package.story_points = "10001" - expect(work_package).not_to be_valid - end - - it "disallows string values, that are not numbers" do - work_package.story_points = "abc" - expect(work_package).not_to be_valid - end - - it "disallows non-integers" do - work_package.story_points = "1.3" - expect(work_package).not_to be_valid - end - end - end - - describe "definition of done" do - before do - @status_resolved = build(:status, name: "Resolved", is_default: false) - @status_open = build(:status, name: "Open", is_default: true) - @project = build(:project) - @project.done_statuses = [@status_resolved] - @project.types = [build(:type_feature)] - - @work_package = build(:work_package, project: @project, - status: @status_open, - type: build(:type_feature)) - end - - it 'is not done when having the initial status "open"' do - expect(@work_package.done?).to be_falsey - end - - it 'is done when having the status "resolved"' do - @work_package.status = @status_resolved - expect(@work_package.done?).to be_truthy - end - - it 'is not done when removing done status from "resolved"' do - @work_package.status = @status_resolved - @project.done_statuses = Array.new - expect(@work_package.done?).to be_falsey - end - end - - describe "backlogs_enabled?" do - let(:project) { build(:project) } - let(:work_package) { build(:work_package) } - - it "is false without a project" do - work_package.project = nil - expect(work_package).not_to be_backlogs_enabled - end - - it "is true with a project having the backlogs module" do - project.enabled_module_names = project.enabled_module_names + ["backlogs"] - work_package.project = project - - expect(work_package).to be_backlogs_enabled - end - - it "is false with a project not having the backlogs module" do - work_package.project = project - work_package.project.enabled_module_names = nil - - expect(work_package).not_to be_backlogs_enabled - end - end -end diff --git a/modules/backlogs/spec/models/work_package_spec.rb b/modules/backlogs/spec/models/work_package_spec.rb index 1a17553e497c..ae79a61753bb 100644 --- a/modules/backlogs/spec/models/work_package_spec.rb +++ b/modules/backlogs/spec/models/work_package_spec.rb @@ -36,6 +36,83 @@ it { is_expected.to belong_to(:sprint).class_name("Sprint").optional(true) } end + describe "validations" do + let(:work_package) do + build(:work_package) + end + + describe "story points" do + before do + work_package.project.enabled_module_names += ["backlogs"] + end + + it "allows empty values" do + expect(work_package.story_points).to be_nil + expect(work_package).to be_valid + end + + it "allows values greater than or equal to 0" do + work_package.story_points = "0" + expect(work_package).to be_valid + + work_package.story_points = "1" + expect(work_package).to be_valid + end + + it "allows values less than 10.000" do + work_package.story_points = "9999" + expect(work_package).to be_valid + end + + it "disallows negative values" do + work_package.story_points = "-1" + expect(work_package).not_to be_valid + end + + it "disallows greater or equal than 10.000" do + work_package.story_points = "10000" + expect(work_package).not_to be_valid + + work_package.story_points = "10001" + expect(work_package).not_to be_valid + end + + it "disallows string values, that are not numbers" do + work_package.story_points = "abc" + expect(work_package).not_to be_valid + end + + it "disallows non-integers" do + work_package.story_points = "1.3" + expect(work_package).not_to be_valid + end + end + end + + describe "#backlogs_enabled?" do + let(:project) { build(:project) } + let(:work_package) { build(:work_package) } + + it "is false without a project" do + work_package.project = nil + expect(work_package).not_to be_backlogs_enabled + end + + it "is true with a project having the backlogs module" do + project.enabled_module_names = project.enabled_module_names + ["backlogs"] + work_package.project = project + + expect(work_package).to be_backlogs_enabled + end + + it "is false with a project not having the backlogs module" do + work_package.project = project + work_package.project.enabled_module_names = nil + + expect(work_package).not_to be_backlogs_enabled + end + end + describe ".order_by_position" do let(:work_packages) { create_list(:work_package, 3) } From 8741ea4995cc94a6ce51959232db58960daec8a3 Mon Sep 17 00:00:00 2001 From: ulferts Date: Tue, 21 Apr 2026 18:11:52 +0200 Subject: [PATCH 4/7] move Backlog scope into WorkPackage scope --- .../backlogs/backlog_controller.rb | 2 +- .../controllers/backlogs/inbox_controller.rb | 4 +- .../backlogs/work_packages_controller.rb | 2 +- .../scopes/backlogs_inbox_for.rb} | 51 +++++----- .../backlogs/patches/work_package_patch.rb | 2 + modules/backlogs/spec/models/backlog_spec.rb | 93 ------------------- .../scopes/backlogs_inbox_for_spec.rb | 71 ++++++++++++++ 7 files changed, 98 insertions(+), 127 deletions(-) rename modules/backlogs/app/models/{backlog.rb => work_packages/scopes/backlogs_inbox_for.rb} (62%) delete mode 100644 modules/backlogs/spec/models/backlog_spec.rb create mode 100644 modules/backlogs/spec/models/work_packages/scopes/backlogs_inbox_for_spec.rb diff --git a/modules/backlogs/app/controllers/backlogs/backlog_controller.rb b/modules/backlogs/app/controllers/backlogs/backlog_controller.rb index ebc119f37c23..662bee529471 100644 --- a/modules/backlogs/app/controllers/backlogs/backlog_controller.rb +++ b/modules/backlogs/app/controllers/backlogs/backlog_controller.rb @@ -79,7 +79,7 @@ def load_backlogs .order_by_position .group_by(&:sprint_id) @active_sprint_ids = @sprints.select(&:active?).map(&:id) - @inbox_work_packages = Backlog.inbox_for(project: @project) + @inbox_work_packages = WorkPackage.backlogs_inbox_for(project: @project) end end end diff --git a/modules/backlogs/app/controllers/backlogs/inbox_controller.rb b/modules/backlogs/app/controllers/backlogs/inbox_controller.rb index 223399f8d6df..271cb2450a9f 100644 --- a/modules/backlogs/app/controllers/backlogs/inbox_controller.rb +++ b/modules/backlogs/app/controllers/backlogs/inbox_controller.rb @@ -40,7 +40,7 @@ def menu backlog_items_scope = if OpenProject::FeatureDecisions.backlog_buckets_active? && @work_package.backlog_bucket_id @work_package.backlog_bucket.work_packages else - Backlog.inbox_for(project: @project) + WorkPackage.backlogs_inbox_for(project: @project) end max_position = backlog_items_scope.maximum(:position) || 0 @@ -99,7 +99,7 @@ def load_work_package end def replace_inbox_component_via_turbo_stream - inbox_work_packages = Backlog.inbox_for(project: @project) + inbox_work_packages = WorkPackage.backlogs_inbox_for(project: @project) backlog_buckets = if OpenProject::FeatureDecisions.backlog_buckets_active? Agile::BacklogBucket.for_project(@project) end diff --git a/modules/backlogs/app/controllers/backlogs/work_packages_controller.rb b/modules/backlogs/app/controllers/backlogs/work_packages_controller.rb index 37da2843ecc5..f319223f64b3 100644 --- a/modules/backlogs/app/controllers/backlogs/work_packages_controller.rb +++ b/modules/backlogs/app/controllers/backlogs/work_packages_controller.rb @@ -125,7 +125,7 @@ def moved_to_inbox render_success_flash_message_via_turbo_stream( message: I18n.t(:notice_successful_move, from: @sprint.name, to: I18n.t(:label_inbox)) ) - inbox_work_packages = Backlog.inbox_for(project: @project) + inbox_work_packages = WorkPackage.backlogs_inbox_for(project: @project) backlog_buckets = if OpenProject::FeatureDecisions.backlog_buckets_active? Agile::BacklogBucket.for_project(@project) end diff --git a/modules/backlogs/app/models/backlog.rb b/modules/backlogs/app/models/work_packages/scopes/backlogs_inbox_for.rb similarity index 62% rename from modules/backlogs/app/models/backlog.rb rename to modules/backlogs/app/models/work_packages/scopes/backlogs_inbox_for.rb index b9c8a3aae3f2..89d0dacbd549 100644 --- a/modules/backlogs/app/models/backlog.rb +++ b/modules/backlogs/app/models/work_packages/scopes/backlogs_inbox_for.rb @@ -1,4 +1,6 @@ -#-- copyright +# frozen_string_literal: true + +# -- copyright # OpenProject is an open source project management software. # Copyright (C) the OpenProject GmbH # @@ -24,37 +26,26 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # See COPYRIGHT and LICENSE files for more details. -#++ - -class Backlog - extend ActiveModel::Naming - - attr_accessor :sprint, :stories - - delegate :id, to: :sprint, prefix: true +# ++ - def self.inbox_for(project:) - inbox_condition = if OpenProject::FeatureDecisions.backlog_buckets_active? - { sprint_id: nil, backlog_bucket_id: nil } - else - { sprint_id: nil } - end +module WorkPackages::Scopes::BacklogsInboxFor + extend ActiveSupport::Concern - WorkPackage - .visible - .with_status_open - .where(project:, **inbox_condition) - .includes(:type) - .order_by_position - .order(WorkPackage.arel_table[:id].asc) - end - - def initialize(sprint:, stories:) - @sprint = sprint - @stories = stories - end + class_methods do + def backlogs_inbox_for(project:) + inbox_condition = if OpenProject::FeatureDecisions.backlog_buckets_active? + { sprint_id: nil, backlog_bucket_id: nil } + else + { sprint_id: nil } + end - def to_key - [sprint_id] + WorkPackage + .visible + .with_status_open + .where(project:, **inbox_condition) + .includes(:type) + .order_by_position + .order(WorkPackage.arel_table[:id].asc) + end end end diff --git a/modules/backlogs/lib/open_project/backlogs/patches/work_package_patch.rb b/modules/backlogs/lib/open_project/backlogs/patches/work_package_patch.rb index 07a81c8eb1c1..4b941842685d 100644 --- a/modules/backlogs/lib/open_project/backlogs/patches/work_package_patch.rb +++ b/modules/backlogs/lib/open_project/backlogs/patches/work_package_patch.rb @@ -47,6 +47,8 @@ module OpenProject::Backlogs::Patches::WorkPackagePatch belongs_to :sprint, optional: true include OpenProject::Backlogs::List + + scopes :backlogs_inbox_for end module ClassMethods diff --git a/modules/backlogs/spec/models/backlog_spec.rb b/modules/backlogs/spec/models/backlog_spec.rb deleted file mode 100644 index 9e65d6b1b423..000000000000 --- a/modules/backlogs/spec/models/backlog_spec.rb +++ /dev/null @@ -1,93 +0,0 @@ -#-- copyright -# OpenProject is an open source project management software. -# Copyright (C) the OpenProject GmbH -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License version 3. -# -# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: -# Copyright (C) 2006-2013 Jean-Philippe Lang -# Copyright (C) 2010-2013 the ChiliProject Team -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# See COPYRIGHT and LICENSE files for more details. -#++ - -require "spec_helper" - -RSpec.describe Backlog do - let(:project) { build(:project) } - - before do - @status = create(:status) - end - - describe "Class Methods" do - describe ".inbox_for" do - let(:project) { create(:project) } - let(:open_status) { create(:status, is_closed: false) } - let(:closed_status) { create(:status, is_closed: true) } - let(:sprint) { create(:sprint, project:) } - - before { login_as create(:admin) } - - subject(:inbox) { described_class.inbox_for(project:) } - - it "returns work packages with no sprint assigned and open status" do - inbox_wp = create(:work_package, project:, status: open_status) - create(:work_package, project:, status: closed_status) - create(:work_package, project:, status: open_status, sprint:) - - expect(inbox).to contain_exactly(inbox_wp) - end - - it "excludes work packages from other projects" do - create(:work_package, status: open_status) - own_wp = create(:work_package, project:, status: open_status) - - expect(inbox).to contain_exactly(own_wp) - end - - it "orders by position ascending, falling back to id for unpositioned items" do - wp1 = create(:work_package, project:, status: open_status, position: 2) - wp2 = create(:work_package, project:, status: open_status, position: 1) - wp3 = create(:work_package, project:, status: open_status, position: nil) - wp4 = create(:work_package, project:, status: open_status, position: nil) - - wp3.update_column(:position, nil) - wp4.update_column(:position, nil) - - expect(inbox).to eq([wp2, wp1, wp3, wp4]) - end - end - - end - - describe "ActiveModel naming" do - let(:sprint) { build_stubbed(:sprint) } - - subject(:instance) { described_class.new(sprint:, stories: []) } - - it "exposes an ActiveModel model_name" do - expect(described_class).to respond_to(:model_name) - expect(described_class.model_name).to respond_to(:param_key) - end - - it "implements #to_key" do - expect(instance).to respond_to(:to_key) - end - end -end diff --git a/modules/backlogs/spec/models/work_packages/scopes/backlogs_inbox_for_spec.rb b/modules/backlogs/spec/models/work_packages/scopes/backlogs_inbox_for_spec.rb new file mode 100644 index 000000000000..2a41587c9f87 --- /dev/null +++ b/modules/backlogs/spec/models/work_packages/scopes/backlogs_inbox_for_spec.rb @@ -0,0 +1,71 @@ +# frozen_string_literal: true + +# -- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +# ++ + +require "spec_helper" + +RSpec.describe WorkPackages::Scopes::BacklogsInboxFor do + let(:project) { create(:project) } + let(:open_status) { create(:status, is_closed: false) } + let(:closed_status) { create(:status, is_closed: true) } + let(:sprint) { create(:sprint, project:) } + + before { login_as create(:admin) } + + subject(:inbox) { WorkPackage.backlogs_inbox_for(project:) } + + describe ".backlogs_inbox_for" do + it "returns work packages with no sprint assigned and open status" do + inbox_wp = create(:work_package, project:, status: open_status) + create(:work_package, project:, status: closed_status) + create(:work_package, project:, status: open_status, sprint:) + + expect(inbox).to contain_exactly(inbox_wp) + end + + it "excludes work packages from other projects" do + create(:work_package, status: open_status) + own_wp = create(:work_package, project:, status: open_status) + + expect(inbox).to contain_exactly(own_wp) + end + + it "orders by position ascending, falling back to id for unpositioned items" do + wp1 = create(:work_package, project:, status: open_status, position: 2) + wp2 = create(:work_package, project:, status: open_status, position: 1) + wp3 = create(:work_package, project:, status: open_status, position: nil) + wp4 = create(:work_package, project:, status: open_status, position: nil) + + wp3.update_column(:position, nil) + wp4.update_column(:position, nil) + + expect(inbox).to eq([wp2, wp1, wp3, wp4]) + end + end +end From ba3c07641e3987660e555f89c739f9bfb1fc9430 Mon Sep 17 00:00:00 2001 From: ulferts Date: Tue, 21 Apr 2026 18:13:58 +0200 Subject: [PATCH 5/7] remove story and task models --- modules/backlogs/app/models/story.rb | 31 ------ modules/backlogs/app/models/task.rb | 33 ------ .../app/services/stories/create_service.rb | 47 -------- .../app/services/stories/update_service.rb | 2 + .../backlogs/mixins/prevent_issue_sti.rb | 45 -------- .../backlogs/sprint_header_component_spec.rb | 18 ++-- .../work_packages/story_points_spec.rb | 11 +- modules/backlogs/spec/models/burndown_spec.rb | 83 +++++++------- modules/backlogs/spec/models/task_spec.rb | 98 ----------------- .../services/stories/create_service_spec.rb | 101 ------------------ 10 files changed, 57 insertions(+), 412 deletions(-) delete mode 100644 modules/backlogs/app/models/story.rb delete mode 100644 modules/backlogs/app/models/task.rb delete mode 100644 modules/backlogs/app/services/stories/create_service.rb delete mode 100644 modules/backlogs/lib/open_project/backlogs/mixins/prevent_issue_sti.rb delete mode 100644 modules/backlogs/spec/models/task_spec.rb delete mode 100644 modules/backlogs/spec/services/stories/create_service_spec.rb diff --git a/modules/backlogs/app/models/story.rb b/modules/backlogs/app/models/story.rb deleted file mode 100644 index dd7378f1ae52..000000000000 --- a/modules/backlogs/app/models/story.rb +++ /dev/null @@ -1,31 +0,0 @@ -#-- copyright -# OpenProject is an open source project management software. -# Copyright (C) the OpenProject GmbH -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License version 3. -# -# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: -# Copyright (C) 2006-2013 Jean-Philippe Lang -# Copyright (C) 2010-2013 the ChiliProject Team -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# See COPYRIGHT and LICENSE files for more details. -#++ - -class Story < WorkPackage - extend OpenProject::Backlogs::Mixins::PreventIssueSti -end diff --git a/modules/backlogs/app/models/task.rb b/modules/backlogs/app/models/task.rb deleted file mode 100644 index 5ca78e0653c7..000000000000 --- a/modules/backlogs/app/models/task.rb +++ /dev/null @@ -1,33 +0,0 @@ -#-- copyright -# OpenProject is an open source project management software. -# Copyright (C) the OpenProject GmbH -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License version 3. -# -# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: -# Copyright (C) 2006-2013 Jean-Philippe Lang -# Copyright (C) 2010-2013 the ChiliProject Team -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# See COPYRIGHT and LICENSE files for more details. -#++ - -require "date" - -class Task < WorkPackage - extend OpenProject::Backlogs::Mixins::PreventIssueSti -end diff --git a/modules/backlogs/app/services/stories/create_service.rb b/modules/backlogs/app/services/stories/create_service.rb deleted file mode 100644 index d8c523914b93..000000000000 --- a/modules/backlogs/app/services/stories/create_service.rb +++ /dev/null @@ -1,47 +0,0 @@ -#-- copyright -# OpenProject is an open source project management software. -# Copyright (C) the OpenProject GmbH -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License version 3. -# -# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: -# Copyright (C) 2006-2013 Jean-Philippe Lang -# Copyright (C) 2010-2013 the ChiliProject Team -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# See COPYRIGHT and LICENSE files for more details. -#++ - -class Stories::CreateService - attr_accessor :user - - def initialize(user:) - self.user = user - end - - def call(attributes: {}, position: nil) - create_call = WorkPackages::CreateService - .new(user:) - .call(**attributes.symbolize_keys) - - if create_call.success? - create_call.result.move_after position: - end - - create_call - end -end diff --git a/modules/backlogs/app/services/stories/update_service.rb b/modules/backlogs/app/services/stories/update_service.rb index 046202e8890e..89baf4c30856 100644 --- a/modules/backlogs/app/services/stories/update_service.rb +++ b/modules/backlogs/app/services/stories/update_service.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + #-- copyright # OpenProject is an open source project management software. # Copyright (C) the OpenProject GmbH diff --git a/modules/backlogs/lib/open_project/backlogs/mixins/prevent_issue_sti.rb b/modules/backlogs/lib/open_project/backlogs/mixins/prevent_issue_sti.rb deleted file mode 100644 index 7751f31d00d5..000000000000 --- a/modules/backlogs/lib/open_project/backlogs/mixins/prevent_issue_sti.rb +++ /dev/null @@ -1,45 +0,0 @@ -#-- copyright -# OpenProject is an open source project management software. -# Copyright (C) the OpenProject GmbH -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License version 3. -# -# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: -# Copyright (C) 2006-2013 Jean-Philippe Lang -# Copyright (C) 2010-2013 the ChiliProject Team -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# See COPYRIGHT and LICENSE files for more details. -#++ - -module OpenProject::Backlogs::Mixins - module PreventIssueSti - # Overrides ActiveRecord::Inheritance::ClassMethods#sti_name - # so that stories are stored and found with type-attribute = "WorkPackage" - def sti_name - "WorkPackage" - end - - # Overrides ActiveRecord::Inheritance::ClassMethods#find_sti_classes - # so that stories are instantiated correctly despite sti_name being "WorkPackage" - def find_sti_class(type_name) - type_name = to_s if type_name == "WorkPackage" - - super - end - end -end diff --git a/modules/backlogs/spec/components/backlogs/sprint_header_component_spec.rb b/modules/backlogs/spec/components/backlogs/sprint_header_component_spec.rb index 3499dc7b3bcf..6a51a1442682 100644 --- a/modules/backlogs/spec/components/backlogs/sprint_header_component_spec.rb +++ b/modules/backlogs/spec/components/backlogs/sprint_header_component_spec.rb @@ -50,9 +50,9 @@ def render_component(folded: false, active_sprint_ids: nil) end describe "show state (default)" do - context "with stories" do - let!(:story1) do - create(:story, + context "with work_packages" do + let!(:work_package1) do + create(:work_package, project:, type: type_feature, status: default_status, @@ -60,8 +60,8 @@ def render_component(folded: false, active_sprint_ids: nil) story_points: 5, sprint:) end - let!(:story2) do - create(:story, + let!(:work_package2) do + create(:work_package, project:, type: type_feature, status: default_status, @@ -69,8 +69,8 @@ def render_component(folded: false, active_sprint_ids: nil) story_points: 3, sprint:) end - let!(:story_with_nil_points) do - create(:story, + let!(:work_package_with_nil_points) do + create(:work_package, project:, type: type_feature, status: default_status, @@ -85,7 +85,7 @@ def render_component(folded: false, active_sprint_ids: nil) expect(page).to have_css("h3", text: "Sprint 1") end - it "shows story count via Primer::Beta::Counter" do + it "shows work_package count via Primer::Beta::Counter" do render_component expect(page).to have_css(".Counter", text: "3") @@ -128,7 +128,7 @@ def render_component(folded: false, active_sprint_ids: nil) context "with no stories" do let(:stories) { [] } - it "hides the story count counter" do + it "hides the work_package count counter" do render_component expect(page).to have_css(".Counter", text: "0", visible: :hidden) diff --git a/modules/backlogs/spec/features/work_packages/story_points_spec.rb b/modules/backlogs/spec/features/work_packages/story_points_spec.rb index 62b0a05953ae..53d5de003e1f 100644 --- a/modules/backlogs/spec/features/work_packages/story_points_spec.rb +++ b/modules/backlogs/spec/features/work_packages/story_points_spec.rb @@ -38,23 +38,18 @@ create(:project, enabled_module_names: %w(work_package_tracking backlogs)) end - let(:status) { create(:default_status) } - let(:story_type) { create(:type_feature) } - let(:task_type) { create(:type_feature) } describe "showing the story points on the work package show page" do let(:story_points) { 42 } - let(:story_with_sp) do - create(:story, - type: story_type, + let(:work_package_with_story_points) do + create(:work_package, author: current_user, project:, - status:, story_points:) end it "is displayed" do - wp_page = Pages::FullWorkPackage.new(story_with_sp) + wp_page = Pages::FullWorkPackage.new(work_package_with_story_points) wp_page.visit! wp_page.expect_subject diff --git a/modules/backlogs/spec/models/burndown_spec.rb b/modules/backlogs/spec/models/burndown_spec.rb index ad7eaaac5a80..221fdcb8fb48 100644 --- a/modules/backlogs/spec/models/burndown_spec.rb +++ b/modules/backlogs/spec/models/burndown_spec.rb @@ -29,12 +29,14 @@ require "spec_helper" RSpec.describe Burndown do - def set_attribute_journalized(story, attribute, value, day) - story.reload - story.send(attribute, value) - story.save! - story.journals[-2].update_columns(validity_period: story.journals[-2].created_at...day) if story.journals.count > 1 - story.journals[-1].update_columns(created_at: day, updated_at: day, validity_period: day..Float::INFINITY) + def set_attribute_journalized(work_package, attribute, value, day) + work_package.reload + work_package.send(attribute, value) + work_package.save! + if work_package.journals.many? + work_package.journals[-2].update_columns(validity_period: work_package.journals[-2].created_at...day) + end + work_package.journals[-1].update_columns(created_at: day, updated_at: day, validity_period: day..Float::INFINITY) end let(:project) { create(:project) } @@ -87,29 +89,30 @@ def set_attribute_journalized(story, attribute, value, day) sprint.save! end - describe "WITH 1 story assigned to the sprint" do - let(:story) do - build(:story, subject: "Story 1", - project:, - sprint:, - type: type_feature, - status: issue_open, - priority: issue_priority, - created_at: Time.zone.today - 20.days, - updated_at: Time.zone.today - 20.days) + describe "WITH 1 work_package assigned to the sprint" do + let(:work_package) do + build(:work_package, + subject: "WorkPackage 1", + project:, + sprint:, + type: type_feature, + status: issue_open, + priority: issue_priority, + created_at: Time.zone.today - 20.days, + updated_at: Time.zone.today - 20.days) end - describe "WITH the story having story_point defined on creation" do + describe "WITH the work_package having story_point defined on creation" do before do - story.story_points = 9 - story.save! - story.last_journal.update_columns(created_at: story.created_at, updated_at: story.created_at) + work_package.story_points = 9 + work_package.save! + work_package.last_journal.update_columns(created_at: work_package.created_at, updated_at: work_package.created_at) end - describe "WITH the story being closed and opened again within the sprint duration" do + describe "WITH the work_package being closed and opened again within the sprint duration" do before do - set_attribute_journalized story, :status_id=, issue_closed.id, 6.days.ago - set_attribute_journalized story, :status_id=, issue_open.id, 3.days.ago + set_attribute_journalized work_package, :status_id=, issue_closed.id, 6.days.ago + set_attribute_journalized work_package, :status_id=, issue_open.id, 3.days.ago end it { expect(burndown.story_points).to eql [9.0, 0.0, 0.0, 0.0, 9.0, 9.0] } @@ -124,14 +127,13 @@ def set_attribute_journalized(story, attribute, value, day) it { expect(burndown.story_points_ideal).to eql [9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 0.0] } end - describe "WITH the story marked as resolved and consequently 'done'" do + describe "WITH the work_package marked as resolved and consequently 'done'" do before do - set_attribute_journalized story, :status_id=, issue_resolved.id, 6.days.ago - set_attribute_journalized story, :status_id=, issue_open.id, 3.days.ago + set_attribute_journalized work_package, :status_id=, issue_resolved.id, 6.days.ago + set_attribute_journalized work_package, :status_id=, issue_open.id, 3.days.ago project.done_statuses << issue_resolved end - it { expect(story.done?).to be false } it { expect(burndown.story_points).to eql [9.0, 0.0, 0.0, 0.0, 9.0, 9.0] } end end @@ -142,14 +144,15 @@ def set_attribute_journalized(story, attribute, value, day) stories = [] 10.times do |i| - stories[i] = create(:story, subject: "Story #{i}", - project:, - sprint:, - type: type_feature, - status: issue_open, - priority: issue_priority, - created_at: Time.zone.today - (20 - i).days, - updated_at: Time.zone.today - (20 - i).days) + stories[i] = create(:work_package, + subject: "WorkPackage #{i}", + project:, + sprint:, + type: type_feature, + status: issue_open, + priority: issue_priority, + created_at: Time.zone.today - (20 - i).days, + updated_at: Time.zone.today - (20 - i).days) stories[i].last_journal.update_columns(created_at: stories[i].created_at, updated_at: stories[i].created_at, validity_period: stories[i].created_at..Float::INFINITY) @@ -158,14 +161,14 @@ def set_attribute_journalized(story, attribute, value, day) stories end - describe "WITH each story having story points defined at start" do + describe "WITH each work_package having story points defined at start" do before do stories.each do |s| set_attribute_journalized s, :story_points=, 10, sprint.start_date - 3.days end end - describe "WITH 5 stories having been reduced to 0 story points, one story per day" do + describe "WITH 5 stories having been reduced to 0 story points, one work_package per day" do before do 5.times do |i| set_attribute_journalized stories[i], :story_points=, nil, sprint.start_date + i.days + 1.hour @@ -192,10 +195,10 @@ def set_attribute_journalized(story, attribute, value, day) context "without dates on the sprint" do let(:sprint) { create(:sprint, project:, start_date: nil, finish_date: nil) } - let(:story) do - build(:story, + let(:work_package) do + build(:work_package, :created_in_past, - subject: "Story 1", + subject: "WorkPackage 1", project:, sprint:, type: type_feature, diff --git a/modules/backlogs/spec/models/task_spec.rb b/modules/backlogs/spec/models/task_spec.rb deleted file mode 100644 index c80f8c010cff..000000000000 --- a/modules/backlogs/spec/models/task_spec.rb +++ /dev/null @@ -1,98 +0,0 @@ -#-- copyright -# OpenProject is an open source project management software. -# Copyright (C) the OpenProject GmbH -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License version 3. -# -# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: -# Copyright (C) 2006-2013 Jean-Philippe Lang -# Copyright (C) 2010-2013 the ChiliProject Team -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# See COPYRIGHT and LICENSE files for more details. -#++ - -require "spec_helper" - -RSpec.describe Task do - let(:task_type) { create(:type) } - let(:default_status) { create(:default_status) } - let(:project) { create(:project) } - let(:task) do - build(:task, - project:, - status: default_status, - type: task_type) - end - - describe "having custom journables", with_settings: { journal_aggregation_time_minutes: 0 } do - let(:user) { create(:user) } - let(:role) do - create(:project_role, permissions: %i[add_work_packages manage_subtasks manage_work_packages view_work_packages]) - end - let(:member) { create(:member, principal: user, project:, roles: [role]) } - - before do - project.members << member - end - - describe "with unchanged custom field" do - let(:custom_field) { create(:work_package_custom_field, name: "TestingCustomField", field_format: "text") } - - before do - project.work_package_custom_fields << custom_field - task_type.custom_fields << custom_field - end - - it "must have the same journal when resaved" do - task.custom_field_values = { custom_field.id => "Example CF text" } - task.save! - - expect(task.journals.last.customizable_journals.count).to eq 1 - customizable_journal = task.journals.last.customizable_journals.first - - attributes = { id: task.id, parent_id: task.parent_id, status_id: task.status_id } - result = WorkPackages::UpdateService.new(user:, model: task).call(**attributes) - - expect(result).to be_success - task.reload - - expect(task.journals.last.customizable_journals.first).to eq customizable_journal - end - end - - describe "with attachment" do - let(:attachment) { build(:attachment) } - - it "must have the same journal when resaved" do - task.attachments << attachment - task.save! - - expect(task.journals.last.attachable_journals.count).to eq 1 - attachable_journal = task.journals.last.attachable_journals.first - - attributes = { id: task.id, parent_id: task.parent_id, status_id: task.status_id } - result = WorkPackages::UpdateService.new(user:, model: task).call(**attributes) - - expect(result).to be_success - task.reload - - expect(task.journals.last.attachable_journals.first).to eq attachable_journal - end - end - end -end diff --git a/modules/backlogs/spec/services/stories/create_service_spec.rb b/modules/backlogs/spec/services/stories/create_service_spec.rb deleted file mode 100644 index 0ee06ac9d8f9..000000000000 --- a/modules/backlogs/spec/services/stories/create_service_spec.rb +++ /dev/null @@ -1,101 +0,0 @@ -#-- copyright -# OpenProject is an open source project management software. -# Copyright (C) the OpenProject GmbH -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License version 3. -# -# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: -# Copyright (C) 2006-2013 Jean-Philippe Lang -# Copyright (C) 2010-2013 the ChiliProject Team -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# See COPYRIGHT and LICENSE files for more details. -#++ - -require "spec_helper" - -RSpec.describe Stories::CreateService, type: :model do - let(:priority) { create(:priority) } - let(:project) { create(:project, types: [type_feature]) } - let(:status) { create(:status) } - let(:type_feature) { create(:type_feature) } - - let(:user) do - create(:user, member_with_permissions: { project => %i(add_work_packages manage_subtasks assign_versions) }) - end - - let(:instance) do - described_class.new(user:) - end - - let(:attributes) do - { - project:, - status:, - type: type_feature, - priority:, - parent_id: story.id, - remaining_hours:, - subject: "some subject" - } - end - - let(:version) { create(:version, project:) } - - let(:story) do - create(:story, - version:, - project:, - status:, - type: type_feature, - priority:) - end - - before do - allow(User).to receive(:current).and_return(user) - end - - subject { instance.call(attributes:) } - - describe "creating a feature in a story" do - before do - subject - end - - context "with the feature being created with some remaining work (remaining hours)" do - let(:remaining_hours) { 15.0 } - - it "updates the story total work, total remaining work, and total % complete" do - expect(subject).to be_success - expect(story.reload).to have_attributes(derived_estimated_hours: 15, - derived_remaining_hours: 15, - derived_done_ratio: 0) - end - end - - context "with the feature being created without any remaining work (remaining hours)" do - let(:remaining_hours) { nil } - - it "does not change the story total work, total remaining work, and total % complete" do - expect(subject).to be_success - expect(story.reload).to have_attributes(derived_estimated_hours: nil, - derived_remaining_hours: nil, - derived_done_ratio: nil) - end - end - end -end From f48d7cf42c4846336879df470ddd7109f5fe5e66 Mon Sep 17 00:00:00 2001 From: ulferts Date: Thu, 23 Apr 2026 16:34:50 +0200 Subject: [PATCH 6/7] move Agile::Backlogs to Backlogs --- .../app/components/backlogs/backlogs_component.html.erb | 4 ++-- .../backlogs/app/contracts/backlog_buckets/base_contract.rb | 2 +- .../app/controllers/backlogs/backlog_buckets_controller.rb | 4 ++-- .../backlogs/app/controllers/backlogs/backlog_controller.rb | 2 +- .../backlogs/app/controllers/backlogs/inbox_controller.rb | 2 +- .../app/controllers/backlogs/work_packages_controller.rb | 2 +- modules/backlogs/app/models/backlog_bucket.rb | 2 +- .../backlogs/app/services/backlog_buckets/create_service.rb | 2 +- .../backlogs/app/services/backlog_buckets/update_service.rb | 2 +- .../lib/open_project/backlogs/patches/project_patch.rb | 4 ++-- .../lib/open_project/backlogs/patches/work_package_patch.rb | 2 +- .../spec/contracts/backlog_buckets/create_contract_spec.rb | 2 +- modules/backlogs/spec/factories/backlog_bucket_factory.rb | 2 +- .../backlogs/spec/features/backlog_buckets/create_spec.rb | 4 ++-- .../backlogs/spec/features/backlog_buckets/delete_spec.rb | 2 +- .../spec/features/backlogs/pagination_state_spec.rb | 2 +- modules/backlogs/spec/models/backlog_bucket_spec.rb | 2 +- modules/backlogs/spec/models/project_spec.rb | 2 +- modules/backlogs/spec/models/work_package_spec.rb | 2 +- .../spec/services/backlog_buckets/create_service_spec.rb | 2 +- .../services/backlog_buckets/set_attributes_service_spec.rb | 2 +- .../spec/services/backlog_buckets/update_service_spec.rb | 2 +- modules/backlogs/spec/support/pages/backlog.rb | 6 +++--- 23 files changed, 29 insertions(+), 29 deletions(-) diff --git a/modules/backlogs/app/components/backlogs/backlogs_component.html.erb b/modules/backlogs/app/components/backlogs/backlogs_component.html.erb index b627668d5865..1d8aeef61398 100644 --- a/modules/backlogs/app/components/backlogs/backlogs_component.html.erb +++ b/modules/backlogs/app/components/backlogs/backlogs_component.html.erb @@ -53,7 +53,7 @@ See COPYRIGHT and LICENSE files for more details. head.with_actions do render Primer::Beta::Button.new( tag: :a, - label: Agile::BacklogBucket.human_model_name, + label: BacklogBucket.human_model_name, href: new_dialog_project_backlogs_backlog_buckets_path(project, all_backlogs_params), data: { controller: "async-dialog", @@ -61,7 +61,7 @@ See COPYRIGHT and LICENSE files for more details. } ) do |button| button.with_leading_visual_icon(icon: :plus) - Agile::BacklogBucket.human_model_name + BacklogBucket.human_model_name end end elsif allow_sprint_creation?(project) diff --git a/modules/backlogs/app/contracts/backlog_buckets/base_contract.rb b/modules/backlogs/app/contracts/backlog_buckets/base_contract.rb index d8df0f59b2d4..e1f8d6d6aa9d 100644 --- a/modules/backlogs/app/contracts/backlog_buckets/base_contract.rb +++ b/modules/backlogs/app/contracts/backlog_buckets/base_contract.rb @@ -32,7 +32,7 @@ class BacklogBuckets::BaseContract < ModelContract validate :user_authorized def self.model - Agile::BacklogBucket + BacklogBucket end attribute :name diff --git a/modules/backlogs/app/controllers/backlogs/backlog_buckets_controller.rb b/modules/backlogs/app/controllers/backlogs/backlog_buckets_controller.rb index 801ef382f014..b22f337f2247 100644 --- a/modules/backlogs/app/controllers/backlogs/backlog_buckets_controller.rb +++ b/modules/backlogs/app/controllers/backlogs/backlog_buckets_controller.rb @@ -36,7 +36,7 @@ class BacklogBucketsController < BaseController before_action :find_backlog_bucket, only: %i[edit_dialog update destroy] def new_dialog - backlog_bucket = Agile::BacklogBucket.new(project: @project) + backlog_bucket = BacklogBucket.new(project: @project) respond_with_dialog Backlogs::NewBacklogBucketDialogComponent.new(backlog_bucket:) end @@ -104,7 +104,7 @@ def check_feature_flag end def find_backlog_bucket - @backlog_bucket = Agile::BacklogBucket.where(project: @project).find(params[:id]) + @backlog_bucket = BacklogBucket.where(project: @project).find(params[:id]) end def backlog_bucket_params diff --git a/modules/backlogs/app/controllers/backlogs/backlog_controller.rb b/modules/backlogs/app/controllers/backlogs/backlog_controller.rb index 662bee529471..30f82a063f07 100644 --- a/modules/backlogs/app/controllers/backlogs/backlog_controller.rb +++ b/modules/backlogs/app/controllers/backlogs/backlog_controller.rb @@ -65,7 +65,7 @@ def split_view_base_route def load_backlogs if OpenProject::FeatureDecisions.backlog_buckets_active? - @backlog_buckets = Agile::BacklogBucket.for_project(@project) + @backlog_buckets = BacklogBucket.for_project(@project) end @sprints = Sprint.for_project(@project) diff --git a/modules/backlogs/app/controllers/backlogs/inbox_controller.rb b/modules/backlogs/app/controllers/backlogs/inbox_controller.rb index 271cb2450a9f..278ed4c30cbc 100644 --- a/modules/backlogs/app/controllers/backlogs/inbox_controller.rb +++ b/modules/backlogs/app/controllers/backlogs/inbox_controller.rb @@ -101,7 +101,7 @@ def load_work_package def replace_inbox_component_via_turbo_stream inbox_work_packages = WorkPackage.backlogs_inbox_for(project: @project) backlog_buckets = if OpenProject::FeatureDecisions.backlog_buckets_active? - Agile::BacklogBucket.for_project(@project) + BacklogBucket.for_project(@project) end replace_via_turbo_stream( diff --git a/modules/backlogs/app/controllers/backlogs/work_packages_controller.rb b/modules/backlogs/app/controllers/backlogs/work_packages_controller.rb index f319223f64b3..cb8878c0703c 100644 --- a/modules/backlogs/app/controllers/backlogs/work_packages_controller.rb +++ b/modules/backlogs/app/controllers/backlogs/work_packages_controller.rb @@ -127,7 +127,7 @@ def moved_to_inbox ) inbox_work_packages = WorkPackage.backlogs_inbox_for(project: @project) backlog_buckets = if OpenProject::FeatureDecisions.backlog_buckets_active? - Agile::BacklogBucket.for_project(@project) + BacklogBucket.for_project(@project) end replace_via_turbo_stream( diff --git a/modules/backlogs/app/models/backlog_bucket.rb b/modules/backlogs/app/models/backlog_bucket.rb index 33f50c4828e0..099756bb79ed 100644 --- a/modules/backlogs/app/models/backlog_bucket.rb +++ b/modules/backlogs/app/models/backlog_bucket.rb @@ -28,7 +28,7 @@ # See COPYRIGHT and LICENSE files for more details. #++ -class Agile::BacklogBucket < ApplicationRecord +class BacklogBucket < ApplicationRecord self.table_name = "backlog_buckets" belongs_to :project diff --git a/modules/backlogs/app/services/backlog_buckets/create_service.rb b/modules/backlogs/app/services/backlog_buckets/create_service.rb index 741b1abf9558..9cdfc4b7fc17 100644 --- a/modules/backlogs/app/services/backlog_buckets/create_service.rb +++ b/modules/backlogs/app/services/backlog_buckets/create_service.rb @@ -30,6 +30,6 @@ class BacklogBuckets::CreateService < BaseServices::Create def instance_class - Agile::BacklogBucket + BacklogBucket end end diff --git a/modules/backlogs/app/services/backlog_buckets/update_service.rb b/modules/backlogs/app/services/backlog_buckets/update_service.rb index cf4f8ddfd07f..868e4fdefc36 100644 --- a/modules/backlogs/app/services/backlog_buckets/update_service.rb +++ b/modules/backlogs/app/services/backlog_buckets/update_service.rb @@ -30,6 +30,6 @@ class BacklogBuckets::UpdateService < BaseServices::Update def instance_class - Agile::BacklogBucket + BacklogBucket end end diff --git a/modules/backlogs/lib/open_project/backlogs/patches/project_patch.rb b/modules/backlogs/lib/open_project/backlogs/patches/project_patch.rb index 40c91d916a4e..bc399a890ea8 100644 --- a/modules/backlogs/lib/open_project/backlogs/patches/project_patch.rb +++ b/modules/backlogs/lib/open_project/backlogs/patches/project_patch.rb @@ -34,8 +34,8 @@ module OpenProject::Backlogs::Patches::ProjectPatch included do has_and_belongs_to_many :done_statuses, join_table: :done_statuses_for_project, class_name: "::Status" - has_many :backlog_buckets, class_name: "Agile::BacklogBucket", dependent: :destroy - has_many :sprints, class_name: "Sprint", dependent: :destroy + has_many :sprints, dependent: :destroy + has_many :backlog_buckets, dependent: :destroy end def backlogs_enabled? diff --git a/modules/backlogs/lib/open_project/backlogs/patches/work_package_patch.rb b/modules/backlogs/lib/open_project/backlogs/patches/work_package_patch.rb index 4b941842685d..f1df182caca8 100644 --- a/modules/backlogs/lib/open_project/backlogs/patches/work_package_patch.rb +++ b/modules/backlogs/lib/open_project/backlogs/patches/work_package_patch.rb @@ -43,8 +43,8 @@ module OpenProject::Backlogs::Patches::WorkPackagePatch less_than: 10_000, if: -> { backlogs_enabled? } - belongs_to :backlog_bucket, class_name: "Agile::BacklogBucket", optional: true belongs_to :sprint, optional: true + belongs_to :backlog_bucket, optional: true include OpenProject::Backlogs::List diff --git a/modules/backlogs/spec/contracts/backlog_buckets/create_contract_spec.rb b/modules/backlogs/spec/contracts/backlog_buckets/create_contract_spec.rb index 3be717f35b4f..47bee290864d 100644 --- a/modules/backlogs/spec/contracts/backlog_buckets/create_contract_spec.rb +++ b/modules/backlogs/spec/contracts/backlog_buckets/create_contract_spec.rb @@ -35,6 +35,6 @@ include_context "as backlog bucket contract" let(:backlog_bucket) do - Agile::BacklogBucket.new(name:, project:) + BacklogBucket.new(name:, project:) end end diff --git a/modules/backlogs/spec/factories/backlog_bucket_factory.rb b/modules/backlogs/spec/factories/backlog_bucket_factory.rb index c3f307471c35..892f078c4c42 100644 --- a/modules/backlogs/spec/factories/backlog_bucket_factory.rb +++ b/modules/backlogs/spec/factories/backlog_bucket_factory.rb @@ -29,7 +29,7 @@ #++ FactoryBot.define do - factory :backlog_bucket, class: "Agile::BacklogBucket" do + factory :backlog_bucket do sequence(:name) { |n| "#{n} #{'idea'.pluralize(n)} for another name for a bucket list" } project end diff --git a/modules/backlogs/spec/features/backlog_buckets/create_spec.rb b/modules/backlogs/spec/features/backlog_buckets/create_spec.rb index dba4ab57413a..b17c27406eff 100644 --- a/modules/backlogs/spec/features/backlog_buckets/create_spec.rb +++ b/modules/backlogs/spec/features/backlog_buckets/create_spec.rb @@ -61,7 +61,7 @@ expect_and_dismiss_flash type: :success, exact_message: "Successful creation." backlogs_page.expect_bucket_names_in_order("Discovery work") - bucket = Agile::BacklogBucket.find_by!(project:, name: "Discovery work") + bucket = BacklogBucket.find_by!(project:, name: "Discovery work") expect(bucket.work_packages).to be_empty end @@ -77,7 +77,7 @@ expect(page).to have_field "Name", validation_error: "can't be blank" end - expect(Agile::BacklogBucket.where(project:)).to be_empty + expect(BacklogBucket.where(project:)).to be_empty end context "without the :create_sprints permission" do diff --git a/modules/backlogs/spec/features/backlog_buckets/delete_spec.rb b/modules/backlogs/spec/features/backlog_buckets/delete_spec.rb index b9fb3f80a04a..19f9da3bbbcf 100644 --- a/modules/backlogs/spec/features/backlog_buckets/delete_spec.rb +++ b/modules/backlogs/spec/features/backlog_buckets/delete_spec.rb @@ -67,7 +67,7 @@ backlogs_page.expect_work_packages_in_backlog_inbox_in_order(work_packages: [bucket_wp1, bucket_wp2]) - expect(Agile::BacklogBucket.where(id: bucket.id)).to be_empty + expect(BacklogBucket.where(id: bucket.id)).to be_empty expect(bucket_wp1.reload.backlog_bucket_id).to be_nil expect(bucket_wp2.reload.backlog_bucket_id).to be_nil end diff --git a/modules/backlogs/spec/features/backlogs/pagination_state_spec.rb b/modules/backlogs/spec/features/backlogs/pagination_state_spec.rb index b69696066e83..57733c127104 100644 --- a/modules/backlogs/spec/features/backlogs/pagination_state_spec.rb +++ b/modules/backlogs/spec/features/backlogs/pagination_state_spec.rb @@ -81,7 +81,7 @@ expect_and_dismiss_flash type: :success, exact_message: "Successful creation." backlogs_page.expect_no_inbox_show_more - bucket = Agile::BacklogBucket.find_by!(project:, name: "New bucket") + bucket = BacklogBucket.find_by!(project:, name: "New bucket") # Edit backlog bucket backlogs_page.click_in_backlog_bucket_menu(bucket, "Edit backlog bucket") diff --git a/modules/backlogs/spec/models/backlog_bucket_spec.rb b/modules/backlogs/spec/models/backlog_bucket_spec.rb index d8614920a809..dccd5b19a2d0 100644 --- a/modules/backlogs/spec/models/backlog_bucket_spec.rb +++ b/modules/backlogs/spec/models/backlog_bucket_spec.rb @@ -30,7 +30,7 @@ require "rails_helper" -RSpec.describe Agile::BacklogBucket do +RSpec.describe BacklogBucket do shared_let(:project) { create(:project) } subject(:backlog_bucket) do diff --git a/modules/backlogs/spec/models/project_spec.rb b/modules/backlogs/spec/models/project_spec.rb index 1bd800f101dd..692a765ef57b 100644 --- a/modules/backlogs/spec/models/project_spec.rb +++ b/modules/backlogs/spec/models/project_spec.rb @@ -32,7 +32,7 @@ RSpec.describe Project do describe "associations" do - it { is_expected.to have_many(:backlog_buckets).class_name("Agile::BacklogBucket").dependent(:destroy) } it { is_expected.to have_many(:sprints).class_name("Sprint").dependent(:destroy) } + it { is_expected.to have_many(:backlog_buckets).class_name("BacklogBucket").dependent(:destroy) } end end diff --git a/modules/backlogs/spec/models/work_package_spec.rb b/modules/backlogs/spec/models/work_package_spec.rb index ae79a61753bb..43fa19d0f646 100644 --- a/modules/backlogs/spec/models/work_package_spec.rb +++ b/modules/backlogs/spec/models/work_package_spec.rb @@ -32,7 +32,7 @@ RSpec.describe WorkPackage do describe "associations" do - it { is_expected.to belong_to(:backlog_bucket).class_name("Agile::BacklogBucket").optional(true) } + it { is_expected.to belong_to(:backlog_bucket).class_name("BacklogBucket").optional(true) } it { is_expected.to belong_to(:sprint).class_name("Sprint").optional(true) } end diff --git a/modules/backlogs/spec/services/backlog_buckets/create_service_spec.rb b/modules/backlogs/spec/services/backlog_buckets/create_service_spec.rb index 06a8143a6d86..7966f339f7bb 100644 --- a/modules/backlogs/spec/services/backlog_buckets/create_service_spec.rb +++ b/modules/backlogs/spec/services/backlog_buckets/create_service_spec.rb @@ -33,7 +33,7 @@ RSpec.describe BacklogBuckets::CreateService, type: :model do it_behaves_like "BaseServices create service" do - let(:model_class) { Agile::BacklogBucket } + let(:model_class) { BacklogBucket } let(:factory) { :backlog_bucket } end end diff --git a/modules/backlogs/spec/services/backlog_buckets/set_attributes_service_spec.rb b/modules/backlogs/spec/services/backlog_buckets/set_attributes_service_spec.rb index c268bc83d545..420dfabe8e16 100644 --- a/modules/backlogs/spec/services/backlog_buckets/set_attributes_service_spec.rb +++ b/modules/backlogs/spec/services/backlog_buckets/set_attributes_service_spec.rb @@ -57,7 +57,7 @@ contract_options: {}) end let(:project) { create(:project) } - let(:backlog_bucket) { Agile::BacklogBucket.new } + let(:backlog_bucket) { BacklogBucket.new } let(:params) { { project: } } subject(:service_call) { instance.call(params) } diff --git a/modules/backlogs/spec/services/backlog_buckets/update_service_spec.rb b/modules/backlogs/spec/services/backlog_buckets/update_service_spec.rb index 6e4d1f144161..e88954343f0a 100644 --- a/modules/backlogs/spec/services/backlog_buckets/update_service_spec.rb +++ b/modules/backlogs/spec/services/backlog_buckets/update_service_spec.rb @@ -33,7 +33,7 @@ RSpec.describe BacklogBuckets::UpdateService, type: :model do it_behaves_like "BaseServices update service" do - let(:model_class) { Agile::BacklogBucket } + let(:model_class) { BacklogBucket } let(:factory) { :backlog_bucket } end end diff --git a/modules/backlogs/spec/support/pages/backlog.rb b/modules/backlogs/spec/support/pages/backlog.rb index df02fbdbedb0..7f3db6f404d2 100644 --- a/modules/backlogs/spec/support/pages/backlog.rb +++ b/modules/backlogs/spec/support/pages/backlog.rb @@ -367,19 +367,19 @@ def expect_work_packages_in_backlog_inbox_in_order(work_packages: []) def open_create_backlog_bucket_dialog within_owner_backlogs do - click_on accessible_name: Agile::BacklogBucket.human_model_name + click_on accessible_name: BacklogBucket.human_model_name end end def expect_new_backlog_bucket_button within_owner_backlogs do - expect(page).to have_link(Agile::BacklogBucket.human_model_name, exact: true) + expect(page).to have_link(BacklogBucket.human_model_name, exact: true) end end def expect_no_new_backlog_bucket_button within_owner_backlogs do - expect(page).to have_no_link(Agile::BacklogBucket.human_model_name, exact: true) + expect(page).to have_no_link(BacklogBucket.human_model_name, exact: true) end end From ce8577f3d50308ee989ee695752ba19c2f5366e6 Mon Sep 17 00:00:00 2001 From: ulferts Date: Mon, 27 Apr 2026 15:02:46 +0200 Subject: [PATCH 7/7] change column indexed for burndown chart --- .../20260427125502_modify_burndown_index.rb | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 modules/backlogs/db/migrate/20260427125502_modify_burndown_index.rb diff --git a/modules/backlogs/db/migrate/20260427125502_modify_burndown_index.rb b/modules/backlogs/db/migrate/20260427125502_modify_burndown_index.rb new file mode 100644 index 000000000000..f8aceb0b97bf --- /dev/null +++ b/modules/backlogs/db/migrate/20260427125502_modify_burndown_index.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +class ModifyBurndownIndex < ActiveRecord::Migration[8.1] + INDEX_NAME = "work_package_journal_on_burndown_attributes" + + def up + remove_and_add_burndown_index :sprint_id + end + + def down + remove_and_add_burndown_index :version_id + end + + private + + def remove_and_add_burndown_index(column) + remove_index :work_package_journals, + name: INDEX_NAME + + add_index :work_package_journals, + [column, + :status_id, + :project_id, + :type_id], + name: INDEX_NAME + end +end