From 3b580e44345bb8dcaf0f31a090b377b39f8bf288 Mon Sep 17 00:00:00 2001 From: baarkerlounger Date: Thu, 7 Oct 2021 16:32:30 +0100 Subject: [PATCH] Spec question counting behaviour --- app/helpers/check_answers_helper.rb | 13 +++- spec/helpers/check_answers_helper_spec.rb | 85 ++++++++++++++++++++++- 2 files changed, 94 insertions(+), 4 deletions(-) diff --git a/app/helpers/check_answers_helper.rb b/app/helpers/check_answers_helper.rb index a2c45f7a5..1581764bf 100644 --- a/app/helpers/check_answers_helper.rb +++ b/app/helpers/check_answers_helper.rb @@ -15,7 +15,7 @@ module CheckAnswersHelper questions_not_applicable = [] questions.reject do |question_key, question| question.fetch("conditional_for", []).map do |conditional_question_key, condition| - if condition_not_met(case_log, question_key, condition) + if condition_not_met(case_log, question_key, question, condition) questions_not_applicable << conditional_question_key end end @@ -23,8 +23,15 @@ module CheckAnswersHelper end end - def condition_not_met(case_log, question_key, condition) - case_log[question_key].blank? || !eval(case_log[question_key].to_s + condition) + def condition_not_met(case_log, question_key, question, condition) + case question["type"] + when "numeric" + case_log[question_key].blank? || !eval(case_log[question_key].to_s + condition) + when "radio" + case_log[question_key].blank? || !condition.include?(case_log[question_key]) + else + raise "Not implemented yet" + end end def subsection_pages(subsection) diff --git a/spec/helpers/check_answers_helper_spec.rb b/spec/helpers/check_answers_helper_spec.rb index bd13ddf32..2dee5539f 100644 --- a/spec/helpers/check_answers_helper_spec.rb +++ b/spec/helpers/check_answers_helper_spec.rb @@ -2,8 +2,20 @@ require "rails_helper" RSpec.describe CheckAnswersHelper do let(:case_log) { FactoryBot.create(:case_log) } - let(:form) { Form.new(2021, 2022) } + let(:case_log_with_met_numeric_condition) do + FactoryBot.create( + :case_log, + :in_progress, + household_number_of_other_members: 2, + person_2_relationship: "Partner" + ) + end + let(:case_log_with_met_radio_condition) do + FactoryBot.create(:case_log, armed_forces: "Yes - a regular") + end let(:subsection) { "income_and_benefits" } + let(:subsection_with_numeric_conditionals) { "household_characteristics" } + let(:subsection_with_radio_conditionals) { "household_needs" } describe "Get answered questions total" do it "returns 0 if no questions are answered" do @@ -14,11 +26,82 @@ RSpec.describe CheckAnswersHelper do case_log["net_income"] = "123" expect(total_answered_questions(subsection, case_log)).to equal(1) end + + it "ignores questions with unmet numeric conditions" do + case_log["tenant_code"] = "T1234" + expect(total_answered_questions(subsection_with_numeric_conditionals, case_log)).to equal(1) + end + + it "includes conditional questions with met numeric conditions" do + expect(total_answered_questions( + subsection_with_numeric_conditionals, + case_log_with_met_numeric_condition, + )).to equal(4) + end + + it "ignores questions with unmet radio conditions" do + case_log["armed_forces"] = "No" + expect(total_answered_questions(subsection_with_radio_conditionals, case_log)).to equal(1) + end + + it "includes conditional questions with met radio conditions" do + case_log_with_met_radio_condition["armed_forces_injured"] = "No" + case_log_with_met_radio_condition["medical_conditions"] = "No" + expect(total_answered_questions( + subsection_with_radio_conditionals, + case_log_with_met_radio_condition, + )).to equal(3) + end end describe "Get total number of questions" do it "returns the total number of questions for a subsection" do expect(total_number_of_questions(subsection, case_log)).to eq(4) end + + it "ignores questions with unmet numeric conditions" do + expect(total_number_of_questions(subsection_with_numeric_conditionals, case_log)).to eq(7) + end + + it "includes conditional questions with met numeric conditions" do + expect(total_number_of_questions( + subsection_with_numeric_conditionals, + case_log_with_met_numeric_condition, + )).to eq(15) + end + + it "ignores questions with unmet radio conditions" do + expect(total_number_of_questions(subsection_with_radio_conditionals, case_log)).to eq(6) + end + + it "includes conditional questions with met radio conditions" do + expect(total_number_of_questions( + subsection_with_radio_conditionals, + case_log_with_met_radio_condition, + )).to eq(8) + end + + context "conditional questions with type that hasn't been implemented yet" do + let(:unimplemented_conditional) do + {"question_1"=> + {"header"=>"The actual question?", + "hint_text"=>"", + "type"=>"date", + "check_answer_label"=>"Question Label", + "conditional_for"=>{"question_2"=>["12-12-2021"]}}, + "question_2"=> + {"header"=>"The second actual question?", + "hint_text"=>"", + "type"=>"radio", + "check_answer_label"=>"The second question label", + "answer_options"=>{"0"=>"Yes", "1"=>"No"}} + } + end + + it "raises an error" do + allow_any_instance_of(Form).to receive(:questions_for_subsection).and_return(unimplemented_conditional) + expect { total_number_of_questions(subsection, case_log) }.to raise_error(RuntimeError, "Not implemented yet") + end + end end end