Browse Source

Handles visible IDs not being system unique

pull/748/head
Stéphane Meny 3 years ago
parent
commit
6b4ae987e5
No known key found for this signature in database
GPG Key ID: 9D0AFEA988527923
  1. 2
      app/models/form/setup/questions/location_id.rb
  2. 16
      app/services/imports/case_logs_import_service.rb
  3. 2
      spec/models/form/setup/questions/location_id_spec.rb
  4. 5
      spec/models/form_spec.rb
  5. 33
      spec/services/imports/case_logs_import_service_spec.rb

2
app/models/form/setup/questions/location_id.rb

@ -5,7 +5,7 @@ class Form::Setup::Questions::LocationId < ::Form::Question
@header = "Which location is this log for?" @header = "Which location is this log for?"
@hint_text = "" @hint_text = ""
@type = "radio" @type = "radio"
@derived = true unless FeatureToggle.supported_housing_schemes_enabled? @derived = true
@answer_options = answer_options @answer_options = answer_options
end end

16
app/services/imports/case_logs_import_service.rb

@ -185,16 +185,20 @@ module Imports
# Supported Housing fields # Supported Housing fields
if attributes["needstype"] == GN_SH[:supported_housing] if attributes["needstype"] == GN_SH[:supported_housing]
old_visible_id = safe_string_as_integer(xml_doc, "_1cschemecode") location_old_visible_id = safe_string_as_integer(xml_doc, "_1cschemecode")
location = Location.find_by(old_visible_id:) scheme_old_visible_id = safe_string_as_integer(xml_doc, "_1cmangroupcode")
scheme = location.scheme
# Set the scheme via location, because the scheme old visible ID is not unique schemes = Scheme.where(old_visible_id: scheme_old_visible_id, owning_organisation_id: attributes["owning_organisation_id"])
location = Location.find_by(old_visible_id: location_old_visible_id, scheme: schemes)
raise "No matching location for scheme #{scheme_old_visible_id} and location #{location_old_visible_id} (visible IDs)" if location.nil?
# Set the scheme via location, because the scheme old visible ID can be duplicated at import
attributes["location_id"] = location.id attributes["location_id"] = location.id
attributes["scheme_id"] = scheme.id attributes["scheme_id"] = location.scheme.id
attributes["sheltered"] = unsafe_string_as_integer(xml_doc, "Q1e") attributes["sheltered"] = unsafe_string_as_integer(xml_doc, "Q1e")
attributes["chcharge"] = safe_string_as_decimal(xml_doc, "Q18b") attributes["chcharge"] = safe_string_as_decimal(xml_doc, "Q18b")
attributes["household_charge"] = household_charge(xml_doc) attributes["household_charge"] = household_charge(xml_doc)
attributes["is_carehome"] = is_carehome(scheme) attributes["is_carehome"] = is_carehome(location.scheme)
end end
# Handles confidential schemes # Handles confidential schemes

2
spec/models/form/setup/questions/location_id_spec.rb

@ -28,7 +28,7 @@ RSpec.describe Form::Setup::Questions::LocationId, type: :model do
end end
it "is marked as derived" do it "is marked as derived" do
expect(question).not_to be_derived expect(question).to be_derived
end end
context "when there are no locations" do context "when there are no locations" do

5
spec/models/form_spec.rb

@ -178,18 +178,15 @@ RSpec.describe Form, type: :model do
describe "invalidated_page_questions" do describe "invalidated_page_questions" do
let(:case_log) { FactoryBot.create(:case_log, :in_progress, needstype: 1) } let(:case_log) { FactoryBot.create(:case_log, :in_progress, needstype: 1) }
let(:expected_invalid) { %w[scheme_id condition_effects cbl conditional_question_no_second_question net_income_value_check dependent_question offered layear declaration] }
context "when dependencies are not met" do context "when dependencies are not met" do
let(:expected_invalid) { %w[scheme_id location_id condition_effects cbl conditional_question_no_second_question net_income_value_check dependent_question offered layear declaration] }
it "returns an array of question keys whose pages conditions are not met" do it "returns an array of question keys whose pages conditions are not met" do
expect(form.invalidated_page_questions(case_log).map(&:id).uniq).to eq(expected_invalid) expect(form.invalidated_page_questions(case_log).map(&:id).uniq).to eq(expected_invalid)
end end
end end
context "with two pages having the same question and only one has dependencies met" do context "with two pages having the same question and only one has dependencies met" do
let(:expected_invalid) { %w[scheme_id location_id condition_effects cbl conditional_question_no_second_question net_income_value_check dependent_question offered layear declaration] }
it "returns an array of question keys whose pages conditions are not met" do it "returns an array of question keys whose pages conditions are not met" do
case_log["preg_occ"] = "No" case_log["preg_occ"] = "No"
expect(form.invalidated_page_questions(case_log).map(&:id).uniq).to eq(expected_invalid) expect(form.invalidated_page_questions(case_log).map(&:id).uniq).to eq(expected_invalid)

