diff --git a/app/controllers/form_controller.rb b/app/controllers/form_controller.rb index be15cc1b3..9fbb6fc63 100644 --- a/app/controllers/form_controller.rb +++ b/app/controllers/form_controller.rb @@ -9,12 +9,7 @@ class FormController < ApplicationController responses_for_page = responses_for_page(@page) if @case_log.update(responses_for_page) session[:errors] = nil - if is_referrer_check_answers? && !@case_log.form.next_page(@page, @case_log).to_s.include?("value_check") - redirect_to(send("case_log_#{@case_log.form.subsection_for_page(@page).id}_check_answers_path", @case_log)) - else - redirect_path = @case_log.form.next_page_redirect_path(@page, @case_log) - redirect_to(send(redirect_path, @case_log)) - end + redirect_to(successful_redirect_path) else redirect_path = "case_log_#{@page.id}_path" session[:errors] = @case_log.errors.to_json @@ -108,4 +103,20 @@ private referrer = request.headers["HTTP_REFERER"].presence || "" referrer.present? && CGI.parse(referrer.split("?")[-1]).present? && CGI.parse(referrer.split("?")[-1])["referrer"][0] == "check_answers" end + + def successful_redirect_path + if is_referrer_check_answers? + page_ids = @case_log.form.subsection_for_page(@page).pages.map(&:id) + page_index = page_ids.index(@page.id) + next_page = @case_log.form.next_page(@page, @case_log) + previous_page = @case_log.form.previous_page(page_ids, page_index, @case_log) + if next_page.to_s.include?("value_check") || next_page == previous_page + return "/logs/#{@case_log.id}/#{next_page.dasherize}?referrer=check_answers" + else + return send("case_log_#{@case_log.form.subsection_for_page(@page).id}_check_answers_path", @case_log) + end + end + redirect_path = @case_log.form.next_page_redirect_path(@page, @case_log) + send(redirect_path, @case_log) + end end diff --git a/app/models/validations/soft_validations.rb b/app/models/validations/soft_validations.rb index 8b51767dc..7c76d6646 100644 --- a/app/models/validations/soft_validations.rb +++ b/app/models/validations/soft_validations.rb @@ -58,7 +58,7 @@ module Validations::SoftValidations def all_tenants_age_and_gender_information_completed? (1..hhmemb).all? do |n| - public_send("sex#{n}").present? && public_send("age#{n}").present? && details_known_or_lead_tenant?(n) && public_send("age#{n}_known") + public_send("sex#{n}").present? && public_send("age#{n}").present? && details_known_or_lead_tenant?(n) && public_send("age#{n}_known").zero? end end diff --git a/spec/requests/form_controller_spec.rb b/spec/requests/form_controller_spec.rb index 3d9f9cf64..5a30b1ae5 100644 --- a/spec/requests/form_controller_spec.rb +++ b/spec/requests/form_controller_spec.rb @@ -342,6 +342,43 @@ RSpec.describe FormController, type: :request do end end + context "when coming from check answers page" do + context "and navigating to an interruption screen" do + let(:interrupt_params) do + { + id: completed_case_log.id, + case_log: { + page: "net_income_value_check", + net_income_value_check: value, + }, + } + end + let(:referrer) { "/logs/#{completed_case_log.id}/net-income-value-check?referrer=check_answers" } + + before do + completed_case_log.update!(ecstat1: 1, earnings: 130, hhmemb: 1) # we're not routing to that page, so it gets cleared?ยง + allow(completed_case_log).to receive(:net_income_soft_validation_triggered?).and_return(true) + post "/logs/#{completed_case_log.id}/form", params: interrupt_params, headers: headers.merge({ "HTTP_REFERER" => referrer }) + end + + context "when yes is answered" do + let(:value) { 0 } + + it "redirects back to check answers if 'yes' is selected" do + expect(response).to redirect_to("/logs/#{completed_case_log.id}/income-and-benefits/check-answers") + end + end + + context "when no is answered" do + let(:value) { 1 } + + it "redirects to the previous question if 'no' is selected" do + expect(response).to redirect_to("/logs/#{completed_case_log.id}/net-income?referrer=check_answers") + end + end + end + end + context "with case logs that are not owned or managed by your organisation" do let(:answer) { 25 } let(:other_organisation) { FactoryBot.create(:organisation) }