Browse Source

Early import work

pull/470/head
Stéphane Meny 3 years ago
parent
commit
be6ee00b85
No known key found for this signature in database
GPG Key ID: 9D0AFEA988527923
  1. 9
      app/models/bulk_upload.rb
  2. 28
      app/models/case_log.rb
  3. 2
      app/models/validations/property_validations.rb
  4. 6
      app/models/validations/setup_validations.rb
  5. 278
      app/services/imports/case_logs_import_service.rb
  6. 56
      config/forms/2021_2022.json
  7. 0
      db/migrate/20220207112310_additional_user_fields2.rb
  8. 10
      db/migrate/20220411092231_update_case_logs_fields.rb
  9. 15
      db/schema.rb
  10. 10
      spec/factories/case_log.rb
  11. 8
      spec/features/form/check_answers_page_spec.rb
  12. 2
      spec/features/form/form_navigation_spec.rb
  13. 2
      spec/features/form/saving_data_spec.rb
  14. 11
      spec/fixtures/exports/case_logs.xml
  15. 18
      spec/fixtures/forms/2021_2022.json
  16. 532
      spec/fixtures/softwire_imports/case_logs/0ead17cb-1668-442d-898c-0d52879ff592.xml
  17. 2
      spec/helpers/check_answers_helper_spec.rb
  18. 39
      spec/models/case_log_spec.rb
  19. 8
      spec/models/form/subsection_spec.rb
  20. 2
      spec/models/form_spec.rb
  21. 6
      spec/models/validations/financial_validations_spec.rb
  22. 20
      spec/models/validations/household_validations_spec.rb
  23. 6
      spec/models/validations/property_validations_spec.rb
  24. 20
      spec/models/validations/setup_validations_spec.rb
  25. 29
      spec/services/imports/case_logs_import_service_spec.rb

9
app/models/bulk_upload.rb

@ -67,8 +67,7 @@ class BulkUpload
tenancy: row[9], tenancy: row[9],
tenancyother: row[10], tenancyother: row[10],
# tenancyduration: row[11], # tenancyduration: row[11],
other_hhmemb: other_hhmemb(row), hhmemb: hhmemb(row),
hhmemb: other_hhmemb(row) + 1,
age1: row[12], age1: row[12],
age2: row[13], age2: row[13],
age3: row[14], age3: row[14],
@ -193,7 +192,7 @@ class BulkUpload
illness_type_10: row[128], illness_type_10: row[128],
# london_affordable: row[129], # london_affordable: row[129],
rent_type: row[130], rent_type: row[130],
intermediate_rent_product_name: row[131], irproduct: row[131],
# data_protection: row[132], # data_protection: row[132],
sale_or_letting: "letting", sale_or_letting: "letting",
declaration: 1, declaration: 1,
@ -206,7 +205,7 @@ class BulkUpload
Time.zone.local("20#{year}", month.to_s, day.to_s) Time.zone.local("20#{year}", month.to_s, day.to_s)
end end
def other_hhmemb(row) def hhmemb(row)
[13, 14, 15, 16, 17, 18, 19].count { |idx| row[idx].present? } [14, 15, 16, 17, 18, 19, 20].count { |idx| row[idx].present? }
end end
end end

28
app/models/case_log.rb

@ -51,6 +51,8 @@ class CaseLog < ApplicationRecord
end end
def collection_start_year def collection_start_year
return unless startdate
window_end_date = Time.zone.local(startdate.year, 4, 1) window_end_date = Time.zone.local(startdate.year, 4, 1)
startdate < window_end_date ? startdate.year - 1 : startdate.year startdate < window_end_date ? startdate.year - 1 : startdate.year
end end
@ -364,20 +366,11 @@ private
end end
def set_derived_fields! def set_derived_fields!
if ppostcode_full.present?
self.ppostc1 = UKPostcode.parse(ppostcode_full).outcode
self.ppostc2 = UKPostcode.parse(ppostcode_full).incode
end
if mrcdate.present? if mrcdate.present?
self.mrcday = mrcdate.day self.mrcday = mrcdate.day
self.mrcmonth = mrcdate.month self.mrcmonth = mrcdate.month
self.mrcyear = mrcdate.year self.mrcyear = mrcdate.year
end end
if startdate.present?
self.day = startdate.day
self.month = startdate.month
self.year = startdate.year
end
if property_void_date.present? if property_void_date.present?
self.vday = property_void_date.day self.vday = property_void_date.day
self.vmonth = property_void_date.month self.vmonth = property_void_date.month
@ -387,7 +380,6 @@ private
self.newprop = has_first_let_vacancy_reason? ? 1 : 2 self.newprop = has_first_let_vacancy_reason? ? 1 : 2
end end
self.incref = 1 if net_income_refused? self.incref = 1 if net_income_refused?
self.other_hhmemb = hhmemb - 1 if hhmemb.present?
self.renttype = RENT_TYPE_MAPPING[rent_type] self.renttype = RENT_TYPE_MAPPING[rent_type]
self.lettype = get_lettype self.lettype = get_lettype
self.totchild = get_totchild self.totchild = get_totchild
@ -416,11 +408,11 @@ private
weekly_value(tshortfall) weekly_value(tshortfall)
end end
self.nocharge = household_charge&.zero? ? 1 : 0 self.nocharge = household_charge&.zero? ? 1 : 0
self.underoccupation_benefitcap = 3 if renewal == 1 && year == 2021 self.underoccupation_benefitcap = 3 if renewal == 1 && collection_start_year == 2021
self.ethnic = ethnic || ethnic_group self.ethnic = ethnic || ethnic_group
self.housingneeds = get_housingneeds self.housingneeds = get_housingneeds
if is_renewal? if is_renewal?
self.underoccupation_benefitcap = 2 if year == 2021 self.underoccupation_benefitcap = 2 if collection_start_year == 2021
self.homeless = 2 self.homeless = 2
self.referral = 0 self.referral = 0
self.layear = 1 self.layear = 1
@ -447,7 +439,7 @@ private
def process_previous_postcode_changes! def process_previous_postcode_changes!
self.ppostcode_full = ppostcode_full.present? ? ppostcode_full.upcase.gsub(/\s+/, "") : ppostcode_full self.ppostcode_full = ppostcode_full.present? ? ppostcode_full.upcase.gsub(/\s+/, "") : ppostcode_full
process_postcode(ppostcode_full, "previous_postcode_known", "is_previous_la_inferred", "prevloc", "ppostc1", "ppostc2") process_postcode(ppostcode_full, "previous_postcode_known", "is_previous_la_inferred", "prevloc", nil, nil)
end end
def process_postcode(postcode, postcode_known_key, la_inferred_key, la_key, outcode_key, incode_key) def process_postcode(postcode, postcode_known_key, la_inferred_key, la_key, outcode_key, incode_key)
@ -457,8 +449,8 @@ private
inferred_la = get_inferred_la(postcode) inferred_la = get_inferred_la(postcode)
self[la_inferred_key] = inferred_la.present? self[la_inferred_key] = inferred_la.present?
self[la_key] = inferred_la if inferred_la.present? self[la_key] = inferred_la if inferred_la.present?
self[outcode_key] = UKPostcode.parse(postcode).outcode self[outcode_key] = UKPostcode.parse(postcode).outcode unless outcode_key.nil?
self[incode_key] = UKPostcode.parse(postcode).incode self[incode_key] = UKPostcode.parse(postcode).incode unless incode_key.nil?
end end
def reset_location_fields! def reset_location_fields!
@ -466,7 +458,7 @@ private
end end
def reset_previous_location_fields! def reset_previous_location_fields!
reset_location(is_previous_la_inferred, "prevloc", "is_previous_la_inferred", "ppostcode_full", "ppostc1", "ppostc2", previous_la_known) reset_location(is_previous_la_inferred, "prevloc", "is_previous_la_inferred", "ppostcode_full", nil, nil, previous_la_known)
end end
def reset_location(is_inferred, la_key, is_inferred_key, postcode_key, incode_key, outcode_key, is_la_known) def reset_location(is_inferred, la_key, is_inferred_key, postcode_key, incode_key, outcode_key, is_la_known)
@ -475,8 +467,8 @@ private
end end
self[is_inferred_key] = false self[is_inferred_key] = false
self[postcode_key] = nil self[postcode_key] = nil
self[incode_key] = nil self[incode_key] = nil unless incode_key.nil?
self[outcode_key] = nil self[outcode_key] = nil unless outcode_key.nil?
end end
def get_totelder def get_totelder

2
app/models/validations/property_validations.rb

@ -112,7 +112,7 @@ module Validations::PropertyValidations
record.errors.add :beds, I18n.t("validations.property.unittype_gn.one_bedroom_bedsit") record.errors.add :beds, I18n.t("validations.property.unittype_gn.one_bedroom_bedsit")
end end
if record.other_hhmemb&.zero? && record.is_shared_housing? && if record.hhmemb == 1 && record.is_shared_housing? &&
!record.beds.to_i.between?(1, 3) && record.beds.present? !record.beds.to_i.between?(1, 3) && record.beds.present?
record.errors.add :unittype_gn, I18n.t("validations.property.unittype_gn.one_three_bedroom_single_tenant_shared") record.errors.add :unittype_gn, I18n.t("validations.property.unittype_gn.one_three_bedroom_single_tenant_shared")
record.errors.add :beds, I18n.t("validations.property.unittype_gn.one_three_bedroom_single_tenant_shared") record.errors.add :beds, I18n.t("validations.property.unittype_gn.one_three_bedroom_single_tenant_shared")

