Browse Source
* Refactor tests #1 * Update tasklist helper tests * Update task list helper * Fix test * Rabase fixes * Update model/validations tests * Update som sales log specs * Remove missing addresses csv tasks * Update some tests for 2023 collection close * More fixes * Revert sales shared examples change * Fix test * Update test nemes, remove time stubpull/2513/head v0.4.59
23 changed files with 26 additions and 2195 deletions
@ -1,22 +0,0 @@
|
||||
class CreateAddressesCsvJob < ApplicationJob |
||||
queue_as :default |
||||
|
||||
BYTE_ORDER_MARK = "\uFEFF".freeze # Required to ensure Excel always reads CSV as UTF-8 |
||||
|
||||
def perform(organisation, log_type) |
||||
csv_service = Csv::MissingAddressesCsvService.new(organisation, []) |
||||
case log_type |
||||
when "lettings" |
||||
csv_string = csv_service.create_lettings_addresses_csv |
||||
filename = "#{['lettings-logs-addresses', organisation.name, Time.zone.now].compact.join('-')}.csv" |
||||
when "sales" |
||||
csv_string = csv_service.create_sales_addresses_csv |
||||
filename = "#{['sales-logs-addresses', organisation.name, Time.zone.now].compact.join('-')}.csv" |
||||
end |
||||
|
||||
storage_service = Storage::S3Service.new(Configuration::EnvConfigurationService.new, ENV["BULK_UPLOAD_BUCKET"]) |
||||
storage_service.write_file(filename, BYTE_ORDER_MARK + csv_string) |
||||
|
||||
Rails.logger.info("Created addresses file: #{filename}") |
||||
end |
||||
end |
@ -1,33 +0,0 @@
|
||||
class EmailMissingAddressesCsvJob < ApplicationJob |
||||
queue_as :default |
||||
|
||||
BYTE_ORDER_MARK = "\uFEFF".freeze # Required to ensure Excel always reads CSV as UTF-8 |
||||
EXPIRATION_TIME = 1.week.to_i |
||||
MISSING_ADDRESSES_THRESHOLD = 50 |
||||
|
||||
def perform(user_ids, organisation, log_type, issue_types, skip_uprn_issue_organisations) |
||||
csv_service = Csv::MissingAddressesCsvService.new(organisation, skip_uprn_issue_organisations) |
||||
case log_type |
||||
when "lettings" |
||||
csv_string = csv_service.create_missing_lettings_addresses_csv |
||||
filename = "#{['missing-lettings-logs-addresses', organisation.name, Time.zone.now].compact.join('-')}.csv" |
||||
email_method = :send_missing_lettings_addresses_csv_download_mail |
||||
when "sales" |
||||
csv_string = csv_service.create_missing_sales_addresses_csv |
||||
filename = "#{['missing-sales-logs-addresses', organisation.name, Time.zone.now].compact.join('-')}.csv" |
||||
email_method = :send_missing_sales_addresses_csv_download_mail |
||||
end |
||||
|
||||
storage_service = Storage::S3Service.new(Configuration::EnvConfigurationService.new, ENV["BULK_UPLOAD_BUCKET"]) |
||||
storage_service.write_file(filename, BYTE_ORDER_MARK + csv_string) |
||||
|
||||
url = storage_service.get_presigned_url(filename, EXPIRATION_TIME) |
||||
|
||||
user_ids.each do |id| |
||||
user = User.find(id) |
||||
next if user.blank? |
||||
|
||||
CsvDownloadMailer.new.send(email_method, user, url, EXPIRATION_TIME, issue_types) |
||||
end |
||||
end |
||||
end |
@ -1,140 +0,0 @@
|
||||
module Csv |
||||
class MissingAddressesCsvService |
||||
def initialize(organisation, skip_uprn_issue_organisations) |
||||
@organisation = organisation |
||||
@skip_uprn_issue_organisations = skip_uprn_issue_organisations |
||||
end |
||||
|
||||
def create_missing_lettings_addresses_csv |
||||
logs_with_missing_addresses = @organisation.managed_lettings_logs |
||||
.imported_2023_with_old_form_id |
||||
.where(needstype: 1, address_line1: nil, town_or_city: nil, uprn_known: [0, nil]) |
||||
|
||||
logs_with_missing_town_or_city = @organisation.managed_lettings_logs |
||||
.imported_2023_with_old_form_id |
||||
.where(needstype: 1, town_or_city: nil, uprn_known: [0, nil]) |
||||
.where.not(address_line1: nil) |
||||
|
||||
logs_with_wrong_uprn = if @skip_uprn_issue_organisations.include?(@organisation.id) |
||||
[] |
||||
else |
||||
@organisation.managed_lettings_logs |
||||
.imported_2023 |
||||
.where(needstype: 1) |
||||
.where.not(uprn: nil) |
||||
.where("uprn = propcode OR uprn = tenancycode OR town_or_city = 'Bristol'") |
||||
end |
||||
|
||||
return if logs_with_missing_addresses.empty? && logs_with_missing_town_or_city.empty? && logs_with_wrong_uprn.empty? |
||||
|
||||
CSV.generate(headers: true) do |csv| |
||||
csv << ["Issue type", "Log ID", "Tenancy start date", "Tenant code", "Property reference", "Log owner", "Owning organisation", "Managing organisation", "UPRN", "Address Line 1", "Address Line 2 (optional)", "Town or City", "County (optional)", "Property's postcode"] |
||||
|
||||
logs_with_missing_addresses.each do |log| |
||||
csv << ["Full address required"] + lettings_log_to_csv_row(log) |
||||
end |
||||
|
||||
logs_with_missing_town_or_city.each do |log| |
||||
csv << ["Missing town or city"] + lettings_log_to_csv_row(log) |
||||
end |
||||
|
||||
logs_with_wrong_uprn.each do |log| |
||||
csv << ["Incorrect UPRN"] + lettings_log_to_csv_row(log) |
||||
end |
||||
end |
||||
end |
||||
|
||||
def create_missing_sales_addresses_csv |
||||
logs_with_missing_addresses = @organisation.sales_logs |
||||
.imported_2023_with_old_form_id |
||||
.where(address_line1: nil, town_or_city: nil, uprn_known: [0, nil]) |
||||
|
||||
logs_with_missing_town_or_city = @organisation.sales_logs |
||||
.imported_2023_with_old_form_id |
||||
.where(town_or_city: nil, uprn_known: [0, nil]) |
||||
.where.not(address_line1: nil) |
||||
|
||||
logs_with_wrong_uprn = if @skip_uprn_issue_organisations.include?(@organisation.id) |
||||
[] |
||||
else |
||||
@organisation.sales_logs |
||||
.imported_2023 |
||||
.where.not(uprn: nil) |
||||
.where("uprn = purchid OR town_or_city = 'Bristol'") |
||||
end |
||||
return if logs_with_missing_addresses.empty? && logs_with_missing_town_or_city.empty? && logs_with_wrong_uprn.empty? |
||||
|
||||
CSV.generate(headers: true) do |csv| |
||||
csv << ["Issue type", "Log ID", "Sale completion date", "Purchaser code", "Log owner", "Owning organisation", "UPRN", "Address Line 1", "Address Line 2 (optional)", "Town or City", "County (optional)", "Property's postcode"] |
||||
|
||||
logs_with_missing_addresses.each do |log| |
||||
csv << ["Full address required"] + sales_log_to_csv_row(log) |
||||
end |
||||
|
||||
logs_with_missing_town_or_city.each do |log| |
||||
csv << ["Missing town or city"] + sales_log_to_csv_row(log) |
||||
end |
||||
|
||||
logs_with_wrong_uprn.each do |log| |
||||
csv << ["Incorrect UPRN"] + sales_log_to_csv_row(log) |
||||
end |
||||
end |
||||
end |
||||
|
||||
def create_lettings_addresses_csv |
||||
logs = @organisation.managed_lettings_logs.filter_by_year(2023) |
||||
|
||||
CSV.generate(headers: true) do |csv| |
||||
csv << ["Log ID", "Tenancy start date", "Tenant code", "Property reference", "Log owner", "Owning organisation", "Managing organisation", "UPRN", "Address Line 1", "Address Line 2 (optional)", "Town or City", "County (optional)", "Property's postcode"] |
||||
|
||||
logs.each do |log| |
||||
csv << lettings_log_to_csv_row(log) |
||||
end |
||||
end |
||||
end |
||||
|
||||
def create_sales_addresses_csv |
||||
logs = @organisation.sales_logs.filter_by_year(2023) |
||||
|
||||
CSV.generate(headers: true) do |csv| |
||||
csv << ["Log ID", "Sale completion date", "Purchaser code", "Log owner", "Owning organisation", "UPRN", "Address Line 1", "Address Line 2 (optional)", "Town or City", "County (optional)", "Property's postcode"] |
||||
|
||||
logs.each do |log| |
||||
csv << sales_log_to_csv_row(log) |
||||
end |
||||
end |
||||
end |
||||
|
||||
private |
||||
|
||||
def sales_log_to_csv_row(log) |
||||
[log.id, |
||||
log.saledate&.to_date, |
||||
log.purchid, |
||||
log.assigned_to&.email, |
||||
log.owning_organisation&.name, |
||||
log.uprn, |
||||
log.address_line1, |
||||
log.address_line2, |
||||
log.town_or_city, |
||||
log.county, |
||||
log.postcode_full] |
||||
end |
||||
|
||||
def lettings_log_to_csv_row(log) |
||||
[log.id, |
||||
log.startdate&.to_date, |
||||
log.tenancycode, |
||||
log.propcode, |
||||
log.assigned_to&.email, |
||||
log.owning_organisation&.name, |
||||
log.managing_organisation&.name, |
||||
log.uprn, |
||||
log.address_line1, |
||||
log.address_line2, |
||||
log.town_or_city, |
||||
log.county, |
||||
log.postcode_full] |
||||
end |
||||
end |
||||
end |
@ -1,129 +0,0 @@
|
||||
namespace :data_import do |
||||
desc "Import lettings address data from a csv file" |
||||
task :import_lettings_addresses_from_csv, %i[file_name] => :environment do |_task, args| |
||||
file_name = args[:file_name] |
||||
|
||||
raise "Usage: rake data_import:import_lettings_addresses_from_csv['csv_file_name']" if file_name.blank? |
||||
|
||||
s3_service = Storage::S3Service.new(Configuration::EnvConfigurationService.new, ENV["BULK_UPLOAD_BUCKET"]) |
||||
file_io = s3_service.get_file_io(file_name) |
||||
file_io.set_encoding_by_bom |
||||
addresses_csv = CSV.parse(file_io, headers: true) |
||||
contains_issue_type = addresses_csv.headers.include?("Issue type") |
||||
|
||||
addresses_csv.each do |row| |
||||
lettings_log_id = contains_issue_type ? row[1] : row[0] |
||||
uprn = contains_issue_type ? row[8] : row[7] |
||||
address_line1 = contains_issue_type ? row[9] : row[8] |
||||
address_line2 = contains_issue_type ? row[10] : row[9] |
||||
town_or_city = contains_issue_type ? row[11] : row[10] |
||||
county = contains_issue_type ? row[12] : row[11] |
||||
postcode_full = contains_issue_type ? row[13] : row[12] |
||||
|
||||
if lettings_log_id.blank? |
||||
Rails.logger.info("Lettings log ID not provided for address: #{[address_line1, address_line2, town_or_city, county, postcode_full].join(', ')}") |
||||
next |
||||
end |
||||
|
||||
if uprn.present? |
||||
Rails.logger.info("Lettings log with ID #{lettings_log_id} contains uprn, skipping log") |
||||
next |
||||
end |
||||
|
||||
if address_line1.blank? || town_or_city.blank? || postcode_full.blank? |
||||
Rails.logger.info("Lettings log with ID #{lettings_log_id} is missing required address data, skipping log") |
||||
next |
||||
end |
||||
|
||||
lettings_log = LettingsLog.find_by(id: lettings_log_id) |
||||
if lettings_log.blank? |
||||
Rails.logger.info("Could not find a lettings log with id #{lettings_log_id}") |
||||
next |
||||
end |
||||
|
||||
lettings_log.uprn_known = 0 |
||||
lettings_log.uprn = nil |
||||
lettings_log.uprn_confirmed = nil |
||||
lettings_log.address_line1 = address_line1 |
||||
lettings_log.address_line2 = address_line2 |
||||
lettings_log.town_or_city = town_or_city |
||||
lettings_log.county = county |
||||
lettings_log.postcode_full = postcode_full |
||||
lettings_log.postcode_known = lettings_log.postcode_full.present? ? 1 : nil |
||||
lettings_log.is_la_inferred = nil |
||||
lettings_log.la = nil |
||||
lettings_log.send("process_postcode_changes!") |
||||
lettings_log.values_updated_at = Time.zone.now |
||||
|
||||
if lettings_log.save |
||||
Rails.logger.info("Updated lettings log #{lettings_log_id}, with address: #{[lettings_log.address_line1, lettings_log.address_line2, lettings_log.town_or_city, lettings_log.county, lettings_log.postcode_full].join(', ')}") |
||||
else |
||||
Rails.logger.error("Validation failed for lettings log with ID #{lettings_log.id}: #{lettings_log.errors.full_messages.join(', ')}}") |
||||
end |
||||
end |
||||
end |
||||
|
||||
desc "Import sales address data from a csv file" |
||||
task :import_sales_addresses_from_csv, %i[file_name] => :environment do |_task, args| |
||||
file_name = args[:file_name] |
||||
|
||||
raise "Usage: rake data_import:import_sales_addresses_from_csv['csv_file_name']" if file_name.blank? |
||||
|
||||
s3_service = Storage::S3Service.new(Configuration::EnvConfigurationService.new, ENV["BULK_UPLOAD_BUCKET"]) |
||||
file_io = s3_service.get_file_io(file_name) |
||||
file_io.set_encoding_by_bom |
||||
addresses_csv = CSV.parse(file_io, headers: true) |
||||
contains_issue_type = addresses_csv.headers.include?("Issue type") |
||||
|
||||
addresses_csv.each do |row| |
||||
sales_log_id = contains_issue_type ? row[1] : row[0] |
||||
uprn = contains_issue_type ? row[6] : row[5] |
||||
address_line1 = contains_issue_type ? row[7] : row[6] |
||||
address_line2 = contains_issue_type ? row[8] : row[7] |
||||
town_or_city = contains_issue_type ? row[9] : row[8] |
||||
county = contains_issue_type ? row[10] : row[9] |
||||
postcode_full = contains_issue_type ? row[11] : row[10] |
||||
|
||||
if sales_log_id.blank? |
||||
Rails.logger.info("Sales log ID not provided for address: #{[address_line1, address_line2, town_or_city, county, postcode_full].join(', ')}") |
||||
next |
||||
end |
||||
|
||||
if uprn.present? |
||||
Rails.logger.info("Sales log with ID #{sales_log_id} contains uprn, skipping log") |
||||
next |
||||
end |
||||
|
||||
if address_line1.blank? || town_or_city.blank? || postcode_full.blank? |
||||
Rails.logger.info("Sales log with ID #{sales_log_id} is missing required address data, skipping log") |
||||
next |
||||
end |
||||
|
||||
sales_log = SalesLog.find_by(id: sales_log_id) |
||||
if sales_log.blank? |
||||
Rails.logger.info("Could not find a sales log with id #{sales_log_id}") |
||||
next |
||||
end |
||||
|
||||
sales_log.uprn_known = 0 |
||||
sales_log.uprn = nil |
||||
sales_log.uprn_confirmed = nil |
||||
sales_log.address_line1 = address_line1 |
||||
sales_log.address_line2 = address_line2 |
||||
sales_log.town_or_city = town_or_city |
||||
sales_log.county = county |
||||
sales_log.postcode_full = postcode_full |
||||
sales_log.pcodenk = sales_log.postcode_full.present? ? 0 : nil |
||||
sales_log.is_la_inferred = nil |
||||
sales_log.la = nil |
||||
sales_log.send("process_postcode_changes!") |
||||
sales_log.values_updated_at = Time.zone.now |
||||
|
||||
if sales_log.save |
||||
Rails.logger.info("Updated sales log #{sales_log_id}, with address: #{[sales_log.address_line1, sales_log.address_line2, sales_log.town_or_city, sales_log.county, sales_log.postcode_full].join(', ')}") |
||||
else |
||||
Rails.logger.error("Validation failed for sales log with ID #{sales_log.id}: #{sales_log.errors.full_messages.join(', ')}}") |
||||
end |
||||
end |
||||
end |
||||
end |
@ -1,118 +0,0 @@
|
||||
namespace :correct_addresses do |
||||
desc "Send missing lettings addresses csv" |
||||
task :send_missing_addresses_lettings_csv, %i[skip_uprn_issue_organisations] => :environment do |_task, args| |
||||
skip_uprn_issue_organisations = args[:skip_uprn_issue_organisations]&.split(" ")&.map(&:to_i) || [] |
||||
|
||||
Organisation.all.each do |organisation| |
||||
logs_impacted_by_missing_address = organisation.managed_lettings_logs |
||||
.imported_2023_with_old_form_id |
||||
.where(needstype: 1, address_line1: nil, town_or_city: nil, uprn_known: [0, nil]).count |
||||
|
||||
logs_impacted_by_missing_town_or_city = organisation.managed_lettings_logs |
||||
.imported_2023_with_old_form_id |
||||
.where(needstype: 1, town_or_city: nil, uprn_known: [0, nil]) |
||||
.where.not(address_line1: nil).count |
||||
|
||||
logs_impacted_by_uprn_issue = if skip_uprn_issue_organisations.include?(organisation.id) |
||||
[] |
||||
else |
||||
organisation.managed_lettings_logs |
||||
.imported_2023 |
||||
.where(needstype: 1) |
||||
.where.not(uprn: nil) |
||||
.where("uprn = propcode OR uprn = tenancycode") |
||||
end |
||||
|
||||
logs_impacted_by_bristol_uprn_issue = if skip_uprn_issue_organisations.include?(organisation.id) |
||||
[] |
||||
else |
||||
organisation.managed_lettings_logs |
||||
.imported_2023 |
||||
.where(needstype: 1) |
||||
.where.not(uprn: nil) |
||||
.where("town_or_city = 'Bristol'") |
||||
end |
||||
|
||||
missing_addresses_threshold = EmailMissingAddressesCsvJob::MISSING_ADDRESSES_THRESHOLD |
||||
if logs_impacted_by_missing_address >= missing_addresses_threshold || logs_impacted_by_missing_town_or_city >= missing_addresses_threshold || logs_impacted_by_uprn_issue.any? || logs_impacted_by_bristol_uprn_issue.any? |
||||
issue_types = [] |
||||
issue_types << "missing_address" if logs_impacted_by_missing_address.positive? |
||||
issue_types << "missing_town" if logs_impacted_by_missing_town_or_city.positive? |
||||
issue_types << "wrong_uprn" if logs_impacted_by_uprn_issue.any? |
||||
issue_types << "bristol_uprn" if logs_impacted_by_bristol_uprn_issue.any? |
||||
data_coordinators = organisation.users.where(role: 2).filter_by_active |
||||
users_to_contact = data_coordinators.any? ? data_coordinators : organisation.users.filter_by_active |
||||
EmailMissingAddressesCsvJob.perform_later(users_to_contact.map(&:id), organisation, "lettings", issue_types, skip_uprn_issue_organisations) |
||||
Rails.logger.info("Sending missing lettings addresses CSV for #{organisation.name} to #{users_to_contact.map(&:email).join(', ')}") |
||||
else |
||||
Rails.logger.info("Missing addresses below threshold for #{organisation.name}") |
||||
end |
||||
end |
||||
end |
||||
|
||||
desc "Send missing sales addresses csv" |
||||
task :send_missing_addresses_sales_csv, %i[skip_uprn_issue_organisations] => :environment do |_task, args| |
||||
skip_uprn_issue_organisations = args[:skip_uprn_issue_organisations]&.split(" ")&.map(&:to_i) || [] |
||||
|
||||
Organisation.all.each do |organisation| |
||||
logs_impacted_by_missing_address = organisation.sales_logs |
||||
.imported_2023_with_old_form_id |
||||
.where(address_line1: nil, town_or_city: nil, uprn_known: [0, nil]).count |
||||
|
||||
logs_impacted_by_missing_town_or_city = organisation.sales_logs |
||||
.imported_2023_with_old_form_id |
||||
.where(town_or_city: nil, uprn_known: [0, nil]) |
||||
.where.not(address_line1: nil).count |
||||
|
||||
logs_impacted_by_uprn_issue = if skip_uprn_issue_organisations.include?(organisation.id) |
||||
[] |
||||
else |
||||
organisation.sales_logs |
||||
.imported_2023 |
||||
.where.not(uprn: nil) |
||||
.where("uprn = purchid OR town_or_city = 'Bristol'") |
||||
end |
||||
missing_addresses_threshold = EmailMissingAddressesCsvJob::MISSING_ADDRESSES_THRESHOLD |
||||
if logs_impacted_by_missing_address >= missing_addresses_threshold || logs_impacted_by_missing_town_or_city >= missing_addresses_threshold || logs_impacted_by_uprn_issue.any? |
||||
issue_types = [] |
||||
issue_types << "missing_address" if logs_impacted_by_missing_address.positive? |
||||
issue_types << "missing_town" if logs_impacted_by_missing_town_or_city.positive? |
||||
issue_types << "wrong_uprn" if logs_impacted_by_uprn_issue.any? |
||||
data_coordinators = organisation.users.where(role: 2).filter_by_active |
||||
users_to_contact = data_coordinators.any? ? data_coordinators : organisation.users.filter_by_active |
||||
EmailMissingAddressesCsvJob.perform_later(users_to_contact.map(&:id), organisation, "sales", issue_types, skip_uprn_issue_organisations) |
||||
Rails.logger.info("Sending missing sales addresses CSV for #{organisation.name} to #{users_to_contact.map(&:email).join(', ')}") |
||||
else |
||||
Rails.logger.info("Missing addresses below threshold for #{organisation.name}") |
||||
end |
||||
end |
||||
end |
||||
|
||||
desc "Send all 2023 lettings addresses csv" |
||||
task :create_lettings_addresses_csv, %i[organisation_id] => :environment do |_task, args| |
||||
organisation_id = args[:organisation_id] |
||||
raise "Usage: rake correct_addresses:create_lettings_addresses_csv['organisation_id']" if organisation_id.blank? |
||||
|
||||
organisation = Organisation.find_by(id: organisation_id) |
||||
if organisation.present? |
||||
CreateAddressesCsvJob.perform_later(organisation, "lettings") |
||||
Rails.logger.info("Creating lettings addresses CSV for #{organisation.name}") |
||||
else |
||||
Rails.logger.error("Organisation with ID #{organisation_id} not found") |
||||
end |
||||
end |
||||
|
||||
desc "Send all 2023 sales addresses csv" |
||||
task :create_sales_addresses_csv, %i[organisation_id] => :environment do |_task, args| |
||||
organisation_id = args[:organisation_id] |
||||
raise "Usage: rake correct_addresses:create_sales_addresses_csv['organisation_id']" if organisation_id.blank? |
||||
|
||||
organisation = Organisation.find_by(id: organisation_id) |
||||
if organisation.present? |
||||
CreateAddressesCsvJob.perform_later(organisation, "sales") |
||||
Rails.logger.info("Creating sales addresses CSV for #{organisation.name}") |
||||
else |
||||
Rails.logger.error("Organisation with ID #{organisation_id} not found") |
||||
end |
||||
end |
||||
end |
|
|
|
|
|
|
|
|
@ -1,49 +0,0 @@
|
||||
require "rails_helper" |
||||
|
||||
describe CreateAddressesCsvJob do |
||||
include Helpers |
||||
|
||||
let(:job) { described_class.new } |
||||
let(:storage_service) { instance_double(Storage::S3Service) } |
||||
let(:mailer) { instance_double(CsvDownloadMailer) } |
||||
let(:missing_addresses_csv_service) { instance_double(Csv::MissingAddressesCsvService) } |
||||
let(:organisation) { build(:organisation) } |
||||
let(:users) { create_list(:user, 2) } |
||||
|
||||
before do |
||||
allow(Storage::S3Service).to receive(:new).and_return(storage_service) |
||||
allow(storage_service).to receive(:write_file) |
||||
|
||||
allow(Csv::MissingAddressesCsvService).to receive(:new).and_return(missing_addresses_csv_service) |
||||
allow(missing_addresses_csv_service).to receive(:create_lettings_addresses_csv).and_return("") |
||||
allow(missing_addresses_csv_service).to receive(:create_sales_addresses_csv).and_return("") |
||||
end |
||||
|
||||
context "when sending all lettings logs csv" do |
||||
it "uses an appropriate filename in S3" do |
||||
expect(storage_service).to receive(:write_file).with(/lettings-logs-addresses-#{organisation.name}-.*\.csv/, anything) |
||||
expect(Rails.logger).to receive(:info).with(/Created addresses file: lettings-logs-addresses-#{organisation.name}-.*\.csv/) |
||||
job.perform(organisation, "lettings") |
||||
end |
||||
|
||||
it "creates a MissingAddressesCsvService with the correct organisation and calls create all lettings logs adresses csv" do |
||||
expect(Csv::MissingAddressesCsvService).to receive(:new).with(organisation, []) |
||||
expect(missing_addresses_csv_service).to receive(:create_lettings_addresses_csv) |
||||
job.perform(organisation, "lettings") |
||||
end |
||||
end |
||||
|
||||
context "when sending all sales logs csv" do |
||||
it "uses an appropriate filename in S3" do |
||||
expect(storage_service).to receive(:write_file).with(/sales-logs-addresses-#{organisation.name}-.*\.csv/, anything) |
||||
expect(Rails.logger).to receive(:info).with(/Created addresses file: sales-logs-addresses-#{organisation.name}-.*\.csv/) |
||||
job.perform(organisation, "sales") |
||||
end |
||||
|
||||
it "creates a MissingAddressesCsvService with the correct organisation and calls create all sales logs adresses csv" do |
||||
expect(Csv::MissingAddressesCsvService).to receive(:new).with(organisation, []) |
||||
expect(missing_addresses_csv_service).to receive(:create_sales_addresses_csv) |
||||
job.perform(organisation, "sales") |
||||
end |
||||
end |
||||
end |
@ -1,66 +0,0 @@
|
||||
require "rails_helper" |
||||
|
||||
describe EmailMissingAddressesCsvJob do |
||||
include Helpers |
||||
|
||||
test_url = :test_url |
||||
|
||||
let(:job) { described_class.new } |
||||
let(:storage_service) { instance_double(Storage::S3Service) } |
||||
let(:mailer) { instance_double(CsvDownloadMailer) } |
||||
let(:missing_addresses_csv_service) { instance_double(Csv::MissingAddressesCsvService) } |
||||
let(:organisation) { build(:organisation) } |
||||
let(:users) { create_list(:user, 2) } |
||||
|
||||
before do |
||||
allow(Storage::S3Service).to receive(:new).and_return(storage_service) |
||||
allow(storage_service).to receive(:write_file) |
||||
allow(storage_service).to receive(:get_presigned_url).and_return(test_url) |
||||
|
||||
allow(Csv::MissingAddressesCsvService).to receive(:new).and_return(missing_addresses_csv_service) |
||||
allow(missing_addresses_csv_service).to receive(:create_missing_lettings_addresses_csv).and_return("") |
||||
allow(missing_addresses_csv_service).to receive(:create_missing_sales_addresses_csv).and_return("") |
||||
|
||||
allow(CsvDownloadMailer).to receive(:new).and_return(mailer) |
||||
allow(mailer).to receive(:send_missing_lettings_addresses_csv_download_mail) |
||||
allow(mailer).to receive(:send_missing_sales_addresses_csv_download_mail) |
||||
end |
||||
|
||||
context "when sending missing lettings logs csv" do |
||||
it "uses an appropriate filename in S3" do |
||||
expect(storage_service).to receive(:write_file).with(/missing-lettings-logs-addresses-#{organisation.name}-.*\.csv/, anything) |
||||
job.perform(users.map(&:id), organisation, "lettings", %w[missing_address wrong_uprn], [1, 2]) |
||||
end |
||||
|
||||
it "creates a MissingAddressesCsvService with the correct organisation and calls create missing lettings logs adresses csv" do |
||||
expect(Csv::MissingAddressesCsvService).to receive(:new).with(organisation, [1, 2]) |
||||
expect(missing_addresses_csv_service).to receive(:create_missing_lettings_addresses_csv) |
||||
job.perform(users.map(&:id), organisation, "lettings", %w[missing_address wrong_uprn], [1, 2]) |
||||
end |
||||
|
||||
it "sends emails to all the provided users" do |
||||
expect(mailer).to receive(:send_missing_lettings_addresses_csv_download_mail).with(users[0], test_url, instance_of(Integer), %w[missing_address wrong_uprn]) |
||||
expect(mailer).to receive(:send_missing_lettings_addresses_csv_download_mail).with(users[1], test_url, instance_of(Integer), %w[missing_address wrong_uprn]) |
||||
job.perform(users.map(&:id), organisation, "lettings", %w[missing_address wrong_uprn], [1, 2]) |
||||
end |
||||
end |
||||
|
||||
context "when sending missing sales logs csv" do |
||||
it "uses an appropriate filename in S3" do |
||||
expect(storage_service).to receive(:write_file).with(/missing-sales-logs-addresses-#{organisation.name}-.*\.csv/, anything) |
||||
job.perform(users.map(&:id), organisation, "sales", %w[missing_town], [2, 3]) |
||||
end |
||||
|
||||
it "creates a MissingAddressesCsvService with the correct organisation and calls create missing sales logs adresses csv" do |
||||
expect(Csv::MissingAddressesCsvService).to receive(:new).with(organisation, [2, 3]) |
||||
expect(missing_addresses_csv_service).to receive(:create_missing_sales_addresses_csv) |
||||
job.perform(users.map(&:id), organisation, "sales", %w[missing_town], [2, 3]) |
||||
end |
||||
|
||||
it "sends emails to all the provided users" do |
||||
expect(mailer).to receive(:send_missing_sales_addresses_csv_download_mail).with(users[0], test_url, instance_of(Integer), %w[missing_town]) |
||||
expect(mailer).to receive(:send_missing_sales_addresses_csv_download_mail).with(users[1], test_url, instance_of(Integer), %w[missing_town]) |
||||
job.perform(users.map(&:id), organisation, "sales", %w[missing_town], [2, 3]) |
||||
end |
||||
end |
||||
end |
@ -1,522 +0,0 @@
|
||||
require "rails_helper" |
||||
require "rake" |
||||
|
||||
RSpec.describe "data_import" do |
||||
def replace_entity_ids(log, second_log, third_log, fourth_log, export_template) |
||||
export_template.sub!(/\{id\}/, log.id.to_s) |
||||
export_template.sub!(/\{id2\}/, second_log.id.to_s) |
||||
export_template.sub!(/\{id3\}/, third_log.id.to_s) |
||||
export_template.sub!(/\{id4\}/, fourth_log.id.to_s) |
||||
end |
||||
|
||||
before do |
||||
Timecop.freeze(Time.zone.local(2024, 3, 1)) |
||||
Singleton.__init__(FormHandler) |
||||
allow(Storage::S3Service).to receive(:new).and_return(storage_service) |
||||
allow(Configuration::EnvConfigurationService).to receive(:new).and_return(env_config_service) |
||||
allow(ENV).to receive(:[]) |
||||
allow(ENV).to receive(:[]).with("BULK_UPLOAD_BUCKET").and_return(instance_name) |
||||
allow(ENV).to receive(:[]).with("VCAP_SERVICES").and_return("dummy") |
||||
|
||||
WebMock.stub_request(:get, /api\.postcodes\.io/) |
||||
.to_return(status: 200, body: "{\"status\":404,\"error\":\"Postcode not found\"}", headers: {}) |
||||
WebMock.stub_request(:get, /api\.postcodes\.io\/postcodes\/B11BB/) |
||||
.to_return(status: 200, body: '{"status":200,"result":{"admin_district":"Westminster","codes":{"admin_district":"E08000035"}}}', headers: {}) |
||||
end |
||||
|
||||
after do |
||||
Timecop.return |
||||
Singleton.__init__(FormHandler) |
||||
end |
||||
|
||||
describe ":import_lettings_addresses_from_csv", type: :task do |
||||
subject(:task) { Rake::Task["data_import:import_lettings_addresses_from_csv"] } |
||||
|
||||
let(:instance_name) { "import_instance" } |
||||
let(:storage_service) { instance_double(Storage::S3Service) } |
||||
let(:env_config_service) { instance_double(Configuration::EnvConfigurationService) } |
||||
|
||||
before do |
||||
Rake.application.rake_require("tasks/import_address_from_csv") |
||||
Rake::Task.define_task(:environment) |
||||
task.reenable |
||||
end |
||||
|
||||
context "when the rake task is run" do |
||||
let(:addresses_csv_path) { "addresses_reimport_123.csv" } |
||||
let(:all_addresses_csv_path) { "all_addresses_reimport_123.csv" } |
||||
let(:wrong_file_path) { "/test/no_csv_here.csv" } |
||||
let!(:lettings_log) do |
||||
create(:lettings_log, |
||||
uprn_known: nil, |
||||
uprn: nil, |
||||
uprn_confirmed: nil, |
||||
address_line1: nil, |
||||
address_line2: nil, |
||||
town_or_city: nil, |
||||
county: nil, |
||||
postcode_known: 1, |
||||
postcode_full: "A1 1AA", |
||||
la: "E06000064", |
||||
is_la_inferred: true) |
||||
end |
||||
|
||||
let!(:lettings_logs) do |
||||
logs = build_list(:lettings_log, |
||||
3, |
||||
:setup_completed, |
||||
uprn_known: 1, |
||||
uprn: "121", |
||||
uprn_confirmed: nil, |
||||
address_line1: "wrong address line1", |
||||
address_line2: "wrong address 2", |
||||
town_or_city: "wrong town", |
||||
county: "wrong city", |
||||
postcode_known: 1, |
||||
postcode_full: "A1 1AA", |
||||
la: "E06000064", |
||||
is_la_inferred: true) |
||||
logs.each { |log| log.save!(validate: false) } |
||||
logs |
||||
end |
||||
|
||||
before do |
||||
allow(storage_service).to receive(:get_file_io) |
||||
.with("addresses_reimport_123.csv") |
||||
.and_return(StringIO.new(replace_entity_ids(lettings_log, lettings_logs[0], lettings_logs[1], lettings_logs[2], File.open("./spec/fixtures/files/addresses_reimport.csv").read))) |
||||
|
||||
allow(storage_service).to receive(:get_file_io) |
||||
.with("all_addresses_reimport_123.csv") |
||||
.and_return(StringIO.new(replace_entity_ids(lettings_log, lettings_logs[0], lettings_logs[1], lettings_logs[2], File.open("./spec/fixtures/files/addresses_reimport_all_logs.csv").read))) |
||||
end |
||||
|
||||
context "when the file contains issue type column" do |
||||
it "updates the log address when old address was not given" do |
||||
task.invoke(addresses_csv_path) |
||||
lettings_log.reload |
||||
expect(lettings_log.uprn_known).to eq(0) |
||||
expect(lettings_log.uprn).to eq(nil) |
||||
expect(lettings_log.uprn_confirmed).to eq(nil) |
||||
expect(lettings_log.address_line1).to eq("address 1") |
||||
expect(lettings_log.address_line2).to eq("address 2") |
||||
expect(lettings_log.town_or_city).to eq("town") |
||||
expect(lettings_log.county).to eq("county") |
||||
expect(lettings_log.postcode_known).to eq(1) |
||||
expect(lettings_log.postcode_full).to eq("B1 1BB") |
||||
expect(lettings_log.la).to eq("E08000035") |
||||
expect(lettings_log.is_la_inferred).to eq(true) |
||||
end |
||||
|
||||
it "updates the log address when old address was given" do |
||||
task.invoke(addresses_csv_path) |
||||
lettings_logs[0].reload |
||||
expect(lettings_logs[0].uprn_known).to eq(0) |
||||
expect(lettings_logs[0].uprn).to eq(nil) |
||||
expect(lettings_logs[0].uprn_confirmed).to eq(nil) |
||||
expect(lettings_logs[0].address_line1).to eq("address 3") |
||||
expect(lettings_logs[0].address_line2).to eq(nil) |
||||
expect(lettings_logs[0].town_or_city).to eq("city") |
||||
expect(lettings_logs[0].county).to eq(nil) |
||||
expect(lettings_logs[0].postcode_known).to eq(1) |
||||
expect(lettings_logs[0].postcode_full).to eq("B1 1BB") |
||||
expect(lettings_logs[0].la).to eq("E08000035") |
||||
expect(lettings_logs[0].is_la_inferred).to eq(true) |
||||
end |
||||
|
||||
it "does not update log address when uprn is given" do |
||||
task.invoke(addresses_csv_path) |
||||
lettings_logs[1].reload |
||||
expect(lettings_logs[1].uprn_known).to eq(1) |
||||
expect(lettings_logs[1].uprn).to eq("121") |
||||
expect(lettings_logs[1].uprn_confirmed).to eq(nil) |
||||
expect(lettings_logs[1].address_line1).to eq("wrong address line1") |
||||
expect(lettings_logs[1].address_line2).to eq("wrong address 2") |
||||
expect(lettings_logs[1].town_or_city).to eq("wrong town") |
||||
expect(lettings_logs[1].county).to eq("wrong city") |
||||
expect(lettings_logs[1].postcode_known).to eq(1) |
||||
expect(lettings_logs[1].postcode_full).to eq("A1 1AA") |
||||
expect(lettings_logs[1].la).to eq("E06000064") |
||||
end |
||||
|
||||
it "does not update log address when all required address fields are not present" do |
||||
task.invoke(addresses_csv_path) |
||||
lettings_logs[2].reload |
||||
expect(lettings_logs[2].uprn_known).to eq(1) |
||||
expect(lettings_logs[2].uprn).to eq("121") |
||||
expect(lettings_logs[2].uprn_confirmed).to eq(nil) |
||||
expect(lettings_logs[2].address_line1).to eq("wrong address line1") |
||||
expect(lettings_logs[2].address_line2).to eq("wrong address 2") |
||||
expect(lettings_logs[2].town_or_city).to eq("wrong town") |
||||
expect(lettings_logs[2].county).to eq("wrong city") |
||||
expect(lettings_logs[2].postcode_known).to eq(1) |
||||
expect(lettings_logs[2].postcode_full).to eq("A1 1AA") |
||||
expect(lettings_logs[2].la).to eq("E06000064") |
||||
end |
||||
|
||||
it "reinfers the LA if the postcode doesn't change" do |
||||
lettings_log.update!(postcode_full: "B1 1BB") |
||||
task.invoke(addresses_csv_path) |
||||
lettings_log.reload |
||||
expect(lettings_log.postcode_full).to eq("B1 1BB") |
||||
expect(lettings_log.la).to eq("E08000035") |
||||
expect(lettings_log.is_la_inferred).to eq(true) |
||||
end |
||||
|
||||
it "logs the progress of the update" do |
||||
expect(Rails.logger).to receive(:info).with("Updated lettings log #{lettings_log.id}, with address: address 1, address 2, town, county, B1 1BB") |
||||
expect(Rails.logger).to receive(:info).with("Updated lettings log #{lettings_logs[0].id}, with address: address 3, , city, , B1 1BB") |
||||
expect(Rails.logger).to receive(:info).with("Lettings log with ID #{lettings_logs[1].id} contains uprn, skipping log") |
||||
expect(Rails.logger).to receive(:info).with("Lettings log with ID #{lettings_logs[2].id} is missing required address data, skipping log") |
||||
expect(Rails.logger).to receive(:info).with("Lettings log ID not provided for address: Some Place, , Bristol, , BS1 1AD") |
||||
expect(Rails.logger).to receive(:info).with("Could not find a lettings log with id fake_id") |
||||
|
||||
task.invoke(addresses_csv_path) |
||||
end |
||||
|
||||
it "raises an error when no path is given" do |
||||
expect { task.invoke(nil) }.to raise_error(RuntimeError, "Usage: rake data_import:import_lettings_addresses_from_csv['csv_file_name']") |
||||
end |
||||
|
||||
it "logs an error if a validation fails" do |
||||
lettings_log.ppcodenk = 0 |
||||
lettings_log.ppostcode_full = "invalid_format" |
||||
lettings_log.save!(validate: false) |
||||
expect(Rails.logger).to receive(:error).with(/Validation failed for lettings log with ID #{lettings_log.id}: Ppostcode full/) |
||||
task.invoke(addresses_csv_path) |
||||
end |
||||
end |
||||
|
||||
context "when the file does not contain issue type column" do |
||||
it "updates the log address when old address was not given" do |
||||
task.invoke(all_addresses_csv_path) |
||||
lettings_log.reload |
||||
expect(lettings_log.uprn_known).to eq(0) |
||||
expect(lettings_log.uprn).to eq(nil) |
||||
expect(lettings_log.uprn_confirmed).to eq(nil) |
||||
expect(lettings_log.address_line1).to eq("address 1") |
||||
expect(lettings_log.address_line2).to eq("address 2") |
||||
expect(lettings_log.town_or_city).to eq("town") |
||||
expect(lettings_log.county).to eq("county") |
||||
expect(lettings_log.postcode_known).to eq(1) |
||||
expect(lettings_log.postcode_full).to eq("B1 1BB") |
||||
expect(lettings_log.la).to eq("E08000035") |
||||
expect(lettings_log.is_la_inferred).to eq(true) |
||||
end |
||||
|
||||
it "updates the log address when old address was given" do |
||||
task.invoke(all_addresses_csv_path) |
||||
lettings_logs[0].reload |
||||
expect(lettings_logs[0].uprn_known).to eq(0) |
||||
expect(lettings_logs[0].uprn).to eq(nil) |
||||
expect(lettings_logs[0].uprn_confirmed).to eq(nil) |
||||
expect(lettings_logs[0].address_line1).to eq("address 3") |
||||
expect(lettings_logs[0].address_line2).to eq(nil) |
||||
expect(lettings_logs[0].town_or_city).to eq("city") |
||||
expect(lettings_logs[0].county).to eq(nil) |
||||
expect(lettings_logs[0].postcode_known).to eq(1) |
||||
expect(lettings_logs[0].postcode_full).to eq("B1 1BB") |
||||
expect(lettings_logs[0].la).to eq("E08000035") |
||||
expect(lettings_logs[0].is_la_inferred).to eq(true) |
||||
end |
||||
|
||||
it "does not update log address when uprn is given" do |
||||
task.invoke(all_addresses_csv_path) |
||||
lettings_logs[1].reload |
||||
expect(lettings_logs[1].uprn_known).to eq(1) |
||||
expect(lettings_logs[1].uprn).to eq("121") |
||||
expect(lettings_logs[1].uprn_confirmed).to eq(nil) |
||||
expect(lettings_logs[1].address_line1).to eq("wrong address line1") |
||||
expect(lettings_logs[1].address_line2).to eq("wrong address 2") |
||||
expect(lettings_logs[1].town_or_city).to eq("wrong town") |
||||
expect(lettings_logs[1].county).to eq("wrong city") |
||||
expect(lettings_logs[1].postcode_known).to eq(1) |
||||
expect(lettings_logs[1].postcode_full).to eq("A1 1AA") |
||||
expect(lettings_logs[1].la).to eq("E06000064") |
||||
end |
||||
|
||||
it "does not update log address when all required address fields are not present" do |
||||
task.invoke(all_addresses_csv_path) |
||||
lettings_logs[2].reload |
||||
expect(lettings_logs[2].uprn_known).to eq(1) |
||||
expect(lettings_logs[2].uprn).to eq("121") |
||||
expect(lettings_logs[2].uprn_confirmed).to eq(nil) |
||||
expect(lettings_logs[2].address_line1).to eq("wrong address line1") |
||||
expect(lettings_logs[2].address_line2).to eq("wrong address 2") |
||||
expect(lettings_logs[2].town_or_city).to eq("wrong town") |
||||
expect(lettings_logs[2].county).to eq("wrong city") |
||||
expect(lettings_logs[2].postcode_known).to eq(1) |
||||
expect(lettings_logs[2].postcode_full).to eq("A1 1AA") |
||||
expect(lettings_logs[2].la).to eq("E06000064") |
||||
end |
||||
|
||||
it "reinfers the LA if the postcode hasn't changed" do |
||||
lettings_log.update!(postcode_full: "B1 1BB") |
||||
task.invoke(all_addresses_csv_path) |
||||
lettings_log.reload |
||||
expect(lettings_log.postcode_full).to eq("B1 1BB") |
||||
expect(lettings_log.la).to eq("E08000035") |
||||
expect(lettings_log.is_la_inferred).to eq(true) |
||||
end |
||||
|
||||
it "logs the progress of the update" do |
||||
expect(Rails.logger).to receive(:info).with("Updated lettings log #{lettings_log.id}, with address: address 1, address 2, town, county, B1 1BB") |
||||
expect(Rails.logger).to receive(:info).with("Updated lettings log #{lettings_logs[0].id}, with address: address 3, , city, , B1 1BB") |
||||
expect(Rails.logger).to receive(:info).with("Lettings log with ID #{lettings_logs[1].id} contains uprn, skipping log") |
||||
expect(Rails.logger).to receive(:info).with("Lettings log with ID #{lettings_logs[2].id} is missing required address data, skipping log") |
||||
expect(Rails.logger).to receive(:info).with("Lettings log ID not provided for address: Some Place, , Bristol, , BS1 1AD") |
||||
expect(Rails.logger).to receive(:info).with("Could not find a lettings log with id fake_id") |
||||
|
||||
task.invoke(all_addresses_csv_path) |
||||
end |
||||
|
||||
it "raises an error when no path is given" do |
||||
expect { task.invoke(nil) }.to raise_error(RuntimeError, "Usage: rake data_import:import_lettings_addresses_from_csv['csv_file_name']") |
||||
end |
||||
|
||||
it "logs an error if a validation fails" do |
||||
lettings_log.ppcodenk = 0 |
||||
lettings_log.ppostcode_full = "invalid_format" |
||||
lettings_log.save!(validate: false) |
||||
expect(Rails.logger).to receive(:error).with(/Validation failed for lettings log with ID #{lettings_log.id}: Ppostcode full/) |
||||
task.invoke(addresses_csv_path) |
||||
end |
||||
end |
||||
end |
||||
end |
||||
|
||||
describe ":import_sales_addresses_from_csv", type: :task do |
||||
subject(:task) { Rake::Task["data_import:import_sales_addresses_from_csv"] } |
||||
|
||||
let(:instance_name) { "import_instance" } |
||||
let(:storage_service) { instance_double(Storage::S3Service) } |
||||
let(:env_config_service) { instance_double(Configuration::EnvConfigurationService) } |
||||
|
||||
before do |
||||
Rake.application.rake_require("tasks/import_address_from_csv") |
||||
Rake::Task.define_task(:environment) |
||||
task.reenable |
||||
end |
||||
|
||||
context "when the rake task is run" do |
||||
let(:addresses_csv_path) { "addresses_reimport_123.csv" } |
||||
let(:all_addresses_csv_path) { "all_addresses_reimport_123.csv" } |
||||
let(:wrong_file_path) { "/test/no_csv_here.csv" } |
||||
let!(:sales_log) do |
||||
create(:sales_log, |
||||
:completed, |
||||
uprn_known: nil, |
||||
uprn: nil, |
||||
uprn_confirmed: nil, |
||||
address_line1: nil, |
||||
address_line2: nil, |
||||
town_or_city: nil, |
||||
la: "E06000064", |
||||
is_la_inferred: true) |
||||
end |
||||
|
||||
let!(:sales_logs) { create_list(:sales_log, 3, :completed, uprn_known: 1, uprn: "121", la: "E06000064", is_la_inferred: true) } |
||||
|
||||
before do |
||||
allow(storage_service).to receive(:get_file_io) |
||||
.with("addresses_reimport_123.csv") |
||||
.and_return(StringIO.new(replace_entity_ids(sales_log, sales_logs[0], sales_logs[1], sales_logs[2], File.open("./spec/fixtures/files/sales_addresses_reimport.csv").read))) |
||||
|
||||
allow(storage_service).to receive(:get_file_io) |
||||
.with("all_addresses_reimport_123.csv") |
||||
.and_return(StringIO.new(replace_entity_ids(sales_log, sales_logs[0], sales_logs[1], sales_logs[2], File.open("./spec/fixtures/files/sales_addresses_reimport_all_logs.csv").read))) |
||||
end |
||||
|
||||
context "when the file contains issue type column" do |
||||
it "updates the log address when old address was not given" do |
||||
task.invoke(addresses_csv_path) |
||||
sales_log.reload |
||||
expect(sales_log.uprn_known).to eq(0) |
||||
expect(sales_log.uprn).to eq(nil) |
||||
expect(sales_log.uprn_confirmed).to eq(nil) |
||||
expect(sales_log.address_line1).to eq("address 1") |
||||
expect(sales_log.address_line2).to eq("address 2") |
||||
expect(sales_log.town_or_city).to eq("town") |
||||
expect(sales_log.county).to eq("county") |
||||
expect(sales_log.pcodenk).to eq(0) |
||||
expect(sales_log.postcode_full).to eq("B1 1BB") |
||||
expect(sales_log.la).to eq("E08000035") |
||||
expect(sales_log.is_la_inferred).to eq(true) |
||||
end |
||||
|
||||
it "updates the log address when old address was given" do |
||||
task.invoke(addresses_csv_path) |
||||
sales_logs[0].reload |
||||
expect(sales_logs[0].uprn_known).to eq(0) |
||||
expect(sales_logs[0].uprn).to eq(nil) |
||||
expect(sales_logs[0].uprn_confirmed).to eq(nil) |
||||
expect(sales_logs[0].address_line1).to eq("address 3") |
||||
expect(sales_logs[0].address_line2).to eq(nil) |
||||
expect(sales_logs[0].town_or_city).to eq("city") |
||||
expect(sales_logs[0].county).to eq(nil) |
||||
expect(sales_logs[0].pcodenk).to eq(0) |
||||
expect(sales_logs[0].postcode_full).to eq("B1 1BB") |
||||
expect(sales_logs[0].la).to eq("E08000035") |
||||
expect(sales_logs[0].is_la_inferred).to eq(true) |
||||
end |
||||
|
||||
it "does not update log address when uprn is given" do |
||||
task.invoke(addresses_csv_path) |
||||
sales_logs[1].reload |
||||
expect(sales_logs[1].uprn_known).to eq(1) |
||||
expect(sales_logs[1].uprn).to eq("121") |
||||
expect(sales_logs[1].uprn_confirmed).to eq(nil) |
||||
expect(sales_logs[1].address_line1).to eq("Wrong Address Line1") |
||||
expect(sales_logs[1].address_line2).to eq("Double Dependent Locality") |
||||
expect(sales_logs[1].town_or_city).to eq("Westminster") |
||||
expect(sales_logs[1].county).to eq(nil) |
||||
expect(sales_logs[1].pcodenk).to eq(0) |
||||
expect(sales_logs[1].postcode_full).to eq("LS16 6FT") |
||||
expect(sales_logs[1].la).to eq("E06000064") |
||||
end |
||||
|
||||
it "does not update log address when all required address fields are not present" do |
||||
task.invoke(addresses_csv_path) |
||||
sales_logs[2].reload |
||||
expect(sales_logs[2].uprn_known).to eq(1) |
||||
expect(sales_logs[2].uprn).to eq("121") |
||||
expect(sales_logs[2].uprn_confirmed).to eq(nil) |
||||
expect(sales_logs[2].address_line1).to eq("Wrong Address Line1") |
||||
expect(sales_logs[2].address_line2).to eq("Double Dependent Locality") |
||||
expect(sales_logs[2].town_or_city).to eq("Westminster") |
||||
expect(sales_logs[2].county).to eq(nil) |
||||
expect(sales_logs[2].pcodenk).to eq(0) |
||||
expect(sales_logs[2].postcode_full).to eq("LS16 6FT") |
||||
expect(sales_logs[2].la).to eq("E06000064") |
||||
end |
||||
|
||||
it "reinfers the LA if the postcode hasn't changed" do |
||||
sales_log.update!(postcode_full: "B1 1BB") |
||||
task.invoke(addresses_csv_path) |
||||
sales_log.reload |
||||
expect(sales_log.postcode_full).to eq("B1 1BB") |
||||
expect(sales_log.la).to eq("E08000035") |
||||
expect(sales_log.is_la_inferred).to eq(true) |
||||
end |
||||
|
||||
it "logs the progress of the update" do |
||||
expect(Rails.logger).to receive(:info).with("Updated sales log #{sales_log.id}, with address: address 1, address 2, town, county, B1 1BB") |
||||
expect(Rails.logger).to receive(:info).with("Updated sales log #{sales_logs[0].id}, with address: address 3, , city, , B1 1BB") |
||||
expect(Rails.logger).to receive(:info).with("Sales log with ID #{sales_logs[1].id} contains uprn, skipping log") |
||||
expect(Rails.logger).to receive(:info).with("Sales log with ID #{sales_logs[2].id} is missing required address data, skipping log") |
||||
expect(Rails.logger).to receive(:info).with("Sales log ID not provided for address: Some Place, , Bristol, , BS1 1AD") |
||||
expect(Rails.logger).to receive(:info).with("Could not find a sales log with id fake_id") |
||||
|
||||
task.invoke(addresses_csv_path) |
||||
end |
||||
|
||||
it "raises an error when no path is given" do |
||||
expect { task.invoke(nil) }.to raise_error(RuntimeError, "Usage: rake data_import:import_sales_addresses_from_csv['csv_file_name']") |
||||
end |
||||
|
||||
it "logs an error if a validation fails" do |
||||
sales_log.ppcodenk = 0 |
||||
sales_log.ppostcode_full = "invalid_format" |
||||
sales_log.save!(validate: false) |
||||
expect(Rails.logger).to receive(:error).with(/Validation failed for sales log with ID #{sales_log.id}: Ppostcode full/) |
||||
task.invoke(addresses_csv_path) |
||||
end |
||||
end |
||||
|
||||
context "when the file does not contain issue type column" do |
||||
it "updates the log address when old address was not given" do |
||||
task.invoke(all_addresses_csv_path) |
||||
sales_log.reload |
||||
expect(sales_log.uprn_known).to eq(0) |
||||
expect(sales_log.uprn).to eq(nil) |
||||
expect(sales_log.uprn_confirmed).to eq(nil) |
||||
expect(sales_log.address_line1).to eq("address 1") |
||||
expect(sales_log.address_line2).to eq("address 2") |
||||
expect(sales_log.town_or_city).to eq("town") |
||||
expect(sales_log.county).to eq("county") |
||||
expect(sales_log.pcodenk).to eq(0) |
||||
expect(sales_log.postcode_full).to eq("B1 1BB") |
||||
expect(sales_log.la).to eq("E08000035") |
||||
expect(sales_log.is_la_inferred).to eq(true) |
||||
end |
||||
|
||||
it "updates the log address when old address was given" do |
||||
task.invoke(all_addresses_csv_path) |
||||
sales_logs[0].reload |
||||
expect(sales_logs[0].uprn_known).to eq(0) |
||||
expect(sales_logs[0].uprn).to eq(nil) |
||||
expect(sales_logs[0].uprn_confirmed).to eq(nil) |
||||
expect(sales_logs[0].address_line1).to eq("address 3") |
||||
expect(sales_logs[0].address_line2).to eq(nil) |
||||
expect(sales_logs[0].town_or_city).to eq("city") |
||||
expect(sales_logs[0].county).to eq(nil) |
||||
expect(sales_logs[0].pcodenk).to eq(0) |
||||
expect(sales_logs[0].postcode_full).to eq("B1 1BB") |
||||
expect(sales_logs[0].la).to eq("E08000035") |
||||
expect(sales_logs[0].is_la_inferred).to eq(true) |
||||
end |
||||
|
||||
it "does not update log address when uprn is given" do |
||||
task.invoke(all_addresses_csv_path) |
||||
sales_logs[1].reload |
||||
expect(sales_logs[1].uprn_known).to eq(1) |
||||
expect(sales_logs[1].uprn).to eq("121") |
||||
expect(sales_logs[1].uprn_confirmed).to eq(nil) |
||||
expect(sales_logs[1].address_line1).to eq("Wrong Address Line1") |
||||
expect(sales_logs[1].address_line2).to eq("Double Dependent Locality") |
||||
expect(sales_logs[1].town_or_city).to eq("Westminster") |
||||
expect(sales_logs[1].county).to eq(nil) |
||||
expect(sales_logs[1].pcodenk).to eq(0) |
||||
expect(sales_logs[1].postcode_full).to eq("LS16 6FT") |
||||
expect(sales_logs[1].la).to eq("E06000064") |
||||
end |
||||
|
||||
it "does not update log address when all required address fields are not present" do |
||||
task.invoke(all_addresses_csv_path) |
||||
sales_logs[2].reload |
||||
expect(sales_logs[2].uprn_known).to eq(1) |
||||
expect(sales_logs[2].uprn).to eq("121") |
||||
expect(sales_logs[2].uprn_confirmed).to eq(nil) |
||||
expect(sales_logs[2].address_line1).to eq("Wrong Address Line1") |
||||
expect(sales_logs[2].address_line2).to eq("Double Dependent Locality") |
||||
expect(sales_logs[2].town_or_city).to eq("Westminster") |
||||
expect(sales_logs[2].county).to eq(nil) |
||||
expect(sales_logs[2].pcodenk).to eq(0) |
||||
expect(sales_logs[2].postcode_full).to eq("LS16 6FT") |
||||
expect(sales_logs[2].la).to eq("E06000064") |
||||
end |
||||
|
||||
it "reinfers the LA if the postcode hasn't changed" do |
||||
sales_log.update!(postcode_full: "B1 1BB") |
||||
task.invoke(all_addresses_csv_path) |
||||
sales_log.reload |
||||
expect(sales_log.postcode_full).to eq("B1 1BB") |
||||
expect(sales_log.la).to eq("E08000035") |
||||
expect(sales_log.is_la_inferred).to eq(true) |
||||
end |
||||
|
||||
it "logs the progress of the update" do |
||||
expect(Rails.logger).to receive(:info).with("Updated sales log #{sales_log.id}, with address: address 1, address 2, town, county, B1 1BB") |
||||
expect(Rails.logger).to receive(:info).with("Updated sales log #{sales_logs[0].id}, with address: address 3, , city, , B1 1BB") |
||||
expect(Rails.logger).to receive(:info).with("Sales log with ID #{sales_logs[1].id} contains uprn, skipping log") |
||||
expect(Rails.logger).to receive(:info).with("Sales log with ID #{sales_logs[2].id} is missing required address data, skipping log") |
||||
expect(Rails.logger).to receive(:info).with("Sales log ID not provided for address: Some Place, , Bristol, , BS1 1AD") |
||||
expect(Rails.logger).to receive(:info).with("Could not find a sales log with id fake_id") |
||||
|
||||
task.invoke(all_addresses_csv_path) |
||||
end |
||||
|
||||
it "raises an error when no path is given" do |
||||
expect { task.invoke(nil) }.to raise_error(RuntimeError, "Usage: rake data_import:import_sales_addresses_from_csv['csv_file_name']") |
||||
end |
||||
|
||||
it "logs an error if a validation fails" do |
||||
sales_log.ppcodenk = 0 |
||||
sales_log.ppostcode_full = "invalid_format" |
||||
sales_log.save!(validate: false) |
||||
expect(Rails.logger).to receive(:error).with(/Validation failed for sales log with ID #{sales_log.id}: Ppostcode full/) |
||||
task.invoke(addresses_csv_path) |
||||
end |
||||
end |
||||
end |
||||
end |
||||
end |
@ -1,519 +0,0 @@
|
||||
require "rails_helper" |
||||
require "rake" |
||||
|
||||
RSpec.describe "correct_addresses" do |
||||
around do |example| |
||||
Timecop.freeze(Time.zone.local(2023, 10, 10)) do |
||||
Singleton.__init__(FormHandler) |
||||
example.run |
||||
end |
||||
end |
||||
|
||||
describe ":send_missing_addresses_lettings_csv", type: :task do |
||||
subject(:task) { Rake::Task["correct_addresses:send_missing_addresses_lettings_csv"] } |
||||
|
||||
before do |
||||
organisation.users.destroy_all |
||||
Rake.application.rake_require("tasks/send_missing_addresses_csv") |
||||
Rake::Task.define_task(:environment) |
||||
task.reenable |
||||
end |
||||
|
||||
context "when the rake task is run" do |
||||
let(:organisation) { create(:organisation, name: "test organisation") } |
||||
|
||||
before do |
||||
stub_const("EmailMissingAddressesCsvJob::MISSING_ADDRESSES_THRESHOLD", 5) |
||||
end |
||||
|
||||
context "when org has more than 5 missing addresses and data coordinators" do |
||||
let!(:data_coordinator) { create(:user, :data_coordinator, organisation:, email: "data_coordinator1@example.com") } |
||||
let!(:data_coordinator2) { create(:user, :data_coordinator, organisation:, email: "data_coordinator2@example.com") } |
||||
|
||||
before do |
||||
create(:user, :data_provider, organisation:, email: "data_provider1@example.com") |
||||
create_list(:lettings_log, 7, :imported, startdate: Time.zone.local(2023, 9, 9), address_line1: nil, town_or_city: nil, needstype: 1, old_form_id: "form_1", owning_organisation: organisation, managing_organisation: organisation, assigned_to: data_coordinator) |
||||
end |
||||
|
||||
it "enqueues the job with correct organisations" do |
||||
expect { task.invoke }.to enqueue_job(EmailMissingAddressesCsvJob).with(include(data_coordinator.id, data_coordinator2.id), organisation, "lettings", %w[missing_address], []) |
||||
end |
||||
|
||||
it "prints out the jobs enqueued" do |
||||
expect(Rails.logger).to receive(:info).with(nil) |
||||
expect(Rails.logger).to receive(:info).with(match(/^Sending missing lettings addresses CSV for test organisation to (?:data_coordinator1@example\.com, data_coordinator2@example\.com|data_coordinator2@example\.com, data_coordinator1@example\.com)$/)) |
||||
task.invoke |
||||
end |
||||
end |
||||
|
||||
context "when org has 5 missing addresses and data providers only" do |
||||
let!(:data_provider) { create(:user, :data_provider, organisation:, email: "data_provider3@example.com") } |
||||
let!(:data_provider2) { create(:user, :data_provider, organisation:, email: "data_provider4@example.com") } |
||||
|
||||
before do |
||||
create_list(:lettings_log, 5, :imported, startdate: Time.zone.local(2023, 9, 9), address_line1: nil, town_or_city: nil, needstype: 1, old_form_id: "form_2", owning_organisation: organisation, managing_organisation: organisation, assigned_to: data_provider) |
||||
end |
||||
|
||||
it "enqueues the job with correct organisations" do |
||||
expect { task.invoke }.to enqueue_job(EmailMissingAddressesCsvJob).with(include(data_provider.id, data_provider2.id), organisation, "lettings", %w[missing_address], []) |
||||
end |
||||
|
||||
it "prints out the jobs enqueued" do |
||||
expect(Rails.logger).to receive(:info).with(nil) |
||||
expect(Rails.logger).to receive(:info).with(match(/^Sending missing lettings addresses CSV for test organisation to (?:data_provider3@example\.com, data_provider4@example\.com|data_provider4@example\.com, data_provider3@example\.com)$/)) |
||||
task.invoke |
||||
end |
||||
end |
||||
|
||||
context "when org has less than 5 missing addresses" do |
||||
let!(:data_provider) { create(:user, :data_provider, organisation:, email: "data_provider3@example.com") } |
||||
|
||||
before do |
||||
create_list(:lettings_log, 3, :imported, startdate: Time.zone.local(2023, 9, 9), address_line1: nil, town_or_city: nil, needstype: 1, old_form_id: "form_2", owning_organisation: organisation, managing_organisation: organisation, assigned_to: data_provider) |
||||
create_list(:lettings_log, 2, :imported, startdate: Time.zone.local(2023, 9, 9), address_line1: nil, needstype: 1, owning_organisation: organisation, managing_organisation: organisation, assigned_to: data_provider) |
||||
end |
||||
|
||||
it "does not enqueue the job with organisations that is missing less addresses than threshold amount" do |
||||
expect { task.invoke }.not_to enqueue_job(EmailMissingAddressesCsvJob) |
||||
end |
||||
end |
||||
|
||||
context "when org has more than 5 missing town_or_city and data coordinators" do |
||||
let!(:data_coordinator) { create(:user, :data_coordinator, organisation:, email: "data_coordinator1@example.com") } |
||||
let!(:data_coordinator2) { create(:user, :data_coordinator, organisation:, email: "data_coordinator2@example.com") } |
||||
|
||||
before do |
||||
create(:user, :data_provider, organisation:, email: "data_provider1@example.com") |
||||
create_list(:lettings_log, 7, :imported, startdate: Time.zone.local(2023, 9, 9), address_line1: "exists", town_or_city: nil, needstype: 1, old_form_id: "form_1", owning_organisation: organisation, managing_organisation: organisation, assigned_to: data_coordinator) |
||||
end |
||||
|
||||
it "enqueues the job with correct organisations" do |
||||
expect { task.invoke }.to enqueue_job(EmailMissingAddressesCsvJob).with(include(data_coordinator.id, data_coordinator2.id), organisation, "lettings", %w[missing_town], []) |
||||
end |
||||
|
||||
it "prints out the jobs enqueued" do |
||||
expect(Rails.logger).to receive(:info).with(nil) |
||||
expect(Rails.logger).to receive(:info).with(match(/^Sending missing lettings addresses CSV for test organisation to (?:data_coordinator1@example\.com, data_coordinator2@example\.com|data_coordinator2@example\.com, data_coordinator1@example\.com)$/)) |
||||
task.invoke |
||||
end |
||||
end |
||||
|
||||
context "when org has 5 missing town or city and data providers only" do |
||||
let!(:data_provider) { create(:user, :data_provider, organisation:, email: "data_provider3@example.com") } |
||||
let!(:data_provider2) { create(:user, :data_provider, organisation:, email: "data_provider4@example.com") } |
||||
|
||||
before do |
||||
create_list(:lettings_log, 5, :imported, startdate: Time.zone.local(2023, 9, 9), address_line1: "exists", town_or_city: nil, needstype: 1, old_form_id: "form_2", owning_organisation: organisation, managing_organisation: organisation, assigned_to: data_provider) |
||||
end |
||||
|
||||
it "enqueues the job with correct organisations" do |
||||
expect { task.invoke }.to enqueue_job(EmailMissingAddressesCsvJob).with(include(data_provider.id, data_provider2.id), organisation, "lettings", %w[missing_town], []) |
||||
end |
||||
|
||||
it "prints out the jobs enqueued" do |
||||
expect(Rails.logger).to receive(:info).with(nil) |
||||
expect(Rails.logger).to receive(:info).with(match(/^Sending missing lettings addresses CSV for test organisation to (?:data_provider3@example\.com, data_provider4@example\.com|data_provider4@example\.com, data_provider3@example\.com)$/)) |
||||
task.invoke |
||||
end |
||||
end |
||||
|
||||
context "when org has less than 5 missing town or city" do |
||||
let!(:data_provider) { create(:user, :data_provider, organisation:, email: "data_provider3@example.com") } |
||||
|
||||
before do |
||||
create_list(:lettings_log, 3, :imported, startdate: Time.zone.local(2023, 9, 9), address_line1: "address", town_or_city: nil, needstype: 1, old_form_id: "form_2", owning_organisation: organisation, managing_organisation: organisation, assigned_to: data_provider) |
||||
create_list(:lettings_log, 2, :imported, startdate: Time.zone.local(2023, 9, 9), address_line1: "address", needstype: 1, owning_organisation: organisation, managing_organisation: organisation, assigned_to: data_provider) |
||||
end |
||||
|
||||
it "does not enqueue the job with organisations that is missing less town or city data than threshold amount" do |
||||
expect { task.invoke }.not_to enqueue_job(EmailMissingAddressesCsvJob) |
||||
end |
||||
end |
||||
|
||||
context "when org has more than 5 wrong uprn and data coordinators" do |
||||
let!(:data_coordinator) { create(:user, :data_coordinator, organisation:, email: "data_coordinator1@example.com") } |
||||
let!(:data_coordinator2) { create(:user, :data_coordinator, organisation:, email: "data_coordinator2@example.com") } |
||||
|
||||
before do |
||||
create(:user, :data_provider, organisation:, email: "data_provider1@example.com") |
||||
create_list(:lettings_log, 7, :imported, :setup_completed, startdate: Time.zone.local(2023, 9, 9), uprn_known: 1, uprn: "123", town_or_city: "Bristol", needstype: 1, owning_organisation: organisation, managing_organisation: organisation, assigned_to: data_coordinator) |
||||
end |
||||
|
||||
it "enqueues the job with correct organisations" do |
||||
expect { task.invoke }.to enqueue_job(EmailMissingAddressesCsvJob).with(include(data_coordinator.id, data_coordinator2.id), organisation, "lettings", %w[bristol_uprn], []) |
||||
end |
||||
|
||||
it "prints out the jobs enqueued" do |
||||
expect(Rails.logger).to receive(:info).with(nil) |
||||
expect(Rails.logger).to receive(:info).with(match(/^Sending missing lettings addresses CSV for test organisation to (?:data_coordinator1@example\.com, data_coordinator2@example\.com|data_coordinator2@example\.com, data_coordinator1@example\.com)$/)) |
||||
task.invoke |
||||
end |
||||
end |
||||
|
||||
context "when org has 5 wrong uprn and data providers only" do |
||||
let!(:data_provider) { create(:user, :data_provider, organisation:, email: "data_provider3@example.com") } |
||||
let!(:data_provider2) { create(:user, :data_provider, organisation:, email: "data_provider4@example.com") } |
||||
|
||||
before do |
||||
create_list(:lettings_log, 5, :imported, :setup_completed, startdate: Time.zone.local(2023, 9, 9), uprn: "12", propcode: "12", needstype: 1, owning_organisation: organisation, managing_organisation: organisation, assigned_to: data_provider) |
||||
end |
||||
|
||||
it "enqueues the job with correct organisations" do |
||||
expect { task.invoke }.to enqueue_job(EmailMissingAddressesCsvJob).with(include(data_provider.id, data_provider2.id), organisation, "lettings", %w[wrong_uprn], []) |
||||
end |
||||
|
||||
it "prints out the jobs enqueued" do |
||||
expect(Rails.logger).to receive(:info).with(nil) |
||||
expect(Rails.logger).to receive(:info).with(match(/^Sending missing lettings addresses CSV for test organisation to (?:data_provider3@example\.com, data_provider4@example\.com|data_provider4@example\.com, data_provider3@example\.com)$/)) |
||||
task.invoke |
||||
end |
||||
end |
||||
|
||||
context "when org has less than 5 wrong uprn" do |
||||
let!(:data_provider) { create(:user, :data_provider, organisation:, email: "data_provider3@example.com") } |
||||
let!(:data_provider2) { create(:user, :data_provider, organisation:, email: "data_provider4@example.com") } |
||||
|
||||
before do |
||||
create_list(:lettings_log, 3, :imported, :setup_completed, startdate: Time.zone.local(2023, 9, 9), uprn: "123", town_or_city: "Bristol", needstype: 1, owning_organisation: organisation, managing_organisation: organisation, assigned_to: data_provider) |
||||
create_list(:lettings_log, 2, :imported, :setup_completed, startdate: Time.zone.local(2023, 9, 9), uprn: "12", tenancycode: "12", needstype: 1, owning_organisation: organisation, managing_organisation: organisation, assigned_to: data_provider) |
||||
end |
||||
|
||||
it "enqueues the job with correct organisations" do |
||||
expect { task.invoke }.to enqueue_job(EmailMissingAddressesCsvJob).with(include(data_provider.id, data_provider2.id), organisation, "lettings", %w[wrong_uprn bristol_uprn], []) |
||||
end |
||||
|
||||
it "prints out the jobs enqueued" do |
||||
expect(Rails.logger).to receive(:info).with(nil) |
||||
expect(Rails.logger).to receive(:info).with(match(/^Sending missing lettings addresses CSV for test organisation to (?:data_provider3@example\.com, data_provider4@example\.com|data_provider4@example\.com, data_provider3@example\.com)$/)) |
||||
task.invoke |
||||
end |
||||
end |
||||
|
||||
context "when org is included in skip_uprn_issue_organisations list" do |
||||
let!(:data_provider) { create(:user, :data_provider, organisation:, email: "data_provider3@example.com") } |
||||
|
||||
before do |
||||
create_list(:lettings_log, 5, :imported, startdate: Time.zone.local(2023, 9, 9), uprn: "12", propcode: "12", needstype: 1, owning_organisation: organisation, managing_organisation: organisation, assigned_to: data_provider) |
||||
end |
||||
|
||||
it "does not enqueue the job" do |
||||
expect { task.invoke(organisation.id.to_s) }.not_to enqueue_job(EmailMissingAddressesCsvJob) |
||||
end |
||||
end |
||||
|
||||
context "when org is included in skip_uprn_issue_organisations list but faces a different issue" do |
||||
let!(:data_provider) { create(:user, :data_provider, organisation:, email: "data_provider3@example.com") } |
||||
let!(:data_provider2) { create(:user, :data_provider, organisation:, email: "data_provider4@example.com") } |
||||
|
||||
before do |
||||
create_list(:lettings_log, 5, :imported, startdate: Time.zone.local(2023, 9, 9), address_line1: nil, town_or_city: nil, needstype: 1, old_form_id: "form_2", owning_organisation: organisation, managing_organisation: organisation, assigned_to: data_provider) |
||||
create_list(:lettings_log, 5, :imported, startdate: Time.zone.local(2023, 9, 9), uprn: "12", propcode: "12", needstype: 1, owning_organisation: organisation, managing_organisation: organisation, assigned_to: data_provider) |
||||
end |
||||
|
||||
it "does not enqueue the job" do |
||||
expect { task.invoke(organisation.id.to_s) }.to enqueue_job(EmailMissingAddressesCsvJob).with(include(data_provider.id, data_provider2.id), organisation, "lettings", %w[missing_address], [organisation.id]) |
||||
end |
||||
end |
||||
|
||||
context "when skip_uprn_issue_organisations list is provided" do |
||||
let!(:data_provider) { create(:user, :data_provider, organisation:, email: "data_provider3@example.com") } |
||||
let!(:data_provider2) { create(:user, :data_provider, organisation:, email: "data_provider4@example.com") } |
||||
|
||||
before do |
||||
create_list(:lettings_log, 5, :imported, :setup_completed, startdate: Time.zone.local(2023, 9, 9), uprn: "12", propcode: "12", needstype: 1, owning_organisation: organisation, managing_organisation: organisation, assigned_to: data_provider) |
||||
end |
||||
|
||||
it "does enqueues the job with correct skip_uprn_issue_organisations" do |
||||
expect { task.invoke("100 400") }.to enqueue_job(EmailMissingAddressesCsvJob).with(include(data_provider.id, data_provider2.id), organisation, "lettings", %w[wrong_uprn], [100, 400]) |
||||
end |
||||
end |
||||
end |
||||
end |
||||
|
||||
describe ":send_missing_addresses_sales_csv", type: :task do |
||||
subject(:task) { Rake::Task["correct_addresses:send_missing_addresses_sales_csv"] } |
||||
|
||||
before do |
||||
organisation.users.destroy_all |
||||
Rake.application.rake_require("tasks/send_missing_addresses_csv") |
||||
Rake::Task.define_task(:environment) |
||||
task.reenable |
||||
end |
||||
|
||||
context "when the rake task is run" do |
||||
let(:organisation) { create(:organisation, name: "test organisation") } |
||||
|
||||
before do |
||||
stub_const("EmailMissingAddressesCsvJob::MISSING_ADDRESSES_THRESHOLD", 5) |
||||
end |
||||
|
||||
context "when org has more than 5 missing addresses and data coordinators" do |
||||
let!(:data_coordinator) { create(:user, :data_coordinator, organisation:, email: "data_coordinator1@example.com") } |
||||
let!(:data_coordinator2) { create(:user, :data_coordinator, organisation:, email: "data_coordinator2@example.com") } |
||||
|
||||
before do |
||||
create(:user, :data_provider, organisation:, email: "data_provider1@example.com") |
||||
create_list(:sales_log, 7, :completed, :imported, saledate: Time.zone.local(2023, 9, 9), address_line1: nil, town_or_city: nil, old_form_id: "form_1", owning_organisation: organisation, assigned_to: data_coordinator) |
||||
end |
||||
|
||||
it "enqueues the job with correct organisations" do |
||||
expect { task.invoke("70 90") }.to enqueue_job(EmailMissingAddressesCsvJob).with(include(data_coordinator.id, data_coordinator2.id), organisation, "sales", %w[missing_address], [70, 90]) |
||||
end |
||||
|
||||
it "prints out the jobs enqueued" do |
||||
expect(Rails.logger).to receive(:info).with(nil) |
||||
expect(Rails.logger).to receive(:info).with(match(/^Sending missing sales addresses CSV for test organisation to (?:data_coordinator1@example\.com, data_coordinator2@example\.com|data_coordinator2@example\.com, data_coordinator1@example\.com)$/)) |
||||
task.invoke |
||||
end |
||||
end |
||||
|
||||
context "when org has 5 missing addresses and data providers only" do |
||||
let!(:data_provider) { create(:user, :data_provider, organisation:, email: "data_provider3@example.com") } |
||||
let!(:data_provider2) { create(:user, :data_provider, organisation:, email: "data_provider4@example.com") } |
||||
|
||||
before do |
||||
create_list(:sales_log, 5, :completed, :imported, saledate: Time.zone.local(2023, 9, 9), address_line1: nil, town_or_city: nil, old_form_id: "form_2", owning_organisation: organisation, assigned_to: data_provider) |
||||
end |
||||
|
||||
it "enqueues the job with correct organisations" do |
||||
expect { task.invoke }.to enqueue_job(EmailMissingAddressesCsvJob).with(include(data_provider.id, data_provider2.id), organisation, "sales", %w[missing_address], []) |
||||
end |
||||
|
||||
it "prints out the jobs enqueued" do |
||||
expect(Rails.logger).to receive(:info).with(nil) |
||||
expect(Rails.logger).to receive(:info).with(match(/^Sending missing sales addresses CSV for test organisation to (?:data_provider3@example\.com, data_provider4@example\.com|data_provider4@example\.com, data_provider3@example\.com)$/)) |
||||
task.invoke |
||||
end |
||||
end |
||||
|
||||
context "when org has less than 5 missing addresses" do |
||||
let!(:data_provider) { create(:user, :data_provider, organisation:, email: "data_provider3@example.com") } |
||||
|
||||
before do |
||||
create_list(:sales_log, 3, :completed, :imported, saledate: Time.zone.local(2023, 9, 9), address_line1: nil, town_or_city: nil, old_form_id: "form_2", owning_organisation: organisation, assigned_to: data_provider) |
||||
create_list(:sales_log, 2, :completed, :imported, saledate: Time.zone.local(2023, 9, 9), address_line1: nil, owning_organisation: organisation, assigned_to: data_provider) |
||||
end |
||||
|
||||
it "does not enqueue the job with organisations that is missing less addresses than threshold amount" do |
||||
expect { task.invoke }.not_to enqueue_job(EmailMissingAddressesCsvJob) |
||||
end |
||||
end |
||||
|
||||
context "when org has more than 5 missing town_or_city and data coordinators" do |
||||
let!(:data_coordinator) { create(:user, :data_coordinator, organisation:, email: "data_coordinator1@example.com") } |
||||
let!(:data_coordinator2) { create(:user, :data_coordinator, organisation:, email: "data_coordinator2@example.com") } |
||||
|
||||
before do |
||||
create(:user, :data_provider, organisation:, email: "data_provider1@example.com") |
||||
create_list(:sales_log, 7, :completed, :imported, saledate: Time.zone.local(2023, 9, 9), address_line1: "exists", town_or_city: nil, old_form_id: "form_1", owning_organisation: organisation, assigned_to: data_coordinator) |
||||
end |
||||
|
||||
it "enqueues the job with correct organisations" do |
||||
expect { task.invoke }.to enqueue_job(EmailMissingAddressesCsvJob).with(include(data_coordinator.id, data_coordinator2.id), organisation, "sales", %w[missing_town], []) |
||||
end |
||||
|
||||
it "prints out the jobs enqueued" do |
||||
expect(Rails.logger).to receive(:info).with(nil) |
||||
expect(Rails.logger).to receive(:info).with(match(/^Sending missing sales addresses CSV for test organisation to (?:data_coordinator1@example\.com, data_coordinator2@example\.com|data_coordinator2@example\.com, data_coordinator1@example\.com)$/)) |
||||
task.invoke |
||||
end |
||||
end |
||||
|
||||
context "when org has 5 missing town or city and data providers only" do |
||||
let!(:data_provider) { create(:user, :data_provider, organisation:, email: "data_provider3@example.com") } |
||||
let!(:data_provider2) { create(:user, :data_provider, organisation:, email: "data_provider4@example.com") } |
||||
|
||||
before do |
||||
create_list(:sales_log, 5, :completed, :imported, saledate: Time.zone.local(2023, 9, 9), address_line1: "exists", town_or_city: nil, old_form_id: "form_2", owning_organisation: organisation, assigned_to: data_provider) |
||||
end |
||||
|
||||
it "enqueues the job with correct organisations" do |
||||
expect { task.invoke }.to enqueue_job(EmailMissingAddressesCsvJob).with(include(data_provider.id, data_provider2.id), organisation, "sales", %w[missing_town], []) |
||||
end |
||||
|
||||
it "prints out the jobs enqueued" do |
||||
expect(Rails.logger).to receive(:info).with(nil) |
||||
expect(Rails.logger).to receive(:info).with(match(/^Sending missing sales addresses CSV for test organisation to (?:data_provider3@example\.com, data_provider4@example\.com|data_provider4@example\.com, data_provider3@example\.com)$/)) |
||||
task.invoke |
||||
end |
||||
end |
||||
|
||||
context "when org has less than 5 missing town or city" do |
||||
let!(:data_provider) { create(:user, :data_provider, organisation:, email: "data_provider3@example.com") } |
||||
|
||||
before do |
||||
create_list(:sales_log, 3, :completed, :imported, saledate: Time.zone.local(2023, 9, 9), address_line1: "address", town_or_city: nil, old_form_id: "form_2", owning_organisation: organisation, assigned_to: data_provider) |
||||
create_list(:sales_log, 2, :completed, :imported, saledate: Time.zone.local(2023, 9, 9), address_line1: "address", owning_organisation: organisation, assigned_to: data_provider) |
||||
end |
||||
|
||||
it "does not enqueue the job with organisations that is missing less town or city data than threshold amount" do |
||||
expect { task.invoke }.not_to enqueue_job(EmailMissingAddressesCsvJob) |
||||
end |
||||
end |
||||
|
||||
context "when org has more than 5 wrong uprn and data coordinators" do |
||||
let!(:data_coordinator) { create(:user, :data_coordinator, organisation:, email: "data_coordinator1@example.com") } |
||||
let!(:data_coordinator2) { create(:user, :data_coordinator, organisation:, email: "data_coordinator2@example.com") } |
||||
|
||||
before do |
||||
create(:user, :data_provider, organisation:, email: "data_provider1@example.com") |
||||
create_list(:sales_log, 7, :completed, :imported, saledate: Time.zone.local(2023, 9, 9), uprn_known: 1, uprn: "123", town_or_city: "Bristol", owning_organisation: organisation, assigned_to: data_coordinator) |
||||
end |
||||
|
||||
it "enqueues the job with correct organisations" do |
||||
expect { task.invoke }.to enqueue_job(EmailMissingAddressesCsvJob).with(include(data_coordinator.id, data_coordinator2.id), organisation, "sales", %w[wrong_uprn], []) |
||||
end |
||||
|
||||
it "prints out the jobs enqueued" do |
||||
expect(Rails.logger).to receive(:info).with(nil) |
||||
expect(Rails.logger).to receive(:info).with(match(/^Sending missing sales addresses CSV for test organisation to (?:data_coordinator1@example\.com, data_coordinator2@example\.com|data_coordinator2@example\.com, data_coordinator1@example\.com)$/)) |
||||
task.invoke |
||||
end |
||||
end |
||||
|
||||
context "when org has 5 wrong uprn and data providers only" do |
||||
let!(:data_provider) { create(:user, :data_provider, organisation:, email: "data_provider3@example.com") } |
||||
let!(:data_provider2) { create(:user, :data_provider, organisation:, email: "data_provider4@example.com") } |
||||
|
||||
before do |
||||
create_list(:sales_log, 5, :completed, :imported, saledate: Time.zone.local(2023, 9, 9), uprn_known: 1, uprn: "12", purchid: "12", owning_organisation: organisation, assigned_to: data_provider) |
||||
end |
||||
|
||||
it "enqueues the job with correct organisations" do |
||||
expect { task.invoke }.to enqueue_job(EmailMissingAddressesCsvJob).with(include(data_provider.id, data_provider2.id), organisation, "sales", %w[wrong_uprn], []) |
||||
end |
||||
|
||||
it "prints out the jobs enqueued" do |
||||
expect(Rails.logger).to receive(:info).with(nil) |
||||
expect(Rails.logger).to receive(:info).with(match(/^Sending missing sales addresses CSV for test organisation to (?:data_provider3@example\.com, data_provider4@example\.com|data_provider4@example\.com, data_provider3@example\.com)$/)) |
||||
task.invoke |
||||
end |
||||
end |
||||
|
||||
context "when org has less than 5 wrong uprn" do |
||||
let!(:data_provider) { create(:user, :data_provider, organisation:, email: "data_provider3@example.com") } |
||||
let!(:data_provider2) { create(:user, :data_provider, organisation:, email: "data_provider4@example.com") } |
||||
|
||||
before do |
||||
create_list(:sales_log, 3, :completed, :imported, saledate: Time.zone.local(2023, 9, 9), uprn_known: 1, uprn: "123", town_or_city: "Bristol", owning_organisation: organisation, assigned_to: data_provider) |
||||
create_list(:sales_log, 2, :completed, :imported, saledate: Time.zone.local(2023, 9, 9), uprn_known: 1, uprn: "12", purchid: "12", owning_organisation: organisation, assigned_to: data_provider) |
||||
end |
||||
|
||||
it "enqueues the job with correct organisations" do |
||||
expect { task.invoke }.to enqueue_job(EmailMissingAddressesCsvJob).with(include(data_provider.id, data_provider2.id), organisation, "sales", %w[wrong_uprn], []) |
||||
end |
||||
|
||||
it "prints out the jobs enqueued" do |
||||
expect(Rails.logger).to receive(:info).with(nil) |
||||
expect(Rails.logger).to receive(:info).with(match(/^Sending missing sales addresses CSV for test organisation to (?:data_provider3@example\.com, data_provider4@example\.com|data_provider4@example\.com, data_provider3@example\.com)$/)) |
||||
task.invoke |
||||
end |
||||
end |
||||
|
||||
context "when org is included in skip_uprn_issue_organisations list" do |
||||
let!(:data_provider) { create(:user, :data_provider, organisation:, email: "data_provider3@example.com") } |
||||
|
||||
before do |
||||
create_list(:sales_log, 5, :completed, :imported, saledate: Time.zone.local(2023, 9, 9), uprn_known: 1, uprn: "12", purchid: "12", owning_organisation: organisation, assigned_to: data_provider) |
||||
end |
||||
|
||||
it "does not enqueue the job" do |
||||
expect { task.invoke("#{organisation.id} 4") }.not_to enqueue_job(EmailMissingAddressesCsvJob) |
||||
end |
||||
end |
||||
|
||||
context "when skip_uprn_issue_organisations list is provided" do |
||||
let!(:data_provider) { create(:user, :data_provider, organisation:, email: "data_provider3@example.com") } |
||||
let!(:data_provider2) { create(:user, :data_provider, organisation:, email: "data_provider4@example.com") } |
||||
|
||||
before do |
||||
create_list(:sales_log, 5, :completed, :imported, saledate: Time.zone.local(2023, 9, 9), uprn_known: 1, uprn: "12", purchid: "12", owning_organisation: organisation, assigned_to: data_provider) |
||||
end |
||||
|
||||
it "does enqueues the job with correct skip_uprn_issue_organisations" do |
||||
expect { task.invoke("100 400") }.to enqueue_job(EmailMissingAddressesCsvJob).with(include(data_provider.id, data_provider2.id), organisation, "sales", %w[wrong_uprn], [100, 400]) |
||||
end |
||||
end |
||||
end |
||||
end |
||||
|
||||
describe ":create_lettings_addresses_csv", type: :task do |
||||
subject(:task) { Rake::Task["correct_addresses:create_lettings_addresses_csv"] } |
||||
|
||||
before do |
||||
organisation.users.destroy_all |
||||
Rake.application.rake_require("tasks/send_missing_addresses_csv") |
||||
Rake::Task.define_task(:environment) |
||||
task.reenable |
||||
end |
||||
|
||||
context "when the rake task is run" do |
||||
let(:organisation) { create(:organisation, name: "test organisation") } |
||||
|
||||
context "and organisation ID is provided" do |
||||
it "enqueues the job with correct organisation" do |
||||
expect { task.invoke(organisation.id) }.to enqueue_job(CreateAddressesCsvJob).with(organisation, "lettings") |
||||
end |
||||
|
||||
it "prints out the jobs enqueued" do |
||||
expect(Rails.logger).to receive(:info).with(nil) |
||||
expect(Rails.logger).to receive(:info).with("Creating lettings addresses CSV for test organisation") |
||||
task.invoke(organisation.id) |
||||
end |
||||
end |
||||
|
||||
context "when organisation with given ID cannot be found" do |
||||
it "prints out error" do |
||||
expect(Rails.logger).to receive(:error).with("Organisation with ID fake not found") |
||||
task.invoke("fake") |
||||
end |
||||
end |
||||
|
||||
context "when organisation ID is not given" do |
||||
it "raises an error" do |
||||
expect { task.invoke }.to raise_error(RuntimeError, "Usage: rake correct_addresses:create_lettings_addresses_csv['organisation_id']") |
||||
end |
||||
end |
||||
end |
||||
end |
||||
|
||||
describe ":create_sales_addresses_csv", type: :task do |
||||
subject(:task) { Rake::Task["correct_addresses:create_sales_addresses_csv"] } |
||||
|
||||
before do |
||||
organisation.users.destroy_all |
||||
Rake.application.rake_require("tasks/send_missing_addresses_csv") |
||||
Rake::Task.define_task(:environment) |
||||
task.reenable |
||||
end |
||||
|
||||
context "when the rake task is run" do |
||||
let(:organisation) { create(:organisation, name: "test organisation") } |
||||
|
||||
context "and organisation ID is provided" do |
||||
it "enqueues the job with correct organisation" do |
||||
expect { task.invoke(organisation.id) }.to enqueue_job(CreateAddressesCsvJob).with(organisation, "sales") |
||||
end |
||||
|
||||
it "prints out the jobs enqueued" do |
||||
expect(Rails.logger).to receive(:info).with(nil) |
||||
expect(Rails.logger).to receive(:info).with("Creating sales addresses CSV for test organisation") |
||||
task.invoke(organisation.id) |
||||
end |
||||
end |
||||
|
||||
context "when organisation with given ID cannot be found" do |
||||
it "prints out error" do |
||||
expect(Rails.logger).to receive(:error).with("Organisation with ID fake not found") |
||||
task.invoke("fake") |
||||
end |
||||
end |
||||
|
||||
context "when organisation ID is not given" do |
||||
it "raises an error" do |
||||
expect { task.invoke }.to raise_error(RuntimeError, "Usage: rake correct_addresses:create_sales_addresses_csv['organisation_id']") |
||||
end |
||||
end |
||||
end |
||||
end |
||||
end |
@ -1,504 +0,0 @@
|
||||
require "rails_helper" |
||||
|
||||
RSpec.describe Csv::MissingAddressesCsvService do |
||||
let(:organisation) { create(:organisation, name: "Address org") } |
||||
let(:user) { create(:user, organisation:, email: "testy@example.com") } |
||||
let(:service) { described_class.new(organisation, skip_uprn_issue_organisations) } |
||||
let(:skip_uprn_issue_organisations) { [100, 200] } |
||||
|
||||
around do |example| |
||||
Timecop.freeze(Time.zone.local(2023, 4, 5)) do |
||||
Singleton.__init__(FormHandler) |
||||
example.run |
||||
end |
||||
end |
||||
|
||||
def replace_entity_ids(lettings_log, export_template) |
||||
export_template.sub!(/\{id\}/, lettings_log.id.to_s) |
||||
end |
||||
|
||||
describe "#create_missing_lettings_addresses_csv" do |
||||
let!(:lettings_log) do |
||||
create(:lettings_log, |
||||
tenancycode: "tenancycode", |
||||
propcode: "propcode", |
||||
startdate: Time.zone.local(2023, 4, 5), |
||||
assigned_to: user, |
||||
owning_organisation: organisation, |
||||
managing_organisation: organisation, |
||||
address_line1: nil, |
||||
town_or_city: nil, |
||||
old_id: "old_id", |
||||
old_form_id: "old_form_id", |
||||
needstype: 1, |
||||
uprn_known: 0) |
||||
end |
||||
|
||||
let!(:lettings_log_missing_town) do |
||||
create(:lettings_log, |
||||
tenancycode: "tenancycode", |
||||
propcode: "propcode", |
||||
startdate: Time.zone.local(2023, 4, 5), |
||||
assigned_to: user, |
||||
owning_organisation: organisation, |
||||
managing_organisation: organisation, |
||||
address_line1: "existing address", |
||||
town_or_city: nil, |
||||
old_id: "older_id", |
||||
old_form_id: "old_form_id", |
||||
needstype: 1, |
||||
uprn_known: 0) |
||||
end |
||||
|
||||
let!(:lettings_log_wrong_uprn) do |
||||
create(:lettings_log, |
||||
:completed, |
||||
tenancycode: "tenancycode", |
||||
propcode: "propcode", |
||||
startdate: Time.zone.local(2023, 4, 5), |
||||
assigned_to: user, |
||||
owning_organisation: organisation, |
||||
managing_organisation: organisation, |
||||
uprn: "123", |
||||
uprn_known: 1, |
||||
old_id: "oldest_id", |
||||
needstype: 1) |
||||
end |
||||
|
||||
context "when the organisation has logs with missing addresses, missing town or city and wrong uprn" do |
||||
it "returns a csv with relevant logs" do |
||||
expected_content = replace_entity_ids(lettings_log, File.open("spec/fixtures/files/missing_lettings_logs_addresses_all_issues.csv").read) |
||||
expected_content = replace_entity_ids(lettings_log_missing_town, expected_content) |
||||
expected_content = replace_entity_ids(lettings_log_wrong_uprn, expected_content) |
||||
csv = service.create_missing_lettings_addresses_csv |
||||
expect(csv).to eq(expected_content) |
||||
end |
||||
end |
||||
|
||||
context "when the organisation has logs with missing addresses only" do |
||||
before do |
||||
lettings_log_missing_town.update!(town_or_city: "towncity") |
||||
lettings_log_wrong_uprn.update!(uprn: "12") |
||||
end |
||||
|
||||
it "returns a csv with relevant logs" do |
||||
expected_content = replace_entity_ids(lettings_log, File.open("spec/fixtures/files/missing_lettings_logs_addresses.csv").read) |
||||
csv = service.create_missing_lettings_addresses_csv |
||||
expect(csv).to eq(expected_content) |
||||
end |
||||
end |
||||
|
||||
context "when the organisation has logs with missing town or city only" do |
||||
before do |
||||
lettings_log.update!(address_line1: "existing address", town_or_city: "towncity") |
||||
lettings_log_wrong_uprn.update!(uprn: "12") |
||||
end |
||||
|
||||
it "returns a csv with relevant logs" do |
||||
expected_content = replace_entity_ids(lettings_log_missing_town, File.open("spec/fixtures/files/missing_lettings_logs_town_or_city.csv").read) |
||||
csv = service.create_missing_lettings_addresses_csv |
||||
expect(csv).to eq(expected_content) |
||||
end |
||||
end |
||||
|
||||
context "when the organisation has logs with wrong uprn only" do |
||||
before do |
||||
lettings_log.update!(address_line1: "existing address", town_or_city: "towncity") |
||||
lettings_log_missing_town.update!(town_or_city: "towncity") |
||||
lettings_log_wrong_uprn.update!(uprn_known: 1, uprn: "12", propcode: "12") |
||||
end |
||||
|
||||
it "returns a csv with relevant logs" do |
||||
expected_content = replace_entity_ids(lettings_log_wrong_uprn, File.open("spec/fixtures/files/missing_lettings_logs_wrong_uprn.csv").read) |
||||
csv = service.create_missing_lettings_addresses_csv |
||||
expect(csv).to eq(expected_content) |
||||
end |
||||
|
||||
context "and the organisation is marked as an organisation to skip" do |
||||
let(:skip_uprn_issue_organisations) { [organisation.id] } |
||||
|
||||
it "returns nil" do |
||||
expect(service.create_missing_lettings_addresses_csv).to be_nil |
||||
end |
||||
end |
||||
end |
||||
|
||||
context "when the organisation only has supported housing logs with missing addresses or town or city" do |
||||
before do |
||||
lettings_log.update!(needstype: 2) |
||||
lettings_log_missing_town.update!(needstype: 2) |
||||
lettings_log_wrong_uprn.update!(needstype: 2) |
||||
end |
||||
|
||||
it "returns nil" do |
||||
expect(service.create_missing_lettings_addresses_csv).to be_nil |
||||
end |
||||
end |
||||
|
||||
context "when the organisation only has logs with missing addresses or town or city from 2022" do |
||||
before do |
||||
lettings_log.startdate = Time.zone.local(2022, 4, 5) |
||||
lettings_log.save!(validate: false) |
||||
lettings_log_missing_town.startdate = Time.zone.local(2022, 4, 5) |
||||
lettings_log_missing_town.save!(validate: false) |
||||
lettings_log_wrong_uprn.startdate = Time.zone.local(2022, 4, 5) |
||||
lettings_log_wrong_uprn.save!(validate: false) |
||||
end |
||||
|
||||
it "returns nil" do |
||||
expect(service.create_missing_lettings_addresses_csv).to be_nil |
||||
end |
||||
end |
||||
|
||||
context "when the organisation has any address and town or city fields filled in or correct uprn" do |
||||
before do |
||||
lettings_log.update!(address_line1: "address_line1", town_or_city: "towncity") |
||||
lettings_log_missing_town.update!(address_line1: "address_line1", town_or_city: "towncity") |
||||
lettings_log_wrong_uprn.update!(uprn: "12") |
||||
end |
||||
|
||||
it "returns nil" do |
||||
expect(service.create_missing_lettings_addresses_csv).to be_nil |
||||
end |
||||
end |
||||
end |
||||
|
||||
describe "#create_missing_sales_addresses_csv" do |
||||
let!(:sales_log) do |
||||
create(:sales_log, |
||||
purchid: "purchaser code", |
||||
saledate: Time.zone.local(2023, 4, 5), |
||||
assigned_to: user, |
||||
owning_organisation: organisation, |
||||
address_line1: nil, |
||||
town_or_city: nil, |
||||
old_id: "old_id", |
||||
old_form_id: "old_form_id", |
||||
uprn_known: 0) |
||||
end |
||||
|
||||
let!(:sales_log_missing_town) do |
||||
create(:sales_log, |
||||
purchid: "purchaser code", |
||||
saledate: Time.zone.local(2023, 4, 5), |
||||
assigned_to: user, |
||||
owning_organisation: organisation, |
||||
address_line1: "existing address line 1", |
||||
town_or_city: nil, |
||||
old_id: "older_id", |
||||
old_form_id: "old_form_id", |
||||
uprn_known: 0) |
||||
end |
||||
|
||||
let!(:sales_log_wrong_uprn) do |
||||
create(:sales_log, |
||||
:completed, |
||||
purchid: "purchaser code", |
||||
saledate: Time.zone.local(2023, 4, 5), |
||||
assigned_to: user, |
||||
owning_organisation: organisation, |
||||
uprn: "123", |
||||
town_or_city: "Bristol", |
||||
old_id: "oldest_id", |
||||
uprn_known: 1, |
||||
uprn_confirmed: 1, |
||||
la: nil) |
||||
end |
||||
|
||||
context "when the organisation has logs with missing addresses, town or city and wrong uprn" do |
||||
it "returns a csv with relevant logs" do |
||||
expected_content = replace_entity_ids(sales_log, File.open("spec/fixtures/files/missing_sales_logs_addresses_all_issues.csv").read) |
||||
expected_content = replace_entity_ids(sales_log_missing_town, expected_content) |
||||
expected_content = replace_entity_ids(sales_log_wrong_uprn, expected_content) |
||||
csv = service.create_missing_sales_addresses_csv |
||||
expect(csv).to eq(expected_content) |
||||
end |
||||
end |
||||
|
||||
context "when the organisation has logs with missing addresses" do |
||||
before do |
||||
sales_log_missing_town.update!(town_or_city: "towncity") |
||||
sales_log_wrong_uprn.update!(uprn: "12") |
||||
end |
||||
|
||||
it "returns a csv with relevant logs" do |
||||
expected_content = replace_entity_ids(sales_log, File.open("spec/fixtures/files/missing_sales_logs_addresses.csv").read) |
||||
csv = service.create_missing_sales_addresses_csv |
||||
expect(csv).to eq(expected_content) |
||||
end |
||||
end |
||||
|
||||
context "when the organisation has logs with missing town_or_city only" do |
||||
before do |
||||
sales_log.update!(address_line1: "address", town_or_city: "towncity") |
||||
sales_log_wrong_uprn.update!(uprn: "12") |
||||
end |
||||
|
||||
it "returns a csv with relevant logs" do |
||||
expected_content = replace_entity_ids(sales_log_missing_town, File.open("spec/fixtures/files/missing_sales_logs_town_or_city.csv").read) |
||||
csv = service.create_missing_sales_addresses_csv |
||||
expect(csv).to eq(expected_content) |
||||
end |
||||
end |
||||
|
||||
context "when the organisation has logs with wrong uprn only" do |
||||
before do |
||||
sales_log.update!(address_line1: "address", town_or_city: "towncity") |
||||
sales_log_missing_town.update!(town_or_city: "towncity") |
||||
sales_log_wrong_uprn.update!(uprn: "12", purchid: "12") |
||||
end |
||||
|
||||
it "returns a csv with relevant logs" do |
||||
expected_content = replace_entity_ids(sales_log_wrong_uprn, File.open("spec/fixtures/files/missing_sales_logs_wrong_uprn.csv").read) |
||||
csv = service.create_missing_sales_addresses_csv |
||||
expect(csv).to eq(expected_content) |
||||
end |
||||
|
||||
context "and the organisation is marked as an organisation to skip" do |
||||
let(:skip_uprn_issue_organisations) { [organisation.id] } |
||||
|
||||
it "returns nil" do |
||||
expect(service.create_missing_sales_addresses_csv).to be_nil |
||||
end |
||||
end |
||||
end |
||||
|
||||
context "when the organisation only has logs with missing addresses from 2022" do |
||||
before do |
||||
sales_log.saledate = Time.zone.local(2022, 4, 5) |
||||
sales_log.save!(validate: false) |
||||
sales_log_missing_town.saledate = Time.zone.local(2022, 4, 5) |
||||
sales_log_missing_town.save!(validate: false) |
||||
sales_log_wrong_uprn.saledate = Time.zone.local(2022, 4, 5) |
||||
sales_log_wrong_uprn.save!(validate: false) |
||||
end |
||||
|
||||
it "returns nil" do |
||||
expect(service.create_missing_sales_addresses_csv).to be_nil |
||||
end |
||||
end |
||||
|
||||
context "when the organisation has address fields filled in" do |
||||
before do |
||||
sales_log.update!(town_or_city: "town", address_line1: "line1") |
||||
sales_log_missing_town.update!(town_or_city: "town") |
||||
sales_log_wrong_uprn.update!(uprn: "12") |
||||
end |
||||
|
||||
it "returns nil" do |
||||
expect(service.create_missing_sales_addresses_csv).to be_nil |
||||
end |
||||
end |
||||
end |
||||
|
||||
describe "#create_lettings_addresses_csv" do |
||||
context "when the organisation has lettings logs" do |
||||
let!(:lettings_log) do |
||||
create(:lettings_log, |
||||
tenancycode: "tenancycode1", |
||||
propcode: "propcode1", |
||||
startdate: Time.zone.local(2023, 4, 5), |
||||
assigned_to: user, |
||||
owning_organisation: organisation, |
||||
managing_organisation: organisation, |
||||
address_line1: "address", |
||||
town_or_city: "town", |
||||
old_id: "old_id_1", |
||||
old_form_id: "old_form_id_1", |
||||
needstype: 1, |
||||
uprn_known: 0) |
||||
end |
||||
|
||||
let!(:lettings_log_missing_address) do |
||||
create(:lettings_log, |
||||
tenancycode: "tenancycode", |
||||
propcode: "propcode", |
||||
startdate: Time.zone.local(2023, 4, 5), |
||||
assigned_to: user, |
||||
owning_organisation: organisation, |
||||
managing_organisation: organisation, |
||||
address_line1: nil, |
||||
town_or_city: nil, |
||||
old_id: "old_id", |
||||
old_form_id: "old_form_id", |
||||
needstype: 1, |
||||
uprn_known: 0) |
||||
end |
||||
|
||||
let!(:lettings_log_missing_town) do |
||||
create(:lettings_log, |
||||
tenancycode: "tenancycode", |
||||
propcode: "propcode", |
||||
startdate: Time.zone.local(2023, 4, 5), |
||||
assigned_to: user, |
||||
owning_organisation: organisation, |
||||
managing_organisation: organisation, |
||||
address_line1: "existing address", |
||||
town_or_city: nil, |
||||
old_id: "older_id", |
||||
old_form_id: "old_form_id", |
||||
needstype: 1, |
||||
uprn_known: 0) |
||||
end |
||||
|
||||
let!(:lettings_log_wrong_uprn) do |
||||
create(:lettings_log, |
||||
:completed, |
||||
tenancycode: "tenancycode", |
||||
propcode: "propcode", |
||||
startdate: Time.zone.local(2023, 4, 5), |
||||
assigned_to: user, |
||||
owning_organisation: organisation, |
||||
managing_organisation: organisation, |
||||
uprn: "123", |
||||
uprn_known: 1, |
||||
old_id: "oldest_id", |
||||
needstype: 1) |
||||
end |
||||
|
||||
let!(:lettings_log_not_imported) do |
||||
create(:lettings_log, |
||||
:completed, |
||||
tenancycode: "tenancycode", |
||||
propcode: "propcode", |
||||
startdate: Time.zone.local(2023, 4, 5), |
||||
assigned_to: user, |
||||
owning_organisation: organisation, |
||||
managing_organisation: organisation, |
||||
uprn: "123", |
||||
uprn_known: 1, |
||||
needstype: 1) |
||||
end |
||||
|
||||
before do |
||||
lettings_log = create(:lettings_log, :completed, managing_organisation: organisation, old_id: "exists") |
||||
lettings_log.startdate = Time.zone.local(2022, 4, 5) |
||||
lettings_log.save!(validate: false) |
||||
end |
||||
|
||||
it "returns a csv with relevant logs" do |
||||
csv = CSV.parse(service.create_lettings_addresses_csv) |
||||
expect(csv.count).to eq(6) |
||||
expect(csv).to include([lettings_log.id.to_s, "2023-04-05", "tenancycode1", "propcode1", "testy@example.com", "Address org", "Address org", nil, "address", nil, "town", nil, nil]) |
||||
expect(csv).to include([lettings_log_missing_address.id.to_s, "2023-04-05", "tenancycode", "propcode", "testy@example.com", "Address org", "Address org", nil, nil, nil, nil, nil, nil]) |
||||
expect(csv).to include([lettings_log_missing_town.id.to_s, "2023-04-05", "tenancycode", "propcode", "testy@example.com", "Address org", "Address org", nil, "existing address", nil, nil, nil, nil]) |
||||
expect(csv).to include([lettings_log_wrong_uprn.id.to_s, "2023-04-05", "tenancycode", "propcode", "testy@example.com", "Address org", "Address org", "123", "Some Place", nil, "Bristol", nil, "BS1 1AD"]) |
||||
expect(csv).to include([lettings_log_not_imported.id.to_s, "2023-04-05", "tenancycode", "propcode", "testy@example.com", "Address org", "Address org", "123", "Some Place", nil, "Bristol", nil, "BS1 1AD"]) |
||||
end |
||||
end |
||||
|
||||
context "when the organisation does not have relevant lettings logs" do |
||||
before do |
||||
lettings_log = create(:lettings_log, managing_organisation: organisation) |
||||
lettings_log.startdate = Time.zone.local(2022, 4, 5) |
||||
lettings_log.save!(validate: false) |
||||
end |
||||
|
||||
it "returns only headers" do |
||||
csv = service.create_lettings_addresses_csv |
||||
expect(csv).to eq "Log ID,Tenancy start date,Tenant code,Property reference,Log owner,Owning organisation,Managing organisation,UPRN,Address Line 1,Address Line 2 (optional),Town or City,County (optional),Property's postcode\n" |
||||
end |
||||
end |
||||
end |
||||
|
||||
describe "#create_sales_addresses_csv" do |
||||
context "when the organisation has sales" do |
||||
let!(:sales_log) do |
||||
create(:sales_log, |
||||
purchid: "purchaser code", |
||||
saledate: Time.zone.local(2023, 4, 5), |
||||
assigned_to: user, |
||||
owning_organisation: organisation, |
||||
address_line1: "address", |
||||
town_or_city: "city", |
||||
old_id: "old_id_1", |
||||
old_form_id: "old_form_id_1", |
||||
uprn_known: 0) |
||||
end |
||||
|
||||
let!(:sales_log_missing_address) do |
||||
create(:sales_log, |
||||
purchid: "purchaser code", |
||||
saledate: Time.zone.local(2023, 4, 5), |
||||
assigned_to: user, |
||||
owning_organisation: organisation, |
||||
address_line1: nil, |
||||
town_or_city: nil, |
||||
old_id: "old_id", |
||||
old_form_id: "old_form_id", |
||||
uprn_known: 0) |
||||
end |
||||
|
||||
let!(:sales_log_missing_town) do |
||||
create(:sales_log, |
||||
purchid: "purchaser code", |
||||
saledate: Time.zone.local(2023, 4, 5), |
||||
assigned_to: user, |
||||
owning_organisation: organisation, |
||||
address_line1: "existing address line 1", |
||||
town_or_city: nil, |
||||
old_id: "older_id", |
||||
old_form_id: "old_form_id", |
||||
uprn_known: 0) |
||||
end |
||||
|
||||
let!(:sales_log_wrong_uprn) do |
||||
create(:sales_log, |
||||
:completed, |
||||
purchid: "purchaser code", |
||||
saledate: Time.zone.local(2023, 4, 5), |
||||
assigned_to: user, |
||||
owning_organisation: organisation, |
||||
uprn: "123", |
||||
town_or_city: "Bristol", |
||||
old_id: "oldest_id", |
||||
uprn_known: 1, |
||||
uprn_confirmed: 1, |
||||
la: nil) |
||||
end |
||||
|
||||
let!(:sales_log_not_imported) do |
||||
create(:sales_log, |
||||
:completed, |
||||
purchid: "purchaser code", |
||||
saledate: Time.zone.local(2023, 4, 5), |
||||
assigned_to: user, |
||||
owning_organisation: organisation, |
||||
uprn: "123", |
||||
town_or_city: "Bristol", |
||||
uprn_known: 1, |
||||
uprn_confirmed: 1, |
||||
la: nil) |
||||
end |
||||
|
||||
before do |
||||
sales_log = create(:sales_log, :completed) |
||||
sales_log.saledate = Time.zone.local(2022, 4, 5) |
||||
sales_log.save!(validate: false) |
||||
end |
||||
|
||||
it "returns a csv with relevant logs" do |
||||
csv = CSV.parse(service.create_sales_addresses_csv) |
||||
expect(csv.count).to eq(6) |
||||
expect(csv).to include([sales_log.id.to_s, "2023-04-05", "purchaser code", "testy@example.com", "Address org", nil, "address", nil, "city", nil, nil]) |
||||
expect(csv).to include([sales_log_missing_address.id.to_s, "2023-04-05", "purchaser code", "testy@example.com", "Address org", nil, nil, nil, nil, nil, nil]) |
||||
expect(csv).to include([sales_log_missing_town.id.to_s, "2023-04-05", "purchaser code", "testy@example.com", "Address org", nil, "existing address line 1", nil, nil, nil, nil]) |
||||
expect(csv).to include([sales_log_wrong_uprn.id.to_s, "2023-04-05", "purchaser code", "testy@example.com", "Address org", "123", "Some Place", nil, "Bristol", nil, "BS1 1AD"]) |
||||
expect(csv).to include([sales_log_not_imported.id.to_s, "2023-04-05", "purchaser code", "testy@example.com", "Address org", "123", "Some Place", nil, "Bristol", nil, "BS1 1AD"]) |
||||
end |
||||
end |
||||
|
||||
context "when the organisation does not have relevant sales logs" do |
||||
before do |
||||
sales_log = create(:sales_log, :completed) |
||||
sales_log.saledate = Time.zone.local(2022, 4, 5) |
||||
sales_log.save!(validate: false) |
||||
end |
||||
|
||||
it "returns only headers" do |
||||
csv = service.create_sales_addresses_csv |
||||
expect(csv).to eq("Log ID,Sale completion date,Purchaser code,Log owner,Owning organisation,UPRN,Address Line 1,Address Line 2 (optional),Town or City,County (optional),Property's postcode\n") |
||||
end |
||||
end |
||||
end |
||||
end |
Loading…
Reference in new issue