Browse Source

Refactor lettings validator_spec

pull/2509/head
Rachael Booth 2 years ago
parent
commit
0d389eaf8e
  1. 97
      spec/services/bulk_upload/lettings/validator_spec.rb
  2. 58
      spec/support/bulk_upload/lettings_log_to_csv.rb

97
spec/services/bulk_upload/lettings/validator_spec.rb

@ -5,8 +5,9 @@ RSpec.describe BulkUpload::Lettings::Validator do
let(:organisation) { create(:organisation, old_visible_id: "3", rent_periods: [2]) }
let(:user) { create(:user, organisation:) }
let(:log) { build(:lettings_log, :completed, renttype: 1, period: 2, assigned_to: user, owning_organisation: organisation, managing_organisation: organisation) }
let(:bulk_upload) { create(:bulk_upload, user:, year: 2024) }
let(:log) { build(:lettings_log, :completed, period: 2, assigned_to: user) }
let(:log_to_csv) { BulkUpload::LettingsLogToCsv.new(log:) }
let(:bulk_upload) { create(:bulk_upload, user:, year: log.collection_start_year) }
let(:path) { file.path }
let(:file) { Tempfile.new }
@ -21,9 +22,8 @@ RSpec.describe BulkUpload::Lettings::Validator do
context "and file has extra invalid headers" do
let(:seed) { rand }
let(:log_to_csv) { BulkUpload::LettingsLogToCsv.new(log:) }
let(:field_numbers) { log_to_csv.default_2024_field_numbers + %w[invalid_field_number] }
let(:field_values) { log_to_csv.to_2024_row + %w[value_for_invalid_field_number] }
let(:field_numbers) { log_to_csv.default_field_numbers + %w[invalid_field_number] }
let(:field_values) { log_to_csv.to_row + %w[value_for_invalid_field_number] }
before do
file.write(log_to_csv.custom_field_numbers_row(seed:, field_numbers:))
@ -38,9 +38,8 @@ RSpec.describe BulkUpload::Lettings::Validator do
context "and file has too few valid headers" do
let(:seed) { rand }
let(:log_to_csv) { BulkUpload::LettingsLogToCsv.new(log:) }
let(:field_numbers) { log_to_csv.default_2024_field_numbers }
let(:field_values) { log_to_csv.to_2024_row }
let(:field_numbers) { log_to_csv.default_field_numbers }
let(:field_values) { log_to_csv.to_row }
before do
field_numbers.delete_at(20)
@ -58,9 +57,8 @@ RSpec.describe BulkUpload::Lettings::Validator do
context "and file has too many valid headers" do
let(:seed) { rand }
let(:log_to_csv) { BulkUpload::LettingsLogToCsv.new(log:) }
let(:field_numbers) { log_to_csv.default_2024_field_numbers + %w[23] }
let(:field_values) { log_to_csv.to_2024_row + %w[value] }
let(:field_numbers) { log_to_csv.default_field_numbers + %w[23] }
let(:field_values) { log_to_csv.to_row + %w[value] }
before do
file.write(log_to_csv.custom_field_numbers_row(seed:, field_numbers:))
@ -77,10 +75,10 @@ RSpec.describe BulkUpload::Lettings::Validator do
context "when uploading a 2023 logs for 2024 bulk upload" do
let(:log) { build(:lettings_log, :completed, startdate: Time.zone.local(2023, 5, 6), tenancycode: "5234234234234") }
let(:bulk_upload) { build(:bulk_upload, user:, year: 2024)}
context "with headers" do
let(:seed) { rand }
let(:log_to_csv) { BulkUpload::LettingsLogToCsv.new(log:) }
let(:field_numbers) { log_to_csv.default_2024_field_numbers }
let(:field_values) { log_to_csv.to_2024_row }
@ -100,7 +98,7 @@ RSpec.describe BulkUpload::Lettings::Validator do
describe "#call" do
context "with an invalid 2024 csv" do
let(:log_to_csv) { BulkUpload::LettingsLogToCsv.new(log:) }
let(:log) { build(:lettings_log, :completed, startdate: Time.zone.local(2024, 7, 1), period: 2, assigned_to: user) }
before do
values = log_to_csv.to_2024_row
@ -129,12 +127,10 @@ RSpec.describe BulkUpload::Lettings::Validator do
end
end
context "with a valid 2024 csv" do
let(:log_to_csv) { BulkUpload::LettingsLogToCsv.new(log:) }
context "with a valid csv" do
before do
file.write(log_to_csv.default_2024_field_numbers_row)
file.write(log_to_csv.to_2024_csv_row)
file.write(log_to_csv.default_field_numbers_row)
file.write(log_to_csv.to_csv_row)
file.rewind
end
@ -145,11 +141,11 @@ RSpec.describe BulkUpload::Lettings::Validator do
context "with arbitrary ordered invalid csv" do
let(:seed) { 321 }
let(:log_to_csv) { BulkUpload::LettingsLogToCsv.new(log:) }
let(:log) { build(:lettings_log, :completed, startdate: Time.zone.local(2024, 7, 1), period: 2, assigned_to: user) }
before do
log.needstype = nil
values = log_to_csv.to_2024_row
values[3] = nil
file.write(log_to_csv.default_2024_field_numbers_row(seed:))
file.write(log_to_csv.to_custom_csv_row(seed:, field_values: values))
file.close
@ -175,14 +171,10 @@ RSpec.describe BulkUpload::Lettings::Validator do
end
context "when duplicate rows present" do
let(:file) { Tempfile.new }
let(:path) { file.path }
let(:log) { build(:lettings_log, :completed) }
before do
file.write(BulkUpload::LettingsLogToCsv.new(log:, line_ending: "\r\n").default_2024_field_numbers_row)
file.write(BulkUpload::LettingsLogToCsv.new(log:, line_ending: "\r\n").to_2024_csv_row)
file.write(BulkUpload::LettingsLogToCsv.new(log:, line_ending: "\r\n").to_2024_csv_row)
file.write(log_to_csv.default_field_numbers_row)
file.write(log_to_csv.to_csv_row)
file.write(log_to_csv.to_csv_row)
file.close
end
@ -196,12 +188,12 @@ RSpec.describe BulkUpload::Lettings::Validator do
{ line_ending: "\r\n", name: "windows" },
].each do |test_case|
context "with #{test_case[:name]} line endings" do
context "with a valid file" do
let(:log_to_csv) { BulkUpload::LettingsLogToCsv.new(log:, line_ending: test_case[:line_ending]) }
let(:log_to_csv) { BulkUpload::LettingsLogToCsv.new(log:, line_ending: test_case[:line_ending]) }
context "with a valid file" do
before do
file.write(log_to_csv.default_2024_field_numbers_row)
file.write(log_to_csv.to_2024_csv_row)
file.write(log_to_csv.default_field_numbers_row)
file.write(log_to_csv.to_csv_row)
file.rewind
end
@ -212,11 +204,10 @@ RSpec.describe BulkUpload::Lettings::Validator do
context "with an invalid file" do
let(:log) { build(:lettings_log, :completed, assigned_to: user, owning_organisation: organisation, managing_organisation: organisation, declaration: nil) }
let(:log_to_csv) { BulkUpload::LettingsLogToCsv.new(log:, line_ending: test_case[:line_ending]) }
before do
file.write(log_to_csv.default_2024_field_numbers_row)
file.write(log_to_csv.to_2024_csv_row)
file.write(log_to_csv.default_field_numbers_row)
file.write(log_to_csv.to_csv_row)
file.rewind
end
@ -227,13 +218,11 @@ RSpec.describe BulkUpload::Lettings::Validator do
end
end
context "without headers" do
let(:log) { build(:lettings_log, :completed) }
let(:file) { Tempfile.new }
let(:path) { file.path }
context "with a 2024 csv without headers" do
let(:log) { build(:lettings_log, :completed, startdate: Time.zone.local(2024, 7, 1), period: 2, assigned_to: user) }
before do
file.write(BulkUpload::LettingsLogToCsv.new(log:, line_ending: "\r\n", col_offset: 0).to_2024_csv_row)
file.write(log_to_csv.to_csv_row)
file.close
end
@ -244,29 +233,29 @@ RSpec.describe BulkUpload::Lettings::Validator do
end
describe "#create_logs?" do
context "when a log is not valid?" do
let(:log_1) { build(:lettings_log, :completed, assigned_to: user) }
let(:log_2) { build(:lettings_log, :completed, assigned_to: user) }
context "when a log has a clearable, non-setup error" do
let(:log_1) { build(:lettings_log, :completed, period: 2, assigned_to: user) }
let(:log_2) { build(:lettings_log, :completed, period: 2, assigned_to: user) }
before do
file.write(BulkUpload::LettingsLogToCsv.new(log: log_1, line_ending: "\r\n", col_offset: 0).to_2024_csv_row)
file.write(BulkUpload::LettingsLogToCsv.new(log: log_2, line_ending: "\r\n", col_offset: 0, overrides: { illness: 100 }).to_2024_csv_row)
file.write(BulkUpload::LettingsLogToCsv.new(log: log_1, col_offset: 0).to_csv_row)
file.write(BulkUpload::LettingsLogToCsv.new(log: log_2, col_offset: 0, overrides: { age1: 5 }).to_csv_row)
file.close
end
it "returns false" do
validator.call
expect(validator).not_to be_create_logs
expect(validator).to be_create_logs
end
end
context "when all logs valid?" do
let(:log_1) { build(:lettings_log, :completed, renttype: 1, assigned_to: user) }
let(:log_2) { build(:lettings_log, :completed, renttype: 1, assigned_to: user) }
let(:log_1) { build(:lettings_log, :completed, period: 2, assigned_to: user) }
let(:log_2) { build(:lettings_log, :completed, period: 2, assigned_to: user) }
before do
file.write(BulkUpload::LettingsLogToCsv.new(log: log_1, line_ending: "\r\n", col_offset: 0).to_2024_csv_row)
file.write(BulkUpload::LettingsLogToCsv.new(log: log_2, line_ending: "\r\n", col_offset: 0).to_2024_csv_row)
file.write(BulkUpload::LettingsLogToCsv.new(log: log_1, col_offset: 0).to_csv_row)
file.write(BulkUpload::LettingsLogToCsv.new(log: log_2, col_offset: 0).to_csv_row)
file.close
end
@ -276,13 +265,13 @@ RSpec.describe BulkUpload::Lettings::Validator do
end
end
context "when a single log wants to block log creation" do
context "when a log wants to block log creation" do
let(:unaffiliated_org) { create(:organisation) }
let(:log_1) { build(:lettings_log, :completed, renttype: 1, assigned_to: user, owning_organisation: unaffiliated_org) }
let(:log) { build(:lettings_log, :completed, assigned_to: user, owning_organisation: unaffiliated_org) }
before do
file.write(BulkUpload::LettingsLogToCsv.new(log: log_1, line_ending: "\r\n", col_offset: 0).to_2024_csv_row)
file.write(log_to_csv.to_csv_row)
file.close
end
@ -293,10 +282,10 @@ RSpec.describe BulkUpload::Lettings::Validator do
end
context "when a log has incomplete setup section" do
let(:log) { build(:lettings_log, :completed, renttype: 1, declaration: nil, assigned_to: user) }
let(:log) { build(:lettings_log, :completed, declaration: nil, assigned_to: user) }
before do
file.write(BulkUpload::LettingsLogToCsv.new(log:, line_ending: "\r\n", col_offset: 0).to_2024_csv_row)
file.write(log_to_csv.to_csv_row)
file.close
end