6
app/models/validations/setup_validations.rb

@ -1,7 +1,7 @@
module Validations::SetupValidations module Validations::SetupValidations
def validate_intermediate_rent_product_name(record) def validate_irproduct_other(record)
if intermediate_product_rent_type?(record) && record.intermediate_rent_product_name.blank? if intermediate_product_rent_type?(record) && record.irproduct_other.blank?
record.errors.add :intermediate_rent_product_name, I18n.t("validations.setup.intermediate_rent_product_name.blank") record.errors.add :irproduct_other, I18n.t("validations.setup.intermediate_rent_product_name.blank")
end end
end end

278
app/services/imports/case_logs_import_service.rb

@ -0,0 +1,278 @@
module Imports
class CaseLogsImportService < ImportService
def create_logs(folder)
import_from(folder, :create_log)
end
private
GN_SH = {
general_needs: 1,
supported_housing: 2,
}.freeze
SR_AR_IR = {
social_rent: 1,
affordable_rent: 2,
intermediate_rent: 3,
}.freeze
# For providertype, values are reversed!!!
PRP_LA = {
private_registered_provider: 1,
local_authority: 2,
}.freeze
IRPRODUCT = {
rent_to_buy: 1,
london_living_rent: 2,
other_intermediate_rent_product: 3,
}.freeze
# These must match our form
RENT_TYPE = {
social_rent: 0,
affordable_rent: 1,
london_affordable_rent: 2,
rent_to_buy: 3,
london_living_rent: 4,
other_intermediate_rent_product: 5,
}.freeze
# Order matters since we derive from previous values (uses attributes)
def create_log(xml_doc)
attributes = {}
# Required fields for status complete or logic to work
attributes["startdate"] = start_date(xml_doc)
attributes["owning_organisation_id"] = find_organisation_id(xml_doc, "OWNINGORGID")
attributes["managing_organisation_id"] = find_organisation_id(xml_doc, "MANINGORGID")
attributes["previous_postcode_known"] = previous_postcode_known(xml_doc)
attributes["ppostcode_full"] = previous_postcode(xml_doc, attributes)
attributes["needstype"] = needs_type(xml_doc)
attributes["lar"] = london_affordable_rent(xml_doc)
attributes["irproduct"] = unsafe_string_as_integer(xml_doc, "IRPRODUCT")
attributes["irproduct_other"] = field_value(xml_doc, "xmlns", "IRPRODUCTOTHER")
attributes["rent_type"] = rent_type(xml_doc, attributes)
attributes["rsnvac"] = unsafe_string_as_integer(xml_doc, "Q27")
attributes["renewal"] = renewal(attributes)
(1..8).each do |index|
attributes["age#{index}"] = age(xml_doc, index)
attributes["sex#{index}"] = sex(xml_doc, index)
attributes["ecstat#{index}"] = unsafe_string_as_integer(xml_doc, "P#{index}Eco")
end
# attributes["hhmemb"] =
# Not specific to our form but required for CDS and can't be inferred
# attributes["form"] = Integer(field_value(xml_doc, "xmlns", "FORM"))
# attributes["lettype"] = let_type(xml_doc, attributes)
case_log = CaseLog.new(attributes)
case_log.save!
# pp attributes
# pp case_log.status
# pp case_log.send(:mandatory_fields)
end
def start_date(xml_doc)
day = Integer(field_value(xml_doc, "xmlns", "DAY"))
month = Integer(field_value(xml_doc, "xmlns", "MONTH"))
year = Integer(field_value(xml_doc, "xmlns", "YEAR"))
Date.new(year, month, day)
end
def get_form_name_component(xml_doc, index)
form_name = field_value(xml_doc, "meta", "form-name")
form_type_components = form_name.split("-")
form_type_components[index]
end
def needs_type(xml_doc)
gn_sh = get_form_name_component(xml_doc, -1)
case gn_sh
when "GN"
GN_SH[:general_needs]
when "SH"
GN_SH[:supported_housing]
else
raise "Unknown needstype value: #{gn_sh}"
end
end
# This does not match renttype (CDS) which is derived by case logs logic
def rent_type(xml_doc, attributes)
sr_ar_ir = get_form_name_component(xml_doc, -2)
case sr_ar_ir
when "SR"
RENT_TYPE[:social_rent]
when "AR"
if attributes["lar"] == 1
RENT_TYPE[:london_affordable_rent]
else
RENT_TYPE[:affordable_rent]
end
when "IR"
if attributes["irproduct"] == IRPRODUCT[:rent_to_buy]
RENT_TYPE[:rent_to_buy]
elsif attributes["irproduct"] == IRPRODUCT[:london_living_rent]
RENT_TYPE[:london_living_rent]
elsif attributes["irproduct"] == IRPRODUCT[:other_intermediate_rent_product]
RENT_TYPE[:other_intermediate_rent_product]
end
end
end
# def let_type(xml_doc, attributes)
# # "1 Private Registered Provider" or "2 Local Authority"
# # We do not store providertype since it comes from the organisation import
# landlord = field_value(xml_doc, "xmlns", "Landlord").to_i
#
# if attributes["renttype"] == SR_AR_IR[:social_rent] &&
# attributes["needstype"] == GN_SH[:general_needs] &&
# landlord == PRP_LA[:private_registered_provider]
# 1
# elsif attributes["renttype"] == SR_AR_IR[:social_rent] &&
# attributes["needstype"] == GN_SH[:supported_housing] &&
# landlord == PRP_LA[:private_registered_provider]
# 2
# elsif attributes["renttype"] == SR_AR_IR[:social_rent] &&
# attributes["needstype"] == GN_SH[:general_needs] &&
# landlord == PRP_LA[:local_authority]
# 3
# elsif attributes["renttype"] == SR_AR_IR[:social_rent] &&
# attributes["needstype"] == GN_SH[:supported_housing] &&
# landlord == PRP_LA[:local_authority]
# 4
# elsif attributes["renttype"] == SR_AR_IR[:affordable_rent] &&
# attributes["needstype"] == GN_SH[:general_needs] &&
# landlord == PRP_LA[:private_registered_provider]
# 5
# elsif attributes["renttype"] == SR_AR_IR[:affordable_rent] &&
# attributes["needstype"] == GN_SH[:supported_housing] &&
# landlord == PRP_LA[:private_registered_provider]
# 6
# elsif attributes["renttype"] == SR_AR_IR[:affordable_rent] &&
# attributes["needstype"] == GN_SH[:general_needs] &&
# landlord == PRP_LA[:local_authority]
# 7
# elsif attributes["renttype"] == SR_AR_IR[:affordable_rent] &&
# attributes["needstype"] == GN_SH[:supported_housing] &&
# landlord == PRP_LA[:local_authority]
# 8
# elsif attributes["renttype"] == SR_AR_IR[:intermediate_rent] &&
# attributes["needstype"] == GN_SH[:general_needs] &&
# landlord == PRP_LA[:private_registered_provider]
# 9
# elsif attributes["renttype"] == SR_AR_IR[:intermediate_rent] &&
# attributes["needstype"] == GN_SH[:supported_housing] &&
# landlord == PRP_LA[:private_registered_provider]
# 10
# elsif attributes["renttype"] == SR_AR_IR[:intermediate_rent] &&
# attributes["needstype"] == GN_SH[:general_needs] &&
# landlord == PRP_LA[:local_authority]
# 11
# elsif attributes["renttype"] == SR_AR_IR[:intermediate_rent] &&
# attributes["needstype"] == GN_SH[:supported_housing] &&
# landlord == PRP_LA[:local_authority]
# 12
# else
# raise "Could not infer rent type with rentype:#{attributes['renttype']} / needstype:#{attributes['needstype']} / landlord:#{landlord}"
# end
# end
def find_organisation_id(xml_doc, field)
old_visible_id = field_value(xml_doc, "xmlns", field).to_i
landlord = field_value(xml_doc, "xmlns", "Landlord").to_i
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?
organisation = Organisation.new
organisation.old_visible_id = old_visible_id
organisation.provider_type = if landlord == 2
1
else
2
end
organisation.save!
end
organisation.id
end
def age(xml_doc, index)
Integer(field_value(xml_doc, "xmlns", "P#{index}Age"), exception: false)
end
def sex(xml_doc, index)
sex = field_value(xml_doc, "xmlns", "P#{index}Sex")
case sex
when "Male"
"M"
when "Female"
"F"
when "Other", "Non-binary"
"X"
when "Refused"
"R"
end
end
def previous_postcode_known(xml_doc)
previous_postcode_known = field_value(xml_doc, "xmlns", "Q12bnot")
if previous_postcode_known == "Temporary or Unknown"
0
else
1
end
end
def previous_postcode(xml_doc, attributes)
previous_postcode_known = attributes["previous_postcode_known"]
if previous_postcode_known.zero?
nil
else
outcode = field_value(xml_doc, "xmlns", "PPOSTC1")
incode = field_value(xml_doc, "xmlns", "PPOSTC2")
"#{outcode} #{incode}"
end
end
def london_affordable_rent(xml_doc)
lar = unsafe_string_as_integer(xml_doc, "LAR")
if lar == 1
1
else
# We default to No for any other values (nil, not known)
2
end
end
def renewal(attributes)
# Relet – renewal of fixed-term tenancy
if attributes["rsnvac"] == 14
1
else
0
end
end
# Safe: A string that represents only an integer (or empty/nil)
def safe_string_as_integer(xml_doc, attribute)
str = field_value(xml_doc, "xmlns", attribute)
Integer(str, exception: false)
end
# Unsafe: A string that has more than just the integer value
def unsafe_string_as_integer(xml_doc, attribute)
str = field_value(xml_doc, "xmlns", attribute)
if str.blank?
nil
else
str.to_i
end
end
end
end

