diff --git a/spec/services/csv/lettings_log_csv_service_spec.rb b/spec/services/csv/lettings_log_csv_service_spec.rb index d59aa4406..c5249811c 100644 --- a/spec/services/csv/lettings_log_csv_service_spec.rb +++ b/spec/services/csv/lettings_log_csv_service_spec.rb @@ -1,6 +1,16 @@ require "rails_helper" +require "rake" RSpec.describe Csv::LettingsLogCsvService do + subject(:task) { Rake::Task["data_import:add_variable_definitions"] } + + before do + Rake.application.rake_require("tasks/log_variable_definitions") + Rake::Task.define_task(:environment) + task.reenable + task.invoke("spec/fixtures/variable_definitions") + end + context "when downloading a csv" do let(:log) { create(:lettings_log) } let(:user) { create(:user, :support, email: "s.port@jeemayle.com") } @@ -9,15 +19,20 @@ RSpec.describe Csv::LettingsLogCsvService do let(:year) { 2024 } let(:csv) { CSV.parse(service.prepare_csv(LettingsLog.where(id: logs.map(&:id)))) } let(:logs) { [log] } - let(:headers) { csv.first } + let(:definition_headers) { csv.first } + let(:attribute_headers) { csv.second } it "returns a string" do result = service.prepare_csv(LettingsLog.all) expect(result).to be_a String end - it "returns a csv with headers" do - expect(csv.first.first).to eq "id" + it "returns a csv with definition headers on the first line" do + expect(csv.first.first).to eq "Log ID" + end + + it "returns a csv with attribute headers on the second line" do + expect(csv.second.first).to eq "id" end context "when stubbing :ordered_questions_for_year" do @@ -50,13 +65,13 @@ RSpec.describe Csv::LettingsLogCsvService do let(:question_ids) { %w[prevten startdate brent rent_type] } it "includes log attributes related to questions to the headers" do - expect(headers).to include(*question_ids.first(3)) + expect(attribute_headers).to include(*question_ids.first(3)) end it "removes some log attributes related to questions from the headers and replaces them with their derived values in the correct order" do - expect(headers).not_to include "rent_type" - expect(headers).to include(*%w[wrent renttype renttype_detail]) - expect(headers).not_to include("rent_type_detail") + expect(attribute_headers).not_to include "rent_type" + expect(attribute_headers).to include(*%w[wrent renttype renttype_detail]) + expect(attribute_headers).not_to include("rent_type_detail") end end @@ -70,23 +85,23 @@ RSpec.describe Csv::LettingsLogCsvService do it "does not add the id of the checkbox question to the headers" do question_ids = questions.map(&:id) - expect(headers).not_to include(*question_ids) + expect(attribute_headers).not_to include(*question_ids) end it "adds the related log attributes from the answer options to the headers" do log_attributes = questions.flat_map { |q| q.answer_options.keys } - expect(headers).to include(*log_attributes) + expect(attribute_headers).to include(*log_attributes) end end end it "adds log attributes not related to questions to the headers" do - expect(headers.first(5)).to eq %w[id status duplicate_set_id created_by assigned_to] + expect(attribute_headers.first(5)).to eq %w[id status duplicate_set_id created_by assigned_to] end it "adds attributes related to associated schemes and locations to the headers" do - expect(headers).to include(*%w[scheme_service_name scheme_confidential SCHTYPE scheme_registered_under_care_act]) - expect(headers.last(5)).to eq %w[location_units location_type_of_unit location_mobility_type location_local_authority location_startdate] + expect(attribute_headers).to include(*%w[scheme_service_name scheme_confidential SCHTYPE scheme_registered_under_care_act]) + expect(attribute_headers.last(5)).to eq %w[location_units location_type_of_unit location_mobility_type location_local_authority location_startdate] end context "when there are many logs" do @@ -94,7 +109,7 @@ RSpec.describe Csv::LettingsLogCsvService do let(:log_count) { 30 } it "creates a CSV with the correct number of logs" do - expected_row_count_with_headers = log_count + 1 + expected_row_count_with_headers = log_count + 2 expect(csv.size).to be expected_row_count_with_headers end end @@ -104,32 +119,32 @@ RSpec.describe Csv::LettingsLogCsvService do let(:log) { create(:lettings_log, :setup_completed, hhmemb: 2, details_known_2: 0, relat2: "P", age1: 35, la: "E09000003", duplicate_set_id: 12_312) } it "gives answer to radio questions as labels" do - relat2_column_index = csv.first.index("relat2") - relat2_value = csv.second[relat2_column_index] + relat2_column_index = csv.second.index("relat2") + relat2_value = csv.third[relat2_column_index] expect(relat2_value).to eq "Partner" end it "gives answers to free input questions as the user input" do - age1_column_index = csv.first.index("age1") - age1_value = csv.second[age1_column_index] + age1_column_index = csv.second.index("age1") + age1_value = csv.third[age1_column_index] expect(age1_value).to eq 35.to_s end it "exports the code for the local authority under the heading 'la'" do - la_column_index = csv.first.index("la") - la_value = csv.second[la_column_index] + la_column_index = csv.second.index("la") + la_value = csv.third[la_column_index] expect(la_value).to eq "E09000003" end it "exports the label for the local authority under the heading 'la_label'" do - la_label_column_index = csv.first.index("la_label") - la_label_value = csv.second[la_label_column_index] + la_label_column_index = csv.second.index("la_label") + la_label_value = csv.third[la_label_column_index] expect(la_label_value).to eq "Barnet" end it "exports the id for under the heading 'duplicate_set_id'" do - duplicate_set_id_column_index = csv.first.index("duplicate_set_id") - duplicate_set_id_value = csv.second[duplicate_set_id_column_index] + duplicate_set_id_column_index = csv.second.index("duplicate_set_id") + duplicate_set_id_value = csv.third[duplicate_set_id_column_index] expect(duplicate_set_id_value).to eq "12312" end end @@ -139,32 +154,32 @@ RSpec.describe Csv::LettingsLogCsvService do let(:log) { create(:lettings_log, :setup_completed, hhmemb: 2, details_known_2: 0, relat2: "P", age1: 35, la: "E09000003", duplicate_set_id: 12_312) } it "gives answer to radio questions as labels" do - relat2_column_index = csv.first.index("relat2") - relat2_value = csv.second[relat2_column_index] + relat2_column_index = csv.second.index("relat2") + relat2_value = csv.third[relat2_column_index] expect(relat2_value).to eq "P" end it "gives answers to free input questions as the user input" do - age1_column_index = csv.first.index("age1") - age1_value = csv.second[age1_column_index] + age1_column_index = csv.second.index("age1") + age1_value = csv.third[age1_column_index] expect(age1_value).to eq 35.to_s end it "exports the code for the local authority under the heading 'la'" do - la_column_index = csv.first.index("la") - la_value = csv.second[la_column_index] + la_column_index = csv.second.index("la") + la_value = csv.third[la_column_index] expect(la_value).to eq "E09000003" end it "exports the label for the local authority under the heading 'la_label'" do - la_label_column_index = csv.first.index("la_label") - la_label_value = csv.second[la_label_column_index] + la_label_column_index = csv.second.index("la_label") + la_label_value = csv.third[la_label_column_index] expect(la_label_value).to eq "Barnet" end it "exports the duplicate log reference under the heading 'duplicate_set_id'" do - duplicate_set_id_column_index = csv.first.index("duplicate_set_id") - duplicate_set_id_value = csv.second[duplicate_set_id_column_index] + duplicate_set_id_column_index = csv.second.index("duplicate_set_id") + duplicate_set_id_value = csv.third[duplicate_set_id_column_index] expect(duplicate_set_id_value).to eq "12312" end end @@ -173,7 +188,7 @@ RSpec.describe Csv::LettingsLogCsvService do let(:user) { create(:user, :data_coordinator, email: "choreographer@owtluk.com") } it "does not include certain attributes in the headers" do - expect(headers).not_to include(*%w[wrent wscharge wpschrge wsupchrg wtcharge]) + expect(attribute_headers).not_to include(*%w[wrent wscharge wpschrge wsupchrg wtcharge]) end end @@ -316,8 +331,8 @@ RSpec.describe Csv::LettingsLogCsvService do expected_content = CSV.read("spec/fixtures/files/lettings_log_csv_export_labels_24.csv") values_to_delete = %w[id] values_to_delete.each do |attribute| - index = csv.first.index(attribute) - csv.second[index] = nil + index = csv.second.index(attribute) + csv.third[index] = nil end expect(csv).to eq expected_content end @@ -330,8 +345,8 @@ RSpec.describe Csv::LettingsLogCsvService do expected_content = CSV.read("spec/fixtures/files/lettings_log_csv_export_non_support_labels_24.csv") values_to_delete = %w[id] values_to_delete.each do |attribute| - index = csv.first.index(attribute) - csv.second[index] = nil + index = csv.second.index(attribute) + csv.third[index] = nil end expect(csv).to eq expected_content end @@ -348,8 +363,8 @@ RSpec.describe Csv::LettingsLogCsvService do expected_content = CSV.read("spec/fixtures/files/lettings_log_csv_export_codes_24.csv") values_to_delete = %w[id] values_to_delete.each do |attribute| - index = csv.first.index(attribute) - csv.second[index] = nil + index = csv.second.index(attribute) + csv.third[index] = nil end expect(csv).to eq expected_content end @@ -362,8 +377,8 @@ RSpec.describe Csv::LettingsLogCsvService do expected_content = CSV.read("spec/fixtures/files/lettings_log_csv_export_non_support_codes_24.csv") values_to_delete = %w[id] values_to_delete.each do |attribute| - index = csv.first.index(attribute) - csv.second[index] = nil + index = csv.second.index(attribute) + csv.third[index] = nil end expect(csv).to eq expected_content end @@ -504,8 +519,8 @@ RSpec.describe Csv::LettingsLogCsvService do expected_content = CSV.read("spec/fixtures/files/lettings_log_csv_export_labels_23.csv") values_to_delete = %w[id] values_to_delete.each do |attribute| - index = csv.first.index(attribute) - csv.second[index] = nil + index = csv.second.index(attribute) + csv.third[index] = nil end expect(csv).to eq expected_content end @@ -518,8 +533,8 @@ RSpec.describe Csv::LettingsLogCsvService do expected_content = CSV.read("spec/fixtures/files/lettings_log_csv_export_non_support_labels_23.csv") values_to_delete = %w[id] values_to_delete.each do |attribute| - index = csv.first.index(attribute) - csv.second[index] = nil + index = csv.second.index(attribute) + csv.third[index] = nil end expect(csv).to eq expected_content end @@ -536,8 +551,8 @@ RSpec.describe Csv::LettingsLogCsvService do expected_content = CSV.read("spec/fixtures/files/lettings_log_csv_export_codes_23.csv") values_to_delete = %w[id] values_to_delete.each do |attribute| - index = csv.first.index(attribute) - csv.second[index] = nil + index = csv.second.index(attribute) + csv.third[index] = nil end expect(csv).to eq expected_content end @@ -550,8 +565,8 @@ RSpec.describe Csv::LettingsLogCsvService do expected_content = CSV.read("spec/fixtures/files/lettings_log_csv_export_non_support_codes_23.csv") values_to_delete = %w[id] values_to_delete.each do |attribute| - index = csv.first.index(attribute) - csv.second[index] = nil + index = csv.second.index(attribute) + csv.third[index] = nil end expect(csv).to eq expected_content end diff --git a/spec/services/csv/sales_log_csv_service_spec.rb b/spec/services/csv/sales_log_csv_service_spec.rb index f238db53c..cdccf8788 100644 --- a/spec/services/csv/sales_log_csv_service_spec.rb +++ b/spec/services/csv/sales_log_csv_service_spec.rb @@ -1,6 +1,8 @@ require "rails_helper" RSpec.describe Csv::SalesLogCsvService do + subject(:task) { Rake::Task["data_import:add_variable_definitions"] } + let(:form_handler_mock) { instance_double(FormHandler) } let(:organisation) { create(:organisation) } let(:fixed_time) { now } @@ -37,11 +39,18 @@ RSpec.describe Csv::SalesLogCsvService do let(:service) { described_class.new(user:, export_type: "labels", year:) } let(:csv) { CSV.parse(service.prepare_csv(SalesLog.all)) } let(:year) { 2024 } + let(:definition_headers) { csv.first } + let(:attribute_headers) { csv.second } + before do Timecop.freeze(now) Singleton.__init__(FormHandler) log + Rake.application.rake_require("tasks/log_variable_definitions") + Rake::Task.define_task(:environment) + task.reenable + task.invoke("spec/fixtures/variable_definitions") end after do @@ -53,8 +62,12 @@ RSpec.describe Csv::SalesLogCsvService do expect(result).to be_a String end - it "returns a csv with headers" do - expect(csv.first.first).to eq "ID" + it "returns a csv with definition headers on first line" do + expect(definition_headers.first).to eq "Log ID" + end + + it "returns a csv with attribute headers on second line" do + expect(attribute_headers.first).to eq "ID" end context "when stubbing :ordered_questions_for_year" do @@ -85,14 +98,14 @@ RSpec.describe Csv::SalesLogCsvService do let(:question_ids) { %w[type age1 buy1livein exdate] } it "includes log attributes related to questions to the headers" do - headers = csv.first - expect(headers).to include(*%w[TYPE AGE1 LIVEINBUYER1]) + attribute_headers_before_2023 = csv.first + expect(attribute_headers_before_2023).to include(*%w[TYPE AGE1 LIVEINBUYER1]) end it "removes some log attributes related to questions from the headers and replaces them with their derived values in the correct order" do - headers = csv.first - expect(headers).not_to include "EXDATE" - expect(headers.last(4)).to eq %w[LIVEINBUYER1 EXDAY EXMONTH EXYEAR] + attribute_headers_before_2023 = csv.first + expect(attribute_headers_before_2023).not_to include "EXDATE" + expect(attribute_headers_before_2023.last(4)).to eq %w[LIVEINBUYER1 EXDAY EXMONTH EXYEAR] end end @@ -109,28 +122,27 @@ RSpec.describe Csv::SalesLogCsvService do end it "does not add questions for checks, whether some other attribute is known or whether something else was asked" do - headers = csv.first - expect(headers).not_to include "attribute_value_check" - expect(headers).not_to include "something_or_other_known" - expect(headers).not_to include "whatchamacallit_asked" + attribute_headers_before_2023 = csv.first + expect(attribute_headers_before_2023).not_to include "attribute_value_check" + expect(attribute_headers_before_2023).not_to include "something_or_other_known" + expect(attribute_headers_before_2023).not_to include "whatchamacallit_asked" end it "does not add the id of checkbox questions, but adds the related attributes of the log in the correct order" do - headers = csv.first - expect(headers.last(4)).to eq %w[OWNERSHIP PREGYRHA PREGOTHER TYPE] + attribute_headers_before_2023 = csv.first + expect(attribute_headers_before_2023.last(4)).to eq %w[OWNERSHIP PREGYRHA PREGOTHER TYPE] end end end it "includes attributes not related to questions to the headers" do - headers = csv.first - expect(headers).to include(*%w[ID STATUS CREATEDDATE UPLOADDATE]) + expect(attribute_headers).to include(*%w[ID STATUS CREATEDDATE UPLOADDATE]) end it "returns a csv with the correct number of logs" do create_list(:sales_log, 15) log_count = SalesLog.count - expected_row_count_with_headers = log_count + 1 + expected_row_count_with_headers = log_count + 2 expect(csv.size).to be expected_row_count_with_headers end @@ -140,36 +152,36 @@ RSpec.describe Csv::SalesLogCsvService do let(:now) { fixed_time } it "gives answers to radio questions as their labels" do - national_column_index = csv.first.index("NATIONAL") - national_value = csv.second[national_column_index] + national_column_index = csv.second.index("NATIONAL") + national_value = csv.third[national_column_index] expect(national_value).to eq "United Kingdom" - relat2_column_index = csv.first.index("RELAT2") - relat2_value = csv.second[relat2_column_index] + relat2_column_index = csv.second.index("RELAT2") + relat2_value = csv.third[relat2_column_index] expect(relat2_value).to eq "Partner" end it "gives answers to free input questions as the user input" do - age1_column_index = csv.first.index("AGE1") - age1_value = csv.second[age1_column_index] + age1_column_index = csv.second.index("AGE1") + age1_value = csv.third[age1_column_index] expect(age1_value).to eq 30.to_s postcode_part1, postcode_part2 = log.postcode_full.split - postcode_part1_column_index = csv.first.index("PCODE1") - postcode_part1_value = csv.second[postcode_part1_column_index] + postcode_part1_column_index = csv.second.index("PCODE1") + postcode_part1_value = csv.third[postcode_part1_column_index] expect(postcode_part1_value).to eq postcode_part1 - postcode_part2_column_index = csv.first.index("PCODE2") - postcode_part2_value = csv.second[postcode_part2_column_index] + postcode_part2_column_index = csv.second.index("PCODE2") + postcode_part2_value = csv.third[postcode_part2_column_index] expect(postcode_part2_value).to eq postcode_part2 end it "exports the code for the local authority under the heading 'la'" do - la_column_index = csv.first.index("LA") - la_value = csv.second[la_column_index] + la_column_index = csv.second.index("LA") + la_value = csv.third[la_column_index] expect(la_value).to eq "E09000033" end it "exports the label for the local authority under the heading 'la_label'" do - la_label_column_index = csv.first.index("LANAME") - la_label_value = csv.second[la_label_column_index] + la_label_column_index = csv.second.index("LANAME") + la_label_value = csv.third[la_label_column_index] expect(la_label_value).to eq "Westminster" end @@ -186,8 +198,8 @@ RSpec.describe Csv::SalesLogCsvService do expected_content = CSV.read("spec/fixtures/files/sales_logs_csv_export_labels_24.csv") values_to_delete = %w[ID] values_to_delete.each do |attribute| - index = csv.first.index(attribute) - csv.second[index] = nil + index = csv.second.index(attribute) + csv.third[index] = nil end expect(csv).to eq expected_content end @@ -201,8 +213,8 @@ RSpec.describe Csv::SalesLogCsvService do expected_content = CSV.read("spec/fixtures/files/sales_logs_csv_export_labels_23.csv") values_to_delete = %w[ID] values_to_delete.each do |attribute| - index = csv.first.index(attribute) - csv.second[index] = nil + index = csv.second.index(attribute) + csv.third[index] = nil end expect(csv).to eq expected_content end @@ -214,8 +226,8 @@ RSpec.describe Csv::SalesLogCsvService do end it "exports the id for under the heading 'duplicate_set_id'" do - duplicate_set_id_column_index = csv.first.index("DUPLICATESET") - duplicate_set_id_value = csv.second[duplicate_set_id_column_index] + duplicate_set_id_column_index = csv.second.index("DUPLICATESET") + duplicate_set_id_value = csv.third[duplicate_set_id_column_index] expect(duplicate_set_id_value).to eq "12312" end end @@ -228,36 +240,36 @@ RSpec.describe Csv::SalesLogCsvService do let(:now) { fixed_time } it "gives answers to radio questions as their codes" do - national_column_index = csv.first.index("NATIONAL") - national_value = csv.second[national_column_index] + national_column_index = csv.second.index("NATIONAL") + national_value = csv.third[national_column_index] expect(national_value).to eq 18.to_s - relat2_column_index = csv.first.index("RELAT2") - relat2_value = csv.second[relat2_column_index] + relat2_column_index = csv.second.index("RELAT2") + relat2_value = csv.third[relat2_column_index] expect(relat2_value).to eq "P" end it "gives answers to free input questions as the user input" do - age1_column_index = csv.first.index("AGE1") - age1_value = csv.second[age1_column_index] + age1_column_index = csv.second.index("AGE1") + age1_value = csv.third[age1_column_index] expect(age1_value).to eq 30.to_s postcode_part1, postcode_part2 = log.postcode_full.split - postcode_part1_column_index = csv.first.index("PCODE1") - postcode_part1_value = csv.second[postcode_part1_column_index] + postcode_part1_column_index = csv.second.index("PCODE1") + postcode_part1_value = csv.third[postcode_part1_column_index] expect(postcode_part1_value).to eq postcode_part1 - postcode_part2_column_index = csv.first.index("PCODE2") - postcode_part2_value = csv.second[postcode_part2_column_index] + postcode_part2_column_index = csv.second.index("PCODE2") + postcode_part2_value = csv.third[postcode_part2_column_index] expect(postcode_part2_value).to eq postcode_part2 end it "exports the code for the local authority under the heading 'la'" do - la_column_index = csv.first.index("LA") - la_value = csv.second[la_column_index] + la_column_index = csv.second.index("LA") + la_value = csv.third[la_column_index] expect(la_value).to eq "E09000033" end it "exports the label for the local authority under the heading 'la_label'" do - la_label_column_index = csv.first.index("LANAME") - la_label_value = csv.second[la_label_column_index] + la_label_column_index = csv.second.index("LANAME") + la_label_value = csv.third[la_label_column_index] expect(la_label_value).to eq "Westminster" end @@ -270,8 +282,8 @@ RSpec.describe Csv::SalesLogCsvService do expected_content = CSV.read("spec/fixtures/files/sales_logs_csv_export_codes_24.csv") values_to_delete = %w[ID] values_to_delete.each do |attribute| - index = csv.first.index(attribute) - csv.second[index] = nil + index = csv.second.index(attribute) + csv.third[index] = nil end expect(csv).to eq expected_content end @@ -285,8 +297,8 @@ RSpec.describe Csv::SalesLogCsvService do expected_content = CSV.read("spec/fixtures/files/sales_logs_csv_export_codes_23.csv") values_to_delete = %w[ID] values_to_delete.each do |attribute| - index = csv.first.index(attribute) - csv.second[index] = nil + index = csv.second.index(attribute) + csv.third[index] = nil end expect(csv).to eq expected_content end @@ -298,8 +310,8 @@ RSpec.describe Csv::SalesLogCsvService do end it "exports the id for under the heading 'duplicate_set_id'" do - duplicate_set_id_column_index = csv.first.index("DUPLICATESET") - duplicate_set_id_value = csv.second[duplicate_set_id_column_index] + duplicate_set_id_column_index = csv.second.index("DUPLICATESET") + duplicate_set_id_value = csv.third[duplicate_set_id_column_index] expect(duplicate_set_id_value).to eq "12312" end end @@ -307,10 +319,9 @@ RSpec.describe Csv::SalesLogCsvService do context "when the user is not a support user" do let(:user) { create(:user, email: "billyboy@eyeklaud.com") } - let(:headers) { csv.first } it "does not include certain attributes in the headers" do - expect(headers).not_to include(*%w[address_line1_as_entered address_line2_as_entered town_or_city_as_entered county_as_entered postcode_full_as_entered la_as_entered created_by value_value_check monthly_charges_value_check]) + expect(attribute_headers).not_to include(*%w[address_line1_as_entered address_line2_as_entered town_or_city_as_entered county_as_entered postcode_full_as_entered la_as_entered created_by value_value_check monthly_charges_value_check]) end context "and the requested form is 2024" do @@ -329,8 +340,8 @@ RSpec.describe Csv::SalesLogCsvService do expected_content = CSV.read("spec/fixtures/files/sales_logs_csv_export_non_support_labels_24.csv") values_to_delete = %w[id] values_to_delete.each do |attribute| - index = csv.first.index(attribute) - csv.second[index] = nil + index = csv.second.index(attribute) + csv.third[index] = nil end expect(csv).to eq expected_content end