Merge pull request #23467 from opf/namespaces-contracts-and-services-in-backlogs

namespace contracts and services to be under Backlogs
This commit is contained in:
Ivan Kuchin
2026-06-02 14:01:43 +02:00
committed by GitHub
64 changed files with 121 additions and 118 deletions
@@ -54,7 +54,7 @@ See COPYRIGHT and LICENSE files for more details.
render Primer::Beta::Button.new(
tag: :a,
label: BacklogBucket.human_model_name,
href: new_dialog_project_backlogs_backlog_buckets_path(project, all_backlogs_params),
href: new_dialog_project_backlogs_buckets_path(project, all_backlogs_params),
data: {
controller: "async-dialog",
test_selector: "op-backlog-buckets--new-backlog-bucket-button"
@@ -50,7 +50,7 @@ See COPYRIGHT and LICENSE files for more details.
menu.with_item(
id: dom_target(backlog_bucket, :menu, :edit_backlog_bucket),
label: t(".action_menu.edit_backlog_bucket"),
href: edit_dialog_project_backlogs_backlog_bucket_path(project, backlog_bucket, all_backlogs_params),
href: edit_dialog_project_backlogs_bucket_path(project, backlog_bucket, all_backlogs_params),
content_arguments: { data: { controller: "async-dialog" } }
) do |item|
item.with_leading_visual_icon(icon: :pencil)
@@ -60,7 +60,7 @@ See COPYRIGHT and LICENSE files for more details.
id: dom_target(backlog_bucket, :menu, :delete_backlog_bucket),
label: t(".action_menu.delete_backlog_bucket"),
scheme: :danger,
href: destroy_dialog_project_backlogs_backlog_bucket_path(project, backlog_bucket, all_backlogs_params),
href: destroy_dialog_project_backlogs_bucket_path(project, backlog_bucket, all_backlogs_params),
content_arguments: { data: { controller: "async-dialog" } }
) do |item|
item.with_leading_visual_icon(icon: :trash)
@@ -54,7 +54,7 @@ module Backlogs
def form_arguments
{
action: project_backlogs_backlog_bucket_path(backlog_bucket.project,
action: project_backlogs_bucket_path(backlog_bucket.project,
backlog_bucket,
helpers.all_backlogs_params),
method: :delete
@@ -54,9 +54,9 @@ module Backlogs
def form_url
if @backlog_bucket.new_record?
project_backlogs_backlog_buckets_path(@backlog_bucket.project, all_backlogs_params)
project_backlogs_buckets_path(@backlog_bucket.project, all_backlogs_params)
else
project_backlogs_backlog_bucket_path(@backlog_bucket.project, @backlog_bucket, all_backlogs_params)
project_backlogs_bucket_path(@backlog_bucket.project, @backlog_bucket, all_backlogs_params)
end
end
end
@@ -57,11 +57,11 @@ module Backlogs
private
def show_start_sprint_action?
sprint.in_planning? && ::Sprints::StartContract.can_start?(user: current_user, sprint:, project:)
sprint.in_planning? && ::Backlogs::Sprints::StartContract.can_start?(user: current_user, sprint:, project:)
end
def show_finish_sprint_action?
sprint.active? && ::Sprints::StartContract.can_start_or_complete?(user: current_user, sprint:)
sprint.active? && ::Backlogs::Sprints::StartContract.can_start_or_complete?(user: current_user, sprint:)
end
def disable_start_sprint_action?
@@ -28,7 +28,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
class BacklogBuckets::BaseContract < ModelContract
class Backlogs::Buckets::BaseContract < ModelContract
validate :user_authorized
def self.model
@@ -28,7 +28,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
module BacklogBuckets
module Backlogs::Buckets
class CreateContract < BaseContract
attribute :project_id
end
@@ -28,7 +28,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
module BacklogBuckets
module Backlogs::Buckets
class DeleteContract < ::DeleteContract
delete_permission :create_sprints
end
@@ -28,7 +28,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
module Sprints
module Backlogs::Buckets
class UpdateContract < BaseContract
end
end
@@ -28,7 +28,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
module Projects
module Backlogs::Projects
class BacklogSettingsContract < ::ModelContract
stored_attribute :sprint_sharing, store: :settings
@@ -28,7 +28,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
module Projects
module Backlogs::Projects
class BacklogsTypesAndStatusesContract < ::ModelContract
validate :validate_permissions
validate :validate_done_status_ids
@@ -28,7 +28,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
module Sprints
module Backlogs::Sprints
class BaseContract < ::ModelContract
validate :user_authorized
@@ -28,7 +28,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
module Sprints
module Backlogs::Sprints
class CreateContract < BaseContract
validate :no_receiving_project
@@ -28,7 +28,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
module Sprints
module Backlogs::Sprints
class FinishContract < ModelContract
validate :sprint_must_be_active
validate :user_allowed_to_finish
@@ -28,7 +28,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
module Sprints
module Backlogs::Sprints
class StartContract < ::BaseContract
validate :validate_permission
validate :validate_status_in_planning
@@ -28,7 +28,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
module BacklogBuckets
module Backlogs::Sprints
class UpdateContract < BaseContract
end
end
@@ -28,7 +28,7 @@
# See COPYRIGHT and LICENSE files for more details.
# ++
module WorkPackages
module Backlogs::WorkPackages
# Contract used for moving work packages between two sprints at the end
# of a sprint. It does not enforce permissions as this change is carried
# out in the background.
@@ -28,7 +28,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
module WorkPackages
module Backlogs::WorkPackages
# Contract used for moving work packages to the product backlog (sprint = nil, backlog_bucket = nil):
# * at the end of a sprint
# * upon bucket deletion
@@ -30,7 +30,7 @@
module Backlogs
class BacklogController < BaseController
include WorkPackages::WithSplitView
include ::WorkPackages::WithSplitView
current_menu_item %i[show details] do
:backlog
@@ -29,7 +29,7 @@
#++
module Backlogs
class BacklogBucketsController < BaseController
class BucketsController < BaseController
include OpTurbo::ComponentStream
before_action :find_backlog_bucket, only: %i[edit_dialog destroy_dialog update destroy]
@@ -49,7 +49,7 @@ module Backlogs
end
def create
call = ::BacklogBuckets::CreateService
call = ::Backlogs::Buckets::CreateService
.new(user: current_user)
.call(attributes: backlog_bucket_params)
@@ -63,7 +63,7 @@ module Backlogs
end
def update
call = ::BacklogBuckets::UpdateService
call = ::Backlogs::Buckets::UpdateService
.new(user: current_user, model: @backlog_bucket)
.call(attributes: edit_backlog_bucket_params)
@@ -77,7 +77,7 @@ module Backlogs
end
def destroy
call = ::BacklogBuckets::DeleteService
call = ::Backlogs::Buckets::DeleteService
.new(user: current_user, model: @backlog_bucket)
.call
@@ -66,7 +66,7 @@ module Backlogs
end
def new_dialog
call = ::Sprints::SetAttributesService.new(
call = ::Backlogs::Sprints::SetAttributesService.new(
user: current_user,
model: Sprint.new,
contract_class: ::EmptyContract
@@ -85,7 +85,7 @@ module Backlogs
id = edit_sprint_params.dig(:sprint, :id)
sprint = id.present? ? Sprint.for_project(@project).visible.find(id) : Sprint.new
call = ::Sprints::SetAttributesService.new(
call = ::Backlogs::Sprints::SetAttributesService.new(
user: current_user,
model: sprint,
contract_class: ::EmptyContract
@@ -97,7 +97,7 @@ module Backlogs
end
def create # rubocop:disable Metrics/AbcSize
call = ::Sprints::CreateService
call = ::Backlogs::Sprints::CreateService
.new(user: current_user)
.call(attributes: converted_sprint_params)
@@ -111,7 +111,7 @@ module Backlogs
end
def update
call = ::Sprints::UpdateService
call = ::Backlogs::Sprints::UpdateService
.new(user: current_user, model: @sprint)
.call(attributes: sprint_params[:sprint])
@@ -204,13 +204,13 @@ module Backlogs
end
def start_sprint
::Sprints::StartService
::Backlogs::Sprints::StartService
.new(user: current_user, model: @sprint)
.call(send_notifications: false)
end
def finish_sprint
::Sprints::FinishService
::Backlogs::Sprints::FinishService
.new(user: current_user, model: @sprint)
.call(
unfinished_action: params[:unfinished_action],
@@ -241,12 +241,12 @@ module Backlogs
def authorize_start!
deny_access unless current_user.allowed_in_project?(:view_sprints, @project) &&
::Sprints::StartContract.can_start?(user: current_user, sprint: @sprint, project: @project)
::Backlogs::Sprints::StartContract.can_start?(user: current_user, sprint: @sprint, project: @project)
end
def authorize_finish!
deny_access unless current_user.allowed_in_project?(:view_sprints, @project) &&
::Sprints::StartContract.can_start_or_complete?(user: current_user, sprint: @sprint)
::Backlogs::Sprints::StartContract.can_start_or_complete?(user: current_user, sprint: @sprint)
end
end
end
@@ -65,7 +65,7 @@ module Backlogs
# Capture the source before the call; the service reloads @work_package internally via #move_after.
source = @work_package.sprint
call = Stories::UpdateService.new(user: current_user, story: @work_package)
call = ::Backlogs::WorkPackages::UpdateService.new(user: current_user, story: @work_package)
.call(**move_params.to_h.symbolize_keys)
if call.success?
@@ -35,7 +35,7 @@ class Projects::Settings::BacklogSharingsController < Projects::SettingsControll
def update
call = Projects::UpdateService
.new(model: @project, user: current_user, contract_class: Projects::BacklogSettingsContract)
.new(model: @project, user: current_user, contract_class: ::Backlogs::Projects::BacklogSettingsContract)
.call(backlog_settings_params)
if call.success?
@@ -37,7 +37,7 @@ class Projects::Settings::BacklogsController < Projects::SettingsController
call = Projects::UpdateService
.new(model: @project,
user: current_user,
contract_class: Projects::BacklogsTypesAndStatusesContract)
contract_class: ::Backlogs::Projects::BacklogsTypesAndStatusesContract)
.call(backlogs_settings_params)
if call.success?
@@ -50,7 +50,7 @@ class Projects::Settings::BacklogsController < Projects::SettingsController
end
def rebuild_positions
WorkPackages::RebuildPositionsService.new(project: @project).call
::Backlogs::WorkPackages::RebuildPositionsService.new(project: @project).call
flash[:notice] = I18n.t("backlogs.positions_rebuilt_successfully")
redirect_back_or_to_backlogs_settings
@@ -28,7 +28,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
class BacklogBuckets::CreateService < BaseServices::Create
class Backlogs::Buckets::CreateService < BaseServices::Create
def instance_class
BacklogBucket
end
@@ -28,7 +28,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
class BacklogBuckets::DeleteService < BaseServices::Delete
class Backlogs::Buckets::DeleteService < BaseServices::Delete
private
def after_validate(service_call)
@@ -39,8 +39,8 @@ class BacklogBuckets::DeleteService < BaseServices::Delete
def move_to_backlog
model.work_packages.order(position: :asc).map do |wp|
WorkPackages::UpdateService
.new(user:, model: wp, contract_class: WorkPackages::MoveToBacklogContract)
::WorkPackages::UpdateService
.new(user:, model: wp, contract_class: ::Backlogs::WorkPackages::MoveToBacklogContract)
.call(backlog_bucket: nil)
end
end
@@ -28,5 +28,5 @@
# See COPYRIGHT and LICENSE files for more details.
#++
class BacklogBuckets::SetAttributesService < BaseServices::SetAttributes
class Backlogs::Buckets::SetAttributesService < BaseServices::SetAttributes
end
@@ -28,7 +28,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
class BacklogBuckets::UpdateService < BaseServices::Update
class Backlogs::Buckets::UpdateService < BaseServices::Update
def instance_class
BacklogBucket
end
@@ -28,7 +28,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
class Sprints::CreateService < BaseServices::Create
class Backlogs::Sprints::CreateService < BaseServices::Create
def instance_class
Sprint
end
@@ -28,7 +28,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
class Sprints::FinishService < BaseServices::BaseContracted
class Backlogs::Sprints::FinishService < BaseServices::BaseContracted
def initialize(user:, model:)
super(user:)
self.model = model
@@ -56,7 +56,7 @@ class Sprints::FinishService < BaseServices::BaseContracted
end
def default_contract_class
Sprints::FinishContract
::Backlogs::Sprints::FinishContract
end
private
@@ -67,8 +67,8 @@ class Sprints::FinishService < BaseServices::BaseContracted
def move_to_sprint(target_sprint)
open_work_packages.order(position: :desc).map do |wp|
WorkPackages::UpdateService
.new(user:, model: wp, contract_class: WorkPackages::MoveBetweenSprintsContract)
::WorkPackages::UpdateService
.new(user:, model: wp, contract_class: ::Backlogs::WorkPackages::MoveBetweenSprintsContract)
.call(sprint: target_sprint, position: 1)
end
end
@@ -81,8 +81,8 @@ class Sprints::FinishService < BaseServices::BaseContracted
call_args[:position] = position if position
open_work_packages.order(position: order_direction).map do |wp|
WorkPackages::UpdateService
.new(user:, model: wp, contract_class: WorkPackages::MoveToBacklogContract)
::WorkPackages::UpdateService
.new(user:, model: wp, contract_class: ::Backlogs::WorkPackages::MoveToBacklogContract)
.call(**call_args)
end
end
@@ -28,7 +28,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
module Sprints
module Backlogs::Sprints
class SetAttributesService < ::BaseServices::SetAttributes
private
@@ -28,8 +28,8 @@
# See COPYRIGHT and LICENSE files for more details.
#++
class Sprints::StartService < BaseServices::BaseContracted
def initialize(user:, model:, contract_class: Sprints::StartContract)
class Backlogs::Sprints::StartService < BaseServices::BaseContracted
def initialize(user:, model:, contract_class: ::Backlogs::Sprints::StartContract)
super(user:, contract_class:)
self.model = model
end
@@ -28,7 +28,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
class Sprints::UpdateService < BaseServices::Update
class Backlogs::Sprints::UpdateService < BaseServices::Update
def instance_class
Sprint
end
@@ -28,7 +28,7 @@
# See COPYRIGHT and LICENSE files for more details.
# ++
class WorkPackages::RebuildPositionsService
class Backlogs::WorkPackages::RebuildPositionsService
def initialize(project: nil)
@project = project
end
@@ -28,7 +28,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
class Stories::UpdateService
class Backlogs::WorkPackages::UpdateService
attr_accessor :user, :story
def initialize(user:, story:)
@@ -38,7 +38,7 @@ class Stories::UpdateService
def call(direction: nil, target_id: nil, position: nil, prev_id: nil)
resolve_required_attributes(direction:, target_id:)
.bind { |attrs| WorkPackages::UpdateService.new(user:, model: story).call(**attrs) }
.bind { |attrs| ::WorkPackages::UpdateService.new(user:, model: story).call(**attrs) }
.on_success do |call|
if prev_id
call.result.move_after(prev_id:)
+1 -1
View File
@@ -67,7 +67,7 @@ Rails.application.routes.draw do
constraints: { work_package_id: WorkPackage::SemanticIdentifier::ID_ROUTE_CONSTRAINT },
defaults: { tab: :overview }
resources :backlog_buckets, only: %i[create update destroy] do
resources :buckets, only: %i[create update destroy] do
collection do
get :new_dialog
end
@@ -70,7 +70,7 @@ module OpenProject::Backlogs
require: :member
permission :create_sprints,
{ "backlogs/backlog_buckets": %i[new_dialog create edit_dialog update destroy_dialog destroy],
{ "backlogs/buckets": %i[new_dialog create edit_dialog update destroy_dialog destroy],
"backlogs/sprints": %i[new_dialog refresh_form create edit_dialog update] },
permissible_on: :project,
require: :member,
@@ -31,7 +31,7 @@
require "spec_helper"
require_relative "shared_contract_examples"
RSpec.describe BacklogBuckets::CreateContract do
RSpec.describe Backlogs::Buckets::CreateContract do
include_context "as backlog bucket contract"
let(:backlog_bucket) do
@@ -31,7 +31,7 @@
require "spec_helper"
require "contracts/shared/model_contract_shared_context"
RSpec.describe BacklogBuckets::DeleteContract do
RSpec.describe Backlogs::Buckets::DeleteContract do
include_context "ModelContract shared context"
let(:project) { build_stubbed(:project) }
@@ -31,7 +31,7 @@
require "spec_helper"
require_relative "shared_contract_examples"
RSpec.describe BacklogBuckets::UpdateContract do
RSpec.describe Backlogs::Buckets::UpdateContract do
include_context "as backlog bucket contract"
let(:backlog_bucket) do
@@ -3,7 +3,7 @@
require "spec_helper"
require "contracts/shared/model_contract_shared_context"
RSpec.describe Projects::BacklogSettingsContract, type: :model, with_ee: %i[sprint_sharing] do
RSpec.describe Backlogs::Projects::BacklogSettingsContract, type: :model, with_ee: %i[sprint_sharing] do
include_context "ModelContract shared context"
let(:current_user) { build_stubbed(:user) }
@@ -31,7 +31,7 @@
require "spec_helper"
require "contracts/shared/model_contract_shared_context"
RSpec.describe Projects::BacklogsTypesAndStatusesContract, type: :model do
RSpec.describe Backlogs::Projects::BacklogsTypesAndStatusesContract, type: :model do
include_context "ModelContract shared context"
let(:current_user) { build_stubbed(:user) }
@@ -31,7 +31,7 @@
require "spec_helper"
require_relative "shared_contract_examples"
RSpec.describe Sprints::CreateContract do
RSpec.describe Backlogs::Sprints::CreateContract do
include_context "as sprint contract"
let(:sprint) do
@@ -31,7 +31,7 @@
require "spec_helper"
require "contracts/shared/model_contract_shared_context"
RSpec.describe Sprints::FinishContract do
RSpec.describe Backlogs::Sprints::FinishContract do
include_context "ModelContract shared context"
let(:project) { build_stubbed(:project) }
@@ -30,7 +30,7 @@
require "spec_helper"
RSpec.describe Sprints::StartContract do
RSpec.describe Backlogs::Sprints::StartContract do
let(:project) { create(:project) }
let(:user) { create(:user) }
let(:sprint) do
@@ -31,7 +31,7 @@
require "spec_helper"
require_relative "shared_contract_examples"
RSpec.describe Sprints::UpdateContract do
RSpec.describe Backlogs::Sprints::UpdateContract do
include_context "as sprint contract"
let(:sprint) do
@@ -30,7 +30,7 @@
require "rails_helper"
RSpec.describe Backlogs::BacklogBucketsController do
RSpec.describe Backlogs::BucketsController do
let(:permissions) { %i[view_sprints view_work_packages create_sprints] }
let(:user) { create(:user, member_with_permissions: { project => permissions }) }
let(:project) { create(:project) }
@@ -185,11 +185,11 @@ RSpec.describe Backlogs::SprintsController do
describe "POST #start" do
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(:service) { instance_double(Backlogs::Sprints::StartService, call: service_result) }
let(:request_params) { { project_id: project.id, sprint_id: sprint.id } }
before do
allow(Sprints::StartService)
allow(Backlogs::Sprints::StartService)
.to receive(:new)
.with(user:, model: sprint)
.and_return(service)
@@ -356,10 +356,10 @@ RSpec.describe Backlogs::SprintsController do
result: sprint.tap { |finished_sprint| finished_sprint.status = "completed" }
)
end
let(:service) { instance_double(Sprints::FinishService, call: service_result) }
let(:service) { instance_double(Backlogs::Sprints::FinishService, call: service_result) }
before do
allow(Sprints::FinishService)
allow(Backlogs::Sprints::FinishService)
.to receive(:new)
.with(user:, model: sprint)
.and_return(service)
@@ -278,9 +278,9 @@ RSpec.describe Backlogs::WorkPackagesController do
context "when service call fails" do
before do
allow(Stories::UpdateService)
allow(Backlogs::WorkPackages::UpdateService)
.to receive(:new)
.and_return(instance_double(Stories::UpdateService, call: ServiceResult.failure(message: "Error")))
.and_return(instance_double(Backlogs::WorkPackages::UpdateService, call: ServiceResult.failure(message: "Error")))
end
it "renders an error flash with 422", :aggregate_failures do
@@ -516,9 +516,9 @@ RSpec.describe Backlogs::WorkPackagesController do
let(:service_result) { ServiceResult.failure(message: "Something went wrong") }
before do
update_service = instance_double(Stories::UpdateService, call: service_result)
update_service = instance_double(Backlogs::WorkPackages::UpdateService, call: service_result)
allow(Stories::UpdateService)
allow(Backlogs::WorkPackages::UpdateService)
.to receive(:new)
.and_return(update_service)
end
@@ -21,7 +21,7 @@ RSpec.describe Projects::Settings::BacklogSharingsController do
before do
allow(Projects::UpdateService)
.to receive(:new)
.with(model: project, user:, contract_class: Projects::BacklogSettingsContract)
.with(model: project, user:, contract_class: Backlogs::Projects::BacklogSettingsContract)
.and_return(update_service)
patch :update, params: { project_id: project.identifier, project: project_params }
@@ -49,7 +49,7 @@ RSpec.describe Projects::Settings::BacklogsController do
before do
allow(Projects::UpdateService)
.to receive(:new)
.with(model: project, user:, contract_class: Projects::BacklogsTypesAndStatusesContract)
.with(model: project, user:, contract_class: Backlogs::Projects::BacklogsTypesAndStatusesContract)
.and_return(update_service)
patch :update, params: { project_id: project.identifier, project: project_params }
@@ -30,57 +30,57 @@
require "spec_helper"
RSpec.describe Backlogs::BacklogBucketsController do
RSpec.describe Backlogs::BucketsController do
describe "routing" do
it {
route = "/projects/project_42/backlogs/backlog_buckets"
expect(post(route)).to route_to(controller: "backlogs/backlog_buckets",
route = "/projects/project_42/backlogs/buckets"
expect(post(route)).to route_to(controller: "backlogs/buckets",
action: "create",
project_id: "project_42")
}
it {
route = "/projects/project_42/backlogs/backlog_buckets/23"
expect(patch(route)).to route_to(controller: "backlogs/backlog_buckets",
route = "/projects/project_42/backlogs/buckets/23"
expect(patch(route)).to route_to(controller: "backlogs/buckets",
action: "update",
project_id: "project_42",
id: "23")
}
it {
route = "/projects/project_42/backlogs/backlog_buckets/23"
expect(put(route)).to route_to(controller: "backlogs/backlog_buckets",
route = "/projects/project_42/backlogs/buckets/23"
expect(put(route)).to route_to(controller: "backlogs/buckets",
action: "update",
project_id: "project_42",
id: "23")
}
it {
route = "/projects/project_42/backlogs/backlog_buckets/23"
expect(delete(route)).to route_to(controller: "backlogs/backlog_buckets",
route = "/projects/project_42/backlogs/buckets/23"
expect(delete(route)).to route_to(controller: "backlogs/buckets",
action: "destroy",
project_id: "project_42",
id: "23")
}
it {
route = "/projects/project_42/backlogs/backlog_buckets/new_dialog"
expect(get(route)).to route_to(controller: "backlogs/backlog_buckets",
route = "/projects/project_42/backlogs/buckets/new_dialog"
expect(get(route)).to route_to(controller: "backlogs/buckets",
action: "new_dialog",
project_id: "project_42")
}
it {
route = "/projects/project_42/backlogs/backlog_buckets/23/edit_dialog"
expect(get(route)).to route_to(controller: "backlogs/backlog_buckets",
route = "/projects/project_42/backlogs/buckets/23/edit_dialog"
expect(get(route)).to route_to(controller: "backlogs/buckets",
action: "edit_dialog",
project_id: "project_42",
id: "23")
}
it {
route = "/projects/project_42/backlogs/backlog_buckets/23/destroy_dialog"
expect(get(route)).to route_to(controller: "backlogs/backlog_buckets",
route = "/projects/project_42/backlogs/buckets/23/destroy_dialog"
expect(get(route)).to route_to(controller: "backlogs/buckets",
action: "destroy_dialog",
project_id: "project_42",
id: "23")
@@ -89,28 +89,28 @@ RSpec.describe Backlogs::BacklogBucketsController do
describe "named routing" do
it {
expect(project_backlogs_backlog_buckets_path(project_id: "project_42"))
.to eq("/projects/project_42/backlogs/backlog_buckets")
expect(project_backlogs_buckets_path(project_id: "project_42"))
.to eq("/projects/project_42/backlogs/buckets")
}
it {
expect(project_backlogs_backlog_bucket_path(project_id: "project_42", id: "23"))
.to eq("/projects/project_42/backlogs/backlog_buckets/23")
expect(project_backlogs_bucket_path(project_id: "project_42", id: "23"))
.to eq("/projects/project_42/backlogs/buckets/23")
}
it {
expect(new_dialog_project_backlogs_backlog_buckets_path(project_id: "project_42"))
.to eq("/projects/project_42/backlogs/backlog_buckets/new_dialog")
expect(new_dialog_project_backlogs_buckets_path(project_id: "project_42"))
.to eq("/projects/project_42/backlogs/buckets/new_dialog")
}
it {
expect(edit_dialog_project_backlogs_backlog_bucket_path(project_id: "project_42", id: "23"))
.to eq("/projects/project_42/backlogs/backlog_buckets/23/edit_dialog")
expect(edit_dialog_project_backlogs_bucket_path(project_id: "project_42", id: "23"))
.to eq("/projects/project_42/backlogs/buckets/23/edit_dialog")
}
it {
expect(destroy_dialog_project_backlogs_backlog_bucket_path(project_id: "project_42", id: "23"))
.to eq("/projects/project_42/backlogs/backlog_buckets/23/destroy_dialog")
expect(destroy_dialog_project_backlogs_bucket_path(project_id: "project_42", id: "23"))
.to eq("/projects/project_42/backlogs/buckets/23/destroy_dialog")
}
end
end
@@ -31,7 +31,7 @@
require "spec_helper"
require "services/base_services/behaves_like_create_service"
RSpec.describe BacklogBuckets::CreateService, type: :model do
RSpec.describe Backlogs::Buckets::CreateService, type: :model do
it_behaves_like "BaseServices create service" do
let(:model_class) { BacklogBucket }
let(:factory) { :backlog_bucket }
@@ -31,7 +31,7 @@
require "spec_helper"
require "services/base_services/behaves_like_delete_service"
RSpec.describe BacklogBuckets::DeleteService, type: :model do
RSpec.describe Backlogs::Buckets::DeleteService, type: :model do
shared_let(:project) { create(:project, enabled_module_names: %w[backlogs work_package_tracking]) }
shared_let(:bucket) { create(:backlog_bucket, project:) }
shared_let(:no_bucket_wp1) { create(:work_package, project:) }
@@ -44,7 +44,10 @@ RSpec.describe BacklogBuckets::DeleteService, type: :model do
subject { instance.call }
it_behaves_like "BaseServices delete service"
it_behaves_like "BaseServices delete service" do
let(:model_class) { BacklogBucket }
let(:factory) { :backlog_bucket }
end
context "when the contract is valid" do
it "moves the work packages to the inbox (no bucket - updating the positions)", :aggregate_failures do
@@ -30,10 +30,10 @@
require "spec_helper"
RSpec.describe BacklogBuckets::SetAttributesService, type: :model do
RSpec.describe Backlogs::Buckets::SetAttributesService, type: :model do
let(:user) { build_stubbed(:user) }
let(:contract_class) do
contract = class_double(BacklogBuckets::CreateContract)
contract = class_double(Backlogs::Buckets::CreateContract)
allow(contract)
.to receive(:new)
@@ -31,7 +31,7 @@
require "spec_helper"
require "services/base_services/behaves_like_update_service"
RSpec.describe BacklogBuckets::UpdateService, type: :model do
RSpec.describe Backlogs::Buckets::UpdateService, type: :model do
it_behaves_like "BaseServices update service" do
let(:model_class) { BacklogBucket }
let(:factory) { :backlog_bucket }
@@ -31,7 +31,7 @@
require "spec_helper"
require "services/base_services/behaves_like_create_service"
RSpec.describe Sprints::CreateService, type: :model do
RSpec.describe Backlogs::Sprints::CreateService, type: :model do
it_behaves_like "BaseServices create service" do
let(:model_class) { Sprint }
let(:factory) { :sprint }
@@ -30,7 +30,7 @@
require "rails_helper"
RSpec.describe Sprints::FinishService do
RSpec.describe Backlogs::Sprints::FinishService do
create_shared_association_defaults_for_work_package_factory
shared_let(:open_status) { create(:status, is_closed: false) }
@@ -30,10 +30,10 @@
require "spec_helper"
RSpec.describe Sprints::SetAttributesService, type: :model do
RSpec.describe Backlogs::Sprints::SetAttributesService, type: :model do
let(:user) { build_stubbed(:user) }
let(:contract_class) do
contract = class_double(Sprints::CreateContract)
contract = class_double(Backlogs::Sprints::CreateContract)
allow(contract)
.to receive(:new)
@@ -30,7 +30,7 @@
require "rails_helper"
RSpec.describe Sprints::StartService do
RSpec.describe Backlogs::Sprints::StartService do
shared_let(:type_task) { create(:type_task) }
shared_let(:status1) { create(:status) }
shared_let(:status2) { create(:status) }
@@ -30,7 +30,7 @@
require "spec_helper"
RSpec.describe WorkPackages::RebuildPositionsService, "integration", type: :model do
RSpec.describe Backlogs::WorkPackages::RebuildPositionsService, "integration", type: :model do
def create_work_package(options)
create(:work_package, options.reverse_merge(project: options[:sprint]&.project || options[:backlog_bucket]&.project,
type_id: type.id)) do |wp|
@@ -30,7 +30,7 @@
require "spec_helper"
RSpec.describe Stories::UpdateService, type: :model do
RSpec.describe Backlogs::WorkPackages::UpdateService, type: :model do
let(:user) { build_stubbed(:user) }
let(:story) { build_stubbed(:work_package) }
let(:instance) { described_class.new(user:, story:) }