56
config/forms/2021_2022.json

@ -1559,25 +1559,25 @@
}, },
"depends_on": [ "depends_on": [
{ {
"other_hhmemb": 1 "hhmemb": 2
}, },
{ {
"other_hhmemb": 2 "hhmemb": 3
}, },
{ {
"other_hhmemb": 3 "hhmemb": 4
}, },
{ {
"other_hhmemb": 4 "hhmemb": 5
}, },
{ {
"other_hhmemb": 5 "hhmemb": 6
}, },
{ {
"other_hhmemb": 6 "hhmemb": 7
}, },
{ {
"other_hhmemb": 7 "hhmemb": 8
} }
] ]
}, },
@ -1772,22 +1772,22 @@
}, },
"depends_on": [ "depends_on": [
{ {
"other_hhmemb": 2 "hhmemb": 3
}, },
{ {
"other_hhmemb": 3 "hhmemb": 4
}, },
{ {
"other_hhmemb": 4 "hhmemb": 5
}, },
{ {
"other_hhmemb": 5 "hhmemb": 6
}, },
{ {
"other_hhmemb": 6 "hhmemb": 7
}, },
{ {
"other_hhmemb": 7 "hhmemb": 8
} }
] ]
}, },
@ -1982,19 +1982,19 @@
}, },
"depends_on": [ "depends_on": [
{ {
"other_hhmemb": 3 "hhmemb": 4
}, },
{ {
"other_hhmemb": 4 "hhmemb": 5
}, },
{ {
"other_hhmemb": 5 "hhmemb": 6
}, },
{ {
"other_hhmemb": 6 "hhmemb": 7
}, },
{ {
"other_hhmemb": 7 "hhmemb": 8
} }
] ]
}, },
@ -2189,16 +2189,16 @@
}, },
"depends_on": [ "depends_on": [
{ {
"other_hhmemb": 4 "hhmemb": 5
}, },
{ {
"other_hhmemb": 5 "hhmemb": 6
}, },
{ {
"other_hhmemb": 6 "hhmemb": 7
}, },
{ {
"other_hhmemb": 7 "hhmemb": 8
} }
] ]
}, },
@ -2393,13 +2393,13 @@
}, },
"depends_on": [ "depends_on": [
{ {
"other_hhmemb": 5 "hhmemb": 6
}, },
{ {
"other_hhmemb": 6 "hhmemb": 7
}, },
{ {
"other_hhmemb": 7 "hhmemb": 8
} }
] ]
}, },
@ -2594,10 +2594,10 @@
}, },
"depends_on": [ "depends_on": [
{ {
"other_hhmemb": 6 "hhmemb": 7
}, },
{ {
"other_hhmemb": 7 "hhmemb": 8
} }
] ]
}, },
@ -2792,7 +2792,7 @@
}, },
"depends_on": [ "depends_on": [
{ {
"other_hhmemb": 7 "hhmemb": 8
} }
] ]
}, },

0
db/migrate/202202071123100_additional_user_fields2.rb → db/migrate/20220207112310_additional_user_fields2.rb

10
db/migrate/20220411092231_update_case_logs_fields.rb

@ -0,0 +1,10 @@
class UpdateCaseLogsFields < ActiveRecord::Migration[7.0]
def change
change_table :case_logs, bulk: true do |t|
t.integer :form, :lar, :irproduct
t.remove :day, :month, :year, :other_hhmemb, type: :integer
t.remove :ppostc1, :ppostc2, type: :string
t.rename :intermediate_rent_product_name, :irproduct_other
end
end
end

15
db/schema.rb

@ -10,7 +10,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[7.0].define(version: 202202071123100) do ActiveRecord::Schema[7.0].define(version: 2022_04_11_092231) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "plpgsql" enable_extension "plpgsql"
@ -132,7 +132,7 @@ ActiveRecord::Schema[7.0].define(version: 202202071123100) do
t.string "property_owner_organisation" t.string "property_owner_organisation"
t.string "property_manager_organisation" t.string "property_manager_organisation"
t.string "sale_or_letting" t.string "sale_or_letting"
t.string "intermediate_rent_product_name" t.string "irproduct_other"
t.string "purchaser_code" t.string "purchaser_code"
t.integer "reason" t.integer "reason"
t.string "propcode" t.string "propcode"
@ -143,14 +143,11 @@ ActiveRecord::Schema[7.0].define(version: 202202071123100) do
t.integer "hbrentshortfall" t.integer "hbrentshortfall"
t.string "postcode" t.string "postcode"
t.string "postcod2" t.string "postcod2"
t.string "ppostc1"
t.string "ppostc2"
t.integer "property_relet" t.integer "property_relet"
t.datetime "mrcdate", precision: nil t.datetime "mrcdate", precision: nil
t.integer "mrcday" t.integer "mrcday"
t.integer "mrcmonth" t.integer "mrcmonth"
t.integer "mrcyear" t.integer "mrcyear"
t.integer "other_hhmemb"
t.integer "incref" t.integer "incref"
t.datetime "sale_completion_date", precision: nil t.datetime "sale_completion_date", precision: nil
t.datetime "startdate", precision: nil t.datetime "startdate", precision: nil
@ -167,9 +164,6 @@ ActiveRecord::Schema[7.0].define(version: 202202071123100) do
t.integer "postcode_known" t.integer "postcode_known"
t.integer "la_known" t.integer "la_known"
t.boolean "is_la_inferred" t.boolean "is_la_inferred"
t.integer "day"
t.integer "month"
t.integer "year"
t.integer "totchild" t.integer "totchild"
t.integer "totelder" t.integer "totelder"
t.integer "totadult" t.integer "totadult"
@ -232,6 +226,9 @@ ActiveRecord::Schema[7.0].define(version: 202202071123100) do
t.string "relat7" t.string "relat7"
t.string "relat8" t.string "relat8"
t.integer "rent_value_check" t.integer "rent_value_check"
t.integer "form"
t.integer "lar"
t.integer "irproduct"
t.index ["managing_organisation_id"], name: "index_case_logs_on_managing_organisation_id" t.index ["managing_organisation_id"], name: "index_case_logs_on_managing_organisation_id"
t.index ["owning_organisation_id"], name: "index_case_logs_on_owning_organisation_id" t.index ["owning_organisation_id"], name: "index_case_logs_on_owning_organisation_id"
end end
@ -318,12 +315,12 @@ ActiveRecord::Schema[7.0].define(version: 202202071123100) do
t.string "last_sign_in_ip" t.string "last_sign_in_ip"
t.integer "role" t.integer "role"
t.string "old_user_id" t.string "old_user_id"
t.string "phone"
t.integer "failed_attempts", default: 0 t.integer "failed_attempts", default: 0
t.string "unlock_token" t.string "unlock_token"
t.datetime "locked_at", precision: nil t.datetime "locked_at", precision: nil
t.boolean "is_dpo", default: false t.boolean "is_dpo", default: false
t.boolean "is_key_contact", default: false t.boolean "is_key_contact", default: false
t.string "phone"
t.integer "second_factor_attempts_count", default: 0 t.integer "second_factor_attempts_count", default: 0
t.string "encrypted_otp_secret_key" t.string "encrypted_otp_secret_key"
t.string "encrypted_otp_secret_key_iv" t.string "encrypted_otp_secret_key_iv"

10
spec/factories/case_log.rb

@ -7,7 +7,6 @@ FactoryBot.define do
needstype { 1 } needstype { 1 }
rent_type { 1 } rent_type { 1 }
startdate { Time.zone.local(2022, 5, 1) } startdate { Time.zone.local(2022, 5, 1) }
year { 2022 }
end end
trait :in_progress do trait :in_progress do
status { 1 } status { 1 }
@ -30,7 +29,7 @@ FactoryBot.define do
ethnic { 2 } ethnic { 2 }
national { 4 } national { 4 }
ecstat1 { 2 } ecstat1 { 2 }
other_hhmemb { 0 } hhmemb { 1 }
end end
trait :completed do trait :completed do
status { 2 } status { 2 }
@ -42,7 +41,6 @@ FactoryBot.define do
national { 4 } national { 4 }
prevten { 6 } prevten { 6 }
ecstat1 { 0 } ecstat1 { 0 }
other_hhmemb { 1 }
hhmemb { 2 } hhmemb { 2 }
relat2 { "P" } relat2 { "P" }
age2 { 32 } age2 { 32 }
@ -115,7 +113,6 @@ FactoryBot.define do
property_manager_organisation { "Test" } property_manager_organisation { "Test" }
renewal { 0 } renewal { 0 }
rent_type { 1 } rent_type { 1 }
intermediate_rent_product_name { 2 }
needstype { 1 } needstype { 1 }
purchaser_code { 798_794 } purchaser_code { 798_794 }
reason { 4 } reason { 4 }
@ -127,8 +124,6 @@ FactoryBot.define do
hbrentshortfall { 0 } hbrentshortfall { 0 }
tshortfall { 12 } tshortfall { 12 }
postcod2 { "w3" } postcod2 { "w3" }
ppostc1 { "w3" }
ppostc2 { "w3" }
property_relet { 0 } property_relet { 0 }
mrcdate { Time.utc(2020, 5, 0o5, 10, 36, 49) } mrcdate { Time.utc(2020, 5, 0o5, 10, 36, 49) }
mrcday { mrcdate.day } mrcday { mrcdate.day }
@ -137,9 +132,6 @@ FactoryBot.define do
incref { 0 } incref { 0 }
sale_completion_date { nil } sale_completion_date { nil }
startdate { Time.utc(2022, 2, 2, 10, 36, 49) } startdate { Time.utc(2022, 2, 2, 10, 36, 49) }
day { startdate.day }
month { startdate.month }
year { startdate.year }
armedforces { 0 } armedforces { 0 }
builtype { 1 } builtype { 1 }
unitletas { 2 } unitletas { 2 }

