Skip to content

Commit 3402366

Browse files
committed
move backlog bucket validations from model to contract patch of wp
1 parent 4ac78a8 commit 3402366

4 files changed

Lines changed: 41 additions & 109 deletions

File tree

modules/backlogs/lib/open_project/backlogs/patches/base_contract_patch.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,25 @@ module OpenProject::Backlogs::Patches::BaseContractPatch
4040
# This also covers the check for backlogs being active
4141
permission: :manage_sprint_items
4242

43+
validate :backlog_bucket_xor_sprint
44+
validate :backlog_bucket_belongs_to_project
4345
validate :sprint_shared_with_project
4446

4547
private
4648

49+
def backlog_bucket_xor_sprint
50+
return unless model.backlog_bucket && model.sprint
51+
52+
errors.add :base, :backlog_bucket_xor_sprint
53+
end
54+
55+
def backlog_bucket_belongs_to_project
56+
return unless model.backlog_bucket
57+
return if model.backlog_bucket.project == model.project
58+
59+
errors.add :backlog_bucket, :backlog_bucket_from_another_project
60+
end
61+
4762
def sprint_shared_with_project
4863
return if model.sprint.nil? ||
4964
Agile::Sprint.for_project(model.project).exists?(id: model.sprint_id)

modules/backlogs/lib/open_project/backlogs/patches/work_package_patch.rb

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,6 @@ module OpenProject::Backlogs::Patches::WorkPackagePatch
4646
belongs_to :backlog_bucket, class_name: "Agile::BacklogBucket", optional: true
4747
belongs_to :sprint, class_name: "Agile::Sprint", optional: true
4848

49-
validate :backlog_bucket_xor_sprint
50-
validate :backlog_bucket_belongs_to_project
51-
5249
include OpenProject::Backlogs::List
5350
end
5451

@@ -66,21 +63,6 @@ def done?
6663
def backlogs_enabled?
6764
project&.backlogs_enabled?
6865
end
69-
70-
private
71-
72-
def backlog_bucket_xor_sprint
73-
return unless backlog_bucket && sprint
74-
75-
errors.add :base, :backlog_bucket_xor_sprint
76-
end
77-
78-
def backlog_bucket_belongs_to_project
79-
return unless backlog_bucket
80-
return if backlog_bucket.project == project
81-
82-
errors.add :backlog_bucket, :backlog_bucket_from_another_project
83-
end
8466
end
8567
end
8668

modules/backlogs/spec/contracts/work_packages/shared_contract_examples.rb

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,32 @@
149149

150150
it_behaves_like "contract is invalid", position: :error_readonly
151151
end
152+
153+
describe "when attaching to a backlog bucket" do
154+
before do
155+
work_package.backlog_bucket = backlog_bucket
156+
end
157+
158+
context "when only backlog bucket is set" do
159+
let(:work_package_sprint) { nil }
160+
let(:backlog_bucket) { build_stubbed(:backlog_bucket, project: work_package_project) }
161+
162+
it_behaves_like "contract is valid"
163+
end
164+
165+
context "when both sprint and backlog bucket are set" do
166+
let(:backlog_bucket) { build_stubbed(:backlog_bucket, project: work_package_project) }
167+
168+
it_behaves_like "contract is invalid", base: :backlog_bucket_xor_sprint
169+
end
170+
171+
context "when backlog bucket belongs to a different project" do
172+
let(:work_package_sprint) { nil }
173+
let(:backlog_bucket) { build_stubbed(:backlog_bucket, project: build_stubbed(:project)) }
174+
175+
it_behaves_like "contract is invalid", backlog_bucket: :backlog_bucket_from_another_project
176+
end
177+
end
152178
end
153179

154180
describe "writable_attributes" do

modules/backlogs/spec/models/work_package_spec.rb

Lines changed: 0 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -36,97 +36,6 @@
3636
it { is_expected.to belong_to(:sprint).class_name("Agile::Sprint").optional(true) }
3737
end
3838

39-
describe "can't be both in backlog bucket and sprint" do
40-
shared_let(:project) { create(:project) }
41-
shared_let(:backlog_bucket) { create(:backlog_bucket, project:) }
42-
shared_let(:sprint) { create(:agile_sprint, project:) }
43-
44-
context "when already in a backlog bucket" do
45-
let(:work_package) { create(:work_package, project:, backlog_bucket:) }
46-
47-
it "fails validation when being added to sprint" do
48-
work_package.assign_attributes(sprint:)
49-
50-
expect(work_package).not_to be_valid
51-
expect(work_package.errors[:base]).to include(/cannot be assigned to both a sprint and a backlog bucket/)
52-
end
53-
54-
it "fails being added to sprint" do
55-
work_package.assign_attributes(sprint:)
56-
57-
expect do
58-
work_package.save!(validate: false)
59-
end.to raise_error(ActiveRecord::CheckViolation)
60-
end
61-
62-
it "allows changing backlog bucket" do
63-
work_package.update(backlog_bucket: create(:backlog_bucket, project:))
64-
end
65-
66-
it "allows replacing backlog bucket with sprint" do
67-
work_package.update(backlog_bucket: nil, sprint:)
68-
end
69-
end
70-
71-
context "when already in a sprint" do
72-
let(:work_package) { create(:work_package, project:, sprint:) }
73-
74-
it "fails validation when being added to backlog bucket" do
75-
work_package.assign_attributes(backlog_bucket:)
76-
77-
expect(work_package).not_to be_valid
78-
expect(work_package.errors[:base]).to include(/cannot be assigned to both a sprint and a backlog bucket/)
79-
end
80-
81-
it "fails being added to backlog bucket" do
82-
work_package.assign_attributes(backlog_bucket:)
83-
84-
expect do
85-
work_package.save!(validate: false)
86-
end.to raise_error(ActiveRecord::CheckViolation)
87-
end
88-
89-
it "allows changing sprint" do
90-
work_package.update(sprint: create(:agile_sprint, project:))
91-
end
92-
93-
it "allows replacing sprint with backlog bucket" do
94-
work_package.update(backlog_bucket:, sprint: nil)
95-
end
96-
end
97-
end
98-
99-
describe "backlog bucket must belong to the same project" do
100-
shared_let(:project) { create(:project) }
101-
let(:other_project) { create(:project) }
102-
let(:work_package) { build(:work_package, project:, backlog_bucket:) }
103-
104-
context "when backlog bucket belongs to the same project" do
105-
let(:backlog_bucket) { create(:backlog_bucket, project:) }
106-
107-
it "is valid" do
108-
expect(work_package).to be_valid
109-
end
110-
end
111-
112-
context "when backlog bucket belongs to a different project" do
113-
let(:backlog_bucket) { create(:backlog_bucket, project: other_project) }
114-
115-
it "is invalid" do
116-
expect(work_package).not_to be_valid
117-
expect(work_package.errors[:backlog_bucket]).to include(/must belong to the same project/)
118-
end
119-
end
120-
121-
context "when backlog bucket is nil" do
122-
let(:backlog_bucket) { nil }
123-
124-
it "is valid" do
125-
expect(work_package).to be_valid
126-
end
127-
end
128-
end
129-
13039
describe ".order_by_position" do
13140
let(:work_packages) { create_list(:work_package, 3) }
13241

0 commit comments

Comments
 (0)