From b598a3af20de03d020f48535fe407ab945c9324d Mon Sep 17 00:00:00 2001 From: Kat Date: Fri, 1 Mar 2024 15:43:53 +0000 Subject: [PATCH] Update location policy --- app/policies/location_policy.rb | 12 +++- spec/policies/location_policy_spec.rb | 92 +++++++++++++++++++++++++++ 2 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 spec/policies/location_policy_spec.rb diff --git a/app/policies/location_policy.rb b/app/policies/location_policy.rb index 0f653b55d..9c3c4882b 100644 --- a/app/policies/location_policy.rb +++ b/app/policies/location_policy.rb @@ -31,7 +31,10 @@ class LocationPolicy end def delete? - user.support? && (location.status == :incomplete || location.status == :deactivated) + return false unless user.support? + return false unless location.status == :incomplete || location.status == :deactivated + + !has_any_logs_in_editable_collection_period end %w[ @@ -83,4 +86,11 @@ private def scheme_owned_by_user_org_or_stock_owner scheme&.owning_organisation == user.organisation || user.organisation.stock_owners.exists?(scheme&.owning_organisation_id) end + + def has_any_logs_in_editable_collection_period + editable_from_date = FormHandler.instance.earliest_open_for_editing_collection_start_date + editable_logs = LettingsLog.where(location_id: location.id).after_date(editable_from_date) + + LettingsLog.where(location_id: location.id, startdate: nil).any? || editable_logs.any? + end end diff --git a/spec/policies/location_policy_spec.rb b/spec/policies/location_policy_spec.rb new file mode 100644 index 000000000..efc56978b --- /dev/null +++ b/spec/policies/location_policy_spec.rb @@ -0,0 +1,92 @@ +require "rails_helper" + +RSpec.describe LocationPolicy do + subject(:policy) { described_class } + + let(:data_provider) { FactoryBot.create(:user, :data_provider) } + let(:data_coordinator) { FactoryBot.create(:user, :data_coordinator) } + let(:support) { FactoryBot.create(:user, :support) } + + permissions :delete? do + let(:location) { FactoryBot.create(:location) } + + context "with active location" do + it "does not allow deleting a location as a provider" do + expect(policy).not_to permit(data_provider, location) + end + + it "does not allow allows deleting a location as a coordinator" do + expect(policy).not_to permit(data_coordinator, location) + end + + it "does not allow deleting a location as a support user" do + expect(policy).not_to permit(support, location) + end + end + + context "with incomplete location" do + before do + location.update!(units: nil) + end + + it "does not allow deleting a location as a provider" do + expect(policy).not_to permit(data_provider, location) + end + + it "does not allow allows deleting a location as a coordinator" do + expect(policy).not_to permit(data_coordinator, location) + end + + it "allows deleting a location as a support user" do + expect(policy).to permit(support, location) + end + end + + context "with deactivated location" do + before do + location.location_deactivation_periods << create(:location_deactivation_period, deactivation_date: Time.zone.local(2024, 4, 10), location:) + location.save! + Timecop.freeze(Time.utc(2024, 4, 10)) + log = create(:lettings_log, scheme: location.scheme, location:) + log.startdate = Time.zone.local(2022, 10, 10) + log.save!(validate: false) + end + + after do + Timecop.unfreeze + end + + context "and associated logs in editable collection period" do + before do + create(:lettings_log, scheme: location.scheme, location:) + end + + it "does not allow deleting a location as a provider" do + expect(policy).not_to permit(data_provider, location) + end + + it "does not allow allows deleting a location as a coordinator" do + expect(policy).not_to permit(data_coordinator, location) + end + + it "does not allow deleting a location as a support user" do + expect(policy).not_to permit(support, location) + end + end + + context "and no associated logs in editable collection period" do + it "does not allow deleting a location as a provider" do + expect(policy).not_to permit(data_provider, location) + end + + it "does not allow allows deleting a location as a coordinator" do + expect(policy).not_to permit(data_coordinator, location) + end + + it "allows deleting a location as a support user" do + expect(policy).to permit(support, location) + end + end + end + end +end