8
spec/features/form/check_answers_page_spec.rb

@ -53,7 +53,7 @@ RSpec.describe "Form Check Answers Page" do
it "has question headings based on the subsection" do it "has question headings based on the subsection" do
visit("/logs/#{id}/#{subsection}/check-answers") visit("/logs/#{id}/#{subsection}/check-answers")
question_labels = ["Tenant code", "Lead tenant’s age", "Lead tenant’s gender identity", "Number of Other Household Members"] question_labels = ["Tenant code", "Lead tenant’s age", "Lead tenant’s gender identity", "Number of Household Members"]
question_labels.each do |label| question_labels.each do |label|
expect(page).to have_content(label) expect(page).to have_content(label)
end end
@ -151,7 +151,7 @@ RSpec.describe "Form Check Answers Page" do
tenant_code: "123", tenant_code: "123",
age1: 35, age1: 35,
sex1: "M", sex1: "M",
other_hhmemb: 0, hhmemb: 1,
) )
end end
@ -164,7 +164,7 @@ RSpec.describe "Form Check Answers Page" do
tenant_code: "123", tenant_code: "123",
age1: 35, age1: 35,
sex1: "M", sex1: "M",
other_hhmemb: 0, hhmemb: 1,
armedforces: 3, armedforces: 3,
illness: 0, illness: 0,
) )
@ -179,7 +179,7 @@ RSpec.describe "Form Check Answers Page" do
tenant_code: "123", tenant_code: "123",
age1: 35, age1: 35,
sex1: "M", sex1: "M",
other_hhmemb: 0, hhmemb: 1,
armedforces: 3, armedforces: 3,
illness: 0, illness: 0,
housingneeds_h: 1, housingneeds_h: 1,

2
spec/features/form/form_navigation_spec.rb

@ -19,7 +19,7 @@ RSpec.describe "Form Navigation" do
age1: { type: "numeric", answer: 25, path: "person-1-age" }, age1: { type: "numeric", answer: 25, path: "person-1-age" },
sex1: { type: "radio", answer: "Female", path: "person-1-gender" }, sex1: { type: "radio", answer: "Female", path: "person-1-gender" },
ecstat1: { type: "radio", answer: 3, path: "person-1-working-situation" }, ecstat1: { type: "radio", answer: 3, path: "person-1-working-situation" },
other_hhmemb: { type: "numeric", answer: 2, path: "household-number-of-other-members" }, hhmemb: { type: "numeric", answer: 1, path: "household-number-of-members" },
} }
end end

2
spec/features/form/saving_data_spec.rb

@ -26,7 +26,7 @@ RSpec.describe "Form Saving Data" do
tenant_code: { type: "text", answer: "BZ737", path: "tenant_code" }, tenant_code: { type: "text", answer: "BZ737", path: "tenant_code" },
age1: { type: "numeric", answer: 25, path: "person_1_age" }, age1: { type: "numeric", answer: 25, path: "person_1_age" },
sex1: { type: "radio", answer: { "F" => "Female" }, path: "person_1_gender" }, sex1: { type: "radio", answer: { "F" => "Female" }, path: "person_1_gender" },
other_hhmemb: { type: "numeric", answer: 2, path: "household_number_of_other_members" }, hhmemb: { type: "numeric", answer: 3, path: "household_number_of_members" },
} }
end end

11
spec/fixtures/exports/case_logs.xml vendored

@ -90,7 +90,7 @@
<property_owner_organisation>Test</property_owner_organisation> <property_owner_organisation>Test</property_owner_organisation>
<property_manager_organisation>Test</property_manager_organisation> <property_manager_organisation>Test</property_manager_organisation>
<sale_or_letting/> <sale_or_letting/>
<intermediate_rent_product_name>2</intermediate_rent_product_name> <irproduct_other/>
<purchaser_code>798794</purchaser_code> <purchaser_code>798794</purchaser_code>
<reason>4</reason> <reason>4</reason>
<propcode>123</propcode> <propcode>123</propcode>
@ -101,14 +101,11 @@
<hbrentshortfall>0</hbrentshortfall> <hbrentshortfall>0</hbrentshortfall>
<postcode>NW1</postcode> <postcode>NW1</postcode>
<postcod2>5TY</postcod2> <postcod2>5TY</postcod2>
<ppostc1>SE2</ppostc1>
<ppostc2>6RT</ppostc2>
<property_relet>0</property_relet> <property_relet>0</property_relet>
<mrcdate>2020-05-05 10:36:49 UTC</mrcdate> <mrcdate>2020-05-05 10:36:49 UTC</mrcdate>
<mrcday>5</mrcday> <mrcday>5</mrcday>
<mrcmonth>5</mrcmonth> <mrcmonth>5</mrcmonth>
<mrcyear>2020</mrcyear> <mrcyear>2020</mrcyear>
<other_hhmemb>1</other_hhmemb>
<incref>0</incref> <incref>0</incref>
<sale_completion_date/> <sale_completion_date/>
<startdate>2022-02-02 10:36:49 UTC</startdate> <startdate>2022-02-02 10:36:49 UTC</startdate>
@ -125,9 +122,6 @@
<postcode_known>1</postcode_known> <postcode_known>1</postcode_known>
<la_known>1</la_known> <la_known>1</la_known>
<is_la_inferred>false</is_la_inferred> <is_la_inferred>false</is_la_inferred>
<day>2</day>
<month>2</month>
<year>2022</year>
<totchild>0</totchild> <totchild>0</totchild>
<totelder>0</totelder> <totelder>0</totelder>
<totadult>2</totadult> <totadult>2</totadult>
@ -174,6 +168,9 @@
<relat7/> <relat7/>
<relat8/> <relat8/>
<rent_value_check/> <rent_value_check/>
<form/>
<lar/>
<irproduct/>
<providertype>1</providertype> <providertype>1</providertype>
</form> </form>
</forms> </forms>

18
spec/fixtures/forms/2021_2022.json vendored

