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-components"
gem "govuk_design_system_formbuilder" gem "govuk_design_system_formbuilder"
gem "hotwire-rails" gem "hotwire-rails"
gem "singleton"
group :development, :test do group :development, :test do
# Call 'byebug' anywhere in the code to stop execution and get a debugger console # 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_json_formatter (~> 0.1)
simplecov-html (0.12.3) simplecov-html (0.12.3)
simplecov_json_formatter (0.1.3) simplecov_json_formatter (0.1.3)
singleton (0.1.1)
sprockets (4.0.2) sprockets (4.0.2)
concurrent-ruby (~> 1.0) concurrent-ruby (~> 1.0)
rack (> 1, < 3) rack (> 1, < 3)
@ -355,6 +356,7 @@ DEPENDENCIES
scss_lint-govuk scss_lint-govuk
selenium-webdriver selenium-webdriver
simplecov simplecov
singleton
tzinfo-data tzinfo-data
web-console (>= 4.1.0) web-console (>= 4.1.0)
webpacker (~> 5.0) webpacker (~> 5.0)

5
app/controllers/case_logs_controller.rb

@ -1,6 +1,7 @@
class CaseLogsController < ApplicationController class CaseLogsController < ApplicationController
skip_before_action :verify_authenticity_token, if: :json_create_request? skip_before_action :verify_authenticity_token, if: :json_create_request?
before_action :authenticate, if: :json_create_request? before_action :authenticate, if: :json_create_request?
@@form_handler = FormHandler.instance
def index def index
@submitted_case_logs = CaseLog.where(status: 1) @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 } render "form/check_answers", locals: { case_log: @case_log, subsection: subsection, form: form }
end 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| 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])
@ -95,6 +96,6 @@ private
end end
def use_form 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
end end

5
app/models/form.rb

@ -1,10 +1,11 @@
class Form class Form
attr_reader :form_definition attr_reader :form_definition
def initialize(start_year, end_year) def initialize(filename)
form_json = "config/forms/#{start_year}_#{end_year}.json" form_json = "config/forms/#{filename}.json"
raise "No form definition file exists for given year".freeze unless File.exist?(form_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) @form_definition = JSON.parse(File.open(form_json).read)
end 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" 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 resources :case_logs do
form.all_pages.keys.map do |page| form.all_pages.keys.map do |page|
get page.to_s, to: "case_logs##{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) { "income_and_benefits" }
let(:subsection_with_numeric_conditionals) { "household_characteristics" } let(:subsection_with_numeric_conditionals) { "household_characteristics" }
let(:subsection_with_radio_conditionals) { "household_needs" } 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 describe "Get answered questions total" do
it "returns 0 if no questions are answered" 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" require "rails_helper"
RSpec.describe ConditionalQuestionsHelper do 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_key) { "armed_forces" }
let(:page) { form.all_pages[page_key] } let(:page) { form.all_pages[page_key] }

3
spec/helpers/question_attribute_helper_spec.rb

@ -1,7 +1,8 @@
require "rails_helper" require "rails_helper"
RSpec.describe QuestionAttributeHelper do 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") } let(:questions) { form.questions_for_page("rent") }
describe "html attributes" do describe "html attributes" do

3
spec/helpers/tasklist_helper_spec.rb

@ -3,7 +3,8 @@ require "rails_helper"
RSpec.describe TasklistHelper do RSpec.describe TasklistHelper do
let!(:empty_case_log) { FactoryBot.create(:case_log) } let!(:empty_case_log) { FactoryBot.create(:case_log) }
let!(:case_log) { FactoryBot.create(:case_log, :in_progress) } 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 describe "get subsection status" do
let(:section) { "income_and_benefits" } 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" require "rails_helper"
RSpec.describe Form, type: :model do 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 describe ".next_page" do
let(:previous_page) { "tenant_age" } let(:previous_page) { "tenant_age" }

Loading…
Cancel
Save