diff --git a/spec/models/lettings_log_spec.rb b/spec/models/lettings_log_spec.rb index 22585ca30..ebd8303a6 100644 --- a/spec/models/lettings_log_spec.rb +++ b/spec/models/lettings_log_spec.rb @@ -268,13 +268,6 @@ RSpec.describe LettingsLog do expect(record_from_db["mrcdate"].year).to eq(2021) end - it "correctly derives and saves partial and full major property void date" do - record_from_db = ActiveRecord::Base.connection.execute("select voiddate from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(record_from_db["voiddate"].day).to eq(3) - expect(record_from_db["voiddate"].month).to eq(3) - expect(record_from_db["voiddate"].year).to eq(2021) - end - it "correctly derives and saves incref" do record_from_db = ActiveRecord::Base.connection.execute("select incref from lettings_logs where id=#{lettings_log.id}").to_a[0] expect(record_from_db["incref"]).to eq(1) @@ -1504,6 +1497,42 @@ RSpec.describe LettingsLog do expect(record_from_db["has_benefits"]).to eq(1) end + context "when updating values that derive vacdays" do + let(:lettings_log) { create(:lettings_log, startdate:) } + + context "when start date is set" do + let(:startdate) { Time.zone.now } + + it "correctly derives vacdays when voiddate is set" do + day_count = 3 + expect { lettings_log.update!(voiddate: startdate - day_count.days) }.to change(lettings_log, :vacdays).to day_count + expect { lettings_log.update!(voiddate: nil) }.to change(lettings_log, :vacdays).from(day_count).to nil + end + + it "correctly derives vacdays when mrcdate is set" do + day_count = 3 + expect { lettings_log.update!(mrcdate: startdate - day_count.days) }.to change(lettings_log, :vacdays).to day_count + expect { lettings_log.update!(mrcdate: nil) }.to change(lettings_log, :vacdays).from(day_count).to nil + end + end + + context "when start date is not set" do + let(:startdate) { nil } + + it "correctly derives vacdays when voiddate is set" do + day_count = 3 + lettings_log.update!(voiddate: Time.zone.now - day_count.days) + expect(lettings_log.vacdays).to be nil + end + + it "correctly derives vacdays when mrcdate is set" do + day_count = 3 + lettings_log.update!(mrcdate: Time.zone.now - day_count.days) + expect(lettings_log.vacdays).to be nil + end + end + end + context "when updating renewal" do let!(:lettings_log) do described_class.create({ @@ -1516,51 +1545,38 @@ RSpec.describe LettingsLog do end it "correctly derives the length of time on local authority waiting list" do - lettings_log.update!(renewal: 1) - expect(lettings_log.waityear).to be 2 - lettings_log.update!(renewal: 0) - expect(lettings_log.waityear).to be nil + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :waityear).to 2 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :waityear).from(2).to nil end it "correctly derives the number of times previously offered since becoming available" do - lettings_log.update!(renewal: 1) - expect(lettings_log.offered).to be 0 - lettings_log.update!(renewal: 0) - expect(lettings_log.offered).to be nil + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :offered).to 0 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :offered).from(0).to nil end it "correctly derives referral if the letting is a renewal and clears it if it is not" do - lettings_log.update!(renewal: 1) - expect(lettings_log.referral).to be 1 - lettings_log.update!(renewal: 0) - expect(lettings_log.referral).to be nil + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :referral).to 1 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :referral).from(1).to nil end it "correctly derives voiddate if the letting is a renewal and clears it if it is not" do - lettings_log.update!(renewal: 1) - expect(lettings_log.voiddate).to eq lettings_log.startdate - lettings_log.update!(renewal: 0) - expect(lettings_log.voiddate).to be nil + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :voiddate).to lettings_log.startdate + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :voiddate).from(lettings_log.startdate).to nil end it "correctly derives first_time_property_let_as_social_housing and clears it if it is not" do - lettings_log.update!(renewal: 1) - expect(lettings_log.first_time_property_let_as_social_housing).to be 0 - lettings_log.update!(renewal: 0) - expect(lettings_log.first_time_property_let_as_social_housing).to be nil + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :first_time_property_let_as_social_housing).to 0 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :first_time_property_let_as_social_housing).from(0).to nil end it "correctly derives vacancy reason and clears it if it is not" do - lettings_log.update!(renewal: 1) - expect(lettings_log.rsnvac).to be 14 - lettings_log.update!(renewal: 0) - expect(lettings_log.rsnvac).to be nil + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :rsnvac).to 14 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :rsnvac).from(14).to nil end # should have extra tests for whether it is derived when voiddate, mrcdate etc set and reset it "derives vacdays as 0 if log is renewal" do - lettings_log.update!(renewal: 1) - expect(lettings_log.vacdays).to be 0 + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :vacdays).to 0 end it "correctly derives underoccupation_benefitcap if log is a renewal from 2021/22" do @@ -1569,18 +1585,14 @@ RSpec.describe LettingsLog do end it "clears underoccupation_benefitcap if log is no longer a renewal" do - lettings_log.update!(renewal: 1) - expect(lettings_log.underoccupation_benefitcap).to be 2 - lettings_log.update!(renewal: 0) - expect(lettings_log.underoccupation_benefitcap).to be nil + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :underoccupation_benefitcap).to 2 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :underoccupation_benefitcap).from(2).to nil end it "clears underoccupation_benefitcap if log is no longer in 2021/22" do - lettings_log.update!(renewal: 1) - expect(lettings_log.underoccupation_benefitcap).to be 2 + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :underoccupation_benefitcap).to 2 Timecop.return - lettings_log.update!(startdate: Time.zone.local(2023, 1, 1)) - expect(lettings_log.underoccupation_benefitcap).to be nil + expect { lettings_log.update!(startdate: Time.zone.local(2023, 1, 1)) }.to change(lettings_log, :underoccupation_benefitcap).from(2).to nil end context "when the log is general needs" do @@ -1616,13 +1628,11 @@ RSpec.describe LettingsLog do end it "clears prevten if the log is marked as supported housing" do - lettings_log.update!(needstype: 2) - expect(lettings_log.prevten).to be nil + expect { lettings_log.update!(needstype: 2) }.to change(lettings_log, :prevten).to nil end it "clears prevten if renewal is update to no" do - lettings_log.update!(renewal: 0) - expect(lettings_log.prevten).to be nil + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :prevten).to nil end end end @@ -1645,10 +1655,8 @@ RSpec.describe LettingsLog do let(:rent_type) { 0 } it "derives the most recent let type as Social Rent basis if it is a renewal and clears it if it is not" do - lettings_log.update!(renewal: 1) - expect(lettings_log.unitletas).to be 1 - lettings_log.update!(renewal: 0) - expect(lettings_log.unitletas).to be nil + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :unitletas).to 1 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :unitletas).from(1).to nil end end @@ -1656,10 +1664,8 @@ RSpec.describe LettingsLog do let(:rent_type) { 1 } it "derives the most recent let type as Affordable Rent basis if it is a renewal and clears it if it is not" do - lettings_log.update!(renewal: 1) - expect(lettings_log.unitletas).to be 2 - lettings_log.update!(renewal: 0) - expect(lettings_log.unitletas).to be nil + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :unitletas).to 2 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :unitletas).from(2).to nil end end @@ -1667,10 +1673,8 @@ RSpec.describe LettingsLog do let(:rent_type) { 2 } it "derives the most recent let type as Affordable Rent basis if it is a renewal and clears it if it is not" do - lettings_log.update!(renewal: 1) - expect(lettings_log.unitletas).to be 2 - lettings_log.update!(renewal: 0) - expect(lettings_log.unitletas).to be nil + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :unitletas).to 2 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :unitletas).from(2).to nil end end @@ -1678,10 +1682,8 @@ RSpec.describe LettingsLog do let(:rent_type) { 3 } it "derives the most recent let type as Intermediate Rent basis if it is a renewal and clears it if it is not" do - lettings_log.update!(renewal: 1) - expect(lettings_log.unitletas).to be 4 - lettings_log.update!(renewal: 0) - expect(lettings_log.unitletas).to be nil + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :unitletas).to 4 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :unitletas).from(4).to nil end end @@ -1689,10 +1691,8 @@ RSpec.describe LettingsLog do let(:rent_type) { 4 } it "derives the most recent let type as Intermediate Rent basis if it is a renewal and clears it if it is not" do - lettings_log.update!(renewal: 1) - expect(lettings_log.unitletas).to be 4 - lettings_log.update!(renewal: 0) - expect(lettings_log.unitletas).to be nil + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :unitletas).to 4 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :unitletas).from(4).to nil end end @@ -1701,10 +1701,8 @@ RSpec.describe LettingsLog do let(:irproduct_other) { "Rent first" } it "derives the most recent let type as Intermediate Rent basis if it is a renewal and clears it if it is not" do - lettings_log.update!(renewal: 1) - expect(lettings_log.unitletas).to be 4 - lettings_log.update!(renewal: 0) - expect(lettings_log.unitletas).to be nil + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :unitletas).to 4 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :unitletas).from(4).to nil end end end @@ -1716,10 +1714,8 @@ RSpec.describe LettingsLog do let(:rent_type) { 0 } it "derives the most recent let type as Social Rent basis if it is a renewal and clears it if it is not" do - lettings_log.update!(renewal: 1) - expect(lettings_log.unitletas).to be 1 - lettings_log.update!(renewal: 0) - expect(lettings_log.unitletas).to be nil + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :unitletas).to 1 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :unitletas).from(1).to nil end end @@ -1727,10 +1723,8 @@ RSpec.describe LettingsLog do let(:rent_type) { 1 } it "derives the most recent let type as Affordable Rent basis if it is a renewal and clears it if it is not" do - lettings_log.update!(renewal: 1) - expect(lettings_log.unitletas).to be 2 - lettings_log.update!(renewal: 0) - expect(lettings_log.unitletas).to be nil + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :unitletas).to 2 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :unitletas).from(2).to nil end end @@ -1738,10 +1732,8 @@ RSpec.describe LettingsLog do let(:rent_type) { 2 } it "derives the most recent let type as London Affordable Rent basis if it is a renewal and clears it if it is not" do - lettings_log.update!(renewal: 1) - expect(lettings_log.unitletas).to be 5 - lettings_log.update!(renewal: 0) - expect(lettings_log.unitletas).to be nil + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :unitletas).to 5 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :unitletas).from(5).to nil end end @@ -1749,10 +1741,8 @@ RSpec.describe LettingsLog do let(:rent_type) { 3 } it "derives the most recent let type as Rent to Buy basis if it is a renewal and clears it if it is not" do - lettings_log.update!(renewal: 1) - expect(lettings_log.unitletas).to be 6 - lettings_log.update!(renewal: 0) - expect(lettings_log.unitletas).to be nil + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :unitletas).to 6 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :unitletas).from(6).to nil end end @@ -1760,10 +1750,8 @@ RSpec.describe LettingsLog do let(:rent_type) { 4 } it "derives the most recent let type as London Living Rent basis if it is a renewal and clears it if it is not" do - lettings_log.update!(renewal: 1) - expect(lettings_log.unitletas).to be 7 - lettings_log.update!(renewal: 0) - expect(lettings_log.unitletas).to be nil + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :unitletas).to 7 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :unitletas).from(7).to nil end end @@ -1772,10 +1760,8 @@ RSpec.describe LettingsLog do let(:irproduct_other) { "Rent first" } it "derives the most recent let type as Another Intermediate Rent basis if it is a renewal and clears it if it is not" do - lettings_log.update!(renewal: 1) - expect(lettings_log.unitletas).to be 8 - lettings_log.update!(renewal: 0) - expect(lettings_log.unitletas).to be nil + expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :unitletas).to 8 + expect { lettings_log.update!(renewal: 0) }.to change(lettings_log, :unitletas).from(8).to nil end end end @@ -2171,37 +2157,6 @@ RSpec.describe LettingsLog do expect(record_from_db["wchair"]).to eq(1) end end - - context "and renewal" do - before do - Timecop.freeze(Time.zone.local(2022, 4, 2)) - end - - after do - Timecop.unfreeze - end - - let(:scheme) { create(:scheme) } - let(:location) { create(:location, scheme:) } - let!(:supported_housing_lettings_log) do - described_class.create!({ - managing_organisation: owning_organisation, - owning_organisation:, - created_by: created_by_user, - needstype: 2, - scheme_id: scheme.id, - location_id: location.id, - renewal: 1, - startdate: Time.zone.local(2022, 4, 2), - created_at: Time.utc(2022, 2, 8, 16, 52, 15), - }) - end - - it "correctly infers and saves the renewal date" do - record_from_db = ActiveRecord::Base.connection.execute("SELECT voiddate from lettings_logs where id=#{supported_housing_lettings_log.id}").to_a[0] - expect(record_from_db["voiddate"].to_i).to eq(supported_housing_lettings_log.startdate.to_i) - end - end end context "when saving accessibility needs" do @@ -2342,7 +2297,6 @@ RSpec.describe LettingsLog do end end - # CHECK THROUGH describe "resetting invalidated fields" do let(:scheme) { create(:scheme, owning_organisation: created_by_user.organisation) } let!(:location) { create(:location, location_code: "E07000223", scheme:) } @@ -2438,77 +2392,18 @@ RSpec.describe LettingsLog do end end - context "when it changes from a renewal to not a renewal" do - let(:lettings_log) { create(:lettings_log) } - - it "resets inferred waityear value" do - lettings_log.update!({ renewal: 1 }) - - record_from_db = ActiveRecord::Base.connection.execute("select waityear from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(record_from_db["waityear"]).to eq(2) - expect(lettings_log["waityear"]).to eq(2) - - lettings_log.update!({ renewal: 0 }) - record_from_db = ActiveRecord::Base.connection.execute("select waityear from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(record_from_db["waityear"]).to eq(nil) - expect(lettings_log["waityear"]).to eq(nil) - end - - it "resets inferred vacancy reason value" do - vacancy_reason = "rsnvac" - - lettings_log.update!({ renewal: 1 }) - - record_from_db = ActiveRecord::Base.connection.execute("select #{vacancy_reason} from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(record_from_db[vacancy_reason]).to eq(14) - expect(lettings_log[vacancy_reason]).to eq(14) - - lettings_log.update!({ renewal: 0 }) - record_from_db = ActiveRecord::Base.connection.execute("select #{vacancy_reason} from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(record_from_db[vacancy_reason]).to eq(nil) - expect(lettings_log[vacancy_reason]).to eq(nil) - end - end - context "when it changes from a supported housing to not a supported housing" do let(:location) { create(:location, mobility_type: "A", postcode: "SW1P 4DG") } let(:lettings_log) { create(:lettings_log, location:) } it "resets inferred wchair value" do - lettings_log.update!({ needstype: 2 }) - - record_from_db = ActiveRecord::Base.connection.execute("select wchair from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(record_from_db["wchair"]).to eq(2) - expect(lettings_log["wchair"]).to eq(2) - - lettings_log.update!({ needstype: 1 }) - record_from_db = ActiveRecord::Base.connection.execute("select needstype from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(record_from_db["wchair"]).to eq(nil) - expect(lettings_log["wchair"]).to eq(nil) + expect { lettings_log.update!(needstype: 2) }.to change(lettings_log, :wchair).to(2) + expect { lettings_log.update!(needstype: 1) }.to change(lettings_log, :wchair).from(2).to(nil) end it "resets location" do - lettings_log.update!({ needstype: 2 }) - - record_from_db = ActiveRecord::Base.connection.execute("select location_id from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(record_from_db["location_id"]).to eq(location.id) - expect(lettings_log["location_id"]).to eq(location.id) - lettings_log.update!({ needstype: 1 }) - record_from_db = ActiveRecord::Base.connection.execute("select location_id from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(record_from_db["location_id"]).to eq(nil) - expect(lettings_log["location_id"]).to eq(nil) - end - end - - context "when it is not a renewal" do - let(:lettings_log) { create(:lettings_log) } - - it "saves waityear value" do - lettings_log.update!({ renewal: 0, waityear: 2 }) - - record_from_db = ActiveRecord::Base.connection.execute("select waityear from lettings_logs where id=#{lettings_log.id}").to_a[0] - expect(record_from_db["waityear"]).to eq(2) - expect(lettings_log["waityear"]).to eq(2) + lettings_log.update!(needstype: 2) + expect { lettings_log.update!(needstype: 1) }.to change(lettings_log, :location_id).from(location.id).to(nil) end end