@ -114,21 +114,21 @@
} }
} }
}, },
"household_number_of_other_members": { "household_number_of_members": {
"questions": { "questions": {
"other_hhmemb": { "hhmemb": {
"check_answer_label": "Number of Other Household Members", "check_answer_label": "Number of Household Members",
"header": "How many other people are there in the household?", "header": "How many people are there in the household?",
"hint_text": "The maximum number of others is 1", "hint_text": "The maximum number of members is 8",
"type": "numeric", "type": "numeric",
"min": 0, "min": 0,
"max": 7, "max": 8,
"step": 1, "step": 1,
"width": 2, "width": 2,
"conditional_for": { "conditional_for": {
"relat2": ">0", "relat2": ">1",
"age2": ">0", "age2": ">1",
"sex2": ">0" "sex2": ">1"
} }
}, },
"relat2": { "relat2": {

532
spec/fixtures/softwire_imports/case_logs/0ead17cb-1668-442d-898c-0d52879ff592.xml vendored

@ -0,0 +1,532 @@
<?xml version="1.0" encoding="UTF-8"?>
<Group xmlns="http://data.gov.uk/core/logs/2021-CORE-SR-GN"
xmlns:app="http://www.w3.org/2007/app"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:ev="http://www.w3.org/2001/xml-events"
xmlns:meta="http://data.gov.uk/core/metadata"
xmlns:svc="http://www.w3.org/2007/app"
xmlns:xf="http://www.w3.org/2002/xforms"
xmlns:xfimpl="http://www.w3.org/2002/xforms/implementation"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xxf="http://orbeon.org/oxf/xml/xforms"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<meta:metadata xmlns:es="http://www.ecmascript.org/"
xmlns:xqx="http://www.w3.org/2005/XQueryX"
xmlns:XSLT="http://www.w3.org/1999/XSL/Transform/compile">
<meta:form-name>2021-CORE-SR-GN</meta:form-name>
<meta:document-id>0ead17cb-1668-442d-898c-0d52879ff592</meta:document-id>
<meta:owner-user-id>c3061a2e6ea0b702e6f6210d5c52d2a92612d2aa
</meta:owner-user-id>
<meta:owner-institution-id>7c5bd5fb549c09a2c55d7cb90d7ba84927e64618
</meta:owner-institution-id>
<meta:managing-institution-id>7c5bd5fb549c09a2c55d7cb90d7ba84927e64618
</meta:managing-institution-id>
<meta:created-date>2021-10-08T14:48:17.096123Z</meta:created-date>
<meta:modified-date>2021-10-08T14:48:17.096123Z</meta:modified-date>
<meta:status>submitted-valid</meta:status>
<meta:reporting-year>2021</meta:reporting-year>
<meta:upload-method>Manual Entry</meta:upload-method>
<meta:schema assert-valid="true"/>
<meta:rules assert-valid="true"/>
</meta:metadata>
<Group>
<Qdp>Yes</Qdp>
<KeyDate>2021-09-30</KeyDate>
<FORM>5786509</FORM>
<Landlord source-value="1">1 Private Registered Provider</Landlord>
<Group>
<_1btenagree>1 This Landlord</_1btenagree>
<_1bifanother/>
<_1bCOREcode/>
</Group>
</Group>
<Group>
<_2a>1 Yes</_2a>
<Q2b>2 Assured</Q2b>
<Q2ba/>
<_2bTenCode>MAC003</_2bTenCode>
<_2cYears/>
</Group>
<Group>
<P1Age override-field="">23</P1Age>
<P1AR/>
<P1Sex override-field="">Female</P1Sex>
<P1Eco>6) Not Seeking Work</P1Eco>
<P1Eth>1 White: English/Scottish/Welsh/Northern Irish/British</P1Eth>
<P1Nat>1 UK national resident in UK</P1Nat>
<P2Age override-field="">2</P2Age>
<P2AR/>
<P2Sex override-field="">Male</P2Sex>
<P2Rel>Child</P2Rel>
<P2Eco>9) Child under 16</P2Eco>
<P3Age override-field=""/>
<P3AR/>
<P3Sex override-field=""/>
<P3Rel/>
<P3Eco/>
<P4Age override-field=""/>
<P4AR/>
<P4Sex override-field=""/>
<P4Rel/>
<P4Eco/>
<P5Age override-field=""/>
<P5AR/>
<P5Sex override-field=""/>
<P5Rel/>
<P5Eco/>
<P6Age override-field=""/>
<P6AR/>
<P6Sex override-field=""/>
<P6Rel/>
<P6Eco/>
<P7Age override-field=""/>
<P7AR/>
<P7Sex override-field=""/>
<P7Rel/>
<P7Eco/>
<P8Age override-field=""/>
<P8AR/>
<P8Sex override-field=""/>
<P8Rel/>
<P8Eco/>
<Group>
<ArmedF>2 No</ArmedF>
<LeftAF/>
<Inj/>
<Preg override-field="">2 No</Preg>
</Group>
<Group>
<Q6Ben>6 UC – with housing element (and not in receipt of Housing
Benefit)
</Q6Ben>
</Group>
<Group>
<Q7Ben>1 All</Q7Ben>
<Q8Refused/>
<Q8Money override-field="">600.00</Q8Money>
<Q8a>2 Monthly</Q8a>
</Group>
<Group>
<Q9a>12 Property unsuitable because of overcrowding</Q9a>
<Q9aa/>
</Group>
<Group>
<_9b override-field="">2 No</_9b>
<Q10-a/>
<Q10-b/>
<Q10-c/>
<Q10-f/>
<Q10-g>Yes</Q10-g>
<Q10-h/>
<Q10ia>2 No</Q10ia>
<Q10ib-1/>
<Q10ib-2/>
<Q10ib-3/>
<Q10ib-4/>
<Q10ib-5/>
<Q10ib-6/>
<Q10ib-7/>
<Q10ib-8/>
<Q10ib-9/>
<Q10ib-10/>
<Q11 override-field="">30 Fixed term Local Authority General Needs
tenancy
</Q11>
<Q12a>Leeds</Q12a>
<Q12aONS>E08000035</Q12aONS>
<Q12b override-field="">LS8 3HX</Q12b>
<Q12bnot/>
<Q12c>5 5 years or more</Q12c>
<Q12d>2 Less than 1 year</Q12d>
</Group>
<Group>
<Q13>1 Not homeless</Q13>
<Q14a>1 Yes</Q14a>
<Q14b1/>
<Q14b2>2_Living_in_insanitary_or_overcrowded_or_unsatisfactory_housing
</Q14b2>
<Q14b3/>
<Q14b4/>
<Q14b5/>
</Group>
<Group>
<Q15CBL>1 Yes</Q15CBL>
<Q15CHR>2 No</Q15CHR>
<Q15CAP>2 No</Q15CAP>
</Group>
<Group>
<Q16>3 PRP lettings only - nominated by a local housing authority</Q16>
</Group>
</Group>
<Group>
<Q17>4 Calendar monthly</Q17>
<Q18ai override-field="">406.09</Q18ai>
<Q18aii override-field="">32.02</Q18aii>
<Q18aiii override-field=""/>
<Q18aiv override-field=""/>
<Q18av override-field="">438.11</Q18av>
<Q18d>2 No</Q18d>
<Q18dyes override-field=""/>
<Q19void>2021-09-30</Q19void>
<Q19repair/>
<Q20 override-field="">0</Q20>
<Q21a>MCB003</Q21a>
</Group>
<Group>
<Q22 override-field="">2</Q22>
<Q23>1 Flat / maisonette</Q23>
<Q24>1 Purpose built</Q24>
<Q25>2 No</Q25>
<Q26/>
<Q27>15 First let of newbuild property</Q27>
</Group>
<Group>
<Q28Auth>Leeds</Q28Auth>
<Q28ONS>E08000035</Q28ONS>
<Q28pc override-field="">LS16 6FT</Q28pc>
</Group>
<Group>
<F1Age>1</F1Age>
<F2Age>0</F2Age>
<F3Age>0</F3Age>
<F4Age>0</F4Age>
<F5Age>0</F5Age>
<F6Age>0</F6Age>
<F7Age>0</F7Age>
<F8Age>0</F8Age>
<FAge>1</FAge>
<F1>1</F1>
<F2>0</F2>
<F3>0</F3>
<F4>0</F4>
<F5>0</F5>
<F6>0</F6>
<F7>0</F7>
<F8>0</F8>
<F>1</F>
<P1100>0</P1100>
<P2100>0</P2100>
<P3100>0</P3100>
<P4100>0</P4100>
<P5100>0</P5100>
<P6100>0</P6100>
<P7100>0</P7100>
<P8100>0</P8100>
<_100>0</_100>
<P170>0</P170>
<P270>0</P270>
<P370>0</P370>
<P470>0</P470>
<P570>0</P570>
<P670>0</P670>
<P770>0</P770>
<P870>0</P870>
<_70>0</_70>
<P1PT>0</P1PT>
<P2PT>0</P2PT>
<P3PT>0</P3PT>
<P4PT>0</P4PT>
<P5PT>0</P5PT>
<P6PT>0</P6PT>
<P7PT>0</P7PT>
<P8PT>0</P8PT>
<PT>0</PT>
<P1FT>0</P1FT>
<P2FT>0</P2FT>
<P3FT>0</P3FT>
<P4FT>0</P4FT>
<P5FT>0</P5FT>
<P6FT>0</P6FT>
<P7FT>0</P7FT>
<P8FT>0</P8FT>
<FT>0</FT>
<P1Stud>0</P1Stud>
<P2Stud>0</P2Stud>
<P3Stud>0</P3Stud>
<P4Stud>0</P4Stud>
<P5Stud>0</P5Stud>
<P6Stud>0</P6Stud>
<P7Stud>0</P7Stud>
<P8Stud>0</P8Stud>
<Stud>0</Stud>
<P2Child>1</P2Child>
<P3Child>0</P3Child>
<P4Child>0</P4Child>
<P5Child>0</P5Child>
<P6Child>0</P6Child>
<P7Child>0</P7Child>
<P8Child>0</P8Child>
<Child>1</Child>
<P2Partner>0</P2Partner>
<P3Partner>0</P3Partner>
<P4Partner>0</P4Partner>
<P5Partner>0</P5Partner>
<P6Partner>0</P6Partner>
<P7Partner>0</P7Partner>
<P8Partner>0</P8Partner>
<Partner>0</Partner>
<Q1bV1>0</Q1bV1>
<Q1bV2>0</Q1bV2>
<Q1bV3>1</Q1bV3>
<Q1bVT>1</Q1bVT>
<P1Adult>1</P1Adult>
<P2Adult>0</P2Adult>
<P3Adult>0</P3Adult>
<P4Adult>0</P4Adult>
<P5Adult>0</P5Adult>
<P6Adult>0</P6Adult>
<P7Adult>0</P7Adult>
<P8Adult>0</P8Adult>
<PAdultT>1</PAdultT>
<P2PAge>0</P2PAge>
<P3PAge>0</P3PAge>
<P4PAge>0</P4PAge>
<P5PAge>0</P5PAge>
<P6PAge>0</P6PAge>
<P7PAge>0</P7PAge>
<P8PAge>0</P8PAge>
<PAGE>23</PAGE>
<P2ChildAge>2</P2ChildAge>
<P3ChildAge>0</P3ChildAge>
<P4ChildAge>0</P4ChildAge>
<P5ChildAge>0</P5ChildAge>
<P6ChildAge>0</P6ChildAge>
<P7ChildAge>0</P7ChildAge>
<P8ChildAge>0</P8ChildAge>
<ChildAgeMin>2</ChildAgeMin>
<AgeDiff1>23</AgeDiff1>
<AgeDiff2>21</AgeDiff2>
<AgeDiff3>23</AgeDiff3>
<TODAY>2021-10-08Z</TODAY>
<FutureLimit>2021-10-23Z</FutureLimit>
<minmax1/>
<minmax2/>
<minmax3/>
<minmax4/>
<minmax5/>
<minmax6/>
<minmax7/>
<minmax8/>
<minmax9/>
<minmax0/>
<minmax10/>
<minmaxT/>
<Q10av>0</Q10av>
<Q10bv>0</Q10bv>
<Q10cv>0</Q10cv>
<Q10fv>0</Q10fv>
<Q10gv>20</Q10gv>
<Q10hv>0</Q10hv>
<Q10Validate>20</Q10Validate>
<Q2bv>C</Q2bv>
<P2Agev>1</P2Agev>
<P2Sexv>1</P2Sexv>
<P2Relv>1</P2Relv>
<P2Ecov>1</P2Ecov>
<P2valid>4</P2valid>
<P3Agev>0</P3Agev>
<P3Sexv>0</P3Sexv>
<P3Relv>0</P3Relv>
<P3Ecov>0</P3Ecov>
<P3valid>0</P3valid>
<P4Agev>0</P4Agev>
<P4Sexv>0</P4Sexv>
<P4Relv>0</P4Relv>
<P4Ecov>0</P4Ecov>
<P4valid>0</P4valid>
<P5Agev>0</P5Agev>
<P5Sexv>0</P5Sexv>
<P5Relv>0</P5Relv>
<P5Ecov>0</P5Ecov>
<P5valid>0</P5valid>
<P6Agev>0</P6Agev>
<P6Sexv>0</P6Sexv>
<P6Relv>0</P6Relv>
<P6Ecov>0</P6Ecov>
<P6valid>0</P6valid>
<P7Agev>0</P7Agev>
<P7Sexv>0</P7Sexv>
<P7Relv>0</P7Relv>
<P7Ecov>0</P7Ecov>
<P7valid>0</P7valid>
<P8Agev>0</P8Agev>
<P8Sexv>0</P8Sexv>
<P8Relv>0</P8Relv>
<P8Ecov>0</P8Ecov>
<P8valid>0</P8valid>
<Q14b1v>0</Q14b1v>
<Q14b2v>1</Q14b2v>
<Q14b3v>0</Q14b3v>
<Q14b4v>0</Q14b4v>
<Q14b5v>0</Q14b5v>
<Q14bv>1</Q14bv>
<P2Other>0</P2Other>
<P3Other>0</P3Other>
<P4Other>0</P4Other>
<P5Other>0</P5Other>
<P6Other>0</P6Other>
<P7Other>0</P7Other>
<P8Other>0</P8Other>
<Other>0</Other>
<P2ARefused>0</P2ARefused>
<P3ARefused>0</P3ARefused>
<P4ARefused>0</P4ARefused>
<P5ARefused>0</P5ARefused>
<P6ARefused>0</P6ARefused>
<P7ARefused>0</P7ARefused>
<P8ARefused>0</P8ARefused>
<TAREUSED>0</TAREUSED>
<P2RRefused>0</P2RRefused>
<P3RRefused>0</P3RRefused>
<P4RRefused>0</P4RRefused>
<P5RRefused>0</P5RRefused>
<P6RRefused>0</P6RRefused>
<P7RRefused>0</P7RRefused>
<P8RRefused>0</P8RRefused>
<TotRRefused>0</TotRRefused>
<TOTREFUSED>0</TOTREFUSED>
</Group>
<Group>
<ChildBen>21.05</ChildBen>
<TOTADULT>1</TOTADULT>
<NEW_OLD>2 Existing Tenant</NEW_OLD>
<Q18aValid>1</Q18aValid>
<Q18Valid>1</Q18Valid>
<VACDAYS>0</VACDAYS>
<HHMEMB>2</HHMEMB>
<HHTYPEP1A>1</HHTYPEP1A>
<HHTYPEP2A>0</HHTYPEP2A>
<HHTYPEP3A>0</HHTYPEP3A>
<HHTYPEP4A>0</HHTYPEP4A>
<HHTYPEP5A>0</HHTYPEP5A>
<HHTYPEP6A>0</HHTYPEP6A>
<HHTYPEP7A>0</HHTYPEP7A>
<HHTYPEP8A>0</HHTYPEP8A>
<TADULT>1</TADULT>
<HHTYPEP1E>0</HHTYPEP1E>
<HHTYPEP2E>0</HHTYPEP2E>
<HHTYPEP3E>0</HHTYPEP3E>
<HHTYPEP4E>0</HHTYPEP4E>
<HHTYPEP5E>0</HHTYPEP5E>
<HHTYPEP6E>0</HHTYPEP6E>
<HHTYPEP7E>0</HHTYPEP7E>
<HHTYPEP8E>0</HHTYPEP8E>
<TELDER>0</TELDER>
<HHTYPEP1C>0</HHTYPEP1C>
<HHTYPEP2C>1</HHTYPEP2C>
<HHTYPEP3C>0</HHTYPEP3C>
<HHTYPEP4C>0</HHTYPEP4C>
<HHTYPEP5C>0</HHTYPEP5C>
<HHTYPEP6C>0</HHTYPEP6C>
<HHTYPEP7C>0</HHTYPEP7C>
<HHTYPEP8C>0</HHTYPEP8C>
<TCHILD>1</TCHILD>
<HHTYPE>5 = 1 adult + 1 or more children</HHTYPE>
<WEEKLYINC>133.33</WEEKLYINC>
<INCOME>154.38</INCOME>
<TYPEHB>7.00</TYPEHB>
<AFFRATE/>
<Weekinc>154.38</Weekinc>
<LETTYPE>1 Private Registered Provider</LETTYPE>
<PLOACODE/>
<OACODE/>
<GOVREG>E12000003</GOVREG>
<OWNINGORGID>1034</OWNINGORGID>
<OWNINGORGNAME>LEEDS &amp; YORKSHIRE HA Ltd</OWNINGORGNAME>
<MANINGORGNAME>LEEDS &amp; YORKSHIRE HA Ltd</MANINGORGNAME>
<HCNUM>LH0704</HCNUM>
<MANHCNUM>LH0704</MANHCNUM>
<LAHA/>
<MANINGORGID>1034</MANINGORGID>
<HBTYPE1/>
<HBTYPE2/>
<HBTYPE3/>
<HBTYPE4/>
<HBTYPE5/>
<HBTYPE6/>
<HBTYPE7>7</HBTYPE7>
<HBTYPE8/>
<HBTYPE9/>
<HBTYPE10/>
<HBTYPE11/>
<HBTYPE12/>
<HBTYPE13/>
<HBTYPE14/>
<HBTYPE15/>
<HBTYPE>7</HBTYPE>
<P1R>0</P1R>
<P2R>0</P2R>
<P3R>0</P3R>
<P4R>0</P4R>
<P5R>0</P5R>
<P6R>0</P6R>
<P7R>0</P7R>
<P8R>0</P8R>
<REFUSEDTOT>0</REFUSEDTOT>
<REFUSED/>
<WTSHORTFALL/>
<WRENT>93.71</WRENT>
<WTCHARGE>101.10</WTCHARGE>
<WSCHARGE>7.39</WSCHARGE>
<WPSCHRGE/>
<WSUPCHRG/>
<WTSHORTFALL1/>
<WTSHORTFALLHB/>
<WTSHORTFALLHE/>
<WRENT1>93.71</WRENT1>
<WTCHARGE1>101.10</WTCHARGE1>
<WSCHARGE1>7.39</WSCHARGE1>
<WPSCHRGE1/>
<WSUPCHRG1/>
</Group>
<Group>
<BSa>0</BSa>
<BSb>1</BSb>
<BSc>0</BSc>
<BScm>0</BScm>
<BScf>0</BScf>
<BSd>0</BSd>
<BSdm>0.5</BSdm>
<BSdf>0</BSdf>
<BSe>0</BSe>
<BSem>0</BSem>
<BSef>0</BSef>
<BSf>1</BSf>
<BSfm>0</BSfm>
<BSff>0</BSff>
<BSfmx>1</BSfmx>
<BSffx>0</BSffx>
<BEDROOMSTAND>2</BEDROOMSTAND>
<BEDMINUSBEDS>0</BEDMINUSBEDS>
<WRENTreduced>93.71</WRENTreduced>
<NonDepDeduct>0</NonDepDeduct>
<RENTHB/>
<ChildAllowan>68.6</ChildAllowan>
<PrsnlAllowan>74.7</PrsnlAllowan>
<HousBenDisAl>25</HousBenDisAl>
<PAIDHB/>
<HCNETAF/>
<ChldAlloCat1>1</ChldAlloCat1>
<ChldAlloCat2>0</ChldAlloCat2>
<P2NnDepDedct>0</P2NnDepDedct>
<P3NnDepDedct>0</P3NnDepDedct>
<P4NnDepDedct>0</P4NnDepDedct>
<P5NnDepDedct>0</P5NnDepDedct>
<P6NnDepDedct>0</P6NnDepDedct>
<P7NnDepDedct>0</P7NnDepDedct>
<P8NnDepDedct>0</P8NnDepDedct>
<DAY>30</DAY>
<MONTH>9</MONTH>
<YEAR>2021</YEAR>
<VDAY>30</VDAY>
<VMONTH>9</VMONTH>
<VYEAR>2021</VYEAR>
<MRCDAY/>
<MRCMONTH/>
<MRCYEAR/>
<PPOSTC1>LS8</PPOSTC1>
<PPOSTC2>3HX</PPOSTC2>
<POSTCODE>LS16</POSTCODE>
<POSTCOD2>6FT</POSTCOD2>
</Group>
</Group>

2
spec/helpers/check_answers_helper_spec.rb

@ -16,7 +16,7 @@ RSpec.describe CheckAnswersHelper do
context "when a section has been completed" do context "when a section has been completed" do
it "returns that you have answered all the questions" do it "returns that you have answered all the questions" do
case_log.sex1 = "F" case_log.sex1 = "F"
case_log.other_hhmemb = 0 case_log.hhmemb = 1
case_log.propcode = "123" case_log.propcode = "123"
case_log.ecstat1 = 200 case_log.ecstat1 = 200
case_log.ecstat2 = 9 case_log.ecstat2 = 9

39
spec/models/case_log_spec.rb

@ -57,7 +57,7 @@ RSpec.describe CaseLog do
end end
it "validates intermediate rent product name" do it "validates intermediate rent product name" do
expect(validator).to receive(:validate_intermediate_rent_product_name) expect(validator).to receive(:validate_irproduct_other)
end end
it "validates other household member details" do it "validates other household member details" do
@ -216,12 +216,6 @@ RSpec.describe CaseLog do
expect(record_from_db["postcod2"]).to eq("1AE") expect(record_from_db["postcod2"]).to eq("1AE")
end end
it "correctly derives and saves partial and full previous postcodes" do
record_from_db = ActiveRecord::Base.connection.execute("select ppostc1, ppostc2 from case_logs where id=#{case_log.id}").to_a[0]
expect(record_from_db["ppostc1"]).to eq("M2")
expect(record_from_db["ppostc2"]).to eq("2AE")
end
it "correctly derives and saves partial and full major repairs date" do it "correctly derives and saves partial and full major repairs date" do
record_from_db = ActiveRecord::Base.connection.execute("select mrcday, mrcmonth, mrcyear, mrcdate from case_logs where id=#{case_log.id}").to_a[0] record_from_db = ActiveRecord::Base.connection.execute("select mrcday, mrcmonth, mrcyear, mrcdate from case_logs where id=#{case_log.id}").to_a[0]
expect(record_from_db["mrcdate"].day).to eq(4) expect(record_from_db["mrcdate"].day).to eq(4)
@ -247,11 +241,6 @@ RSpec.describe CaseLog do
expect(record_from_db["incref"]).to eq(1) expect(record_from_db["incref"]).to eq(1)
end end
it "correctly derives and saves other_hhmemb" do
record_from_db = ActiveRecord::Base.connection.execute("select other_hhmemb from case_logs where id=#{case_log.id}").to_a[0]
expect(record_from_db["other_hhmemb"]).to eq(6)
end
it "correctly derives and saves renttype" do it "correctly derives and saves renttype" do
record_from_db = ActiveRecord::Base.connection.execute("select renttype from case_logs where id=#{case_log.id}").to_a[0] record_from_db = ActiveRecord::Base.connection.execute("select renttype from case_logs where id=#{case_log.id}").to_a[0]
expect(case_log.renttype).to eq(3) expect(case_log.renttype).to eq(3)
@ -1131,13 +1120,10 @@ RSpec.describe CaseLog do
end end
it "correctly derives and saves day, month, year from start date" do it "correctly derives and saves day, month, year from start date" do
record_from_db = ActiveRecord::Base.connection.execute("select day, month, year, startdate from case_logs where id=#{case_log.id}").to_a[0] record_from_db = ActiveRecord::Base.connection.execute("select startdate from case_logs where id=#{case_log.id}").to_a[0]
expect(record_from_db["startdate"].day).to eq(10) expect(record_from_db["startdate"].day).to eq(10)
expect(record_from_db["startdate"].month).to eq(10) expect(record_from_db["startdate"].month).to eq(10)
expect(record_from_db["startdate"].year).to eq(2021) expect(record_from_db["startdate"].year).to eq(2021)
expect(record_from_db["day"]).to eq(10)
expect(record_from_db["month"]).to eq(10)
expect(record_from_db["year"]).to eq(2021)
end end
context "when any charge field is set" do context "when any charge field is set" do
@ -1161,6 +1147,11 @@ RSpec.describe CaseLog do
expect(address_case_log[incode_field]).to eq("1AE") expect(address_case_log[incode_field]).to eq("1AE")
expect(record_from_db[incode_field]).to eq("1AE") expect(record_from_db[incode_field]).to eq("1AE")
end end
def check_previous_postcode_fields(postcode_field)
record_from_db = ActiveRecord::Base.connection.execute("select #{postcode_field} from case_logs where id=#{address_case_log.id}").to_a[0]
expect(address_case_log[postcode_field]).to eq("M11AE")
expect(record_from_db[postcode_field]).to eq("M11AE")
end
context "when saving addresses" do context "when saving addresses" do
before do before do
stub_request(:get, /api.postcodes.io/) stub_request(:get, /api.postcodes.io/)
@ -1263,22 +1254,22 @@ RSpec.describe CaseLog do
}) })
end end
def check_previous_postcode_fields def previous_postcode_fields
check_postcode_fields("ppostcode_full", "ppostc1", "ppostc2") check_previous_postcode_fields("ppostcode_full")
end end
it "correctly formats previous postcode" do it "correctly formats previous postcode" do
address_case_log.update!(ppostcode_full: "M1 1AE") address_case_log.update!(ppostcode_full: "M1 1AE")
check_previous_postcode_fields previous_postcode_fields
address_case_log.update!(ppostcode_full: "m1 1ae") address_case_log.update!(ppostcode_full: "m1 1ae")
check_previous_postcode_fields previous_postcode_fields
address_case_log.update!(ppostcode_full: "m11Ae") address_case_log.update!(ppostcode_full: "m11Ae")
check_previous_postcode_fields previous_postcode_fields
address_case_log.update!(ppostcode_full: "m11ae") address_case_log.update!(ppostcode_full: "m11ae")
check_previous_postcode_fields previous_postcode_fields
end end
it "correctly infers prevloc" do it "correctly infers prevloc" do
@ -1360,7 +1351,7 @@ RSpec.describe CaseLog do
described_class.create!({ described_class.create!({
managing_organisation: organisation, managing_organisation: organisation,
owning_organisation: organisation, owning_organisation: organisation,
other_hhmemb: 4, hhmemb: 3,
relat2: "X", relat2: "X",
relat3: "C", relat3: "C",
relat4: "X", relat4: "X",
@ -1414,7 +1405,7 @@ RSpec.describe CaseLog do
managing_organisation: organisation, managing_organisation: organisation,
owning_organisation: organisation, owning_organisation: organisation,
renewal: 1, renewal: 1,
year: 2021, startdate: Time.zone.local(2021, 4, 10),
}) })
end end

