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
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

6
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

26
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
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 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(
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
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)
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
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

6
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 %>

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
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

6
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")

Loading…
Cancel
Save