From 319eb3a910e59bfd3405b8eb3a1ebd82acad607d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Meny?= Date: Tue, 24 May 2022 12:31:47 +0100 Subject: [PATCH] Discard void date during import if after tenancy start date --- .../imports/case_logs_import_service.rb | 15 ++-- .../imports/case_logs_import_service_spec.rb | 72 +++++++++++++------ 2 files changed, 61 insertions(+), 26 deletions(-) diff --git a/app/services/imports/case_logs_import_service.rb b/app/services/imports/case_logs_import_service.rb index b3edab25b..e2297e760 100644 --- a/app/services/imports/case_logs_import_service.rb +++ b/app/services/imports/case_logs_import_service.rb @@ -138,6 +138,8 @@ module Imports 0 end + apply_date_consistency!(attributes) + attributes["offered"] = safe_string_as_integer(xml_doc, "Q20") attributes["propcode"] = string_or_nil(xml_doc, "Q21a") attributes["beds"] = safe_string_as_integer(xml_doc, "Q22") @@ -309,11 +311,8 @@ module Imports def find_organisation_id(xml_doc, id_field) old_visible_id = unsafe_string_as_integer(xml_doc, id_field) organisation = Organisation.find_by(old_visible_id:) - # Quick hack: should be removed when all organisations are imported - # Will fail in the future if the organisation is missing - if organisation.nil? - raise "Organisation not found with legacy ID #{old_visible_id}" - end + raise "Organisation not found with legacy ID #{old_visible_id}" if organisation.nil? + organisation.id end @@ -519,5 +518,11 @@ module Imports 0 end end + + def apply_date_consistency!(attributes) + if attributes["voiddate"] > attributes["startdate"] + attributes.delete("voiddate") + end + end end end diff --git a/spec/services/imports/case_logs_import_service_spec.rb b/spec/services/imports/case_logs_import_service_spec.rb index eb8382cd8..1a23eb768 100644 --- a/spec/services/imports/case_logs_import_service_spec.rb +++ b/spec/services/imports/case_logs_import_service_spec.rb @@ -1,22 +1,40 @@ require "rails_helper" RSpec.describe Imports::CaseLogsImportService do - let(:remote_folder) { "case_logs" } - let(:fixture_directory) { "spec/fixtures/softwire_imports/case_logs" } - let(:case_log_id) { "0ead17cb-1668-442d-898c-0d52879ff592" } - let(:case_log_id2) { "166fc004-392e-47a8-acb8-1c018734882b" } - let(:case_log_id3) { "00d2343e-d5fa-4c89-8400-ec3854b0f2b4" } + subject(:case_log_service) { described_class.new(storage_service, logger) } + let(:storage_service) { instance_double(StorageService) } + let(:logger) { instance_double(ActiveSupport::Logger) } + let(:real_2021_2022_form) { Form.new("config/forms/2021_2022.json", "2021_2022") } let(:real_2022_2023_form) { Form.new("config/forms/2022_2023.json", "2022_2023") } - let(:logger) { instance_double(ActiveSupport::Logger) } + let(:fixture_directory) { "spec/fixtures/softwire_imports/case_logs" } - context "when importing users" do - subject(:case_log_service) { described_class.new(storage_service, logger) } + def open_file(directory, filename) + File.open("#{directory}/#{filename}.xml") + end - def open_file(directory, filename) - File.open("#{directory}/#{filename}.xml") - end + before do + # Owning and Managing organisations + FactoryBot.create(:organisation, old_visible_id: "1", provider_type: "PRP") + + # Created by users + FactoryBot.create(:user, old_user_id: "c3061a2e6ea0b702e6f6210d5c52d2a92612d2aa") + FactoryBot.create(:user, old_user_id: "e29c492473446dca4d50224f2bb7cf965a261d6f") + + # Stub the form handler to use the real form + allow(FormHandler.instance).to receive(:get_form).with("2021_2022").and_return(real_2021_2022_form) + allow(FormHandler.instance).to receive(:get_form).with("2022_2023").and_return(real_2022_2023_form) + + WebMock.stub_request(:get, /api.postcodes.io\/postcodes\/LS166FT/) + .to_return(status: 200, body: '{"status":200,"result":{"codes":{"admin_district":"E08000035"}}}', headers: {}) + end + + context "when importing users" do + let(:remote_folder) { "case_logs" } + let(:case_log_id) { "0ead17cb-1668-442d-898c-0d52879ff592" } + let(:case_log_id2) { "166fc004-392e-47a8-acb8-1c018734882b" } + let(:case_log_id3) { "00d2343e-d5fa-4c89-8400-ec3854b0f2b4" } before do # Stub the S3 file listing and download @@ -31,16 +49,6 @@ RSpec.describe Imports::CaseLogsImportService do allow(storage_service).to receive(:get_file_io) .with("#{remote_folder}/#{case_log_id3}.xml") .and_return(open_file(fixture_directory, case_log_id3), open_file(fixture_directory, case_log_id3)) - # Stub the form handler to use the real form - allow(FormHandler.instance).to receive(:get_form).with("2021_2022").and_return(real_2021_2022_form) - allow(FormHandler.instance).to receive(:get_form).with("2022_2023").and_return(real_2022_2023_form) - - WebMock.stub_request(:get, /api.postcodes.io\/postcodes\/LS166FT/) - .to_return(status: 200, body: '{"status":200,"result":{"codes":{"admin_district":"E08000035"}}}', headers: {}) - - FactoryBot.create(:user, old_user_id: "c3061a2e6ea0b702e6f6210d5c52d2a92612d2aa") - FactoryBot.create(:user, old_user_id: "e29c492473446dca4d50224f2bb7cf965a261d6f") - FactoryBot.create(:organisation, old_visible_id: "1", provider_type: "PRP") end it "successfully create all case logs" do @@ -59,4 +67,26 @@ RSpec.describe Imports::CaseLogsImportService do .to change(CaseLog, :count).by(3) end end + + context "when import a specific log" do + let(:case_log_id) { "0ead17cb-1668-442d-898c-0d52879ff592" } + let(:case_log_file) { open_file(fixture_directory, case_log_id) } + + context "and the void date is after the start date" do + let(:case_log_xml) do + xml_doc = Nokogiri::XML(case_log_file) + xml_doc.at_xpath("//xmlns:VYEAR").content = 2023 + xml_doc + end + + it "does not import the voiddate" do + allow(logger).to receive(:warn).with(/is not completed/) + case_log_service.send(:create_log, case_log_xml) + + case_log = CaseLog.where(old_id: case_log_id).first + expect(case_log).not_to be_nil + expect(case_log.voiddate).to be_nil + end + end + end end