8
spec/models/form/subsection_spec.rb

@ -25,12 +25,12 @@ RSpec.describe Form::Subsection, type: :model do
end end
it "has pages" do it "has pages" do
expected_pages = %w[tenant_code person_1_age person_1_gender person_1_working_situation household_number_of_other_members person_2_working_situation propcode] expected_pages = %w[tenant_code person_1_age person_1_gender person_1_working_situation household_number_of_members person_2_working_situation propcode]
expect(subsection.pages.map(&:id)).to eq(expected_pages) expect(subsection.pages.map(&:id)).to eq(expected_pages)
end end
it "has questions" do it "has questions" do
expected_questions = %w[tenant_code age1 sex1 ecstat1 other_hhmemb relat2 age2 sex2 ecstat2 propcode] expected_questions = %w[tenant_code age1 sex1 ecstat1 hhmemb relat2 age2 sex2 ecstat2 propcode]
expect(subsection.questions.map(&:id)).to eq(expected_questions) expect(subsection.questions.map(&:id)).to eq(expected_questions)
end end
@ -58,7 +58,7 @@ RSpec.describe Form::Subsection, type: :model do
end end
it "has question helpers for the number of applicable questions" do it "has question helpers for the number of applicable questions" do
expected_questions = %w[tenant_code age1 sex1 ecstat1 other_hhmemb ecstat2 propcode] expected_questions = %w[tenant_code age1 sex1 ecstat1 hhmemb ecstat2 propcode]
expect(subsection.applicable_questions(case_log).map(&:id)).to eq(expected_questions) expect(subsection.applicable_questions(case_log).map(&:id)).to eq(expected_questions)
expect(subsection.applicable_questions_count(case_log)).to eq(7) expect(subsection.applicable_questions_count(case_log)).to eq(7)
end end
@ -79,7 +79,7 @@ RSpec.describe Form::Subsection, type: :model do
end end
it "has a question helpers for the unanswered questions" do it "has a question helpers for the unanswered questions" do
expected_questions = %w[sex1 ecstat1 other_hhmemb ecstat2 propcode] expected_questions = %w[sex1 ecstat1 hhmemb ecstat2 propcode]
expect(subsection.unanswered_questions(case_log).map(&:id)).to eq(expected_questions) expect(subsection.unanswered_questions(case_log).map(&:id)).to eq(expected_questions)
end end
end end

