From b3c4e24dcf27c67db2e68b850b1b9b201db08eaa Mon Sep 17 00:00:00 2001 From: Kat Date: Fri, 16 Dec 2022 12:12:03 +0000 Subject: [PATCH] Refactor details known to reuse pages and questions --- app/models/form/sales/pages/person_known.rb | 43 ++++++ .../form/sales/questions/person_known.rb | 24 ++++ .../subsections/household_characteristics.rb | 8 +- .../form/sales/pages/person_known_spec.rb | 128 ++++++++++++++++++ .../form/sales/questions/person_known_spec.rb | 70 ++++++++++ 5 files changed, 269 insertions(+), 4 deletions(-) create mode 100644 app/models/form/sales/pages/person_known.rb create mode 100644 app/models/form/sales/questions/person_known.rb create mode 100644 spec/models/form/sales/pages/person_known_spec.rb create mode 100644 spec/models/form/sales/questions/person_known_spec.rb diff --git a/app/models/form/sales/pages/person_known.rb b/app/models/form/sales/pages/person_known.rb new file mode 100644 index 000000000..1774ac315 --- /dev/null +++ b/app/models/form/sales/pages/person_known.rb @@ -0,0 +1,43 @@ +class Form::Sales::Pages::PersonKnown < Form::Sales::Pages::Person + def initialize(id, hsh, subsection, person_index:) + super + @header_partial = "#{id}_page" + @header = "" + @description = "" + @subsection = subsection + @depends_on = page_depends_on + end + + def questions + @questions ||= [ + Form::Sales::Questions::PersonKnown.new("details_known_#{@person_index}", nil, self, person_index: @person_index), + ] + end + + def page_depends_on + case @person_index + when 1 + [ + { "hholdcount" => 1 }, + { "hholdcount" => 2 }, + { "hholdcount" => 3 }, + { "hholdcount" => 4 }, + ] + when 2 + [ + { "hholdcount" => 2, "details_known_1" => 1 }, + { "hholdcount" => 3, "details_known_1" => 1 }, + { "hholdcount" => 4, "details_known_1" => 1 }, + ] + when 3 + [ + { "hholdcount" => 3, "details_known_2" => 1 }, + { "hholdcount" => 4, "details_known_2" => 1 }, + ] + when 4 + [ + { "hholdcount" => 4, "details_known_3" => 1 }, + ] + end + end +end diff --git a/app/models/form/sales/questions/person_known.rb b/app/models/form/sales/questions/person_known.rb new file mode 100644 index 000000000..12b9cd958 --- /dev/null +++ b/app/models/form/sales/questions/person_known.rb @@ -0,0 +1,24 @@ +class Form::Sales::Questions::PersonKnown < Form::Sales::Questions::Person + def initialize(id, hsh, page, person_index:) + super + @check_answer_label = "Details known for person #{person_index}?" + @header = "Do you know the details for person #{person_index}?" + @type = "radio" + @answer_options = ANSWER_OPTIONS + @page = page + @hint_text = "" + @hidden_in_check_answers = { + "depends_on" => [ + { + "details_known_#{person_index}" => 1, + }, + ], + } + @check_answers_card_number = person_index + 2 + end + + ANSWER_OPTIONS = { + "1" => { "value" => "Yes" }, + "2" => { "value" => "No" }, + }.freeze +end diff --git a/app/models/form/sales/subsections/household_characteristics.rb b/app/models/form/sales/subsections/household_characteristics.rb index feea2a393..4eb252c52 100644 --- a/app/models/form/sales/subsections/household_characteristics.rb +++ b/app/models/form/sales/subsections/household_characteristics.rb @@ -29,7 +29,7 @@ class Form::Sales::Subsections::HouseholdCharacteristics < ::Form::Subsection Form::Sales::Pages::Buyer2WorkingSituation.new(nil, nil, self), Form::Sales::Pages::Buyer2LiveInProperty.new(nil, nil, self), Form::Sales::Pages::NumberOfOthersInProperty.new(nil, nil, self), - Form::Sales::Pages::Person1Known.new(nil, nil, self), + Form::Sales::Pages::PersonKnown.new("person_1_known", nil, self, person_index: 1), Form::Sales::Pages::PersonRelationshipToBuyer1.new("person_1_relationship_to_buyer_1", nil, self, person_index: 2), Form::Sales::Pages::PersonRelationshipToBuyer1.new("person_1_relationship_to_buyer_1_joint_purchase", nil, self, person_index: 3), Form::Sales::Pages::PersonAge.new("person_1_age", nil, self, person_index: 2), @@ -38,21 +38,21 @@ class Form::Sales::Subsections::HouseholdCharacteristics < ::Form::Subsection Form::Sales::Pages::Person1GenderIdentityJointPurchase.new(nil, nil, self), Form::Sales::Pages::PersonWorkingSituation.new("person_1_working_situation", nil, self, person_index: 2), Form::Sales::Pages::PersonWorkingSituation.new("person_1_working_situation_joint_purchase", nil, self, person_index: 3), - Form::Sales::Pages::Person2Known.new(nil, nil, self), + Form::Sales::Pages::PersonKnown.new("person_2_known", nil, self, person_index: 2), Form::Sales::Pages::PersonRelationshipToBuyer1.new("person_2_relationship_to_buyer_1", nil, self, person_index: 3), Form::Sales::Pages::PersonRelationshipToBuyer1.new("person_2_relationship_to_buyer_1_joint_purchase", nil, self, person_index: 4), Form::Sales::Pages::PersonAge.new("person_2_age", nil, self, person_index: 3), Form::Sales::Pages::PersonAge.new("person_2_age_joint_purchase", nil, self, person_index: 4), Form::Sales::Pages::PersonWorkingSituation.new("person_2_working_situation", nil, self, person_index: 3), Form::Sales::Pages::PersonWorkingSituation.new("person_2_working_situation_joint_purchase", nil, self, person_index: 4), - Form::Sales::Pages::Person3Known.new(nil, nil, self), + Form::Sales::Pages::PersonKnown.new("person_3_known", nil, self, person_index: 3), Form::Sales::Pages::PersonRelationshipToBuyer1.new("person_3_relationship_to_buyer_1", nil, self, person_index: 4), Form::Sales::Pages::PersonRelationshipToBuyer1.new("person_3_relationship_to_buyer_1_joint_purchase", nil, self, person_index: 5), Form::Sales::Pages::PersonAge.new("person_3_age", nil, self, person_index: 4), Form::Sales::Pages::PersonAge.new("person_3_age_joint_purchase", nil, self, person_index: 5), Form::Sales::Pages::PersonWorkingSituation.new("person_3_working_situation", nil, self, person_index: 4), Form::Sales::Pages::PersonWorkingSituation.new("person_3_working_situation_joint_purchase", nil, self, person_index: 5), - Form::Sales::Pages::Person4Known.new(nil, nil, self), + Form::Sales::Pages::PersonKnown.new("person_4_known", nil, self, person_index: 4), Form::Sales::Pages::PersonRelationshipToBuyer1.new("person_4_relationship_to_buyer_1", nil, self, person_index: 5), Form::Sales::Pages::PersonRelationshipToBuyer1.new("person_4_relationship_to_buyer_1_joint_purchase", nil, self, person_index: 6), Form::Sales::Pages::PersonAge.new("person_4_age", nil, self, person_index: 5), diff --git a/spec/models/form/sales/pages/person_known_spec.rb b/spec/models/form/sales/pages/person_known_spec.rb new file mode 100644 index 000000000..2b4f2fb5b --- /dev/null +++ b/spec/models/form/sales/pages/person_known_spec.rb @@ -0,0 +1,128 @@ +require "rails_helper" + +RSpec.describe Form::Sales::Pages::PersonKnown, type: :model do + subject(:page) { described_class.new(page_id, page_definition, subsection, person_index:) } + + let(:page_id) { "person_2_known" } + let(:page_definition) { nil } + let(:subsection) { instance_double(Form::Subsection) } + let(:person_index) { 1 } + + it "has correct subsection" do + expect(page.subsection).to eq(subsection) + end + + it "has the correct header" do + expect(page.header).to eq("") + end + + it "has the correct description" do + expect(page.description).to eq("") + end + + context "with person 1" do + let(:page_id) { "person_1_known" } + let(:person_index) { 1 } + + it "has correct questions" do + expect(page.questions.map(&:id)).to eq(%w[details_known_1]) + end + + it "has the correct id" do + expect(page.id).to eq("person_1_known") + end + + it "has the correct header_partial" do + expect(page.header_partial).to eq("person_1_known_page") + end + + it "has correct depends_on" do + expect(page.depends_on).to eq( + [ + { "hholdcount" => 1 }, + { "hholdcount" => 2 }, + { "hholdcount" => 3 }, + { "hholdcount" => 4 }, + ], + ) + end + end + + context "with person 2" do + let(:page_id) { "person_2_known" } + let(:person_index) { 2 } + + it "has correct questions" do + expect(page.questions.map(&:id)).to eq(%w[details_known_2]) + end + + it "has the correct id" do + expect(page.id).to eq("person_2_known") + end + + it "has the correct header_partial" do + expect(page.header_partial).to eq("person_2_known_page") + end + + it "has correct depends_on" do + expect(page.depends_on).to eq( + [ + { "hholdcount" => 2, "details_known_1" => 1 }, + { "hholdcount" => 3, "details_known_1" => 1 }, + { "hholdcount" => 4, "details_known_1" => 1 }, + ], + ) + end + end + + context "with person 3" do + let(:page_id) { "person_3_known" } + let(:person_index) { 3 } + + it "has correct questions" do + expect(page.questions.map(&:id)).to eq(%w[details_known_3]) + end + + it "has the correct id" do + expect(page.id).to eq("person_3_known") + end + + it "has the correct header_partial" do + expect(page.header_partial).to eq("person_3_known_page") + end + + it "has correct depends_on" do + expect(page.depends_on).to eq( + [ + { "hholdcount" => 3, "details_known_2" => 1 }, + { "hholdcount" => 4, "details_known_2" => 1 }, + ], + ) + end + end + + context "with person 4" do + let(:page_id) { "person_4_known" } + let(:person_index) { 4 } + + it "has correct questions" do + expect(page.questions.map(&:id)).to eq(%w[details_known_4]) + end + + it "has the correct id" do + expect(page.id).to eq("person_4_known") + end + + it "has the correct header_partial" do + expect(page.header_partial).to eq("person_4_known_page") + end + + it "has correct depends_on" do + expect(page.depends_on).to eq( + [ + { "hholdcount" => 4, "details_known_3" => 1 }, + ], + ) + end + end +end diff --git a/spec/models/form/sales/questions/person_known_spec.rb b/spec/models/form/sales/questions/person_known_spec.rb new file mode 100644 index 000000000..2c33346f0 --- /dev/null +++ b/spec/models/form/sales/questions/person_known_spec.rb @@ -0,0 +1,70 @@ +require "rails_helper" + +RSpec.describe Form::Sales::Questions::PersonKnown, type: :model do + subject(:question) { described_class.new(question_id, question_definition, page, person_index:) } + + let(:question_id) { "details_known_1" } + let(:question_definition) { nil } + let(:page) { instance_double(Form::Page) } + let(:person_index) { 1 } + + it "has correct page" do + expect(question.page).to eq(page) + end + + it "has the correct type" do + expect(question.type).to eq("radio") + end + + it "is not marked as derived" do + expect(question.derived?).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(nil) + end + + it "has the correct hint" do + expect(question.hint_text).to eq("") + end + + context "with person 1" do + let(:question_id) { "details_known_1" } + let(:person_index) { 1 } + + it "has the correct id" do + expect(question.id).to eq("details_known_1") + end + + it "has the correct header" do + expect(question.header).to eq("Do you know the details for person 1?") + end + + it "has the correct check_answer_label" do + expect(question.check_answer_label).to eq("Details known for person 1?") + end + + it "has the correct hidden_in_check_answers" do + expect(question.hidden_in_check_answers).to eq( + { + "depends_on" => [ + { + "details_known_1" => 1, + }, + ], + }, + ) + end + + it "has the correct check_answers_card_number" do + expect(question.check_answers_card_number).to eq(3) + end + end +end