mirror of
https://github.com/opf/openproject.git
synced 2026-06-14 03:30:14 +00:00
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:
@@ -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?
|
||||
|
||||
+1
-1
@@ -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
|
||||
+1
-1
@@ -28,7 +28,7 @@
|
||||
# See COPYRIGHT and LICENSE files for more details.
|
||||
#++
|
||||
|
||||
module BacklogBuckets
|
||||
module Backlogs::Buckets
|
||||
class CreateContract < BaseContract
|
||||
attribute :project_id
|
||||
end
|
||||
+1
-1
@@ -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
|
||||
+1
-1
@@ -28,7 +28,7 @@
|
||||
# See COPYRIGHT and LICENSE files for more details.
|
||||
#++
|
||||
|
||||
module Sprints
|
||||
module Backlogs::Buckets
|
||||
class UpdateContract < BaseContract
|
||||
end
|
||||
end
|
||||
+1
-1
@@ -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
|
||||
|
||||
+1
-1
@@ -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
|
||||
+1
-1
@@ -28,7 +28,7 @@
|
||||
# See COPYRIGHT and LICENSE files for more details.
|
||||
#++
|
||||
|
||||
module Sprints
|
||||
module Backlogs::Sprints
|
||||
class BaseContract < ::ModelContract
|
||||
validate :user_authorized
|
||||
|
||||
+1
-1
@@ -28,7 +28,7 @@
|
||||
# See COPYRIGHT and LICENSE files for more details.
|
||||
#++
|
||||
|
||||
module Sprints
|
||||
module Backlogs::Sprints
|
||||
class CreateContract < BaseContract
|
||||
validate :no_receiving_project
|
||||
|
||||
+1
-1
@@ -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
|
||||
+1
-1
@@ -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
|
||||
+1
-1
@@ -28,7 +28,7 @@
|
||||
# See COPYRIGHT and LICENSE files for more details.
|
||||
#++
|
||||
|
||||
module BacklogBuckets
|
||||
module Backlogs::Sprints
|
||||
class UpdateContract < BaseContract
|
||||
end
|
||||
end
|
||||
+1
-1
@@ -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.
|
||||
+1
-1
@@ -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
|
||||
|
||||
+4
-4
@@ -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
|
||||
|
||||
+1
-1
@@ -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
|
||||
+3
-3
@@ -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
|
||||
+1
-1
@@ -28,5 +28,5 @@
|
||||
# See COPYRIGHT and LICENSE files for more details.
|
||||
#++
|
||||
|
||||
class BacklogBuckets::SetAttributesService < BaseServices::SetAttributes
|
||||
class Backlogs::Buckets::SetAttributesService < BaseServices::SetAttributes
|
||||
end
|
||||
+1
-1
@@ -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
|
||||
+1
-1
@@ -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
|
||||
+6
-6
@@ -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
|
||||
+1
-1
@@ -28,7 +28,7 @@
|
||||
# See COPYRIGHT and LICENSE files for more details.
|
||||
#++
|
||||
|
||||
module Sprints
|
||||
module Backlogs::Sprints
|
||||
class SetAttributesService < ::BaseServices::SetAttributes
|
||||
private
|
||||
|
||||
+2
-2
@@ -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
|
||||
+1
-1
@@ -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
|
||||
+1
-1
@@ -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
|
||||
+2
-2
@@ -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:)
|
||||
@@ -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,
|
||||
|
||||
+1
-1
@@ -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
|
||||
+1
-1
@@ -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) }
|
||||
+1
-1
@@ -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
|
||||
+1
-1
@@ -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) }
|
||||
+1
-1
@@ -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) }
|
||||
+1
-1
@@ -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
|
||||
+1
-1
@@ -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) }
|
||||
+1
-1
@@ -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
|
||||
+1
-1
@@ -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
|
||||
+1
-1
@@ -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
|
||||
|
||||
+1
-1
@@ -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 }
|
||||
|
||||
+25
-25
@@ -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
|
||||
+1
-1
@@ -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 }
|
||||
+5
-2
@@ -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
|
||||
+2
-2
@@ -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)
|
||||
+1
-1
@@ -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 }
|
||||
+1
-1
@@ -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 }
|
||||
+1
-1
@@ -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) }
|
||||
+2
-2
@@ -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)
|
||||
+1
-1
@@ -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) }
|
||||
+1
-1
@@ -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|
|
||||
+1
-1
@@ -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:) }
|
||||
Reference in New Issue
Block a user