Browse Source

feat: make tests pass, simplify code and incorporate tasklist/check answers back routing

pull/1515/head
natdeanlewissoftwire 3 years ago
parent
commit
4d60926b18
  1. 4
      app/controllers/form_controller.rb
  2. 2
      app/helpers/tasklist_helper.rb
  3. 45
      app/models/form.rb
  4. 6
      app/views/form/page.html.erb
  5. 14
      spec/models/form_spec.rb

4
app/controllers/form_controller.rb

@ -124,9 +124,9 @@ private
if is_referrer_check_answers? if is_referrer_check_answers?
page_ids = form.subsection_for_page(@page).pages.map(&:id) page_ids = form.subsection_for_page(@page).pages.map(&:id)
page_index = page_ids.index(@page.id) page_index = page_ids.index(@page.id)
next_page_id = form.next_page(@page, @log, current_user) next_page_id = form.next_page_id(@page, @log, current_user)
next_page = form.get_page(next_page_id) next_page = form.get_page(next_page_id)
previous_page = form.previous_page(@page, @log, current_user) previous_page = form.previous_page_id(@page, @log, current_user)
if next_page&.interruption_screen? || next_page_id == previous_page if next_page&.interruption_screen? || next_page_id == previous_page
return send("#{@log.class.name.underscore}_#{next_page_id}_path", @log, { referrer: "check_answers" }) return send("#{@log.class.name.underscore}_#{next_page_id}_path", @log, { referrer: "check_answers" })

2
app/helpers/tasklist_helper.rb

@ -15,7 +15,7 @@ module TasklistHelper
if subsection.pages.first.routed_to?(log, current_user) if subsection.pages.first.routed_to?(log, current_user)
subsection.pages.first.id subsection.pages.first.id
else else
log.form.next_page(subsection.pages.first, log, current_user) log.form.next_page_id(subsection.pages.first, log, current_user)
end end
end end

45
app/models/form.rb

@ -61,55 +61,54 @@ class Form
subsections.find { |s| s.pages.find { |p| p.id == page.id } } subsections.find { |s| s.pages.find { |p| p.id == page.id } }
end end
def next_page(page, log, current_user) def next_page_id(page, log, current_user)
return page.next_unresolved_page_id || :check_answers if log.unresolved return page.next_unresolved_page_id || :check_answers if log.unresolved
page_ids = subsection_for_page(page).pages.map(&:id) page_ids = subsection_for_page(page).pages.map(&:id)
page_index = page_ids.index(page.id) page_index = page_ids.index(page.id)
page_id = if page.interruption_screen? && log[page.questions[0].id] == 1 && page.routed_to?(log, current_user) page_id = if page.interruption_screen? && log[page.questions[0].id] == 1 && page.routed_to?(log, current_user)
previous_page(page, log, current_user) previous_page_id(page, log, current_user)
else else
page_ids[page_index + 1] page_ids[page_index + 1]
end end
nxt_page = get_page(page_id) next_page = get_page(page_id)
return :check_answers if nxt_page.nil? return :check_answers if next_page.nil?
return nxt_page.id if nxt_page.routed_to?(log, current_user) return next_page.id if next_page.routed_to?(log, current_user)
next_page(nxt_page, log, current_user) next_page_id(next_page, log, current_user)
end end
def next_page_redirect_path(page, log, current_user) def next_page_redirect_path(page, log, current_user)
nxt_page = next_page(page, log, current_user) next_page_id = next_page_id(page, log, current_user)
if nxt_page == :check_answers if next_page_id == :check_answers
"#{type}_log_#{subsection_for_page(page).id}_check_answers_path" "#{type}_log_#{subsection_for_page(page).id}_check_answers_path"
else else
"#{type}_log_#{nxt_page}_path" "#{type}_log_#{next_page_id}_path"
end end
end end
def previous_page(page, log, current_user) def previous_page_id(page, log, current_user)
page_ids = subsection_for_page(page).pages.map(&:id) page_ids = subsection_for_page(page).pages.map(&:id)
page_index = page_ids.index(page.id) page_index = page_ids.index(page.id)
page_id = if page_index.zero? return :tasklist if page_index.zero?
:check_answers
else page_id = page_ids[page_index - 1]
page_ids[page_index - 1] previous_page = get_page(page_id)
end
prvs_page = get_page(page_id)
return :check_answers if prvs_page.nil? return previous_page.id if previous_page.routed_to?(log, current_user)
return prvs_page.id if prvs_page.routed_to?(log, current_user)
previous_page(prvs_page, log, current_user) previous_page_id(previous_page, log, current_user)
end end
def previous_page_redirect_path(page, log, current_user) def previous_page_redirect_path(page, log, current_user, referrer)
previous_page = previous_page(page, log, current_user) previous_page_id = previous_page_id(page, log, current_user)
if previous_page == :check_answers if referrer == "check_answers"
"#{type}_log_#{subsection_for_page(page).id}_check_answers_path" "#{type}_log_#{subsection_for_page(page).id}_check_answers_path"
elsif previous_page_id == :tasklist
"#{type}_log_path"
else else
"#{type}_log_#{previous_page}_path" "#{type}_log_#{previous_page_id}_path"
end end
end end

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

