From 48eda4ed71c1a9b82faa5d6f3a49ada883bcfa1e Mon Sep 17 00:00:00 2001 From: aaccensi Date: Tue, 9 Dec 2025 14:36:17 +0100 Subject: [PATCH] Make saved scenarios validation to check for exactly one on interpolated collections. Closes #202 --- app/models/collection.rb | 6 +++--- spec/factories/collection.rb | 23 +++++++++++++++------ spec/factories/collection_saved_scenario.rb | 6 +++++- spec/models/collection_spec.rb | 4 ++-- spec/requests/api/collections_spec.rb | 5 +++-- spec/services/api/create_collection_spec.rb | 3 ++- 6 files changed, 32 insertions(+), 15 deletions(-) diff --git a/app/models/collection.rb b/app/models/collection.rb index 33974c5c..7d91a9d3 100644 --- a/app/models/collection.rb +++ b/app/models/collection.rb @@ -176,10 +176,10 @@ def validate_scenario_versions end def validate_interpolated - # Ensure interpolated collections (AKA transition paths) have no saved scenarios + # Ensure interpolated collections (AKA transition paths) have one saved scenario active_saved_scenarios = collection_saved_scenarios.reject(&:marked_for_destruction?) - if self.interpolated? && active_saved_scenarios.size > 1 - errors.add(:scenarios, "interpolated collections cannot have more than 1 saved scenario") + if self.interpolated? && active_saved_scenarios.size != 1 + errors.add(:scenarios, "interpolated collections must have exactly 1 saved scenario") end end diff --git a/spec/factories/collection.rb b/spec/factories/collection.rb index 21a7d586..fb7d838b 100644 --- a/spec/factories/collection.rb +++ b/spec/factories/collection.rb @@ -7,17 +7,28 @@ title { 'My Collection' } end_year { 2050 } version { Version.find_by(tag: "latest") } + interpolation { false } transient do scenarios_count { 2 } + saved_scenarios_count { interpolation ? 1 : 0 } end - after(:create) do |myc, evaluator| - create_list( - :collection_scenario, - evaluator.scenarios_count, - collection: myc - ) + after(:build) do |collection, evaluator| + evaluator.scenarios_count.times do + collection.scenarios << build( + :collection_scenario, + collection: collection + ) + end + + evaluator.saved_scenarios_count.times do + collection.collection_saved_scenarios << build( + :collection_saved_scenario, + collection: collection, + user: collection.user + ) + end end end diff --git a/spec/factories/collection_saved_scenario.rb b/spec/factories/collection_saved_scenario.rb index ac1aa091..9dc45125 100644 --- a/spec/factories/collection_saved_scenario.rb +++ b/spec/factories/collection_saved_scenario.rb @@ -2,7 +2,11 @@ FactoryBot.define do factory :collection_saved_scenario do - saved_scenario + transient do + user { nil } + end + + saved_scenario { create(:saved_scenario, user: user) } collection end end diff --git a/spec/models/collection_spec.rb b/spec/models/collection_spec.rb index 54100f06..d1ea4f48 100644 --- a/spec/models/collection_spec.rb +++ b/spec/models/collection_spec.rb @@ -68,7 +68,7 @@ describe 'number of scenarios' do let(:user) { create(:user) } - let(:myc) { create(:collection, user: user, scenarios_count: 7) } + let(:myc) { create(:collection, user: user, scenarios_count: 6) } context 'with more than 6 combined scenarios' do before do @@ -77,7 +77,7 @@ end it 'is not valid' do - expect(myc).not_to be_valid + expect(myc.reload).not_to be_valid end end end diff --git a/spec/requests/api/collections_spec.rb b/spec/requests/api/collections_spec.rb index 6e55eff9..4daca73a 100644 --- a/spec/requests/api/collections_spec.rb +++ b/spec/requests/api/collections_spec.rb @@ -151,7 +151,8 @@ end_year: 2050, scenario_ids: [1, 2, 3], title: 'My collection', - version: Version.default.tag + version: Version.default.tag, + interpolation: false } end @@ -440,7 +441,7 @@ it 'does not insert a saved_scenario' do expect { request }.not_to change { collection.reload.latest_scenario_ids } expect(response).to have_http_status(:unprocessable_entity) - expect(JSON.parse(response.body)['scenarios']).to include('interpolated collections cannot have more than 1 saved scenario') + expect(JSON.parse(response.body)['scenarios']).to include('interpolated collections must have exactly 1 saved scenario') end end diff --git a/spec/services/api/create_collection_spec.rb b/spec/services/api/create_collection_spec.rb index 7f42f937..d97e62da 100644 --- a/spec/services/api/create_collection_spec.rb +++ b/spec/services/api/create_collection_spec.rb @@ -12,7 +12,8 @@ area_code: 'nl2019', end_year: 2050, scenario_ids: [10, 20], - version: Version.default.tag + version: Version.default.tag, + interpolation: false } end