2
spec/models/form_spec.rb

@ -130,7 +130,7 @@ RSpec.describe Form, type: :model do
case_log.age1 = 35 case_log.age1 = 35
case_log.sex1 = "M" case_log.sex1 = "M"
case_log.ecstat1 = 0 case_log.ecstat1 = 0
case_log.other_hhmemb = 1 case_log.hhmemb = 2
case_log.relat2 = "P" case_log.relat2 = "P"
case_log.sex2 = "F" case_log.sex2 = "F"
case_log.ecstat2 = 1 case_log.ecstat2 = 1

6
spec/models/validations/financial_validations_spec.rb

@ -757,7 +757,6 @@ RSpec.describe Validations::FinancialValidations do
record.period = 1 record.period = 1
record.la = "E07000223" record.la = "E07000223"
record.beds = 1 record.beds = 1
record.year = 2021
record.startdate = Time.zone.local(2021, 9, 17) record.startdate = Time.zone.local(2021, 9, 17)
record.brent = 9.17 record.brent = 9.17
@ -772,7 +771,6 @@ RSpec.describe Validations::FinancialValidations do
record.la = "E07000223" record.la = "E07000223"
record.beds = 1 record.beds = 1
record.startdate = Time.zone.local(2021, 9, 17) record.startdate = Time.zone.local(2021, 9, 17)
record.year = 2021
record.brent = 200 record.brent = 200
financial_validator.validate_rent_amount(record) financial_validator.validate_rent_amount(record)
@ -794,9 +792,6 @@ RSpec.describe Validations::FinancialValidations do
record.la = "E07000223" record.la = "E07000223"
record.startdate = Time.zone.local(2022, 2, 5) record.startdate = Time.zone.local(2022, 2, 5)
record.beds = 1 record.beds = 1
record.year = 2022
record.month = 2
record.day = 5
record.brent = 200 record.brent = 200
financial_validator.validate_rent_amount(record) financial_validator.validate_rent_amount(record)
@ -814,7 +809,6 @@ RSpec.describe Validations::FinancialValidations do
it "does not error if some of the fields are missing" do it "does not error if some of the fields are missing" do
record.managing_organisation.provider_type = 2 record.managing_organisation.provider_type = 2
record.year = 2021
record.startdate = Time.zone.local(2021, 9, 17) record.startdate = Time.zone.local(2021, 9, 17)
record.brent = 200 record.brent = 200

