Browse Source

Route back to check answers after an interruption screen and back to previous page if no is selected on the interruption screen

Co-authored-by: baarkerlounger  <baarkerlounger@users.noreply.github.com>
pull/602/head
Kat 3 years ago
parent
commit
49d71f6f9c
  1. 23
      app/controllers/form_controller.rb
  2. 2
      app/models/validations/soft_validations.rb
  3. 37
      spec/requests/form_controller_spec.rb

23
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

2
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

37
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) }

Loading…
Cancel
Save