From e85d565c275916abddae0afa2fa8dba56a113307 Mon Sep 17 00:00:00 2001 From: baarkerlounger Date: Tue, 11 Jan 2022 17:23:57 +0000 Subject: [PATCH] Page routing can also depend on subsection --- app/models/form/page.rb | 10 +++++++++- app/models/form/question.rb | 2 +- spec/models/form/page_spec.rb | 12 ++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/app/models/form/page.rb b/app/models/form/page.rb index 30ba0f6d5..c550114a2 100644 --- a/app/models/form/page.rb +++ b/app/models/form/page.rb @@ -22,9 +22,17 @@ class Form::Page end def routed_to?(case_log) + return true unless depends_on || subsection.depends_on + + subsection.enabled?(case_log) && depends_on_met(case_log) + end + +private + + def depends_on_met(case_log) return true unless depends_on - subsection.enabled?(case_log) && depends_on.all? do |question, value| + depends_on.all? do |question, value| !case_log[question].nil? && case_log[question] == value end end diff --git a/app/models/form/question.rb b/app/models/form/question.rb index 2bf2d4345..edbf96178 100644 --- a/app/models/form/question.rb +++ b/app/models/form/question.rb @@ -80,7 +80,7 @@ class Form::Question # Special case as No is a valid answer but doesn't let you progress and use the service return false if id == "gdpr_acceptance" && case_log[id] == "No" - case_log[id].present? + case_log[id].present? || !case_log.respond_to?(id.to_sym) end private diff --git a/spec/models/form/page_spec.rb b/spec/models/form/page_spec.rb index a0eac90e9..403227e83 100644 --- a/spec/models/form/page_spec.rb +++ b/spec/models/form/page_spec.rb @@ -63,5 +63,17 @@ RSpec.describe Form::Page, type: :model do expect(subject.routed_to?(case_log)).to be true end end + + context "when the page's subsection has routing conditions" do + let(:section_id) { "submission" } + let(:subsection_id) { "declaration" } + let(:page_id) { "declaration" } + let(:completed_case_log) { FactoryBot.build(:case_log, :completed, incfreq: "Weekly") } + + it "evaluates the sections dependencies" do + expect(subject.routed_to?(case_log)).to be false + expect(subject.routed_to?(completed_case_log)).to be true + end + end end end