From 1f2fae4dfedf64c95ab628c206b0f17c703ac414 Mon Sep 17 00:00:00 2001 From: Phil Lee Date: Tue, 16 May 2023 12:03:45 +0100 Subject: [PATCH] add validations --- .../bulk_upload/sales/year2022/row_parser.rb | 77 ++++++++++++- config/locales/en.yml | 2 + .../sales/year2022/row_parser_spec.rb | 102 ++++++++++++++++-- 3 files changed, 166 insertions(+), 15 deletions(-) diff --git a/app/services/bulk_upload/sales/year2022/row_parser.rb b/app/services/bulk_upload/sales/year2022/row_parser.rb index b8f524ffe..de3e5bb2b 100644 --- a/app/services/bulk_upload/sales/year2022/row_parser.rb +++ b/app/services/bulk_upload/sales/year2022/row_parser.rb @@ -265,14 +265,71 @@ class BulkUpload::Sales::Year2022::RowParser validates :field_4, presence: { message: I18n.t("validations.not_answered", question: "sale completion date (year)"), category: :setup }, on: :after_log validates :field_4, format: { with: /\A\d{2}\z/, message: I18n.t("validations.setup.saledate.year_not_two_digits") }, on: :after_log + validates :field_57, + inclusion: { + in: [2, 16, 18, 24, 28, 30, 31], + category: :setup, + question: QUESTIONS[:field_57].downcase, + }, + if: proc { field_57.present? && shared_ownership? }, + on: :before_log + + validates :field_57, + presence: { + message: I18n.t("validations.not_answered", question: "shared ownership type"), + }, + if: :shared_ownership?, + on: :after_log + + validates :field_76, + inclusion: { + in: [8, 14, 27, 9, 29, 21, 22], + category: :setup, + question: QUESTIONS[:field_76].downcase, + }, + if: proc { field_76.present? && discounted_ownership? }, + on: :before_log + + validates :field_76, + presence: { + message: I18n.t("validations.not_answered", question: "shared ownership type"), + }, + if: :discounted_ownership?, + on: :after_log + + validates :field_84, + inclusion: { + in: [10, 12], + category: :setup, + question: QUESTIONS[:field_84].downcase, + }, + if: proc { field_84.present? && outright_sale? }, + on: :before_log + + validates :field_84, + presence: { + message: I18n.t("validations.not_answered", question: "shared ownership type"), + }, + if: :outright_sale?, + on: :after_log + + validates :field_85, + presence: { + message: I18n.t("validations.not_answered", question: "type of outright sale"), + category: :setup, + }, + if: proc { field_84 == 12 }, + on: :after_log + + validates :field_109, presence: { message: I18n.t("validations.not_answered", question: "more than 2 buyers"), category: :setup }, if: :joint_purchase?, on: :after_log + validates :field_113, presence: { message: I18n.t("validations.not_answered", question: "ownership type"), category: :setup }, on: :after_log - validates :field_57, presence: { message: I18n.t("validations.not_answered", question: "shared ownership type"), category: :setup }, if: :shared_ownership?, on: :after_log - validates :field_76, presence: { message: I18n.t("validations.not_answered", question: "shared ownership type"), category: :setup }, if: :discounted_ownership?, on: :after_log - validates :field_84, presence: { message: I18n.t("validations.not_answered", question: "shared ownership type"), category: :setup }, if: :outright_sale?, on: :after_log + + validates :field_114, presence: { message: I18n.t("validations.not_answered", question: "company buyer"), category: :setup }, if: :outright_sale?, on: :after_log + validates :field_115, presence: { message: I18n.t("validations.not_answered", question: "will the buyers live in the property"), category: :setup }, if: :outright_sale?, on: :after_log + validates :field_116, presence: { message: I18n.t("validations.not_answered", question: "joint purchase"), category: :setup }, if: :joint_purchase_asked?, on: :after_log - validates :field_114, presence: { message: I18n.t("validations.not_answered", question: "company buyer"), category: :setup }, if: :outright_sale?, on: :after_log - validates :field_109, presence: { message: I18n.t("validations.not_answered", question: "more than 2 buyers"), category: :setup }, if: :joint_purchase?, on: :after_log validate :validate_buyer1_economic_status, on: :before_log validate :validate_nulls, on: :after_log @@ -288,6 +345,8 @@ class BulkUpload::Sales::Year2022::RowParser validate :validate_incomplete_soft_validations, on: :after_log validate :validate_if_log_already_exists, on: :after_log, if: -> { FeatureToggle.bulk_upload_duplicate_log_check_enabled? } + validate :validate_data_protection_answered, on: :after_log + def self.question_for_field(field) QUESTIONS[field] end @@ -351,6 +410,12 @@ class BulkUpload::Sales::Year2022::RowParser private + def validate_data_protection_answered + unless field_112 == 1 + errors.add(:field_112, I18n.t("validations.not_answered", question: QUESTIONS[:field_112].downcase), category: :setup) + end + end + def buyer_not_interviewed? field_6 == 1 end @@ -957,6 +1022,8 @@ private def validate_valid_radio_option log.attributes.each do |question_id, _v| + next if question_id == "type" + question = log.form.get_question(question_id, log) next unless question&.type == "radio" diff --git a/config/locales/en.yml b/config/locales/en.yml index 18251468d..64bc5687f 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -41,6 +41,8 @@ en: activemodel: errors: models: + bulk_upload/sales/year2022/row_parser: + inclusion: Enter a valid value for %{question} bulk_upload/sales/year2023/row_parser: inclusion: Enter a valid value for %{question} bulk_upload/lettings/validator: diff --git a/spec/services/bulk_upload/sales/year2022/row_parser_spec.rb b/spec/services/bulk_upload/sales/year2022/row_parser_spec.rb index 4420e33ff..0d326d015 100644 --- a/spec/services/bulk_upload/sales/year2022/row_parser_spec.rb +++ b/spec/services/bulk_upload/sales/year2022/row_parser_spec.rb @@ -198,7 +198,7 @@ RSpec.describe BulkUpload::Sales::Year2022::RowParser do it "has errors on correct setup fields" do errors = parser.errors.select { |e| e.options[:category] == :setup }.map(&:attribute) - expect(errors).to eql(%i[field_2 field_3 field_4 field_113 field_92]) + expect(errors).to eql(%i[field_2 field_3 field_4 field_113 field_92 field_112]) end end @@ -214,7 +214,7 @@ RSpec.describe BulkUpload::Sales::Year2022::RowParser do it "has errors on correct setup fields" do errors = parser.errors.select { |e| e.options[:category] == :setup }.map(&:attribute) - expect(errors).to eql(%i[field_2 field_3 field_4 field_57 field_116 field_92]) + expect(errors).to eql(%i[field_2 field_3 field_4 field_57 field_116 field_92 field_112]) end end @@ -232,7 +232,7 @@ RSpec.describe BulkUpload::Sales::Year2022::RowParser do it "has errors on correct setup fields" do errors = parser.errors.select { |e| e.options[:category] == :setup }.map(&:attribute) - expect(errors).to eql(%i[field_2 field_3 field_4 field_109 field_92]) + expect(errors).to eql(%i[field_2 field_3 field_4 field_109 field_92 field_112]) end end @@ -248,7 +248,7 @@ RSpec.describe BulkUpload::Sales::Year2022::RowParser do it "has errors on correct setup fields" do errors = parser.errors.select { |e| e.options[:category] == :setup }.map(&:attribute) - expect(errors).to eql(%i[field_2 field_3 field_4 field_76 field_116 field_92]) + expect(errors).to eql(%i[field_2 field_3 field_4 field_76 field_116 field_92 field_112]) end end @@ -266,7 +266,7 @@ RSpec.describe BulkUpload::Sales::Year2022::RowParser do it "has errors on correct setup fields" do errors = parser.errors.select { |e| e.options[:category] == :setup }.map(&:attribute) - expect(errors).to eql(%i[field_2 field_3 field_4 field_109 field_92]) + expect(errors).to eql(%i[field_2 field_3 field_4 field_109 field_92 field_112]) end end @@ -280,9 +280,10 @@ RSpec.describe BulkUpload::Sales::Year2022::RowParser do end it "has errors on correct setup fields" do - errors = parser.errors.select { |e| e.options[:category] == :setup }.map(&:attribute) + errors = parser.errors.select { |e| e.options[:category] == :setup }.map(&:attribute).sort expect(errors).to eql(%i[field_2 field_3 field_4 field_84 field_115 field_114 field_92]) + expect(errors).to eql(%i[field_2 field_3 field_4 field_84 field_114 field_92 field_112]) end end @@ -291,22 +292,23 @@ RSpec.describe BulkUpload::Sales::Year2022::RowParser do { bulk_upload:, field_1: "test id", - field_113: "3", field_84: "12", + field_85: "other sale type", + field_113: "3", field_114: "2", } end it "has errors on correct setup fields" do - errors = parser.errors.select { |e| e.options[:category] == :setup }.map(&:attribute) + errors = parser.errors.select { |e| e.options[:category] == :setup }.map(&:attribute).sort - expect(errors).to eql(%i[field_2 field_3 field_4 field_115 field_116 field_92]) + expect(errors).to eql(%i[field_2 field_3 field_4 field_115 field_116 field_92 field_112].sort) end end describe "#field_57" do # type of shared ownership scheme context "when an invalid option" do - let(:attributes) { setup_section_params.merge({ field_57: "100" }) } + let(:attributes) { setup_section_params.merge(field_57: "100", field_113: "1") } it "returns setup error" do expect(parser.errors.where(:field_57, category: :setup).map(&:message)).to eql(["Enter a valid value for what is the type of shared ownership sale?"]) @@ -314,6 +316,36 @@ RSpec.describe BulkUpload::Sales::Year2022::RowParser do end end + describe "#field_76" do # type of discounted ownership scheme + context "when an invalid option" do + let(:attributes) { setup_section_params.merge({ field_76: "100", field_113: "2" }) } + + it "returns setup error" do + expect(parser.errors.where(:field_76, category: :setup).map(&:message)).to eql(["Enter a valid value for what is the type of discounted ownership sale?"]) + end + end + end + + describe "#field_84" do # type of outright sale + context "when an invalid option" do + let(:attributes) { setup_section_params.merge({ field_84: "100", field_113: "3" }) } + + it "returns setup error" do + expect(parser.errors.where(:field_84, category: :setup).map(&:message)).to eql(["Enter a valid value for what is the type of outright sale?"]) + end + end + end + + describe "#field_85" do # type of other outright sale + context "when cant be blank" do + let(:attributes) { setup_section_params.merge({ field_85: nil, field_84: "12" }) } + + it "returns setup error" do + expect(parser.errors.where(:field_85, category: :setup).map(&:message)).to eql(["You must answer type of outright sale"]) + end + end + end + describe "#field_92" do # owning org context "when no data given" do let(:attributes) { { bulk_upload:, field_92: "" } } @@ -461,6 +493,26 @@ RSpec.describe BulkUpload::Sales::Year2022::RowParser do end end + describe "#field_109" do # more that 2 joint purchasers? + context "when an invalid option" do + let(:attributes) { setup_section_params.merge({ field_109: "100", field_116: "1" }) } + + it "returns setup error" do + expect(parser.errors.where(:field_109, category: :setup).map(&:message)).to eql(["Enter a valid value for are there more than two joint purchasers of this property?"]) + end + end + end + + describe "#field_112" do # data protection + context "when not accepted" do + let(:attributes) { setup_section_params.merge(field_112: nil) } + + it "returns setup error" do + expect(parser.errors.where(:field_112, category: :setup).map(&:message)).to eql(["You must answer data protection question"]) + end + end + end + describe "#field_113" do # purchase made thru ownership scheme? context "when an invalid option" do let(:attributes) { setup_section_params.merge({ field_113: "100" }) } @@ -471,6 +523,36 @@ RSpec.describe BulkUpload::Sales::Year2022::RowParser do end end + describe "#field_114" do # is buyer a company? + context "when an invalid option" do + let(:attributes) { setup_section_params.merge({ field_114: "100", field_113: "3" }) } + + it "returns setup error" do + expect(parser.errors.where(:field_114, category: :setup).map(&:message)).to eql(["Enter a valid value for is the buyer a company?"]) + end + end + end + + describe "#field_115" do # will buyers live in property? + context "when an invalid option" do + let(:attributes) { setup_section_params.merge({ field_115: "100", field_113: "3", field_114: "2" }) } + + it "returns setup error" do + expect(parser.errors.where(:field_115, category: :setup).map(&:message)).to eql(["Enter a valid value for will the buyers live in the property?"]) + end + end + end + + describe "#field_116" do # joint purchase? + context "when an invalid option" do + let(:attributes) { setup_section_params.merge({ field_116: "100" }) } + + it "returns setup error" do + expect(parser.errors.where(:field_116, category: :setup).map(&:message)).to eql(["Enter a valid value for is this a joint purchase?"]) + end + end + end + describe "#field_117" do context "when not a possible value" do let(:attributes) { valid_attributes.merge({ field_117: "3" }) }