Browse Source

Enable user based depends on

pull/653/head
baarkerlounger 3 years ago
parent
commit
0bf695daef
  1. 29
      app/controllers/form_controller.rb
  2. 5
      app/models/form.rb
  3. 47
      spec/features/form/page_routing_spec.rb
  4. 5
      spec/fixtures/forms/2021_2022.json

29
app/controllers/form_controller.rb

@ -1,7 +1,6 @@
class FormController < ApplicationController class FormController < ApplicationController
before_action :authenticate_user! before_action :authenticate_user!
before_action :find_resource, only: %i[submit_form review] before_action :find_resources
before_action :find_resource_by_named_id, except: %i[submit_form review]
def submit_form def submit_form
if @case_log if @case_log
@ -23,7 +22,7 @@ class FormController < ApplicationController
def check_answers def check_answers
if @case_log if @case_log
current_url = request.env["PATH_INFO"] current_url = request.env["PATH_INFO"]
subsection = @case_log.form.get_subsection(current_url.split("/")[-2]) subsection = @form.get_subsection(current_url.split("/")[-2])
render "form/check_answers", locals: { subsection: } render "form/check_answers", locals: { subsection: }
else else
render_not_found render_not_found
@ -91,12 +90,16 @@ private
end end
end end
def find_resource def find_resources
@case_log = current_user.case_logs.find_by(id: params[:id]) @case_log = if params[:case_log_id]
end current_user.case_logs.find_by(id: params[:case_log_id])
else
current_user.case_logs.find_by(id: params[:id])
end
return unless @case_log
def find_resource_by_named_id @form = @case_log.form
@case_log = current_user.case_logs.find_by(id: params[:case_log_id]) @form.current_user = current_user
end end
def is_referrer_check_answers? def is_referrer_check_answers?
@ -106,17 +109,17 @@ private
def successful_redirect_path def successful_redirect_path
if is_referrer_check_answers? if is_referrer_check_answers?
page_ids = @case_log.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 = @case_log.form.next_page(@page, @case_log) next_page = @form.next_page(@page, @case_log)
previous_page = @case_log.form.previous_page(page_ids, page_index, @case_log) previous_page = @form.previous_page(page_ids, page_index, @case_log)
if next_page.to_s.include?("value_check") || next_page == previous_page if next_page.to_s.include?("value_check") || next_page == previous_page
return "/logs/#{@case_log.id}/#{next_page.dasherize}?referrer=check_answers" return "/logs/#{@case_log.id}/#{next_page.dasherize}?referrer=check_answers"
else else
return send("case_log_#{@case_log.form.subsection_for_page(@page).id}_check_answers_path", @case_log) return send("case_log_#{@form.subsection_for_page(@page).id}_check_answers_path", @case_log)
end end
end end
redirect_path = @case_log.form.next_page_redirect_path(@page, @case_log) redirect_path = @form.next_page_redirect_path(@page, @case_log)
send(redirect_path, @case_log) send(redirect_path, @case_log)
end end
end end

5
app/models/form.rb

@ -1,6 +1,7 @@
class Form class Form
attr_reader :form_definition, :sections, :subsections, :pages, :questions, attr_reader :form_definition, :sections, :subsections, :pages, :questions,
:start_date, :end_date, :type, :name :start_date, :end_date, :type, :name
attr_accessor :current_user
def initialize(form_path, name) def initialize(form_path, name)
raise "No form definition file exists for given year".freeze unless File.exist?(form_path) raise "No form definition file exists for given year".freeze unless File.exist?(form_path)
@ -14,6 +15,7 @@ class Form
@subsections = sections.flat_map(&:subsections) @subsections = sections.flat_map(&:subsections)
@pages = subsections.flat_map(&:pages) @pages = subsections.flat_map(&:pages)
@questions = pages.flat_map(&:questions) @questions = pages.flat_map(&:questions)
@current_user = nil
end end
def get_subsection(id) def get_subsection(id)
@ -163,8 +165,9 @@ class Form
when "case_log" when "case_log"
case_log case_log
when "user" when "user"
nil current_user
end end
return false unless object_instance
if value.is_a?(Hash) && value.key?("operator") if value.is_a?(Hash) && value.key?("operator")
operator = value["operator"] operator = value["operator"]

47
spec/features/form/page_routing_spec.rb

@ -47,7 +47,52 @@ RSpec.describe "Form Page Routing" do
expect(page).to have_current_path("/logs/#{id}/conditional-question/check-answers") expect(page).to have_current_path("/logs/#{id}/conditional-question/check-answers")
end end
context "when the answers are inferred", js: true do context "when a page is dependent on the current user's role" do
let(:case_log) do
FactoryBot.create(
:case_log,
:in_progress,
owning_organisation: user.organisation,
managing_organisation: user.organisation,
is_previous_la_inferred: false,
)
end
context "when the user has the required role" do
it "routes to the page" do
visit("/logs/#{id}/property-postcode")
click_button("Save and continue")
expect(page).to have_current_path("/logs/#{id}/do-you-know-the-local-authority")
end
end
context "when the user does not have the required role" do
let(:support_user) { FactoryBot.create(:user, :support, organisation: user.organisation) }
let(:devise_notify_mailer) { DeviseNotifyMailer.new }
let(:notify_client) { instance_double(Notifications::Client) }
let(:otp) { "999111" }
before do
allow(DeviseNotifyMailer).to receive(:new).and_return(devise_notify_mailer)
allow(devise_notify_mailer).to receive(:notify_client).and_return(notify_client)
allow(notify_client).to receive(:send_email).and_return(true)
allow(SecureRandom).to receive(:random_number).and_return(otp)
click_link("Sign out")
visit("/account/sign-in")
sign_in support_user
fill_in("code", with: otp)
click_button("Submit")
end
it "does not route to the page" do
visit("/logs/#{id}/property-postcode")
click_button("Save and continue")
expect(page).to have_current_path("/logs/#{id}/property-wheelchair-accessible")
end
end
end
context "when the answers are inferred" do
it "shows question if the answer could not be inferred" do it "shows question if the answer could not be inferred" do
visit("/logs/#{id}/property-postcode") visit("/logs/#{id}/property-postcode")
fill_in("case-log-postcode-full-field", with: "PO5 3TE") fill_in("case-log-postcode-full-field", with: "PO5 3TE")

5
spec/fixtures/forms/2021_2022.json vendored

@ -463,7 +463,10 @@
} }
}, },
"depends_on": [ "depends_on": [
[{"object": "case_log", "method": "is_la_inferred", "value": false}] [
{"object": "case_log", "method": "is_la_inferred", "value": false},
{"object": "user", "method": "role", "value": "data_provider"}
]
] ]
}, },
"property_wheelchair_accessible": { "property_wheelchair_accessible": {

Loading…
Cancel
Save