@ -1,11 +1,7 @@
<% content_for :title, @page.header.presence || @page.questions.first.header.html_safe %> <% content_for :title, @page.header.presence || @page.questions.first.header.html_safe %>
<% content_for :before_content do %> <% content_for :before_content do %>
<% if url_for(:back).include?("check_answers") %> <%= govuk_back_link(href: send(@log.form.previous_page_redirect_path(@page, @log, current_user, params[:referrer]), @log)) %>
<%= govuk_back_link(href: :back) %>
<% else %>
<%= govuk_back_link(href: send(@log.form.previous_page_redirect_path(@page, @log, current_user), @log)) %>
<% end %>
<% end %> <% end %>
<div data-controller="govukfrontend"></div> <div data-controller="govukfrontend"></div>

14
spec/models/form_spec.rb

@ -17,11 +17,11 @@ RSpec.describe Form, type: :model do
let(:conditional_section_complete_lettings_log) { FactoryBot.build(:lettings_log, :conditional_section_complete) } let(:conditional_section_complete_lettings_log) { FactoryBot.build(:lettings_log, :conditional_section_complete) }
describe ".next_page" do describe ".next_page" do
let(:previous_page) { form.get_page("person_1_age") } let(:previous_page_id) { form.get_page("person_1_age") }
let(:value_check_previous_page) { form.get_page("net_income_value_check") } let(:value_check_previous_page) { form.get_page("net_income_value_check") }
it "returns the next page given the previous" do it "returns the next page given the previous" do
expect(form.next_page(previous_page, lettings_log, user)).to eq("person_1_gender") expect(form.next_page_id(previous_page, lettings_log, user)).to eq("person_1_gender")
end end
context "when the current page is a value check page" do context "when the current page is a value check page" do
@ -33,12 +33,12 @@ RSpec.describe Form, type: :model do
it "returns the previous page if answer is `No` and the page is routed to" do it "returns the previous page if answer is `No` and the page is routed to" do
lettings_log.net_income_value_check = 1 lettings_log.net_income_value_check = 1
expect(form.next_page(value_check_previous_page, lettings_log, user)).to eq("net_income") expect(form.next_page_id(value_check_previous_page, lettings_log, user)).to eq("net_income")
end end
it "returns the next page if answer is `Yes` answer and the page is routed to" do it "returns the next page if answer is `Yes` answer and the page is routed to" do
lettings_log.net_income_value_check = 0 lettings_log.net_income_value_check = 0
expect(form.next_page(value_check_previous_page, lettings_log, user)).to eq("net_income_uc_proportion") expect(form.next_page_id(value_check_previous_page, lettings_log, user)).to eq("net_income_uc_proportion")
end end
end end
end end
@ -54,18 +54,18 @@ RSpec.describe Form, type: :model do
it "returns the previous page if the page is routed to" do it "returns the previous page if the page is routed to" do
page_index = page_ids.index("conditional_question_no_second_page") page_index = page_ids.index("conditional_question_no_second_page")
expect(form.previous_page(page_ids, page_index, lettings_log, user)).to eq("conditional_question_no_page") expect(form.previous_page_id(page_ids, page_index, lettings_log, user)).to eq("conditional_question_no_page")
end end
it "returns the page before the previous one if the previous page is not routed to" do it "returns the page before the previous one if the previous page is not routed to" do
page_index = page_ids.index("conditional_question_no_page") page_index = page_ids.index("conditional_question_no_page")
expect(form.previous_page(page_ids, page_index, lettings_log, user)).to eq("conditional_question") expect(form.previous_page_id(page_ids, page_index, lettings_log, user)).to eq("conditional_question")
end end
end end
end end
describe "next_page_redirect_path" do describe "next_page_redirect_path" do
let(:previous_page) { form.get_page("net_income") } let(:previous_page_id) { form.get_page("net_income") }
let(:last_previous_page) { form.get_page("housing_benefit") } let(:last_previous_page) { form.get_page("housing_benefit") }
let(:previous_conditional_page) { form.get_page("conditional_question") } let(:previous_conditional_page) { form.get_page("conditional_question") }

Loading…
Cancel
Save