58
spec/support/bulk_upload/lettings_log_to_csv.rb

@ -12,6 +12,62 @@ class BulkUpload::LettingsLogToCsv
[nil] * col_offset
end
def to_csv_row(seed: nil)
year = log.collection_start_year
case year
when 2022
to_2022_csv_row(seed:)
when 2023
to_2023_csv_row(seed:)
when 2024
to_2024_csv_row(seed:)
else
raise NotImplementedError "No mapping function implemented for year #{year}"
end
end
def to_row
year = log.collection_start_year
case year
when 2022
to_2022_row
when 2023
to_2023_row
when 2024
to_2024_row
else
raise NotImplementedError "No mapping function implemented for year #{year}"
end
end
def default_field_numbers_row(seed: nil)
year = log.collection_start_year
case year
when 2022
default_2022_field_numbers_row(seed:)
when 2023
default_2023_field_numbers_row(seed:)
when 2024
default_2024_field_numbers_row(seed:)
else
raise NotImplementedError "No mapping function implemented for year #{year}"
end
end
def default_field_numbers
year = log.collection_start_year
case year
when 2022
default_2022_field_numbers
when 2023
default_2023_field_numbers
when 2024
default_2024_field_numbers
else
raise NotImplementedError "No mapping function implemented for year #{year}"
end
end
def to_2022_csv_row(seed: nil)
if seed
row = to_2022_row.shuffle(random: Random.new(seed))
@ -421,7 +477,7 @@ private
end
def rent_type
case log.renttype
case log.rent_type
when LettingsLog::RENT_TYPE[:social_rent]
1
when LettingsLog::RENT_TYPE[:affordable_rent]

Loading…
Cancel
Save