20
spec/models/validations/household_validations_spec.rb

@ -462,24 +462,24 @@ RSpec.describe Validations::HouseholdValidations do
expect(record.errors["age2"]).to be_empty expect(record.errors["age2"]).to be_empty
end end
it "validates that the number of other household members cannot be less than 0" do it "validates that the number of household members cannot be less than 0" do
record.other_hhmemb = -1 record.hhmemb = -1
household_validator.validate_numeric_min_max(record) household_validator.validate_numeric_min_max(record)
expect(record.errors["other_hhmemb"]) expect(record.errors["hhmemb"])
.to include(match I18n.t("validations.numeric.valid", field: "Number of Other Household Members", min: 0, max: 7)) .to include(match I18n.t("validations.numeric.valid", field: "Number of Household Members", min: 0, max: 8))
end end
it "validates that the number of other household members cannot be more than 7" do it "validates that the number of household members cannot be more than 8" do
record.other_hhmemb = 8 record.hhmemb = 9
household_validator.validate_numeric_min_max(record) household_validator.validate_numeric_min_max(record)
expect(record.errors["other_hhmemb"]) expect(record.errors["hhmemb"])
.to include(match I18n.t("validations.numeric.valid", field: "Number of Other Household Members", min: 0, max: 7)) .to include(match I18n.t("validations.numeric.valid", field: "Number of Household Members", min: 0, max: 8))
end end
it "expects that the number of other household members is between the min and max" do it "expects that the number of other household members is between the min and max" do
record.other_hhmemb = 5 record.hhmemb = 5
household_validator.validate_numeric_min_max(record) household_validator.validate_numeric_min_max(record)
expect(record.errors["other_hhmemb"]).to be_empty expect(record.errors["hhmemb"]).to be_empty
end end
end end

6
spec/models/validations/property_validations_spec.rb

@ -97,7 +97,7 @@ RSpec.describe Validations::PropertyValidations do
it "adds an error if the number of bedrooms is not between 1 and 7" do it "adds an error if the number of bedrooms is not between 1 and 7" do
record.beds = 8 record.beds = 8
record.unittype_gn = 5 record.unittype_gn = 5
record.other_hhmemb = 2 record.hhmemb = 3
property_validator.validate_shared_housing_rooms(record) property_validator.validate_shared_housing_rooms(record)
expect(record.errors["unittype_gn"]).to include(match(expected_error)) expect(record.errors["unittype_gn"]).to include(match(expected_error))
expect(record.errors["beds"]).to include(I18n.t("validations.property.unittype_gn.one_seven_bedroom_shared")) expect(record.errors["beds"]).to include(I18n.t("validations.property.unittype_gn.one_seven_bedroom_shared"))
@ -110,7 +110,7 @@ RSpec.describe Validations::PropertyValidations do
it "adds an error if the number of bedrooms is not between 1 and 7" do it "adds an error if the number of bedrooms is not between 1 and 7" do
record.beds = 0 record.beds = 0
record.unittype_gn = 5 record.unittype_gn = 5
record.other_hhmemb = 2 record.hhmemb = 3
property_validator.validate_shared_housing_rooms(record) property_validator.validate_shared_housing_rooms(record)
expect(record.errors["unittype_gn"]).to include(match(expected_error)) expect(record.errors["unittype_gn"]).to include(match(expected_error))
expect(record.errors["beds"]).to include(I18n.t("validations.property.unittype_gn.one_seven_bedroom_shared")) expect(record.errors["beds"]).to include(I18n.t("validations.property.unittype_gn.one_seven_bedroom_shared"))
@ -123,7 +123,7 @@ RSpec.describe Validations::PropertyValidations do
it "adds an error" do it "adds an error" do
record.beds = 4 record.beds = 4
record.unittype_gn = 5 record.unittype_gn = 5
record.other_hhmemb = 0 record.hhmemb = 1
property_validator.validate_shared_housing_rooms(record) property_validator.validate_shared_housing_rooms(record)
expect(record.errors["unittype_gn"]).to include(match(expected_error)) expect(record.errors["unittype_gn"]).to include(match(expected_error))
expect(record.errors["beds"]).to include(I18n.t("validations.property.unittype_gn.one_three_bedroom_single_tenant_shared")) expect(record.errors["beds"]).to include(I18n.t("validations.property.unittype_gn.one_three_bedroom_single_tenant_shared"))

20
spec/models/validations/setup_validations_spec.rb

@ -6,28 +6,28 @@ RSpec.describe Validations::SetupValidations do
let(:setup_validator_class) { Class.new { include Validations::SetupValidations } } let(:setup_validator_class) { Class.new { include Validations::SetupValidations } }
let(:record) { FactoryBot.create(:case_log) } let(:record) { FactoryBot.create(:case_log) }
describe "#validate_intermediate_rent_product_name" do describe "#validate_irproduct" do
it "adds an error when the intermediate rent product name is not provided but the rent type was given as other intermediate rent product" do it "adds an error when the intermediate rent product name is not provided but the rent type was given as other intermediate rent product" do
record.rent_type = 5 record.rent_type = 5
record.intermediate_rent_product_name = nil record.irproduct_other = nil
setup_validator.validate_intermediate_rent_product_name(record) setup_validator.validate_irproduct_other(record)
expect(record.errors["intermediate_rent_product_name"]) expect(record.errors["irproduct_other"])
.to include(match I18n.t("validations.setup.intermediate_rent_product_name.blank")) .to include(match I18n.t("validations.setup.intermediate_rent_product_name.blank"))
end end
it "adds an error when the intermediate rent product name is blank but the rent type was given as other intermediate rent product" do it "adds an error when the intermediate rent product name is blank but the rent type was given as other intermediate rent product" do
record.rent_type = 5 record.rent_type = 5
record.intermediate_rent_product_name = "" record.irproduct_other = ""
setup_validator.validate_intermediate_rent_product_name(record) setup_validator.validate_irproduct_other(record)
expect(record.errors["intermediate_rent_product_name"]) expect(record.errors["irproduct_other"])
.to include(match I18n.t("validations.setup.intermediate_rent_product_name.blank")) .to include(match I18n.t("validations.setup.intermediate_rent_product_name.blank"))
end end
it "Does not add an error when the intermediate rent product name is provided and the rent type was given as other intermediate rent product" do it "Does not add an error when the intermediate rent product name is provided and the rent type was given as other intermediate rent product" do
record.rent_type = 5 record.rent_type = 5
record.intermediate_rent_product_name = "Example" record.irproduct_other = "Example"
setup_validator.validate_intermediate_rent_product_name(record) setup_validator.validate_irproduct_other(record)
expect(record.errors["intermediate_rent_product_name"]).to be_empty expect(record.errors["irproduct_other"]).to be_empty
end end
end end
end end

29
spec/services/imports/case_logs_import_service_spec.rb

@ -0,0 +1,29 @@
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_file) { File.open("#{fixture_directory}/#{case_log_id}.xml") }
let(:storage_service) { instance_double(StorageService) }
let(:real_2021_2022_form) { Form.new("config/forms/2021_2022.json", "2021_2022") }
context "when importing users" do
subject(:case_log_service) { described_class.new(storage_service) }
before do
# Stub the S3 file listing and download
allow(storage_service).to receive(:list_files)
.and_return(["#{remote_folder}/#{case_log_id}.xml"])
allow(storage_service).to receive(:get_file_io)
.with("#{remote_folder}/#{case_log_id}.xml")
.and_return(case_log_file)
# Stub the form handler to use the real form
allow(FormHandler.instance).to receive(:get_form).with(anything).and_return(real_2021_2022_form)
end
it "successfully create a case log with the expected data" do
case_log_service.create_logs(remote_folder)
end
end
end
Loading…
Cancel
Save