Submit social housing lettings and sales data (CORE)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

141 lines
4.5 KiB

require "rails_helper"
require "rake"
RSpec.describe "clear_confidential_address_data" do
describe ":clear_confidential_address_data", type: :task do
subject(:task) { Rake::Task["clear_confidential_address_data"] }
before do
Rake.application.rake_require("tasks/clear_confidential_address_data")
Rake::Task.define_task(:environment)
task.reenable
end
let(:owning_organisation) { create(:organisation) }
let(:scheme) { create(:scheme, sensitive: "Yes", owning_organisation:) }
let(:non_confidential_scheme) { create(:scheme, sensitive: "No", owning_organisation:) }
let(:location) { create(:location, scheme:) }
def create_log_with_address_data(scheme:, location:, startdate:)
log = create(
:lettings_log,
:completed,
:sh,
:ignore_validation_errors,
owning_organisation:,
managing_organisation: owning_organisation,
scheme:,
location:,
startdate:,
)
# Bypass callbacks/validations to simulate a log that already holds property
# address/UPRN data collected before the confidential address feature existed.
log.update_columns(
uprn: "123456789012",
address_line1: "1 Secret Street",
town_or_city: "Secretville",
postcode_known: 1,
la: "E09000003",
)
log
end
context "when a confidential-scheme log in 2026/27 has address data" do
let!(:log) { create_log_with_address_data(scheme:, location:, startdate: Time.zone.local(2026, 5, 1)) }
it "clears the address and UPRN fields" do
task.invoke
log.reload
expect(log.address_line1).to be_nil
expect(log.town_or_city).to be_nil
expect(log.uprn).to be_nil
expect(log.postcode_known).to be_nil
end
it "keeps the log's status unchanged when the location's LA can be inferred" do
task.invoke
expect(log.reload.status).to eq("completed")
end
it "resolves the local authority from the scheme's location without persisting it" do
task.invoke
log.reload
expect(log.la).to eq(location.location_code)
expect(log[:la]).to be_nil
expect(log.is_la_inferred).to be true
end
end
context "when the scheme's location has no resolvable local authority" do
let!(:log) { create_log_with_address_data(scheme:, location:, startdate: Time.zone.local(2026, 5, 1)) }
before { location.update_columns(location_code: nil, location_admin_district: nil, is_la_inferred: false) }
it "clears the address fields and forces the log to in_progress" do
task.invoke
log.reload
expect(log.address_line1).to be_nil
expect(log.la).to be_nil
expect(log.status).to eq("in_progress")
end
end
context "when the confidential-scheme log is outside the 2026/27 collection year" do
let!(:log) { create_log_with_address_data(scheme:, location:, startdate: Time.zone.local(2025, 5, 1)) }
it "does not clear the address fields" do
task.invoke
expect(log.reload.address_line1).to eq("1 Secret Street")
end
end
context "when the log's scheme is not confidential" do
let!(:log) { create_log_with_address_data(scheme: non_confidential_scheme, location:, startdate: Time.zone.local(2026, 5, 1)) }
it "does not clear the address fields" do
task.invoke
expect(log.reload.address_line1).to eq("1 Secret Street")
end
end
context "when a confidential-scheme 2026/27 log has no address data left" do
let!(:log) do
create(
:lettings_log,
:ignore_validation_errors,
needstype: 2,
owning_organisation:,
managing_organisation: owning_organisation,
scheme:,
location:,
startdate: Time.zone.local(2026, 5, 1),
)
end
it "is not touched" do
expect { task.invoke }.not_to(change { log.reload.updated_at })
end
end
it "does not affect the scheme or location associations" do
log = create_log_with_address_data(scheme:, location:, startdate: Time.zone.local(2026, 5, 1))
task.invoke
log.reload
expect(log.scheme_id).to eq(scheme.id)
expect(log.location_id).to eq(location.id)
end
it "is idempotent" do
log = create_log_with_address_data(scheme:, location:, startdate: Time.zone.local(2026, 5, 1))
task.invoke
task.reenable
expect { task.invoke }.not_to(change { log.reload.updated_at })
end
end
end