diff --git a/db/migrate/20250922132926_remove_incorrect_foreign_keys_from_scotland_table.rb b/db/migrate/20250922132926_remove_incorrect_foreign_keys_from_scotland_table.rb new file mode 100644 index 000000000..bdd56c109 --- /dev/null +++ b/db/migrate/20250922132926_remove_incorrect_foreign_keys_from_scotland_table.rb @@ -0,0 +1,7 @@ +class RemoveIncorrectForeignKeysFromScotlandTable < ActiveRecord::Migration[8.0] + def change + remove_foreign_key "scotland.assessments_xml", "assessments" + remove_foreign_key "scotland.green_deal_assessments", "assessments" + remove_foreign_key "scotland.green_deal_assessments", "green_deal_plans" + end +end diff --git a/db/migrate/20250922141707_add_correct_foreign_keys_to_scotland_schema_tables.rb b/db/migrate/20250922141707_add_correct_foreign_keys_to_scotland_schema_tables.rb new file mode 100644 index 000000000..503e8e1b9 --- /dev/null +++ b/db/migrate/20250922141707_add_correct_foreign_keys_to_scotland_schema_tables.rb @@ -0,0 +1,14 @@ +class AddCorrectForeignKeysToScotlandSchemaTables < ActiveRecord::Migration[8.0] + def change + add_foreign_key "scotland.assessments_xml", + "scotland.assessments", + column: :assessment_id, + primary_key: :assessment_id, + name: "fk_scotland_assessment_xml_scotland_assessments" + add_foreign_key "scotland.green_deal_assessments", + "scotland.assessments", + column: :assessment_id, + primary_key: :assessment_id, + name: "fk_scotland_green_deal_assessments_scotland_assessments" + end +end diff --git a/db/migrate/20250922145129_add_green_deal_plans_scotland_table.rb b/db/migrate/20250922145129_add_green_deal_plans_scotland_table.rb new file mode 100644 index 000000000..40cd2988d --- /dev/null +++ b/db/migrate/20250922145129_add_green_deal_plans_scotland_table.rb @@ -0,0 +1,22 @@ +class AddGreenDealPlansScotlandTable < ActiveRecord::Migration[8.0] + def change + create_table "scotland.green_deal_plans", primary_key: :green_deal_plan_id, id: false do |t| + t.string :green_deal_plan_id + t.datetime :start_date + t.datetime :end_date + t.string :provider_name + t.string :provider_telephone + t.string :provider_email + t.decimal :interest_rate + t.boolean :fixed_interest_rate + t.decimal :charge_uplift_amount + t.datetime :charge_uplift_date + t.boolean :cca_regulated + t.boolean :structure_changed + t.boolean :measures_removed + t.jsonb :measures, null: false, default: "[]" + t.jsonb :charges, null: false, default: "[]" + t.jsonb :savings, null: false, default: "[]" + end + end +end diff --git a/db/migrate/20250922151938_add_green_deal_plans_foreign_key_to_scotland_green_deal_assessments.rb b/db/migrate/20250922151938_add_green_deal_plans_foreign_key_to_scotland_green_deal_assessments.rb new file mode 100644 index 000000000..0741e7dcd --- /dev/null +++ b/db/migrate/20250922151938_add_green_deal_plans_foreign_key_to_scotland_green_deal_assessments.rb @@ -0,0 +1,9 @@ +class AddGreenDealPlansForeignKeyToScotlandGreenDealAssessments < ActiveRecord::Migration[8.0] + def change + add_index "scotland.green_deal_plans", :green_deal_plan_id, unique: true + + add_foreign_key "scotland.green_deal_assessments", + "scotland.green_deal_plans", + column: :green_deal_plan_id, primary_key: :green_deal_plan_id + end +end diff --git a/db/schema.rb b/db/schema.rb index 09f3bda6b..b847fcf42 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[8.0].define(version: 2025_05_19_124713) do +ActiveRecord::Schema[8.0].define(version: 2025_09_22_151938) do # These are extensions that must be enabled in order to support this database enable_extension "fuzzystrmatch" diff --git a/lib/events/listener.rb b/lib/events/listener.rb index 9be986afd..5d8b4507b 100644 --- a/lib/events/listener.rb +++ b/lib/events/listener.rb @@ -20,7 +20,7 @@ def attach_listeners def attach_assessment_lodged @event_broadcaster.on :assessment_lodged do |**data| if notify_data_warehouse_enabled? - NotifyFactory.new_assessment_to_data_warehouse_use_case.execute(assessment_id: data[:assessment_id]) + NotifyFactory.new_assessment_to_data_warehouse_use_case.execute(assessment_id: data[:assessment_id], is_scottish: data[:is_scottish]) end NotifyFactory.lodgement_to_audit_log(entity_id: data[:assessment_id]) end diff --git a/lib/gateway/assessments_address_id_gateway.rb b/lib/gateway/assessments_address_id_gateway.rb index cb00896b9..1f805344d 100644 --- a/lib/gateway/assessments_address_id_gateway.rb +++ b/lib/gateway/assessments_address_id_gateway.rb @@ -11,14 +11,24 @@ class AssessmentsAddressIdGateway class AssessmentsAddressId < ActiveRecord::Base end - def fetch(assessment_id) - AssessmentsAddressId.find(assessment_id).as_json.symbolize_keys + class AssessmentsAddressIdScotland < ActiveRecord::Base + self.table_name = "scotland.assessments_address_id" end - def send_to_db(record) - existing_assessment_address_id = - AssessmentsAddressId.find_by assessment_id: record[:assessment_id] - AssessmentsAddressId.create(record) if existing_assessment_address_id.nil? + def fetch(assessment_id, is_scottish: false) + is_scottish ? AssessmentsAddressIdScotland.find(assessment_id).as_json.symbolize_keys : AssessmentsAddressId.find(assessment_id).as_json.symbolize_keys + end + + def send_to_db(record, is_scottish: false) + if is_scottish + existing_assessment_address_id = + AssessmentsAddressIdScotland.find_by assessment_id: record[:assessment_id] + AssessmentsAddressIdScotland.create(record) if existing_assessment_address_id.nil? + else + existing_assessment_address_id = + AssessmentsAddressId.find_by assessment_id: record[:assessment_id] + AssessmentsAddressId.create(record) if existing_assessment_address_id.nil? + end end def update_assessments_address_id_mapping( diff --git a/lib/gateway/assessments_country_id_gateway.rb b/lib/gateway/assessments_country_id_gateway.rb index eda8f37a0..434067369 100644 --- a/lib/gateway/assessments_country_id_gateway.rb +++ b/lib/gateway/assessments_country_id_gateway.rb @@ -3,16 +3,18 @@ class AssessmentsCountryIdGateway class AssessmentsCountryId < ActiveRecord::Base end - def insert(assessment_id:, country_id:, upsert: false) + def insert(assessment_id:, country_id:, upsert: false, is_scottish: false) + schema = Helper::ScotlandHelper.select_schema(is_scottish) + sql = if upsert <<-SQL - INSERT INTO assessments_country_ids (assessment_id,country_id) VALUES ($1, $2) + INSERT INTO #{schema}assessments_country_ids (assessment_id,country_id) VALUES ($1, $2) ON CONFLICT(assessment_id) DO UPDATE SET country_id=$2 SQL else <<-SQL - INSERT INTO assessments_country_ids (assessment_id,country_id) VALUES ($1, $2) + INSERT INTO #{schema}assessments_country_ids (assessment_id,country_id) VALUES ($1, $2) SQL end diff --git a/lib/gateway/assessments_gateway.rb b/lib/gateway/assessments_gateway.rb index 026780bbb..61db5c8b9 100644 --- a/lib/gateway/assessments_gateway.rb +++ b/lib/gateway/assessments_gateway.rb @@ -6,6 +6,10 @@ class AssessmentsGateway class Assessment < ActiveRecord::Base; end + class AssessmentScotland < ActiveRecord::Base + self.table_name = "scotland.assessments" + end + class InvalidAssessmentType < StandardError; end class AssessmentAlreadyExists < StandardError; end @@ -21,9 +25,9 @@ class AssessmentAlreadyExists < StandardError; end AC-REPORT ].freeze - def insert_or_update(assessment) + def insert_or_update(assessment, is_scottish: false) check_valid_energy_ratings assessment - send_update_to_db assessment + send_update_to_db(assessment, is_scottish) end def insert(assessment) @@ -218,83 +222,96 @@ def send_insert_to_db(assessment) end unless assessment.get(:related_rrn).nil? - add_linked_assessment assessment + add_linked_assessment(assessment, "public.") end end end - def send_update_to_db(assessment) + def send_update_to_db(assessment, is_scottish) ActiveRecord::Base.transaction do - existing_assessment = - Assessment.exists? assessment_id: assessment.get(:assessment_id) + existing_assessment = if is_scottish + AssessmentScotland.exists?(assessment_id: assessment.get(:assessment_id)) + else + Assessment.exists?(assessment_id: assessment.get(:assessment_id)) + end if existing_assessment - delete_xml = <<-SQL - DELETE FROM assessments_xml WHERE assessment_id = $1 - SQL + schema = Helper::ScotlandHelper.select_schema(is_scottish) + remove_and_relodge_assessment(assessment, schema) + else + is_scottish ? AssessmentScotland.create(assessment.to_record) : Assessment.create(assessment.to_record) + end - delete_address_id = <<-SQL - DELETE FROM assessments_address_id WHERE assessment_id = $1 - SQL + unless assessment.get(:related_rrn).nil? + add_linked_assessment(assessment, schema) + end + end + end - green_deal_plan_id = <<-SQL - SELECT green_deal_plan_id FROM green_deal_assessments WHERE assessment_id = $1 - SQL + def remove_and_relodge_assessment(assessment, schema) + delete_xml = <<-SQL + DELETE FROM #{schema}assessments_xml WHERE assessment_id = $1 + SQL - delete_green_deal_assessment = <<-SQL - DELETE FROM green_deal_assessments WHERE assessment_id = $1 - SQL + delete_address_id = <<-SQL + DELETE FROM #{schema}assessments_address_id WHERE assessment_id = $1 + SQL - delete_assessment = <<-SQL - DELETE FROM assessments WHERE assessment_id = $1 - SQL + green_deal_plan_id = <<-SQL + SELECT green_deal_plan_id FROM #{schema}green_deal_assessments WHERE assessment_id = $1 + SQL - delete_linked_assessment = <<-SQL - DELETE FROM linked_assessments WHERE assessment_id = $1 - SQL + delete_green_deal_assessment = <<-SQL + DELETE FROM #{schema}green_deal_assessments WHERE assessment_id = $1 + SQL - binds = [ - ActiveRecord::Relation::QueryAttribute.new( - "id", - assessment.get(:assessment_id), - ActiveRecord::Type::String.new, - ), - ] + delete_assessment = <<-SQL + DELETE FROM #{schema}assessments WHERE assessment_id = $1 + SQL - ActiveRecord::Base.connection.exec_query delete_xml, "SQL", binds + delete_linked_assessment = <<-SQL + DELETE FROM #{schema}linked_assessments WHERE assessment_id = $1 + SQL - green_deal_plan_ids = - ActiveRecord::Base.connection.exec_query green_deal_plan_id, - "SQL", - binds + binds = [ + ActiveRecord::Relation::QueryAttribute.new( + "id", + assessment.get(:assessment_id), + ActiveRecord::Type::String.new, + ), + ] - ActiveRecord::Base.connection.exec_query delete_green_deal_assessment, - "SQL", - binds + ActiveRecord::Base.connection.exec_query delete_xml, "SQL", binds - ActiveRecord::Base.connection.exec_query delete_assessment, - "SQL", - binds + green_deal_plan_ids = + ActiveRecord::Base.connection.exec_query green_deal_plan_id, + "SQL", + binds - ActiveRecord::Base.connection.exec_query delete_address_id, - "SQL", - binds + ActiveRecord::Base.connection.exec_query delete_green_deal_assessment, + "SQL", + binds - ActiveRecord::Base.connection.exec_query delete_linked_assessment, - "SQL", - binds + ActiveRecord::Base.connection.exec_query delete_assessment, + "SQL", + binds - Assessment.create assessment.to_record + ActiveRecord::Base.connection.exec_query delete_address_id, + "SQL", + binds - reattach_green_deal_plans(green_deal_plan_ids, binds) - else - Assessment.create assessment.to_record - end + ActiveRecord::Base.connection.exec_query delete_linked_assessment, + "SQL", + binds - unless assessment.get(:related_rrn).nil? - add_linked_assessment assessment - end + if schema == "scotland." + AssessmentScotland.create assessment.to_record + else + Assessment.create assessment.to_record end + + # TODO: Need to test this + reattach_green_deal_plans(green_deal_plan_ids, binds, schema) end def check_valid_energy_ratings(assessment) @@ -319,9 +336,9 @@ def check_valid_energy_ratings(assessment) end end - def reattach_green_deal_plans(green_deal_plan_ids, binds) + def reattach_green_deal_plans(green_deal_plan_ids, binds, schema) add_green_deal_plan = <<-SQL - INSERT INTO green_deal_assessments (assessment_id, green_deal_plan_id) + INSERT INTO #{schema}green_deal_assessments (assessment_id, green_deal_plan_id) VALUES ($1, $2) SQL @@ -340,9 +357,9 @@ def reattach_green_deal_plans(green_deal_plan_ids, binds) end end - def add_linked_assessment(assessment) + def add_linked_assessment(assessment, schema) add_linked_assessment = <<-SQL - INSERT INTO linked_assessments (assessment_id, linked_assessment_id) + INSERT INTO #{schema}linked_assessments (assessment_id, linked_assessment_id) VALUES ($1, $2) SQL diff --git a/lib/gateway/assessments_xml_gateway.rb b/lib/gateway/assessments_xml_gateway.rb index a054f23bd..18a3458d4 100644 --- a/lib/gateway/assessments_xml_gateway.rb +++ b/lib/gateway/assessments_xml_gateway.rb @@ -9,8 +9,12 @@ class AssessmentsXmlGateway class AssessmentsXml < ActiveRecord::Base end - def send_to_db(record) - AssessmentsXml.create(record) + class AssessmentsXmlScotland < ActiveRecord::Base + self.table_name = "scotland.assessments_xml" + end + + def send_to_db(record, is_scottish) + is_scottish ? AssessmentsXmlScotland.create(record) : AssessmentsXml.create(record) end def fetch(assessment_id) diff --git a/lib/gateway/green_deal_plans_gateway.rb b/lib/gateway/green_deal_plans_gateway.rb index ff66c24a9..8083a75f6 100644 --- a/lib/gateway/green_deal_plans_gateway.rb +++ b/lib/gateway/green_deal_plans_gateway.rb @@ -3,6 +3,10 @@ class GreenDealPlansGateway class GreenDealPlan < ActiveRecord::Base end + class GreenDealPlanScotland < ActiveRecord::Base + self.table_name = "scotland.green_deal_plan" + end + def exists?(green_deal_plan_id) sql = <<-SQL SELECT EXISTS ( @@ -33,9 +37,10 @@ def add(green_deal_plan, assessment_id) link_green_deal_to_assessment green_deal_plan.green_deal_plan_id, assessment_id end - def link_green_deal_to_assessment(green_deal_plan_id, assessment_id) + def link_green_deal_to_assessment(green_deal_plan_id, assessment_id, is_scottish: false) + schema = Helper::ScotlandHelper.select_schema(is_scottish) sql = <<-SQL - INSERT INTO green_deal_assessments (green_deal_plan_id, assessment_id) + INSERT INTO #{schema}green_deal_assessments (green_deal_plan_id, assessment_id) VALUES ($1, $2) SQL @@ -72,7 +77,8 @@ def update_end_date_and_charges(green_deal_plan_id:, end_date:, charges:) GreenDealPlan.update(green_deal_plan_id, { end_date: end_date, charges: charges }) end - def fetch(assessment_id) + def fetch(assessment_id, is_scottish: false) + schema = Helper::ScotlandHelper.select_schema(is_scottish) sql = <<-SQL SELECT b.green_deal_plan_id, b.start_date, b.end_date, @@ -81,14 +87,17 @@ def fetch(assessment_id) b.charge_uplift_date, b.cca_regulated, b.structure_changed, b.measures_removed, b.charges, b.measures, b.savings FROM - green_deal_assessments a + #{schema}green_deal_assessments a INNER JOIN - green_deal_plans b ON a.green_deal_plan_id = b.green_deal_plan_id + #{schema}green_deal_plans b ON a.green_deal_plan_id = b.green_deal_plan_id WHERE assessment_id = $1 ORDER BY b.green_deal_plan_id SQL - response = GreenDealPlan.connection.exec_query( + + table = is_scottish ? GreenDealPlanScotland : GreenDealPlan + + response = table.connection.exec_query( sql, "SQL", [ diff --git a/lib/gateway/related_assessments_gateway.rb b/lib/gateway/related_assessments_gateway.rb index 1937a1327..aede7a23d 100644 --- a/lib/gateway/related_assessments_gateway.rb +++ b/lib/gateway/related_assessments_gateway.rb @@ -3,13 +3,15 @@ class RelatedAssessmentsGateway class Assessment < ActiveRecord::Base end - def related_assessment_ids(address_id) + def related_assessment_ids(address_id, is_scottish: false) return [] if address_id.blank? + schema = Helper::ScotlandHelper.select_schema(is_scottish) + ActiveRecord::Base .connection .exec_query( - "SELECT assessment_id FROM assessments_address_id WHERE address_id = $1", + "SELECT assessment_id FROM #{schema}assessments_address_id WHERE address_id = $1", "SQL", [ ActiveRecord::Relation::QueryAttribute.new( diff --git a/lib/gateway/search_address_gateway.rb b/lib/gateway/search_address_gateway.rb index e0bed34fd..c559bc542 100644 --- a/lib/gateway/search_address_gateway.rb +++ b/lib/gateway/search_address_gateway.rb @@ -1,10 +1,11 @@ module Gateway class SearchAddressGateway < StandardError - def insert(object) + def insert(object, is_scottish: false) + schema = Helper::ScotlandHelper.select_schema(is_scottish) insert_sql = <<-SQL - INSERT INTO assessment_search_address(assessment_id, address) + INSERT INTO #{schema}assessment_search_address(assessment_id, address) SELECT $1, $2 - WHERE NOT EXISTS(SELECT * FROM assessment_search_address WHERE assessment_id = $3) + WHERE NOT EXISTS(SELECT * FROM #{schema}assessment_search_address WHERE assessment_id = $3) SQL bindings = [ diff --git a/lib/helper/scotland_helper.rb b/lib/helper/scotland_helper.rb new file mode 100644 index 000000000..2b6129817 --- /dev/null +++ b/lib/helper/scotland_helper.rb @@ -0,0 +1,10 @@ +module Helper + class ScotlandHelper + SCOTTISH_SCHEMA = "scotland.".freeze + PUBLIC_SCHEMA = "public.".freeze + + def self.select_schema(is_scottish) + is_scottish ? SCOTTISH_SCHEMA : PUBLIC_SCHEMA + end + end +end diff --git a/lib/use_case/get_canonical_address_id.rb b/lib/use_case/get_canonical_address_id.rb index c7df4b47f..17abcc6ac 100644 --- a/lib/use_case/get_canonical_address_id.rb +++ b/lib/use_case/get_canonical_address_id.rb @@ -12,7 +12,7 @@ def initialize( @assessments_search_gateway = assessments_search_gateway || Gateway::AssessmentsSearchGateway.new end - def execute(rrn:, address_id:, type_of_assessment: nil, related_rrn: nil) + def execute(rrn:, address_id:, type_of_assessment: nil, related_rrn: nil, is_scottish: false) if address_id.nil? return default_address_id(rrn:, related_rrn:, type_of_assessment:) elsif address_id.start_with?("UPRN-") @@ -23,7 +23,7 @@ def execute(rrn:, address_id:, type_of_assessment: nil, related_rrn: nil) related_assessment_id = address_id[4..] begin related_assessment = - @assessments_address_id_gateway.fetch(related_assessment_id) + @assessments_address_id_gateway.fetch(related_assessment_id, is_scottish: is_scottish) rescue ActiveRecord::RecordNotFound related_assessment = nil end diff --git a/lib/use_case/lodge_assessment.rb b/lib/use_case/lodge_assessment.rb index 7372e17b0..683466b1a 100644 --- a/lib/use_case/lodge_assessment.rb +++ b/lib/use_case/lodge_assessment.rb @@ -39,8 +39,10 @@ def initialize( end def execute(data, migrated, schema_name) - assessment_id = data[:assessment_id] + is_scottish = schema_name.include?("-S-") || false + assessment_id = data[:assessment_id] + # TODO: UPDATE WHEN DOING LODGEMENT if !migrated && find_assessment_by_id(assessment_id) raise DuplicateAssessmentIdException end @@ -83,33 +85,31 @@ def execute(data, migrated, schema_name) ) if migrated - @assessments_gateway.insert_or_update assessment - insert_country_id(data[:assessment_id], data[:country_id], upsert: true) + @assessments_gateway.insert_or_update(assessment, is_scottish: is_scottish) + insert_country_id(data[:assessment_id], is_scottish, country_id: data[:country_id], upsert: true) else begin + # TODO: UPDATE WHEN DOING LODGEMENT @assessments_gateway.insert assessment - insert_country_id(data[:assessment_id], data[:country_id]) + insert_country_id(data[:assessment_id], is_scottish, country_id: data[:country_id]) rescue Gateway::AssessmentsGateway::AssessmentAlreadyExists raise DuplicateAssessmentIdException end end - - insert_assessment_address_id assessment - - associate_related_green_deals assessment if assessment.type_of_assessment == "RdSAP" - + insert_assessment_address_id(assessment, is_scottish) + # TODO: UPDATE WHEN DOING LODGEMENT + associate_related_green_deals(assessment, is_scottish) if assessment.type_of_assessment == "RdSAP" && !migrated @assessments_xml_gateway.send_to_db( { assessment_id: data[:assessment_id], xml: data[:raw_data], schema_type: schema_name, }, + is_scottish, ) - search_address = Domain::SearchAddress.new(data).to_hash - @search_address_gateway.insert search_address - - @event_broadcaster.broadcast :assessment_lodged, assessment_id: assessment.assessment_id + @search_address_gateway.insert(search_address, is_scottish: is_scottish) + @event_broadcaster.broadcast :assessment_lodged, assessment_id: assessment.assessment_id, is_scottish: is_scottish assessment end @@ -178,45 +178,49 @@ def find_related_rrn(wrapper_hash) related_rrn end - def insert_assessment_address_id(assessment) - canonical_address_id = get_canonical_address_id(assessment) + def insert_assessment_address_id(assessment, is_scottish) + canonical_address_id = get_canonical_address_id(assessment, is_scottish) source = get_assessments_address_id_source( lodged_address_id: assessment.address_id, canonical_address_id:, ) - @assessments_address_id_gateway.send_to_db( { assessment_id: assessment.assessment_id, address_id: canonical_address_id, source:, }, + is_scottish: is_scottish, ) end - def associate_related_green_deals(assessment) - canonical_address_id = @assessments_address_id_gateway.fetch(assessment.assessment_id)[:address_id] + def associate_related_green_deals(assessment, is_scottish) + canonical_address_id = @assessments_address_id_gateway.fetch(assessment.assessment_id, is_scottish: is_scottish)[:address_id] related_assessment_ids = @related_assessments_gateway.related_assessment_ids(canonical_address_id).reject { |id| id == assessment.assessment_id } + # Need to update the lodge_assessment method in assertive client green_deal_plan_sets = related_assessment_ids.map { |assessment_id| @green_deal_plans_gateway.fetch assessment_id } flat_mapped = green_deal_plan_sets.flat_map(&:itself) green_deal_plan_ids = flat_mapped.map(&:green_deal_plan_id).uniq green_deal_plan_ids.each do |green_deal_plan_id| + # Need to update the lodge_assessment method in assertive client @green_deal_plans_gateway.link_green_deal_to_assessment green_deal_plan_id, assessment.assessment_id end rescue StandardError => e Logger.new($stdout).error "Associating related green deals for the assessment #{assessment.assessment_id} failed with error #{e.class}, message #{e.message}, backtrace #{e.backtrace.join('; ')}" end - def get_canonical_address_id(assessment) + def get_canonical_address_id(assessment, is_scottish) @get_canonical_address_id_use_case.execute( rrn: assessment.assessment_id, related_rrn: assessment.related_rrn, address_id: assessment.address_id, type_of_assessment: assessment.type_of_assessment, + is_scottish: is_scottish, ) end + # TODO: UPDATE WHEN DOING LODGEMENT def find_assessment_by_id(assessment_id) @assessments_search_gateway.search_by_assessment_id(assessment_id, restrictive: false) .first @@ -233,8 +237,8 @@ def get_assessments_address_id_source( end end - def insert_country_id(assessment_id, country_id = nil, upsert: false) - @assessments_country_id_gateway.insert(assessment_id:, country_id:, upsert:) unless country_id.nil? + def insert_country_id(assessment_id, is_scottish, country_id: nil, upsert: false) + @assessments_country_id_gateway.insert(assessment_id:, country_id:, upsert:, is_scottish:) unless country_id.nil? end end end diff --git a/lib/use_case/notify_new_assessment_to_data_warehouse.rb b/lib/use_case/notify_new_assessment_to_data_warehouse.rb index 9cfa7bbfb..7e2d772db 100644 --- a/lib/use_case/notify_new_assessment_to_data_warehouse.rb +++ b/lib/use_case/notify_new_assessment_to_data_warehouse.rb @@ -6,8 +6,10 @@ def initialize(redis_gateway:) @data_warehouse_queues_gateway = redis_gateway end - def execute(assessment_id:) - @data_warehouse_queues_gateway.push_to_queue(:assessments, assessment_id) + def execute(assessment_id:, is_scottish: false) + unless is_scottish + @data_warehouse_queues_gateway.push_to_queue(:assessments, assessment_id) + end rescue Gateway::DataWarehouseQueuesGateway::PushFailedError => e raise CouldNotCompleteError, "Notifying assessment ID #{assessment_id} failed; error from gateway: #{e.message}" end diff --git a/spec/acceptance/scotland-schema/lodge_spec.rb b/spec/acceptance/scotland-schema/lodge_spec.rb new file mode 100644 index 000000000..610a26cb0 --- /dev/null +++ b/spec/acceptance/scotland-schema/lodge_spec.rb @@ -0,0 +1,185 @@ +describe "Acceptance::Assessment::Lodge", :set_with_timecop do + include RSpecRegisterApiServiceMixin + + before do + Events::Broadcaster.enable! + add_countries + end + + let(:valid_rdsap_xml) { Samples.xml "RdSAP-Schema-S-19.0" } + let(:valid_sap_xml) { Samples.xml "SAP-Schema-S-19.0.0" } + let(:valid_assessor_request_body) do + AssessorStub.new.fetch_request_body( + domestic_rd_sap: "ACTIVE", + domestic_sap: "ACTIVE", + non_domestic_nos3: "ACTIVE", + non_domestic_dec: "ACTIVE", + non_domestic_cc4: "ACTIVE", + non_domestic_sp3: "ACTIVE", + ) + end + + context "when migrating a domestic Scottish assessment" do + let(:scheme_id) { add_scheme_and_get_id } + + let(:migrated_scotland_rdsap_data) do + ActiveRecord::Base.connection.exec_query( + "SELECT * FROM scotland.assessments WHERE assessment_id = '0000-0000-0000-0000-0000'", + ).entries.first + end + + before do + add_assessor scheme_id:, assessor_id: "SPEC000000", body: valid_assessor_request_body + end + + it "rejects a migration from a client without migration role" do + expect(lodge_assessment( + assessment_body: valid_rdsap_xml, + accepted_responses: [403], + scopes: %w[assessment:lodge], + auth_data: { + scheme_ids: [scheme_id], + }, + schema_name: "RdSAP-Schema-S-19.0", + migrated: true, + ).status).to eq(403) + end + + it "has all expected data points present" do + expected_rdsap_data = { + "assessment_id" => "0000-0000-0000-0000-0000", + "date_of_assessment" => "2023-06-27", + "date_registered" => "2023-06-27", + "type_of_assessment" => "RdSAP", + "current_energy_efficiency_rating" => 79, + "postcode" => "FK1 1XE", + "date_of_expiry" => "2033-06-26", + "address_line1" => "1 Some Street", + "address_line2" => "", + "address_line3" => "", + "address_line4" => "", + "town" => "Newkirk", + "scheme_assessor_id" => "SPEC000000", + "opt_out" => false, + "address_id" => "LPRN-0000000000", + "migrated" => true, + "cancelled_at" => nil, + "not_for_issue_at" => nil, + "created_at" => "2021-06-21", + "hashed_assessment_id" => "4af9d2c31cf53e72ef6f59d3f59a1bfc500ebc2b1027bc5ca47361435d988e1a", + "test_column" => nil, + } + + response = lodge_assessment assessment_body: valid_rdsap_xml, + accepted_responses: [201], + scopes: %w[assessment:lodge migrate:assessment], + auth_data: { + scheme_ids: [scheme_id], + }, + schema_name: "RdSAP-Schema-S-19.0", + migrated: "true" + + expect(JSON.parse(response.body, symbolize_names: true)[:data][:assessments].first).to eq "0000-0000-0000-0000-0000" + expect(migrated_scotland_rdsap_data).to eq expected_rdsap_data + end + + context "when migrating the same assessment ID" do + before do + lodge_assessment assessment_body: valid_rdsap_xml, + accepted_responses: [201], + scopes: %w[assessment:lodge migrate:assessment], + auth_data: { + scheme_ids: [scheme_id], + }, + schema_name: "RdSAP-Schema-S-19.0", + migrated: "true" + end + + it "doesn't raise and error" do + lodge_assessment assessment_body: valid_rdsap_xml, + accepted_responses: [201], + scopes: %w[assessment:lodge migrate:assessment], + auth_data: { + scheme_ids: [scheme_id], + }, + schema_name: "RdSAP-Schema-S-19.0", + migrated: "true" + expect { migrated_scotland_rdsap_data["migrated"] }.not_to raise_error + end + end + + context "when migrating an assessment submitted by an assessor who is now unqualified" do + let(:rdsap_xml) do + add_assessor scheme_id:, + assessor_id: "UNQU000000", + body: AssessorStub.new.fetch_request_body( + domestic_rd_sap: "INACTIVE", + ) + + xml = Nokogiri.XML valid_rdsap_xml + + xml.css("Membership-Number").children.first.content = "UNQU000000" + + xml.to_s + end + + it "is true in migrated column" do + response = lodge_assessment(assessment_body: rdsap_xml, + accepted_responses: [201], + scopes: %w[assessment:lodge migrate:assessment], + auth_data: { + scheme_ids: [scheme_id], + }, + schema_name: "RdSAP-Schema-S-19.0", + migrated: true).status + + expect(response).to eq 201 + expect(migrated_scotland_rdsap_data["migrated"]).to be_truthy + end + end + + context "when migrating a Scottish SAP assessment" do + expected_sap_assessment_data = { + "assessment_id" => "0000-0000-0000-0000-0000", + "date_of_assessment" => "2024-11-21", + "date_registered" => "2024-11-21", + "type_of_assessment" => "SAP", + "current_energy_efficiency_rating" => 91, + "postcode" => "EH1 2NG", + "date_of_expiry" => "2034-11-20", + "address_line1" => "1 LOVELY ROAD", + "address_line2" => "NICE ESTATE", + "address_line3" => "", + "address_line4" => nil, + "town" => "TOWN", + "scheme_assessor_id" => "SPEC000000", + "opt_out" => false, + "address_id" => "0000000001", + "migrated" => true, + "cancelled_at" => nil, + "not_for_issue_at" => nil, + "created_at" => "2021-06-21", + "hashed_assessment_id" => "4af9d2c31cf53e72ef6f59d3f59a1bfc500ebc2b1027bc5ca47361435d988e1a", + "test_column" => nil, + } + + it "is true in migrated column" do + response = lodge_assessment assessment_body: valid_sap_xml, + accepted_responses: [201], + scopes: %w[assessment:lodge migrate:assessment], + auth_data: { + scheme_ids: [scheme_id], + }, + schema_name: "SAP-Schema-S-19.0.0", + migrated: "true" + + sap_data = ActiveRecord::Base.connection.exec_query( + "SELECT * FROM scotland.assessments WHERE assessment_id = '0000-0000-0000-0000-0000'", + ).entries.first + + expect(JSON.parse(response.body, symbolize_names: true)[:data][:assessments].first).to eq "0000-0000-0000-0000-0000" + expect(sap_data).to eq expected_sap_assessment_data + end + end + end +end diff --git a/spec/acceptance/scotland-schema/scotland_schema_migration_spec.rb b/spec/acceptance/scotland-schema/scotland_schema_migration_spec.rb index f0bedafce..d71407519 100644 --- a/spec/acceptance/scotland-schema/scotland_schema_migration_spec.rb +++ b/spec/acceptance/scotland-schema/scotland_schema_migration_spec.rb @@ -16,6 +16,7 @@ it "creates the required new scotland tables" do expected_tables = %w[assessment_search_address assessments_address_id + green_deal_plans linked_assessments overridden_lodgement_events schema_migrations @@ -27,7 +28,9 @@ SELECT table_name FROM information_schema.tables WHERE table_schema = 'scotland'; SQL tables = table_results.rows.flatten - + if tables.include?("ar_internal_metadata") + tables.delete("ar_internal_metadata") + end expect(tables).to match_array(expected_tables) end end diff --git a/spec/unit/gateway/assessments_address_id_gateway_spec.rb b/spec/unit/gateway/assessments_address_id_gateway_spec.rb index d14f1ea64..416d1832f 100644 --- a/spec/unit/gateway/assessments_address_id_gateway_spec.rb +++ b/spec/unit/gateway/assessments_address_id_gateway_spec.rb @@ -45,6 +45,74 @@ end end + describe "#fetch" do + context "when fetching an assessment id" do + it "returns the expected response" do + expected_response = { + address_id: "RRN-0000-0000-0000-0000-0001", + address_updated_at: nil, + assessment_id: "0000-0000-0000-0000-0001", + source: "lodgement", + } + assessment_id = "0000-0000-0000-0000-0001" + response = gateway.fetch(assessment_id) + + expect(response).to eq expected_response + end + + it "returns the expected response for a Scottish assessment" do + ActiveRecord::Base.connection.exec_query( + "INSERT INTO scotland.assessments_address_id(assessment_id, address_id, source, address_updated_at) VALUES('0000-0000-0000-0000-0002', 'RRN-0000-0000-0000-0000-0002', 'lodgement', null)", + ) + + expected_response = { + address_id: "RRN-0000-0000-0000-0000-0002", + address_updated_at: nil, + assessment_id: "0000-0000-0000-0000-0002", + source: "lodgement", + } + assessment_id = "0000-0000-0000-0000-0002" + response = gateway.fetch(assessment_id, is_scottish: true) + + expect(response).to eq expected_response + end + end + end + + describe "#send_to_db" do + context "when creating an assessment" do + it "returns the expected response" do + entry = { + assessment_id: "0000-0000-0000-0000-0001", + address_id: "RRN-0000-0000-0000-0000-0001", + source: "lodgement", + + } + gateway.send_to_db(entry) + row = ActiveRecord::Base.connection.exec_query( + "SELECT * FROM assessments_address_id WHERE assessment_id = '0000-0000-0000-0000-0001'", + ) + + expect(row.entries.first["assessment_id"]).to eq "0000-0000-0000-0000-0001" + end + + it "returns the expected response for a Scottish entry" do + entry = { + assessment_id: "0000-0000-0000-0000-0001", + address_id: "RRN-0000-0000-0000-0000-0001", + source: "lodgement", + + } + gateway.send_to_db(entry, is_scottish: true) + row = ActiveRecord::Base.connection.exec_query( + "SELECT * FROM scotland.assessments_address_id WHERE assessment_id = '0000-0000-0000-0000-0001'", + ) + + expect(row.entries.first["assessment_id"]).to eq "0000-0000-0000-0000-0001" + end + end + end + describe "#fetch_updated_group_count" do context "when fetching updated group count" do it "returns the number of updated address groups" do diff --git a/spec/unit/gateway/assessments_country_id_gateway_spec.rb b/spec/unit/gateway/assessments_country_id_gateway_spec.rb index e28bd8652..127996b94 100644 --- a/spec/unit/gateway/assessments_country_id_gateway_spec.rb +++ b/spec/unit/gateway/assessments_country_id_gateway_spec.rb @@ -25,6 +25,17 @@ expect { gateway.insert(assessment_id:, country_id: 1) }.to raise_error Gateway::AssessmentsGateway::AssessmentAlreadyExists end end + + context "when inserting an assessment into the scotland equivalent of the assessments_country_ids table" do + it "saves the row to the table" do + assessment_id = "0000-0000-0001-1234-0022" + gateway.insert(assessment_id:, country_id: 2, upsert: true, is_scottish: true) + row = ActiveRecord::Base.connection.exec_query( + "SELECT * FROM scotland.assessments_country_ids WHERE assessment_id = '0000-0000-0001-1234-0022'", + ) + expect(row.entries.first["country_id"]).to eq 2 + end + end end describe "fetch_country_name" do diff --git a/spec/unit/gateway/assessments_gateway_spec.rb b/spec/unit/gateway/assessments_gateway_spec.rb index 6963bd1ca..bebc87bdf 100644 --- a/spec/unit/gateway/assessments_gateway_spec.rb +++ b/spec/unit/gateway/assessments_gateway_spec.rb @@ -14,6 +14,8 @@ def fetch_created_at(assessment_id) "9999" end + let(:fetch_assessor_stub) { AssessorStub.new } + include RSpecRegisterApiServiceMixin include_context "when updating EPC dates" @@ -245,4 +247,176 @@ def fetch_created_at(assessment_id) expect(gateway.update_created_at_from_landmark?("0000-0000-0000-0000-0001", landmark_date)).to be false end end + + describe "#insert_or_update" do + let(:scheme_id) { add_scheme_and_get_id } + let(:assessment) do + Domain::AssessmentIndexRecord.new( + assessment_id: "0000-0000-0000-0000-0000", + type_of_assessment: "RdSAP", + date_of_assessment: "2024-01-16 17:52:43.00000", + date_registered: "2024-01-16 17:52:43.00000", + date_of_expiry: "2024-01-16 17:52:43.00000", + assessor: Domain::Assessor.new( + scheme_assessor_id: "SPEC000000", + first_name: "Test", + last_name: "Assessor", + middle_names: "Brian", + date_of_birth: "2000-10-01", + email: "test@example.com", + telephone_number: "07865672531", + registered_by_id: scheme_id, + registered_by_name: scheme_id, + search_results_comparison_postcode: + "SE32 5TR", + also_known_as: "Bob", + address_line1: "6 Street place", + address_line2: "Whimple area", + address_line3: "Bloopshire", + town: "London", + postcode: "we 32 4ew", + company_reg_no: "23222", + company_address_line1: "3 Week street", + company_address_line2: "Bloop place", + company_address_line3: "London", + company_town: "London", + company_postcode: "AA1 2AA", + company_website: "test.com", + company_telephone_number: "07865672531", + company_email: "test@example.com", + company_name: "Test", + domestic_sap_qualification: "ACTIVE", + domestic_rd_sap_qualification: "ACTIVE", + non_domestic_sp3_qualification: "ACTIVE", + non_domestic_cc4_qualification: "ACTIVE", + non_domestic_dec_qualification: "ACTIVE", + non_domestic_nos3_qualification: "ACTIVE", + non_domestic_nos4_qualification: "ACTIVE", + non_domestic_nos5_qualification: "ACTIVE", + gda_qualification: "ACTIVE", + ), + current_energy_efficiency_rating: 23, + potential_energy_efficiency_rating: 45, + address_id: "RRN-0000-0000-0000-0000-0000", + address_line1: "4 Bloop lane", + address_line2: "Gloop area", + address_line3: "", + address_line4: "", + town: "London", + postcode: "DW12 1WS", + xml: "XML", + migrated: true, + related_rrn: "", + hashed_assessment_id: "Hash23123213", + country_id: 1, + ) + end + + let(:updated_assessment) do + Domain::AssessmentIndexRecord.new( + assessment_id: "0000-0000-0000-0000-0000", + type_of_assessment: "SAP", + date_of_assessment: "2024-01-16 17:52:43.00000", + date_registered: "2024-01-16 17:52:43.00000", + date_of_expiry: "2024-01-16 17:52:43.00000", + assessor: Domain::Assessor.new( + scheme_assessor_id: "SPEC000000", + first_name: "Test", + last_name: "Assessor", + middle_names: "Brian", + date_of_birth: "2000-10-01", + email: "test@example.com", + telephone_number: "07865672531", + registered_by_id: scheme_id, + registered_by_name: scheme_id, + search_results_comparison_postcode: + "SE32 5TR", + also_known_as: "Bob", + address_line1: "6 Street place", + address_line2: "Whimple area", + address_line3: "Bloopshire", + town: "London", + postcode: "we 32 4ew", + company_reg_no: "23222", + company_address_line1: "3 Week street", + company_address_line2: "Bloop place", + company_address_line3: "London", + company_town: "London", + company_postcode: "AA1 2AA", + company_website: "test.com", + company_telephone_number: "07865672531", + company_email: "test@example.com", + company_name: "Test", + domestic_sap_qualification: "ACTIVE", + domestic_rd_sap_qualification: "ACTIVE", + non_domestic_sp3_qualification: "ACTIVE", + non_domestic_cc4_qualification: "ACTIVE", + non_domestic_dec_qualification: "ACTIVE", + non_domestic_nos3_qualification: "ACTIVE", + non_domestic_nos4_qualification: "ACTIVE", + non_domestic_nos5_qualification: "ACTIVE", + gda_qualification: "ACTIVE", + ), + current_energy_efficiency_rating: 70, + potential_energy_efficiency_rating: 80, + address_id: "RRN-0000-0000-0000-0000-0000", + address_line1: "4 Bloop lane", + address_line2: "Gloop area", + address_line3: "", + address_line4: "", + town: "London", + postcode: "DW12 1WS", + xml: "XML", + migrated: true, + related_rrn: "", + hashed_assessment_id: "Hash23123213", + country_id: 1, + ) + end + + before do + add_assessor( + scheme_id:, + assessor_id: "SPEC000000", + body: fetch_assessor_stub.fetch_request_body( + non_domestic_nos3: "ACTIVE", + domestic_rd_sap: "ACTIVE", + ), + ) + end + + it "inserts the assessment" do + gateway.insert_or_update(assessment, is_scottish: false) + result = Gateway::AssessmentsGateway::Assessment.find_by(assessment_id: "0000-0000-0000-0000-0000") + expect(result.type_of_assessment).to eq("RdSAP") + end + + it "updates the original assessment" do + gateway.insert_or_update(assessment, is_scottish: false) + gateway.insert_or_update(updated_assessment, is_scottish: false) + result = Gateway::AssessmentsGateway::Assessment.find_by(assessment_id: "0000-0000-0000-0000-0000") + expect(result.type_of_assessment).to eq("SAP") + end + + it "does not raise an error when no ID is found" do + expect { gateway.update_field("0000-0000-0000-0000-0004", "created_at", "2024-01-16 17:52:43.00000") }.not_to raise_error + end + + it "inserts the scottish assessment to the scottish schema" do + gateway.insert_or_update(assessment, is_scottish: true) + result = ActiveRecord::Base.connection.exec_query( + "SELECT * FROM scotland.assessments WHERE assessment_id = '0000-0000-0000-0000-0000'", + ).entries.first + expect(result["type_of_assessment"]).to eq("RdSAP") + end + + it "updates the original scottish assessment in the scottish schema" do + gateway.insert_or_update(assessment, is_scottish: true) + gateway.insert_or_update(updated_assessment, is_scottish: true) + result = ActiveRecord::Base.connection.exec_query( + "SELECT * FROM scotland.assessments WHERE assessment_id = '0000-0000-0000-0000-0000'", + ).entries.first + expect(result["type_of_assessment"]).to eq("SAP") + end + end end diff --git a/spec/unit/gateway/assessments_xml_gateway_spec.rb b/spec/unit/gateway/assessments_xml_gateway_spec.rb new file mode 100644 index 000000000..83f8c2ea4 --- /dev/null +++ b/spec/unit/gateway/assessments_xml_gateway_spec.rb @@ -0,0 +1,44 @@ +describe Gateway::AssessmentsXmlGateway do + include RSpecRegisterApiServiceMixin + context "when interacting with the assessments xml tables" do + subject(:gateway) { described_class.new } + + let(:record) do + { + assessment_id: "0000-0000-0000-0000-0000", + xml: "0000-0000-0000-0000-0000", + schema_type: "RdSAP-Schema-19.0.0", + } + end + + let(:scottish_record) do + { + assessment_id: "0000-0000-0000-0000-0001", + xml: "0000-0000-0000-0000-0001", + schema_type: "RdSAP-Schema-S-19.0", + } + end + + before do + Gateway::SchemesGateway::Scheme.create(scheme_id: "1") + Gateway::AssessorsGateway::Assessor.create(scheme_assessor_id: "12", first_name: "test_forename", last_name: "test_surname", date_of_birth: "1970-01-05", registered_by: "1") + end + + describe "#sent_to_db" do + it "sends the xml record to the assessments xml table" do + Gateway::AssessmentsGateway::Assessment.create(assessment_id: "0000-0000-0000-0000-0000", scheme_assessor_id: "12", type_of_assessment: "SAP", date_of_assessment: "2010-01-01", date_registered: "2010-01-01", created_at: "2010-01-02", date_of_expiry: "2070-01-02", current_energy_efficiency_rating: 50) + expect(gateway.send_to_db(record, false).assessment_id).to eq("0000-0000-0000-0000-0000") + end + + it "sends the Scottish xml record to the Scottish assessments xml table" do + Gateway::AssessmentsGateway::AssessmentScotland.create(assessment_id: "0000-0000-0000-0000-0001", scheme_assessor_id: "12", type_of_assessment: "SAP", date_of_assessment: "2010-01-01", date_registered: "2010-01-01", created_at: "2010-01-02", date_of_expiry: "2070-01-02", current_energy_efficiency_rating: 50) + gateway.send_to_db(scottish_record, true) + result = ActiveRecord::Base.connection.exec_query( + "SELECT * FROM scotland.assessments_xml WHERE assessment_id = '0000-0000-0000-0000-0001'", + ).entries.first + + expect(result["assessment_id"]).to eq("0000-0000-0000-0000-0001") + end + end + end +end diff --git a/spec/unit/gateway/related_assessments_gateway_spec.rb b/spec/unit/gateway/related_assessments_gateway_spec.rb index 0e86b549c..f764f7e6a 100644 --- a/spec/unit/gateway/related_assessments_gateway_spec.rb +++ b/spec/unit/gateway/related_assessments_gateway_spec.rb @@ -34,8 +34,15 @@ end end - it "returns related assessment IDs when calling related_assessment_ids" do - expect(gateway.related_assessment_ids(address_id).sort).to eq related_assessment_ids + describe "#related_assessment_ids" do + it "returns related assessment IDs when calling related_assessment_ids" do + expect(gateway.related_assessment_ids(address_id).sort).to eq related_assessment_ids + end + + it "returns related assessment IDs when calling related_assessment_ids for a Sottish assessment" do + ActiveRecord::Base.connection.exec_query("INSERT INTO scotland.assessments_address_id (assessment_id, address_id, source, address_updated_at) VALUES('0000-0000-0000-0000-0003','UPRN-000000000003', 'lodgement', '02/02/2023');") + expect(gateway.related_assessment_ids("UPRN-000000000003", is_scottish: true).sort).to eq %w[0000-0000-0000-0000-0003] + end end end end diff --git a/spec/unit/gateway/search_address_gateway_spec.rb b/spec/unit/gateway/search_address_gateway_spec.rb index 2815c40d5..d69f95a63 100644 --- a/spec/unit/gateway/search_address_gateway_spec.rb +++ b/spec/unit/gateway/search_address_gateway_spec.rb @@ -21,23 +21,31 @@ let(:search_address) { Domain::SearchAddress.new record } describe "#insert" do - it "saves data to the search address table without error" do - expect { gateway.insert search_address.to_hash }.not_to raise_error - end + context "when inserting row" do + it "the saved data is correct" do + gateway.insert search_address.to_hash + saved_data = ActiveRecord::Base.connection.exec_query("SELECT * FROM assessment_search_address") + expect(saved_data.rows.length).to eq 1 + expect(saved_data[0]["assessment_id"]).to eq "0000-0000-0000-0000-0005" + expect(saved_data[0]["address"]).to eq "22 acacia avenue some place" + end - it "the saved data is correct" do - gateway.insert search_address.to_hash - saved_data = ActiveRecord::Base.connection.exec_query("SELECT * FROM assessment_search_address") - expect(saved_data.rows.length).to eq 1 - expect(saved_data[0]["assessment_id"]).to eq "0000-0000-0000-0000-0005" - expect(saved_data[0]["address"]).to eq "22 acacia avenue some place" + it "does not duplicate rows" do + gateway.insert search_address.to_hash + gateway.insert search_address.to_hash + saved_data = ActiveRecord::Base.connection.exec_query("SELECT * FROM assessment_search_address") + expect(saved_data.rows.length).to eq 1 + end end - it "does not duplicate rows" do - gateway.insert search_address.to_hash - gateway.insert search_address.to_hash - saved_data = ActiveRecord::Base.connection.exec_query("SELECT * FROM assessment_search_address") - expect(saved_data.rows.length).to eq 1 + context "when inserting into the Scotland version of the table" do + it "the saved data is correct" do + gateway.insert(search_address.to_hash, is_scottish: true) + saved_data = ActiveRecord::Base.connection.exec_query("SELECT * FROM scotland.assessment_search_address") + expect(saved_data.rows.length).to eq 1 + expect(saved_data[0]["assessment_id"]).to eq "0000-0000-0000-0000-0005" + expect(saved_data[0]["address"]).to eq "22 acacia avenue some place" + end end end diff --git a/spec/unit/use_case/get_canonical_address_id_spec.rb b/spec/unit/use_case/get_canonical_address_id_spec.rb index c40bb344b..45068a2b3 100644 --- a/spec/unit/use_case/get_canonical_address_id_spec.rb +++ b/spec/unit/use_case/get_canonical_address_id_spec.rb @@ -9,6 +9,29 @@ let(:address_base_search_gateway) { instance_double Gateway::AddressBaseSearchGateway } let(:assessments_address_id_gateway) { instance_double Gateway::AssessmentsAddressIdGateway } + context "when getting the canonical address ID for a Scottish lodgement when no UPRN is provided" do + before do + allow(address_base_search_gateway).to receive(:check_uprn_exists).and_return(false) + allow(assessments_address_id_gateway).to receive(:fetch).with("0000-0000-0000-0000-0001", is_scottish: true).and_return({ address_id: "RRN-0000-0000-0000-0000-0000" }) + end + + context "when determining the address ID for the scottish lodgement" do + let(:params) do + { + rrn: "0000-0000-0000-0000-0000", + related_rrn: "0000-0000-0000-0000-0001", + type_of_assessment: "SAP", + address_id: "RRN-0000-0000-0000-0000-0001", + is_scottish: true, + } + end + + it "assigns the address ID based on the assessment id given" do + expect(use_case.execute(**params)).to eq "RRN-0000-0000-0000-0000-0000" + end + end + end + context "when getting the canonical address ID for a CEPC dual lodgement when the UPRN provided does not exist" do before do allow(address_base_search_gateway).to receive(:check_uprn_exists).and_return(false) diff --git a/spec/unit/use_case/lodge_assessment_spec.rb b/spec/unit/use_case/lodge_assessment_spec.rb index 31492380c..bbb7c2f54 100644 --- a/spec/unit/use_case/lodge_assessment_spec.rb +++ b/spec/unit/use_case/lodge_assessment_spec.rb @@ -221,7 +221,7 @@ use_case.execute(data, true, "SAP-Schema-18.0.0") expect(assessments_gateway).to have_received(:insert_or_update) - expect(search_address_gateway).to have_received(:insert).with({ assessment_id: "2000-0000-0000-0000-0001", address: "1 some street some area some county" }) + expect(search_address_gateway).to have_received(:insert).with({ assessment_id: "2000-0000-0000-0000-0001", address: "1 some street some area some county" }, is_scottish: false) end it "calls AssessmentsXMLGateway to save the XML data to the assessments_xml table" do @@ -233,6 +233,29 @@ xml: "", schema_type: "SAP-Schema-18.0.0", }, + false, + ) + end + end + + context "when the Scottish assessment is passed as being migrated" do + it "calls AssessmentsGateway to save the assessment data to the assessments table" do + use_case.execute(data, true, "SAP-Schema-S-19.0.0") + + expect(assessments_gateway).to have_received(:insert_or_update) + expect(search_address_gateway).to have_received(:insert).with({ assessment_id: "2000-0000-0000-0000-0001", address: "1 some street some area some county" }, is_scottish: true) + end + + it "calls AssessmentsXMLGateway to save the XML data to the assessments_xml table" do + use_case.execute(data, true, "SAP-Schema-S-19.0.0") + + expect(assessments_xml_gateway).to have_received(:send_to_db).with( + { + assessment_id: "2000-0000-0000-0000-0001", + xml: "", + schema_type: "SAP-Schema-S-19.0.0", + }, + true, ) end end @@ -264,7 +287,7 @@ end it "sends the country to the assessments_country_id gateway" do - expect(assessments_country_id_gateway).to have_received(:insert).with(assessment_id: data[:assessment_id], country_id: 1, upsert: false) + expect(assessments_country_id_gateway).to have_received(:insert).with(assessment_id: data[:assessment_id], country_id: 1, upsert: false, is_scottish: false) end end @@ -291,6 +314,7 @@ expect { use_case.execute(data, true, "RdSAP-Schema-20.0.0") }.to broadcast( :assessment_lodged, assessment_id: data[:assessment_id], + is_scottish: false, ) end end diff --git a/spec/unit/use_case/notify_new_assessment_to_data_warehouse_spec.rb b/spec/unit/use_case/notify_new_assessment_to_data_warehouse_spec.rb index 03c87c284..fede19621 100644 --- a/spec/unit/use_case/notify_new_assessment_to_data_warehouse_spec.rb +++ b/spec/unit/use_case/notify_new_assessment_to_data_warehouse_spec.rb @@ -17,6 +17,17 @@ end end + describe "Scotland paths" do + before do + allow(data_warehouse_queues_gateway).to receive(:push_to_queue) + use_case.execute(assessment_id:, is_scottish: true) + end + + it "calls down to the redis gateway to push to the queue" do + expect(data_warehouse_queues_gateway).not_to have_received(:push_to_queue) + end + end + context "when the gateway is unable to push and raises an error" do before do allow(data_warehouse_queues_gateway).to receive(:push_to_queue).and_raise Gateway::DataWarehouseQueuesGateway::PushFailedError