Browse Source

remove validation that is specific to number format and fold that functionality into accuracy validation, rejig tests accordingly

validations-copy
Arthur Campbell 2 years ago
parent
commit
8b5ef56942
  1. 37
      app/models/validations/shared_validations.rb
  2. 32
      spec/models/validations/shared_validations_spec.rb

37
app/models/validations/shared_validations.rb

@ -39,28 +39,20 @@ module Validations::SharedValidations
next unless question.step next unless question.step
next unless record[question.id] && question.page.routed_to?(record, nil) next unless record[question.id] && question.page.routed_to?(record, nil)
begin value = record.public_send("#{question.id}_before_type_cast")
input = record.public_send("#{question.id}_before_type_cast") field = question.check_answer_label || question.id
answer = Float(input) incorrect_accuracy = (value.to_d * 100) % (question.step * 100) != 0
rescue ArgumentError
add_step_error(record, question)
end
if (answer * 100) % (question.step * 100) != 0 if question.step < 1 && incorrect_accuracy
add_step_error(record, question) record.errors.add question.id.to_sym, I18n.t("validations.numeric.nearest_penny", field:)
elsif incorrect_accuracy || value.to_d != value.to_i # if the user enters a value in exponent notation (eg '4e1') the to_i method does not convert this to the correct value
field = question.check_answer_label || question.id
case question.step
when 1 then record.errors.add question.id.to_sym, I18n.t("validations.numeric.whole_number", field:)
when 10 then record.errors.add question.id.to_sym, I18n.t("validations.numeric.nearest_ten", field:)
end end
end end
end end
def validate_numeric_normal_format(record)
record.form.numeric_questions.each do |question|
next unless record[question.id] && question.page.routed_to?(record, nil)
user_input = record.public_send("#{question.id}_before_type_cast")
if user_input.is_a?(String) && user_input.include?("e")
record.errors.add question.id.to_sym, I18n.t("validations.numeric.normal_format")
end
end
end end
def validate_property_postcode(record) def validate_property_postcode(record)
@ -154,13 +146,4 @@ private
record.errors.add question.id.to_sym, :under_min, message: I18n.t("validations.numeric.above_min", field:, min:) record.errors.add question.id.to_sym, :under_min, message: I18n.t("validations.numeric.above_min", field:, min:)
end end
end end
def add_step_error(record, question)
field = question.check_answer_label || question.id
case question.step
when 1 then record.errors.add question.id.to_sym, I18n.t("validations.numeric.whole_number", field:)
when 10 then record.errors.add question.id.to_sym, I18n.t("validations.numeric.nearest_ten", field:)
when 0.01 then record.errors.add question.id.to_sym, I18n.t("validations.numeric.nearest_penny", field:)
end
end
end end

32
spec/models/validations/shared_validations_spec.rb

@ -122,6 +122,12 @@ RSpec.describe Validations::SharedValidations do
expect(sales_log.errors[:income1]).to include I18n.t("validations.numeric.whole_number", field: "Buyer 1’s gross annual income") expect(sales_log.errors[:income1]).to include I18n.t("validations.numeric.whole_number", field: "Buyer 1’s gross annual income")
end end
it "adds an error if the user attempts to input a number in exponent format" do
sales_log.income1 = "3e5"
shared_validator.validate_numeric_step(sales_log)
expect(sales_log.errors[:income1]).to include I18n.t("validations.numeric.whole_number", field: "Buyer 1’s gross annual income")
end
it "does not add an error if input is an integer" do it "does not add an error if input is an integer" do
sales_log.income1 = 30_000 sales_log.income1 = 30_000
shared_validator.validate_numeric_step(sales_log) shared_validator.validate_numeric_step(sales_log)
@ -136,6 +142,12 @@ RSpec.describe Validations::SharedValidations do
expect(sales_log.errors[:savings]).to include I18n.t("validations.numeric.nearest_ten", field: "Buyer’s total savings (to nearest £10) before any deposit paid") expect(sales_log.errors[:savings]).to include I18n.t("validations.numeric.nearest_ten", field: "Buyer’s total savings (to nearest £10) before any deposit paid")
end end
it "adds an error if the user attempts to input a number in exponent format" do
sales_log.savings = "3e5"
shared_validator.validate_numeric_step(sales_log)
expect(sales_log.errors[:savings]).to include I18n.t("validations.numeric.nearest_ten", field: "Buyer’s total savings (to nearest £10) before any deposit paid")
end
it "does not add an error if input is a multiple of ten" do it "does not add an error if input is a multiple of ten" do
sales_log.savings = 30_000 sales_log.savings = 30_000
shared_validator.validate_numeric_step(sales_log) shared_validator.validate_numeric_step(sales_log)
@ -150,27 +162,19 @@ RSpec.describe Validations::SharedValidations do
expect(sales_log.errors[:mscharge]).to include I18n.t("validations.numeric.nearest_penny", field: "Monthly leasehold charges") expect(sales_log.errors[:mscharge]).to include I18n.t("validations.numeric.nearest_penny", field: "Monthly leasehold charges")
end end
it "does not add an error if input has 2 or fewer decimal places" do it "does not add an error if the user attempts to input a number in exponent format" do
sales_log.mscharge = 30.74 sales_log.mscharge = "3e1"
shared_validator.validate_numeric_step(sales_log) shared_validator.validate_numeric_step(sales_log)
expect(sales_log.errors).to be_empty expect(sales_log.errors).to be_empty
end end
end
end
describe "validating the format of inputs in numeric questions" do
it "adds an error if number is input in exponent notation" do
sales_log.age2 = "1e1"
shared_validator.validate_numeric_normal_format(sales_log)
expect(sales_log.errors[:age2]).to include I18n.t("validations.numeric.normal_format")
end
it "does not add an error if number is input in standard notation" do it "does not add an error if input has 2 or fewer decimal places" do
sales_log.age2 = "11" sales_log.mscharge = 30.74
shared_validator.validate_numeric_normal_format(sales_log) shared_validator.validate_numeric_step(sales_log)
expect(sales_log.errors).to be_empty expect(sales_log.errors).to be_empty
end end
end end
end
describe "radio options validations" do describe "radio options validations" do
it "allows only possible values" do it "allows only possible values" do

Loading…
Cancel
Save