diff --git a/lib/tasks/import_address_from_csv.rake b/lib/tasks/import_address_from_csv.rake index e910f3a77..4c175554e 100644 --- a/lib/tasks/import_address_from_csv.rake +++ b/lib/tasks/import_address_from_csv.rake @@ -1,18 +1,34 @@ namespace :data_import do - desc "Import address data from a csv file" - task :import_address_from_csv, %i[file_name] => :environment do |_task, args| + desc "Import lettings address data from a csv file" + task :import_lettings_addresses_from_csv, %i[file_name] => :environment do |_task, args| file_name = args[:file_name] - raise "Usage: rake data_import:import_address_from_csv['csv_file_name']" if file_name.blank? + raise "Usage: rake data_import:import_lettings_addresses_from_csv['csv_file_name']" if file_name.blank? s3_service = Storage::S3Service.new(PlatformHelper.is_paas? ? Configuration::PaasConfigurationService.new : Configuration::EnvConfigurationService.new, ENV["IMPORT_PAAS_INSTANCE"]) addresses_csv = CSV.parse(s3_service.get_file_io(file_name), headers: true) addresses_csv.each do |row| - lettings_log_id = row[0] + lettings_log_id = row[1] + address_line1 = row[9] + address_line2 = row[10] + town_or_city = row[11] + county = row[12] + postcode_full = row[13] if lettings_log_id.blank? - Rails.logger.info("Lettings log ID not provided for address: #{[row[1], row[2], row[3], row[4]].join(', ')}") + Rails.logger.info("Lettings log ID not provided for address: #{[address_line1, address_line2, town_or_city, county, postcode_full].join(', ')}") + next + end + + uprn = row[8] + if uprn.present? + Rails.logger.info("Lettings log with ID #{lettings_log_id} contains uprn, skipping log") + next + end + + if address_line1.blank? || town_or_city.blank? || postcode_full.blank? + Rails.logger.info("Lettings log with ID #{lettings_log_id} is missing required address data, skipping log") next end @@ -25,18 +41,18 @@ namespace :data_import do lettings_log.uprn_known = 0 lettings_log.uprn = nil lettings_log.uprn_confirmed = nil - lettings_log.address_line1 = row[1] - lettings_log.address_line2 = row[2] - lettings_log.town_or_city = row[3] - lettings_log.postcode_full = row[4] + lettings_log.address_line1 = address_line1 + lettings_log.address_line2 = address_line2 + lettings_log.town_or_city = town_or_city + lettings_log.county = county + lettings_log.postcode_full = postcode_full lettings_log.postcode_known = lettings_log.postcode_full.present? ? 1 : nil - lettings_log.county = nil lettings_log.is_la_inferred = nil lettings_log.la = nil lettings_log.values_updated_at = Time.zone.now lettings_log.save! - Rails.logger.info("Updated lettings log #{lettings_log_id}, with address: #{[lettings_log.address_line1, lettings_log.address_line2, lettings_log.town_or_city, lettings_log.postcode_full].join(', ')}") + Rails.logger.info("Updated lettings log #{lettings_log_id}, with address: #{[lettings_log.address_line1, lettings_log.address_line2, lettings_log.town_or_city, lettings_log.county, lettings_log.postcode_full].join(', ')}") end end end diff --git a/spec/fixtures/files/addresses_reimport.csv b/spec/fixtures/files/addresses_reimport.csv index 998d2fbfa..d413b3ffc 100644 --- a/spec/fixtures/files/addresses_reimport.csv +++ b/spec/fixtures/files/addresses_reimport.csv @@ -1,6 +1,7 @@ -lettings_log_id,address_line1,address_line2,town_or_city,postcode_full -{id},address 1,address 2,town,B1 1BB -{id2},address 3,address 4,city,B1 1BB -{id3},,,,C1 1CC -,address 5,address 6,city,D1 1DD -fake_id,address 7,address 8,city,D1 1DD +Issue type,Log ID,Tenancy start date,Tenant code,Property reference,Log owner,Owning organisation,Managing organisation,UPRN,Address Line 1,Address Line 2 (optional),Town or City,County (optional),Property’s postcode +Full address required,{id},2023-04-05,tenancycode,propcode,testy@example.com,Address org,Address org,,address 1,address 2,town,county,B1 1BB +Missing town or city,{id2},2023-04-05,tenancycode,propcode,testy@example.com,Address org,Address org,,address 3,,city,,B1 1BB +UPRN issues,{id3},2023-04-05,tenancycode,propcode,testy@example.com,Address org,Address org,123,Some Place,,Bristol,,BS1 1AD +UPRN issues,{id4},2023-04-05,tenancycode,propcode,testy@example.com,Address org,Address org,,Some Place,,,,BS1 1AD +UPRN issues,,2023-04-05,tenancycode,propcode,testy@example.com,Address org,Address org,,Some Place,,Bristol,,BS1 1AD +UPRN issues,fake_id,2023-04-05,tenancycode,propcode,testy@example.com,Address org,Address org,,Some Place,,Bristol,,BS1 1AD diff --git a/spec/lib/tasks/correct_address_from_csv_spec.rb b/spec/lib/tasks/correct_address_from_csv_spec.rb index 0a3d1c563..18146adfe 100644 --- a/spec/lib/tasks/correct_address_from_csv_spec.rb +++ b/spec/lib/tasks/correct_address_from_csv_spec.rb @@ -2,14 +2,15 @@ require "rails_helper" require "rake" RSpec.describe "data_import" do - def replace_entity_ids(lettings_log, second_lettings_log, third_lettings_log, export_template) + def replace_entity_ids(lettings_log, second_lettings_log, third_lettings_log, fourth_lettings_log, export_template) export_template.sub!(/\{id\}/, lettings_log.id.to_s) export_template.sub!(/\{id2\}/, second_lettings_log.id.to_s) export_template.sub!(/\{id3\}/, third_lettings_log.id.to_s) + export_template.sub!(/\{id4\}/, fourth_lettings_log.id.to_s) end - describe ":import_address_from_csv", type: :task do - subject(:task) { Rake::Task["data_import:import_address_from_csv"] } + describe ":import_lettings_addresses_from_csv", type: :task do + subject(:task) { Rake::Task["data_import:import_lettings_addresses_from_csv"] } let(:instance_name) { "paas_import_instance" } let(:storage_service) { instance_double(Storage::S3Service) } @@ -82,10 +83,25 @@ RSpec.describe "data_import" do is_la_inferred: true) end + let!(:fourth_lettings_log) do + create(:lettings_log, + uprn_known: 1, + uprn: "1", + uprn_confirmed: nil, + address_line1: "wrong address line1", + address_line2: "wrong address 2", + town_or_city: "wrong town", + county: "wrong city", + postcode_known: 1, + postcode_full: "A1 1AA", + la: "E06000064", + is_la_inferred: true) + end + before do allow(storage_service).to receive(:get_file_io) .with("addresses_reimport_123.csv") - .and_return(replace_entity_ids(lettings_log, second_lettings_log, third_lettings_log, File.open("./spec/fixtures/files/addresses_reimport.csv").read)) + .and_return(replace_entity_ids(lettings_log, second_lettings_log, third_lettings_log, fourth_lettings_log, File.open("./spec/fixtures/files/addresses_reimport.csv").read)) end it "updates the log address when old address was not given" do @@ -97,7 +113,7 @@ RSpec.describe "data_import" do expect(lettings_log.address_line1).to eq("address 1") expect(lettings_log.address_line2).to eq("address 2") expect(lettings_log.town_or_city).to eq("town") - expect(lettings_log.county).to eq(nil) + expect(lettings_log.county).to eq("county") expect(lettings_log.postcode_known).to eq(1) expect(lettings_log.postcode_full).to eq("B1 1BB") expect(lettings_log.la).to eq("E08000035") @@ -111,7 +127,7 @@ RSpec.describe "data_import" do expect(second_lettings_log.uprn).to eq(nil) expect(second_lettings_log.uprn_confirmed).to eq(nil) expect(second_lettings_log.address_line1).to eq("address 3") - expect(second_lettings_log.address_line2).to eq("address 4") + expect(second_lettings_log.address_line2).to eq(nil) expect(second_lettings_log.town_or_city).to eq("city") expect(second_lettings_log.county).to eq(nil) expect(second_lettings_log.postcode_known).to eq(1) @@ -120,34 +136,49 @@ RSpec.describe "data_import" do expect(second_lettings_log.is_la_inferred).to eq(true) end - it "updates the log address when new address is not given" do + it "does not update log address when uprn is given" do task.invoke(addresses_csv_path) third_lettings_log.reload - expect(third_lettings_log.uprn_known).to eq(0) - expect(third_lettings_log.uprn).to eq(nil) + expect(third_lettings_log.uprn_known).to eq(1) + expect(third_lettings_log.uprn).to eq("1") expect(third_lettings_log.uprn_confirmed).to eq(nil) - expect(third_lettings_log.address_line1).to eq(nil) - expect(third_lettings_log.address_line2).to eq(nil) - expect(third_lettings_log.town_or_city).to eq(nil) - expect(third_lettings_log.county).to eq(nil) + expect(third_lettings_log.address_line1).to eq("wrong address line1") + expect(third_lettings_log.address_line2).to eq("wrong address 2") + expect(third_lettings_log.town_or_city).to eq("wrong town") + expect(third_lettings_log.county).to eq("wrong city") expect(third_lettings_log.postcode_known).to eq(1) - expect(third_lettings_log.postcode_full).to eq("C11CC") - expect(third_lettings_log.la).to eq(nil) - expect(third_lettings_log.is_la_inferred).to eq(false) + expect(third_lettings_log.postcode_full).to eq("A1 1AA") + expect(third_lettings_log.la).to eq("E06000064") + end + + it "does not update log address when all required address fields are not present" do + task.invoke(addresses_csv_path) + fourth_lettings_log.reload + expect(fourth_lettings_log.uprn_known).to eq(1) + expect(fourth_lettings_log.uprn).to eq("1") + expect(fourth_lettings_log.uprn_confirmed).to eq(nil) + expect(fourth_lettings_log.address_line1).to eq("wrong address line1") + expect(fourth_lettings_log.address_line2).to eq("wrong address 2") + expect(fourth_lettings_log.town_or_city).to eq("wrong town") + expect(fourth_lettings_log.county).to eq("wrong city") + expect(fourth_lettings_log.postcode_known).to eq(1) + expect(fourth_lettings_log.postcode_full).to eq("A1 1AA") + expect(fourth_lettings_log.la).to eq("E06000064") end it "logs the progress of the update" do - expect(Rails.logger).to receive(:info).with("Updated lettings log #{lettings_log.id}, with address: address 1, address 2, town, B1 1BB") - expect(Rails.logger).to receive(:info).with("Updated lettings log #{second_lettings_log.id}, with address: address 3, address 4, city, B1 1BB") - expect(Rails.logger).to receive(:info).with("Updated lettings log #{third_lettings_log.id}, with address: , , , C11CC") - expect(Rails.logger).to receive(:info).with("Lettings log ID not provided for address: address 5, address 6, city, D1 1DD") + expect(Rails.logger).to receive(:info).with("Updated lettings log #{lettings_log.id}, with address: address 1, address 2, town, county, B1 1BB") + expect(Rails.logger).to receive(:info).with("Updated lettings log #{second_lettings_log.id}, with address: address 3, , city, , B1 1BB") + expect(Rails.logger).to receive(:info).with("Lettings log with ID #{third_lettings_log.id} contains uprn, skipping log") + expect(Rails.logger).to receive(:info).with("Lettings log with ID #{fourth_lettings_log.id} is missing required address data, skipping log") + expect(Rails.logger).to receive(:info).with("Lettings log ID not provided for address: Some Place, , Bristol, , BS1 1AD") expect(Rails.logger).to receive(:info).with("Could not find a lettings log with id fake_id") task.invoke(addresses_csv_path) end it "raises an error when no path is given" do - expect { task.invoke(nil) }.to raise_error(RuntimeError, "Usage: rake data_import:import_address_from_csv['csv_file_name']") + expect { task.invoke(nil) }.to raise_error(RuntimeError, "Usage: rake data_import:import_lettings_addresses_from_csv['csv_file_name']") end end end