Browse Source

All specs currently passing. Can this be real?

pull/72/head
baarkerlounger 4 years ago
parent
commit
2bc54919aa
  1. 24
      app/controllers/case_logs_controller.rb
  2. 6
      app/models/case_log.rb
  3. 26
      app/validations/soft_validations.rb
  4. 6
      app/views/form/page.html.erb
  5. 14
      spec/controllers/case_logs_controller_spec.rb
  6. 6
      spec/features/case_log_spec.rb

24
app/controllers/case_logs_controller.rb

@ -56,15 +56,17 @@ class CaseLogsController < ApplicationController
def submit_form def submit_form
form = FormHandler.instance.get_form("2021_2022") form = FormHandler.instance.get_form("2021_2022")
@case_log = CaseLog.find(params[:id]) @case_log = CaseLog.find(params[:id])
page = params[:case_log][:previous_page] page = params[:case_log][:page]
@case_log.previous_page = page @case_log.current_page = page
responses_for_page = responses_for_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_path = get_next_page_path(form, page, @case_log)
redirect_to(send(redirect_path, @case_log)) redirect_to(send(redirect_path, @case_log))
else else
page_info = form.all_pages[page] 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
end end
@ -92,7 +94,8 @@ class CaseLogsController < ApplicationController
form.all_pages.map do |page_key, page_info| form.all_pages.map do |page_key, page_info|
define_method(page_key) do |_errors = {}| define_method(page_key) do |_errors = {}|
@case_log = CaseLog.find(params[:case_log_id]) @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
end end
@ -135,8 +138,8 @@ private
params.require(:case_log).permit(CaseLog.editable_fields) params.require(:case_log).permit(CaseLog.editable_fields)
end end
def get_next_page_path(form, previous_page, case_log = {}) def get_next_page_path(form, page, case_log = {})
content = form.all_pages[previous_page] content = form.all_pages[page]
if content.key?("conditional_route_to") if content.key?("conditional_route_to")
content["conditional_route_to"].each do |route, conditions| content["conditional_route_to"].each do |route, conditions|
@ -145,6 +148,11 @@ private
end end
end 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
end end

6
app/models/case_log.rb

@ -43,14 +43,14 @@ class CaseLog < ApplicationRecord
validate :instance_validations validate :instance_validations
before_save :update_status! before_save :update_status!
attr_writer :previous_page attr_accessor :current_page, :previous_page
enum status: { "not_started" => 0, "in_progress" => 1, "completed" => 2 } enum status: { "not_started" => 0, "in_progress" => 1, "completed" => 2 }
AUTOGENERATED_FIELDS = %w[id status created_at updated_at discarded_at].freeze AUTOGENERATED_FIELDS = %w[id status created_at updated_at discarded_at].freeze
def instance_validations def instance_validations
validates_with CaseLogValidator, ({ previous_page: @previous_page } || {}) validates_with CaseLogValidator, ({ current_page: current_page } || {})
end end
def self.editable_fields def self.editable_fields
@ -123,7 +123,7 @@ private
dynamically_not_required << "fixed_term_tenancy" dynamically_not_required << "fixed_term_tenancy"
end 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" dynamically_not_required << "override_net_income_validation"
end end

26
app/validations/soft_validations.rb

@ -3,27 +3,39 @@ module SoftValidations
{}.merge(net_income_validations) {}.merge(net_income_validations)
end end
def soft_errors_overridden?
public_send(soft_errors.keys.first) if soft_errors.present?
end
private private
def net_income_validations def net_income_validations
net_income_errors = {} net_income_errors = {}
if weekly_net_income && person_1_economic_status && override_net_income_validation.blank? if net_income_in_soft_min_range?
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( 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?", 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}", 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 elsif net_income_in_soft_max_range?
net_income_errors["override_net_income_validation"] = OpenStruct.new( 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?", 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}", hint_text: "This is based on the tenant's work situation: #{person_1_economic_status}",
) )
else
update_column(:override_net_income_validation, nil)
end end
elsif weekly_net_income && person_1_economic_status && override_net_income_validation.present? net_income_errors
if weekly_net_income > applicable_income_range.soft_min && weekly_net_income < applicable_income_range.soft_max
update!(override_net_income_validation: nil)
end 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 end
net_income_errors
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
end end

6
app/views/form/page.html.erb

@ -1,5 +1,7 @@
<% content_for :before_content do %> <% 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 %> <% end %>
<%= turbo_frame_tag "case_log_form", target: "_top" do %> <%= turbo_frame_tag "case_log_form", target: "_top" do %>
@ -21,7 +23,7 @@
<%= render partial: "form/validation_override_question", locals: { f: f } %> <%= render partial: "form/validation_override_question", locals: { f: f } %>
<% end %> <% end %>
<%= f.hidden_field :previous_page, value: page_key %> <%= f.hidden_field :page, value: page_key %>
<%= f.govuk_submit "Save and continue" %> <%= f.govuk_submit "Save and continue" %>
<% end %> <% end %>
<% end %> <% end %>

14
spec/controllers/case_logs_controller_spec.rb

@ -52,13 +52,13 @@ RSpec.describe CaseLogsController, type: :controller do
%w[ accessibility_requirements_fully_wheelchair_accessible_housing %w[ accessibility_requirements_fully_wheelchair_accessible_housing
accessibility_requirements_wheelchair_access_to_essential_rooms accessibility_requirements_wheelchair_access_to_essential_rooms
accessibility_requirements_level_access_housing], accessibility_requirements_level_access_housing],
previous_page: "accessibility_requirements" } page: "accessibility_requirements" }
end end
let(:new_case_log_form_params) do let(:new_case_log_form_params) do
{ {
accessibility_requirements: %w[accessibility_requirements_level_access_housing], accessibility_requirements: %w[accessibility_requirements_level_access_housing],
previous_page: "accessibility_requirements", page: "accessibility_requirements",
} }
end end
@ -88,7 +88,7 @@ RSpec.describe CaseLogsController, type: :controller do
accessibility_requirements_wheelchair_access_to_essential_rooms accessibility_requirements_wheelchair_access_to_essential_rooms
accessibility_requirements_level_access_housing], accessibility_requirements_level_access_housing],
tenant_code: tenant_code, tenant_code: tenant_code,
previous_page: "accessibility_requirements" } page: "accessibility_requirements" }
end end
let(:questions_for_page) do let(:questions_for_page) do
{ "accessibility_requirements" => { "accessibility_requirements" =>
@ -124,17 +124,21 @@ RSpec.describe CaseLogsController, type: :controller do
end end
context "conditional routing" do 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 let(:case_log_form_conditional_question_yes_params) do
{ {
pregnancy: "Yes", pregnancy: "Yes",
previous_page: "conditional_question", page: "conditional_question",
} }
end end
let(:case_log_form_conditional_question_no_params) do let(:case_log_form_conditional_question_no_params) do
{ {
pregnancy: "No", pregnancy: "No",
previous_page: "conditional_question", page: "conditional_question",
} }
end end

6
spec/features/case_log_spec.rb

@ -427,10 +427,12 @@ RSpec.describe "Test Features" do
end end
describe "conditional page routing", js: true do 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 it "can route the user to a different page based on their answer on the current page" do
visit("case_logs/#{id}/conditional_question") 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) choose("case-log-pregnancy-yes-field", allow_label_click: true)
click_button("Save and continue") click_button("Save and continue")
expect(page).to have_current_path("/case_logs/#{id}/conditional_question_yes_page") expect(page).to have_current_path("/case_logs/#{id}/conditional_question_yes_page")

Loading…
Cancel
Save