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.
 
 
 
 

196 lines
6.0 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:) }
let(:cleared_fields) do
%w[
uprn
uprn_known
uprn_confirmed
uprn_selection
address_line1
address_line2
town_or_city
county
postcode_full
postcode_known
address_line1_input
postcode_full_input
address_line1_as_entered
address_line2_as_entered
town_or_city_as_entered
county_as_entered
postcode_full_as_entered
la_as_entered
address_search_value_check
la
]
end
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",
uprn_known: 1,
uprn_confirmed: 1,
uprn_selection: "123456789012",
address_line1: "1 Secret Street",
address_line2: "Flat 2",
town_or_city: "Secretville",
county: "Secretshire",
postcode_full: "SW1A 1AA",
postcode_known: 1,
address_line1_input: "1 Secret Street",
postcode_full_input: "SW1A1AA",
address_line1_as_entered: "1 Secret Street",
address_line2_as_entered: "Flat 2",
town_or_city_as_entered: "Secretville",
county_as_entered: "Secretshire",
postcode_full_as_entered: "SW1A 1AA",
la_as_entered: "E09000003",
address_search_value_check: 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 "clears every field the task targets" do
task.invoke
log.reload
cleared_fields.each do |field|
expect(log[field]).to be_nil, "expected #{field} to be nil but was #{log[field].inspect}"
end
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
it "does not affect the scheme or location associations" do
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
task.invoke
task.reenable
expect { task.invoke }.not_to(change { log.reload.updated_at })
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
log.reload
expect(log.address_line1).to eq("1 Secret Street")
expect(log.town_or_city).to eq("Secretville")
expect(log.uprn).to eq("123456789012")
expect(log.postcode_known).to eq(1)
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
log.reload
expect(log.address_line1).to eq("1 Secret Street")
expect(log.town_or_city).to eq("Secretville")
expect(log.uprn).to eq("123456789012")
expect(log.postcode_known).to eq(1)
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
end
end