diff --git a/spec/models/form/sales/pages/service_charge_changed_spec.rb b/spec/models/form/sales/pages/service_charge_changed_spec.rb new file mode 100644 index 000000000..4f313021a --- /dev/null +++ b/spec/models/form/sales/pages/service_charge_changed_spec.rb @@ -0,0 +1,29 @@ +require "rails_helper" + +RSpec.describe Form::Sales::Pages::ServiceChargeChanged, type: :model do + subject(:page) { described_class.new(page_id, page_definition, subsection) } + + let(:page_id) { nil } + let(:page_definition) { nil } + let(:subsection) { instance_double(Form::Subsection, form: instance_double(Form, start_date: Time.zone.local(2026, 4, 1))) } + + it "has correct subsection" do + expect(page.subsection).to eq(subsection) + end + + it "has correct questions" do + expect(page.questions.map(&:id)).to eq(%w[hasservicechargeschanged newservicecharges]) + end + + it "has the correct id" do + expect(page.id).to eq("service_charge_changed") + end + + it "has the correct description" do + expect(page.description).to be_nil + end + + it "has correct depends_on" do + expect(page.depends_on).to be_nil + end +end diff --git a/spec/models/form/sales/questions/has_service_charges_changed_spec.rb b/spec/models/form/sales/questions/has_service_charges_changed_spec.rb new file mode 100644 index 000000000..f220ddd65 --- /dev/null +++ b/spec/models/form/sales/questions/has_service_charges_changed_spec.rb @@ -0,0 +1,54 @@ +require "rails_helper" + +RSpec.describe Form::Sales::Questions::HasServiceChargesChanged, type: :model do + subject(:question) { described_class.new(question_id, question_definition, page) } + + let(:question_id) { nil } + let(:question_definition) { nil } + let(:subsection) { instance_double(Form::Subsection, form: instance_double(Form, start_date:)) } + let(:page) { instance_double(Form::Page, subsection:) } + let(:start_date) { Time.utc(2026, 5, 1) } + + it "has correct page" do + expect(question.page).to eq(page) + end + + it "has the correct id" do + expect(question.id).to eq("hasservicechargeschanged") + end + + it "has the correct type" do + expect(question.type).to eq("radio") + end + + it "is not marked as derived" do + expect(question.derived?(nil)).to be false + end + + it "has the correct answer_options" do + expect(question.answer_options).to eq({ + "1" => { "value" => "Yes" }, + "2" => { "value" => "No" }, + }) + end + + it "has correct conditional for" do + expect(question.conditional_for).to eq({ + "newservicecharges" => [1], + }) + end + + it "has correct hidden_in_check_answers for" do + expect(question.hidden_in_check_answers).to eq({ + "depends_on" => [ + { + "hasservicechargeschanged" => 1, + }, + ], + }) + end + + it "has the correct question number" do + expect(question.question_number).to eq(0) + end +end diff --git a/spec/models/form/sales/questions/new_service_charges_spec.rb b/spec/models/form/sales/questions/new_service_charges_spec.rb new file mode 100644 index 000000000..3a5fea1b3 --- /dev/null +++ b/spec/models/form/sales/questions/new_service_charges_spec.rb @@ -0,0 +1,51 @@ +require "rails_helper" + +RSpec.describe Form::Sales::Questions::NewServiceCharges, type: :model do + subject(:question) { described_class.new(question_id, question_definition, page) } + + let(:question_id) { nil } + let(:question_definition) { nil } + let(:subsection) { instance_double(Form::Subsection, form: instance_double(Form, start_date:)) } + let(:page) { instance_double(Form::Page, subsection:) } + let(:start_date) { Time.utc(2026, 5, 1) } + + it "has correct page" do + expect(question.page).to eq(page) + end + + it "has the correct id" do + expect(question.id).to eq("newservicecharges") + end + + it "has the correct type" do + expect(question.type).to eq("numeric") + end + + it "is not marked as derived" do + expect(question.derived?(nil)).to be false + end + + it "has the correct width" do + expect(question.width).to be 5 + end + + it "has the correct min" do + expect(question.min).to be 0 + end + + it "has the correct max" do + expect(question.max).to be 9999.99 + end + + it "has the correct step" do + expect(question.step).to be 0.01 + end + + it "has the correct prefix" do + expect(question.prefix).to eq("£") + end + + it "has the correct question number" do + expect(question.question_number).to eq(0) + end +end diff --git a/spec/models/validations/sales/financial_validations_spec.rb b/spec/models/validations/sales/financial_validations_spec.rb index 80d10718b..390dd9dc7 100644 --- a/spec/models/validations/sales/financial_validations_spec.rb +++ b/spec/models/validations/sales/financial_validations_spec.rb @@ -478,4 +478,96 @@ RSpec.describe Validations::Sales::FinancialValidations do expect(record.errors).to be_empty end end + + describe "#validate_newservicecharges" do + let(:record) { FactoryBot.build(:sales_log, ownershipsch: 1, staircase: 1) } + + it "does not add errors when newservicecharges is nil" do + record.newservicecharges = nil + financial_validator.validate_newservicecharges(record) + expect(record.errors).to be_empty + end + + it "does not add errors when newservicecharges is valid" do + record.newservicecharges = 100.50 + financial_validator.validate_newservicecharges(record) + expect(record.errors).to be_empty + end + + it "adds an error when newservicecharges is negative" do + record.newservicecharges = -50 + financial_validator.validate_newservicecharges(record) + expect(record.errors["newservicecharges"]).to include(match I18n.t("validations.sales.financial.newservicecharges.negative")) + end + + it "adds an error when newservicecharges is over the maximum" do + record.newservicecharges = 10_000 + financial_validator.validate_newservicecharges(record) + expect(record.errors["newservicecharges"]).to include(match I18n.t("validations.sales.financial.newservicecharges.over_max")) + end + + it "does not add errors when newservicecharges is exactly the maximum" do + record.newservicecharges = 9999.99 + financial_validator.validate_newservicecharges(record) + expect(record.errors).to be_empty + end + + it "does not add errors when newservicecharges is zero" do + record.newservicecharges = 0 + financial_validator.validate_newservicecharges(record) + expect(record.errors).to be_empty + end + end + + describe "#validate_newservicecharges_different_from_mscharge" do + let(:record) { FactoryBot.build(:sales_log, ownershipsch: 1, staircase: 1) } + + it "does not add errors when hasservicechargeschanged is nil" do + record.hasservicechargeschanged = nil + record.newservicecharges = 100 + record.mscharge = 100 + financial_validator.validate_newservicecharges_different_from_mscharge(record) + expect(record.errors).to be_empty + end + + it "does not add errors when hasservicechargeschanged is 2 (No)" do + record.hasservicechargeschanged = 2 + record.newservicecharges = 100 + record.mscharge = 100 + financial_validator.validate_newservicecharges_different_from_mscharge(record) + expect(record.errors).to be_empty + end + + it "does not add errors when newservicecharges is nil" do + record.hasservicechargeschanged = 1 + record.newservicecharges = nil + record.mscharge = 100 + financial_validator.validate_newservicecharges_different_from_mscharge(record) + expect(record.errors).to be_empty + end + + it "does not add errors when mscharge is nil" do + record.hasservicechargeschanged = 1 + record.newservicecharges = 100 + record.mscharge = nil + financial_validator.validate_newservicecharges_different_from_mscharge(record) + expect(record.errors).to be_empty + end + + it "does not add errors when newservicecharges is different from mscharge" do + record.hasservicechargeschanged = 1 + record.newservicecharges = 150 + record.mscharge = 100 + financial_validator.validate_newservicecharges_different_from_mscharge(record) + expect(record.errors).to be_empty + end + + it "adds an error when hasservicechargeschanged is 1 (Yes) and newservicecharges equals mscharge" do + record.hasservicechargeschanged = 1 + record.newservicecharges = 100 + record.mscharge = 100 + financial_validator.validate_newservicecharges_different_from_mscharge(record) + expect(record.errors["newservicecharges"]).to include(match I18n.t("validations.sales.financial.newservicecharges.same_as_previous")) + end + end end