Browse Source

Extract creation of form into a formHandler

pull/46/head
Kat 4 years ago committed by MadeTech Dushan
parent
commit
a2af0ae9d6
  1. 1
      Gemfile
  2. 2
      Gemfile.lock
  3. 5
      app/controllers/case_logs_controller.rb
  4. 5
      app/models/form.rb
  5. 22
      app/models/form_handler.rb
  6. 3
      config/routes.rb
  7. 3
      spec/helpers/check_answers_helper_spec.rb
  8. 3
      spec/helpers/conditional_questions_helper_spec.rb
  9. 3
      spec/helpers/question_attribute_helper_spec.rb
  10. 3
      spec/helpers/tasklist_helper_spec.rb
  11. 27
      spec/models/form_handler_spec.rb
  12. 3
      spec/models/form_spec.rb

1
Gemfile

@ -21,6 +21,7 @@ gem "bootsnap", ">= 1.4.4", require: false
gem "govuk-components"
gem "govuk_design_system_formbuilder"
gem "hotwire-rails"
gem "singleton"
group :development, :test do
# Call 'byebug' anywhere in the code to stop execution and get a debugger console

2
Gemfile.lock

@ -287,6 +287,7 @@ GEM
simplecov_json_formatter (~> 0.1)
simplecov-html (0.12.3)
simplecov_json_formatter (0.1.3)
singleton (0.1.1)
sprockets (4.0.2)
concurrent-ruby (~> 1.0)
rack (> 1, < 3)
@ -355,6 +356,7 @@ DEPENDENCIES
scss_lint-govuk
selenium-webdriver
simplecov
singleton
tzinfo-data
web-console (>= 4.1.0)
webpacker (~> 5.0)

5
app/controllers/case_logs_controller.rb

@ -1,6 +1,7 @@
class CaseLogsController < ApplicationController
skip_before_action :verify_authenticity_token, if: :json_create_request?
before_action :authenticate, if: :json_create_request?
@@form_handler = FormHandler.instance
def index
@submitted_case_logs = CaseLog.where(status: 1)
@ -56,7 +57,7 @@ class CaseLogsController < ApplicationController
render "form/check_answers", locals: { case_log: @case_log, subsection: subsection, form: form }
end
form = ENV["RAILS_ENV"] == "test" ? Form.new("test", "form") : Form.new(2021, 2022)
form = ENV["RAILS_ENV"] == "test" ? @@form_handler.get_form("test_form") : @@form_handler.get_form("2021_2022")
form.all_pages.map do |page_key, page_info|
define_method(page_key) do |_errors = {}|
@case_log = CaseLog.find(params[:case_log_id])
@ -95,6 +96,6 @@ private
end
def use_form
ENV["RAILS_ENV"] == "test" ? Form.new("test", "form") : Form.new(2021, 2022)
ENV["RAILS_ENV"] == "test" ? @@form_handler.get_form("test_form") : @@form_handler.get_form("2021_2022")
end
end

5
app/models/form.rb

@ -1,10 +1,11 @@
class Form
attr_reader :form_definition
def initialize(start_year, end_year)
form_json = "config/forms/#{start_year}_#{end_year}.json"
def initialize(filename)
form_json = "config/forms/#{filename}.json"
raise "No form definition file exists for given year".freeze unless File.exist?(form_json)
@form_definition = JSON.parse(File.open(form_json).read)
end

22
app/models/form_handler.rb

@ -0,0 +1,22 @@
class FormHandler
include Singleton
def initialize
@forms = {}
end
def get_form(form)
# binding.pry
@forms[form] ||= Form.new(form)
end
def get_all_forms
Dir.foreach("config/forms") do |filename|
next if (filename == ".") || (filename == "..")
form_name = filename.sub(".json", "")
@forms[form_name] = Form.new(form_name)
end
@forms
end
end

3
config/routes.rb

@ -5,7 +5,8 @@ Rails.application.routes.draw do
post "/case_logs/:id", to: "case_logs#submit_form"
form = ENV["RAILS_ENV"] == "test" ? Form.new("test", "form") : Form.new(2021, 2022)
form_handler = FormHandler.instance
form = ENV["RAILS_ENV"] == "test" ? form_handler.get_form("test_form") : form_handler.get_form("2021_2022")
resources :case_logs do
form.all_pages.keys.map do |page|
get page.to_s, to: "case_logs##{page}"

3
spec/helpers/check_answers_helper_spec.rb

@ -16,7 +16,8 @@ RSpec.describe CheckAnswersHelper do
let(:subsection) { "income_and_benefits" }
let(:subsection_with_numeric_conditionals) { "household_characteristics" }
let(:subsection_with_radio_conditionals) { "household_needs" }
let(:form) { Form.new("test", "form") }
form_handler = FormHandler.instance
let(:form) { form_handler.get_form("test_form") }
describe "Get answered questions total" do
it "returns 0 if no questions are answered" do

3
spec/helpers/conditional_questions_helper_spec.rb

@ -1,7 +1,8 @@
require "rails_helper"
RSpec.describe ConditionalQuestionsHelper do
let(:form) { Form.new("test", "form") }
form_handler = FormHandler.instance
let(:form) { form_handler.get_form("test_form") }
let(:page_key) { "armed_forces" }
let(:page) { form.all_pages[page_key] }

3
spec/helpers/question_attribute_helper_spec.rb

@ -1,7 +1,8 @@
require "rails_helper"
RSpec.describe QuestionAttributeHelper do
let(:form) { Form.new("test", "form") }
form_handler = FormHandler.instance
let(:form) { form_handler.get_form("test_form") }
let(:questions) { form.questions_for_page("rent") }
describe "html attributes" do

3
spec/helpers/tasklist_helper_spec.rb

@ -3,7 +3,8 @@ require "rails_helper"
RSpec.describe TasklistHelper do
let!(:empty_case_log) { FactoryBot.create(:case_log) }
let!(:case_log) { FactoryBot.create(:case_log, :in_progress) }
let(:form) { Form.new("test", "form") }
form_handler = FormHandler.instance
let(:form) { form_handler.get_form("test_form") }
describe "get subsection status" do
let(:section) { "income_and_benefits" }

27
spec/models/form_handler_spec.rb

@ -0,0 +1,27 @@
require "rails_helper"
RSpec.describe FormHandler do
describe "Get all forms" do
it "should be able to load all the forms" do
form_handler = FormHandler.instance
all_forms = form_handler.get_all_forms
expect(all_forms.count).to be >= 1
expect(all_forms["2021_2022"]).to be_a(Form)
end
end
describe "Get specific form" do
it "should be able to load a specific form" do
form_handler = FormHandler.instance
form = form_handler.get_form("2021_2022")
expect(form).to be_a(Form)
expect(form.all_pages.count).to eq(43)
end
end
it "should only load the form once at boot time" do
form_handler = FormHandler.instance
expect(Form).not_to receive(:new).with("test_form")
expect(form_handler.get_form("test_form")).to be_a(Form)
end
end

3
spec/models/form_spec.rb

@ -1,7 +1,8 @@
require "rails_helper"
RSpec.describe Form, type: :model do
let(:form) { Form.new("test", "form") }
form_handler = FormHandler.instance
let(:form) { form_handler.get_form("test_form") }
describe ".next_page" do
let(:previous_page) { "tenant_age" }

Loading…
Cancel
Save