From 2bc54919aaa21adaee0b0afe3f9360033823070a Mon Sep 17 00:00:00 2001 From: baarkerlounger Date: Fri, 29 Oct 2021 15:13:28 +0100 Subject: [PATCH] All specs currently passing. Can this be real? --- app/controllers/case_logs_controller.rb | 24 ++++++---- app/models/case_log.rb | 6 +-- app/validations/soft_validations.rb | 44 ++++++++++++------- app/views/form/page.html.erb | 6 ++- spec/controllers/case_logs_controller_spec.rb | 14 +++--- spec/features/case_log_spec.rb | 6 ++- 6 files changed, 64 insertions(+), 36 deletions(-) diff --git a/app/controllers/case_logs_controller.rb b/app/controllers/case_logs_controller.rb index 41d81ca04..59bbc4a39 100644 --- a/app/controllers/case_logs_controller.rb +++ b/app/controllers/case_logs_controller.rb @@ -56,15 +56,17 @@ class CaseLogsController < ApplicationController def submit_form form = FormHandler.instance.get_form("2021_2022") @case_log = CaseLog.find(params[:id]) - page = params[:case_log][:previous_page] - @case_log.previous_page = page + page = params[:case_log][:page] + @case_log.current_page = page responses_for_page = responses_for_page(page) - if @case_log.update(responses_for_page) && @case_log.soft_errors.empty? + if @case_log.update(responses_for_page) && (@case_log.soft_errors.empty? || @case_log.soft_errors_overridden?) + @case_log.previous_page = page redirect_path = get_next_page_path(form, page, @case_log) redirect_to(send(redirect_path, @case_log)) else page_info = form.all_pages[page] - render "form/page", locals: { form: form, page_key: page, page_info: page_info }, status: :unprocessable_entity + back_path = get_previous_page_path(form, page, @case_log) + render "form/page", locals: { form: form, back_path: back_path, page_key: page, page_info: page_info }, status: :unprocessable_entity end end @@ -92,7 +94,8 @@ class CaseLogsController < ApplicationController form.all_pages.map do |page_key, page_info| define_method(page_key) do |_errors = {}| @case_log = CaseLog.find(params[:case_log_id]) - render "form/page", locals: { form: form, page_key: page_key, page_info: page_info } + back_path = get_previous_page_path(form, page_key, @case_log) + render "form/page", locals: { form: form, back_path: back_path, page_key: page_key, page_info: page_info } end end @@ -135,8 +138,8 @@ private params.require(:case_log).permit(CaseLog.editable_fields) end - def get_next_page_path(form, previous_page, case_log = {}) - content = form.all_pages[previous_page] + def get_next_page_path(form, page, case_log = {}) + content = form.all_pages[page] if content.key?("conditional_route_to") content["conditional_route_to"].each do |route, conditions| @@ -145,6 +148,11 @@ private end end end - form.next_page_redirect_path(previous_page) + form.next_page_redirect_path(page) + end + + def get_previous_page_path(form, current_page, case_log = {}) + return case_log.previous_page if case_log.previous_page + return form.previous_page(current_page) if current_page end end diff --git a/app/models/case_log.rb b/app/models/case_log.rb index 9f3241534..bf0da4aee 100644 --- a/app/models/case_log.rb +++ b/app/models/case_log.rb @@ -43,14 +43,14 @@ class CaseLog < ApplicationRecord validate :instance_validations before_save :update_status! - attr_writer :previous_page + attr_accessor :current_page, :previous_page enum status: { "not_started" => 0, "in_progress" => 1, "completed" => 2 } AUTOGENERATED_FIELDS = %w[id status created_at updated_at discarded_at].freeze def instance_validations - validates_with CaseLogValidator, ({ previous_page: @previous_page } || {}) + validates_with CaseLogValidator, ({ current_page: current_page } || {}) end def self.editable_fields @@ -123,7 +123,7 @@ private dynamically_not_required << "fixed_term_tenancy" end - if soft_errors.empty? + unless net_income_in_soft_max_range? || net_income_in_soft_min_range? dynamically_not_required << "override_net_income_validation" end diff --git a/app/validations/soft_validations.rb b/app/validations/soft_validations.rb index dc3593136..37bcd3e56 100644 --- a/app/validations/soft_validations.rb +++ b/app/validations/soft_validations.rb @@ -3,27 +3,39 @@ module SoftValidations {}.merge(net_income_validations) end + def soft_errors_overridden? + public_send(soft_errors.keys.first) if soft_errors.present? + end + private def net_income_validations net_income_errors = {} - if weekly_net_income && person_1_economic_status && override_net_income_validation.blank? - if weekly_net_income < applicable_income_range.soft_min && weekly_net_income > applicable_income_range.hard_min - net_income_errors["override_net_income_validation"] = OpenStruct.new( - message: "Net income is lower than expected based on the main tenant's working situation. Are you sure this is correct?", - hint_text: "This is based on the tenant's work situation: #{person_1_economic_status}", - ) - elsif weekly_net_income > applicable_income_range.soft_max && weekly_net_income < applicable_income_range.hard_max - net_income_errors["override_net_income_validation"] = OpenStruct.new( - message: "Net income is higher than expected based on the main tenant's working situation. Are you sure this is correct?", - hint_text: "This is based on the tenant's work situation: #{person_1_economic_status}", - ) - end - elsif weekly_net_income && person_1_economic_status && override_net_income_validation.present? - if weekly_net_income > applicable_income_range.soft_min && weekly_net_income < applicable_income_range.soft_max - update!(override_net_income_validation: nil) - end + if net_income_in_soft_min_range? + net_income_errors["override_net_income_validation"] = OpenStruct.new( + message: "Net income is lower than expected based on the main tenant's working situation. Are you sure this is correct?", + hint_text: "This is based on the tenant's work situation: #{person_1_economic_status}", + ) + elsif net_income_in_soft_max_range? + net_income_errors["override_net_income_validation"] = OpenStruct.new( + message: "Net income is higher than expected based on the main tenant's working situation. Are you sure this is correct?", + hint_text: "This is based on the tenant's work situation: #{person_1_economic_status}", + ) + else + update_column(:override_net_income_validation, nil) end net_income_errors end + + def net_income_in_soft_max_range? + return unless weekly_net_income && person_1_economic_status + + weekly_net_income.between?(applicable_income_range.soft_max, applicable_income_range.hard_max) + end + + def net_income_in_soft_min_range? + return unless weekly_net_income && person_1_economic_status + + weekly_net_income.between?(applicable_income_range.soft_min, applicable_income_range.hard_min) + end end diff --git a/app/views/form/page.html.erb b/app/views/form/page.html.erb index b578c9ca0..f5acb7c06 100644 --- a/app/views/form/page.html.erb +++ b/app/views/form/page.html.erb @@ -1,5 +1,7 @@ <% content_for :before_content do %> - <%= link_to 'Back', :back, class: "govuk-back-link" %> + <%= govuk_back_link href: "/case_logs/#{@case_log.id}/#{back_path}" do %> + Back + <% end %> <% end %> <%= turbo_frame_tag "case_log_form", target: "_top" do %> @@ -21,7 +23,7 @@ <%= render partial: "form/validation_override_question", locals: { f: f } %> <% end %> - <%= f.hidden_field :previous_page, value: page_key %> + <%= f.hidden_field :page, value: page_key %> <%= f.govuk_submit "Save and continue" %> <% end %> <% end %> diff --git a/spec/controllers/case_logs_controller_spec.rb b/spec/controllers/case_logs_controller_spec.rb index 29b129e5e..3adcf8335 100644 --- a/spec/controllers/case_logs_controller_spec.rb +++ b/spec/controllers/case_logs_controller_spec.rb @@ -52,13 +52,13 @@ RSpec.describe CaseLogsController, type: :controller do %w[ accessibility_requirements_fully_wheelchair_accessible_housing accessibility_requirements_wheelchair_access_to_essential_rooms accessibility_requirements_level_access_housing], - previous_page: "accessibility_requirements" } + page: "accessibility_requirements" } end let(:new_case_log_form_params) do { accessibility_requirements: %w[accessibility_requirements_level_access_housing], - previous_page: "accessibility_requirements", + page: "accessibility_requirements", } end @@ -88,7 +88,7 @@ RSpec.describe CaseLogsController, type: :controller do accessibility_requirements_wheelchair_access_to_essential_rooms accessibility_requirements_level_access_housing], tenant_code: tenant_code, - previous_page: "accessibility_requirements" } + page: "accessibility_requirements" } end let(:questions_for_page) do { "accessibility_requirements" => @@ -124,17 +124,21 @@ RSpec.describe CaseLogsController, type: :controller do end context "conditional routing" do + before do + allow_any_instance_of(CaseLogValidator).to receive(:validate_household_pregnancy).and_return(true) + end + let(:case_log_form_conditional_question_yes_params) do { pregnancy: "Yes", - previous_page: "conditional_question", + page: "conditional_question", } end let(:case_log_form_conditional_question_no_params) do { pregnancy: "No", - previous_page: "conditional_question", + page: "conditional_question", } end diff --git a/spec/features/case_log_spec.rb b/spec/features/case_log_spec.rb index df96ba2ed..7e2c7b414 100644 --- a/spec/features/case_log_spec.rb +++ b/spec/features/case_log_spec.rb @@ -427,10 +427,12 @@ RSpec.describe "Test Features" do end describe "conditional page routing", js: true do + before do + allow_any_instance_of(CaseLogValidator).to receive(:validate_household_pregnancy).and_return(true) + end + it "can route the user to a different page based on their answer on the current page" do visit("case_logs/#{id}/conditional_question") - # using a question name that is already in the db to avoid - # having to add a new column to the db for this test choose("case-log-pregnancy-yes-field", allow_label_click: true) click_button("Save and continue") expect(page).to have_current_path("/case_logs/#{id}/conditional_question_yes_page")