|
|
|
|
@ -1,6 +1,16 @@
|
|
|
|
|
require "rails_helper" |
|
|
|
|
|
|
|
|
|
RSpec.describe Imports::LettingsLogsImportService do |
|
|
|
|
context "in 21/22" do |
|
|
|
|
around do |example| |
|
|
|
|
Timecop.freeze(Time.zone.local(2022, 1, 1)) do |
|
|
|
|
Singleton.__init__(FormHandler) |
|
|
|
|
example.run |
|
|
|
|
end |
|
|
|
|
Timecop.return |
|
|
|
|
Singleton.__init__(FormHandler) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
subject(:lettings_log_service) { described_class.new(storage_service, logger) } |
|
|
|
|
|
|
|
|
|
let(:storage_service) { instance_double(Storage::S3Service) } |
|
|
|
|
@ -37,22 +47,22 @@ RSpec.describe Imports::LettingsLogsImportService do
|
|
|
|
|
FactoryBot.create(:location, old_visible_id: "10", postcode: "LS166FT", scheme_id: scheme2.id, mobility_type: "W", startdate: Time.zone.local(2021, 4, 1)) |
|
|
|
|
|
|
|
|
|
# Stub the form handler to use the real form |
|
|
|
|
allow(FormHandler.instance).to receive(:get_form).with("current_lettings").and_return(real_2021_2022_form) |
|
|
|
|
allow(FormHandler.instance).to receive(:get_form).with("previous_lettings").and_return(real_2021_2022_form) |
|
|
|
|
allow(FormHandler.instance).to receive(:get_form).with("current_lettings").and_return(real_2022_2023_form) |
|
|
|
|
allow(FormHandler.instance).to receive(:get_form).with("next_lettings").and_return(real_2022_2023_form) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
context "when importing lettings logs" do |
|
|
|
|
let(:remote_folder) { "lettings_logs" } |
|
|
|
|
let(:lettings_log_id) { "0ead17cb-1668-442d-898c-0d52879ff592" } |
|
|
|
|
let(:lettings_log_id2) { "166fc004-392e-47a8-acb8-1c018734882b" } |
|
|
|
|
let(:lettings_log_id3) { "00d2343e-d5fa-4c89-8400-ec3854b0f2b4" } |
|
|
|
|
let(:lettings_log_id4) { "0b4a68df-30cc-474a-93c0-a56ce8fdad3b" } |
|
|
|
|
let(:lettings_log_id3) { "0b4a68df-30cc-474a-93c0-a56ce8fdad3b" } |
|
|
|
|
let(:sales_log) { "shared_ownership_sales_log" } |
|
|
|
|
|
|
|
|
|
before do |
|
|
|
|
# Stub the S3 file listing and download |
|
|
|
|
allow(storage_service).to receive(:list_files) |
|
|
|
|
.and_return(%W[#{remote_folder}/#{lettings_log_id}.xml #{remote_folder}/#{lettings_log_id2}.xml #{remote_folder}/#{lettings_log_id3}.xml #{remote_folder}/#{lettings_log_id4}.xml #{remote_folder}/#{sales_log}.xml]) |
|
|
|
|
.and_return(%W[#{remote_folder}/#{lettings_log_id}.xml #{remote_folder}/#{lettings_log_id2}.xml #{remote_folder}/#{lettings_log_id3}.xml #{remote_folder}/#{sales_log}.xml]) |
|
|
|
|
allow(storage_service).to receive(:get_file_io) |
|
|
|
|
.with("#{remote_folder}/#{lettings_log_id}.xml") |
|
|
|
|
.and_return(open_file(fixture_directory, lettings_log_id), open_file(fixture_directory, lettings_log_id)) |
|
|
|
|
@ -62,9 +72,6 @@ RSpec.describe Imports::LettingsLogsImportService do
|
|
|
|
|
allow(storage_service).to receive(:get_file_io) |
|
|
|
|
.with("#{remote_folder}/#{lettings_log_id3}.xml") |
|
|
|
|
.and_return(open_file(fixture_directory, lettings_log_id3), open_file(fixture_directory, lettings_log_id3)) |
|
|
|
|
allow(storage_service).to receive(:get_file_io) |
|
|
|
|
.with("#{remote_folder}/#{lettings_log_id4}.xml") |
|
|
|
|
.and_return(open_file(fixture_directory, lettings_log_id4), open_file(fixture_directory, lettings_log_id4)) |
|
|
|
|
allow(storage_service).to receive(:get_file_io) |
|
|
|
|
.with("#{remote_folder}/#{sales_log}.xml") |
|
|
|
|
.and_return(open_file(fixture_directory, sales_log), open_file(fixture_directory, sales_log)) |
|
|
|
|
@ -75,15 +82,15 @@ RSpec.describe Imports::LettingsLogsImportService do
|
|
|
|
|
expect(logger).not_to receive(:warn) |
|
|
|
|
expect(logger).not_to receive(:info) |
|
|
|
|
expect { lettings_log_service.create_logs(remote_folder) } |
|
|
|
|
.to change(LettingsLog, :count).by(4) |
|
|
|
|
.to change(LettingsLog, :count).by(3) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
it "only updates existing lettings logs" do |
|
|
|
|
expect(logger).not_to receive(:error) |
|
|
|
|
expect(logger).not_to receive(:warn) |
|
|
|
|
expect(logger).to receive(:info).with(/Updating lettings log/).exactly(4).times |
|
|
|
|
expect(logger).to receive(:info).with(/Updating lettings log/).exactly(3).times |
|
|
|
|
expect { 2.times { lettings_log_service.create_logs(remote_folder) } } |
|
|
|
|
.to change(LettingsLog, :count).by(4) |
|
|
|
|
.to change(LettingsLog, :count).by(3) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
it "creates organisation relationship once" do |
|
|
|
|
@ -439,4 +446,99 @@ RSpec.describe Imports::LettingsLogsImportService do
|
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
context "in 22/23" do |
|
|
|
|
around do |example| |
|
|
|
|
Timecop.freeze(Time.zone.local(2023, 1, 1)) do |
|
|
|
|
Singleton.__init__(FormHandler) |
|
|
|
|
example.run |
|
|
|
|
end |
|
|
|
|
Timecop.return |
|
|
|
|
Singleton.__init__(FormHandler) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
subject(:lettings_log_service) { described_class.new(storage_service, logger) } |
|
|
|
|
|
|
|
|
|
let(:storage_service) { instance_double(Storage::S3Service) } |
|
|
|
|
let(:logger) { instance_double(ActiveSupport::Logger) } |
|
|
|
|
|
|
|
|
|
let(:real_2021_2022_form) { Form.new("config/forms/2021_2022.json") } |
|
|
|
|
let(:real_2022_2023_form) { Form.new("config/forms/2022_2023.json") } |
|
|
|
|
let(:fixture_directory) { "spec/fixtures/imports/logs" } |
|
|
|
|
|
|
|
|
|
let(:organisation) { FactoryBot.create(:organisation, old_visible_id: "1", provider_type: "PRP") } |
|
|
|
|
let(:managing_organisation) { FactoryBot.create(:organisation, old_visible_id: "2", provider_type: "PRP") } |
|
|
|
|
let(:scheme1) { FactoryBot.create(:scheme, old_visible_id: "0123", owning_organisation: organisation) } |
|
|
|
|
let(:scheme2) { FactoryBot.create(:scheme, old_visible_id: "456", owning_organisation: organisation) } |
|
|
|
|
|
|
|
|
|
def open_file(directory, filename) |
|
|
|
|
File.open("#{directory}/#{filename}.xml") |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
before do |
|
|
|
|
WebMock.stub_request(:get, /api.postcodes.io\/postcodes\/LS166FT/) |
|
|
|
|
.to_return(status: 200, body: '{"status":200,"result":{"admin_district":"Westminster","codes":{"admin_district":"E08000035"}}}', headers: {}) |
|
|
|
|
|
|
|
|
|
allow(Organisation).to receive(:find_by).and_return(nil) |
|
|
|
|
allow(Organisation).to receive(:find_by).with(old_visible_id: organisation.old_visible_id).and_return(organisation) |
|
|
|
|
allow(Organisation).to receive(:find_by).with(old_visible_id: managing_organisation.old_visible_id).and_return(managing_organisation) |
|
|
|
|
|
|
|
|
|
# Created by users |
|
|
|
|
FactoryBot.create(:user, old_user_id: "c3061a2e6ea0b702e6f6210d5c52d2a92612d2aa", organisation:) |
|
|
|
|
FactoryBot.create(:user, old_user_id: "e29c492473446dca4d50224f2bb7cf965a261d6f", organisation:) |
|
|
|
|
|
|
|
|
|
# Location setup |
|
|
|
|
FactoryBot.create(:location, old_visible_id: "10", postcode: "LS166FT", scheme_id: scheme1.id, mobility_type: "W", startdate: Time.zone.local(2021, 4, 1)) |
|
|
|
|
FactoryBot.create(:location, scheme_id: scheme1.id, startdate: Time.zone.local(2021, 4, 1)) |
|
|
|
|
FactoryBot.create(:location, old_visible_id: "10", postcode: "LS166FT", scheme_id: scheme2.id, mobility_type: "W", startdate: Time.zone.local(2021, 4, 1)) |
|
|
|
|
|
|
|
|
|
# Stub the form handler to use the real form |
|
|
|
|
allow(FormHandler.instance).to receive(:get_form).with("current_lettings").and_return(real_2022_2023_form) |
|
|
|
|
allow(FormHandler.instance).to receive(:get_form).with("previous_lettings").and_return(real_2021_2022_form) |
|
|
|
|
allow(FormHandler.instance).to receive(:get_form).with("next_lettings").and_return(real_2022_2023_form) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
context "when importing lettings logs" do |
|
|
|
|
let(:remote_folder) { "lettings_logs" } |
|
|
|
|
let(:lettings_log_id) { "00d2343e-d5fa-4c89-8400-ec3854b0f2b4" } |
|
|
|
|
let(:sales_log) { "shared_ownership_sales_log" } |
|
|
|
|
|
|
|
|
|
before do |
|
|
|
|
# Stub the S3 file listing and download |
|
|
|
|
allow(storage_service).to receive(:list_files) |
|
|
|
|
.and_return(%W[#{remote_folder}/#{lettings_log_id}.xml #{remote_folder}/#{sales_log}.xml]) |
|
|
|
|
allow(storage_service).to receive(:get_file_io) |
|
|
|
|
.with("#{remote_folder}/#{lettings_log_id}.xml") |
|
|
|
|
.and_return(open_file(fixture_directory, lettings_log_id), open_file(fixture_directory, lettings_log_id)) |
|
|
|
|
allow(storage_service).to receive(:get_file_io) |
|
|
|
|
.with("#{remote_folder}/#{sales_log}.xml") |
|
|
|
|
.and_return(open_file(fixture_directory, sales_log), open_file(fixture_directory, sales_log)) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
it "successfully create all lettings logs" do |
|
|
|
|
expect(logger).not_to receive(:error) |
|
|
|
|
expect(logger).not_to receive(:warn) |
|
|
|
|
expect(logger).not_to receive(:info) |
|
|
|
|
expect { lettings_log_service.create_logs(remote_folder) } |
|
|
|
|
.to change(LettingsLog, :count).by(1) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
it "only updates existing lettings logs" do |
|
|
|
|
expect(logger).not_to receive(:error) |
|
|
|
|
expect(logger).not_to receive(:warn) |
|
|
|
|
expect(logger).to receive(:info).with(/Updating lettings log/).exactly(1).times |
|
|
|
|
expect { 2.times { lettings_log_service.create_logs(remote_folder) } } |
|
|
|
|
.to change(LettingsLog, :count).by(1) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
it "creates organisation relationship once" do |
|
|
|
|
expect(logger).not_to receive(:error) |
|
|
|
|
expect(logger).not_to receive(:warn) |
|
|
|
|
expect { lettings_log_service.create_logs(remote_folder) } |
|
|
|
|
.to change(OrganisationRelationship, :count).by(1) |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
end |
|
|
|
|
|