33
spec/services/imports/case_logs_import_service_spec.rb

@ -9,7 +9,10 @@ RSpec.describe Imports::CaseLogsImportService do
let(:real_2021_2022_form) { Form.new("config/forms/2021_2022.json", "2021_2022") } 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(:real_2022_2023_form) { Form.new("config/forms/2022_2023.json", "2022_2023") }
let(:fixture_directory) { "spec/fixtures/imports/case_logs" } let(:fixture_directory) { "spec/fixtures/imports/case_logs" }
let(:organisation) { FactoryBot.create(:organisation, old_visible_id: "1", provider_type: "PRP") } let(:organisation) { FactoryBot.create(:organisation, old_visible_id: "1", provider_type: "PRP") }
let(:scheme1) { FactoryBot.create(:scheme, old_visible_id: 123, owning_organisation: organisation) }
let(:scheme2) { FactoryBot.create(:scheme, old_visible_id: 456, owning_organisation: organisation) }
def open_file(directory, filename) def open_file(directory, filename)
File.open("#{directory}/#{filename}.xml") File.open("#{directory}/#{filename}.xml")
@ -26,14 +29,10 @@ RSpec.describe Imports::CaseLogsImportService do
FactoryBot.create(:user, old_user_id: "c3061a2e6ea0b702e6f6210d5c52d2a92612d2aa", organisation:) FactoryBot.create(:user, old_user_id: "c3061a2e6ea0b702e6f6210d5c52d2a92612d2aa", organisation:)
FactoryBot.create(:user, old_user_id: "e29c492473446dca4d50224f2bb7cf965a261d6f", organisation:) FactoryBot.create(:user, old_user_id: "e29c492473446dca4d50224f2bb7cf965a261d6f", organisation:)
# Scheme and Location # Location setup
scheme = FactoryBot.create(:scheme, old_visible_id: 123) FactoryBot.create(:location, old_visible_id: 10, wheelchair_adaptation: 1, postcode: "LS166FT", scheme_id: scheme1.id)
locations = FactoryBot.create_list(:location, 3, scheme_id: scheme.id) FactoryBot.create(:location, scheme_id: scheme1.id)
locations[0].update!( FactoryBot.create(:location, old_visible_id: 10, wheelchair_adaptation: 1, postcode: "LS166FT", scheme_id: scheme2.id)
old_visible_id: 10,
wheelchair_adaptation: 1,
postcode: "LS166FT"
)
# Stub the form handler to use the real form # 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("2021_2022").and_return(real_2021_2022_form)
@ -217,7 +216,7 @@ RSpec.describe Imports::CaseLogsImportService do
end end
end end
context "and this is a supported housing log" do context "and this is a supported housing log with multiple locations under a scheme" do
let(:case_log_id) { "0b4a68df-30cc-474a-93c0-a56ce8fdad3b" } let(:case_log_id) { "0b4a68df-30cc-474a-93c0-a56ce8fdad3b" }
it "sets the scheme and location values" do it "sets the scheme and location values" do
@ -230,5 +229,21 @@ RSpec.describe Imports::CaseLogsImportService do
expect(case_log.status).to eq("completed") expect(case_log.status).to eq("completed")
end end
end end
context "and this is a supported housing log with a single location under a scheme" do
let(:case_log_id) { "0b4a68df-30cc-474a-93c0-a56ce8fdad3b" }
before { case_log_xml.at_xpath("//xmlns:_1cmangroupcode").content = scheme2.old_visible_id }
it "sets the scheme and location values" do
expect(logger).not_to receive(:warn)
case_log_service.send(:create_log, case_log_xml)
case_log = CaseLog.find_by(old_id: case_log_id)
expect(case_log.scheme_id).not_to be_nil
expect(case_log.location_id).not_to be_nil
expect(case_log.status).to eq("completed")
end
end
end end
end end

Loading…
Cancel
Save