diff --git a/Gemfile b/Gemfile index f28f6dee0..60ca7b1b6 100644 --- a/Gemfile +++ b/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 diff --git a/Gemfile.lock b/Gemfile.lock index 328d2a9ef..d565e7d8c 100644 --- a/Gemfile.lock +++ b/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) diff --git a/app/controllers/case_logs_controller.rb b/app/controllers/case_logs_controller.rb index 94bac8b60..efb2e0be9 100644 --- a/app/controllers/case_logs_controller.rb +++ b/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 diff --git a/app/models/form.rb b/app/models/form.rb index 031c0093c..902ef6c56 100644 --- a/app/models/form.rb +++ b/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 diff --git a/app/models/form_handler.rb b/app/models/form_handler.rb new file mode 100644 index 000000000..8576859b2 --- /dev/null +++ b/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 diff --git a/config/routes.rb b/config/routes.rb index 812a4d127..346fccff9 100644 --- a/config/routes.rb +++ b/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}" diff --git a/spec/helpers/check_answers_helper_spec.rb b/spec/helpers/check_answers_helper_spec.rb index bdc768079..4e04496d4 100644 --- a/spec/helpers/check_answers_helper_spec.rb +++ b/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 diff --git a/spec/helpers/conditional_questions_helper_spec.rb b/spec/helpers/conditional_questions_helper_spec.rb index fe5d3c469..0c611f635 100644 --- a/spec/helpers/conditional_questions_helper_spec.rb +++ b/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] } diff --git a/spec/helpers/question_attribute_helper_spec.rb b/spec/helpers/question_attribute_helper_spec.rb index 51298418c..5dce09cd6 100644 --- a/spec/helpers/question_attribute_helper_spec.rb +++ b/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 diff --git a/spec/helpers/tasklist_helper_spec.rb b/spec/helpers/tasklist_helper_spec.rb index a01311756..28860962f 100644 --- a/spec/helpers/tasklist_helper_spec.rb +++ b/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" } diff --git a/spec/models/form_handler_spec.rb b/spec/models/form_handler_spec.rb new file mode 100644 index 000000000..58daaf10b --- /dev/null +++ b/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 diff --git a/spec/models/form_spec.rb b/spec/models/form_spec.rb index 3d3080f43..b26e2014c 100644 --- a/spec/models/form_spec.rb +++ b/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" }