From c7dc3b339b3b3989e2195d472a7c3c097c7c92ba Mon Sep 17 00:00:00 2001 From: Kat Date: Wed, 14 Sep 2022 14:59:41 +0100 Subject: [PATCH] Implement current_lettings_form, current_sales_form and store year and form type in form --- app/models/form_handler.rb | 27 ++++++++++------- app/models/lettings_log.rb | 2 +- app/models/rent_period.rb | 2 +- app/models/sales_log.rb | 2 +- app/models/validations/date_validations.rb | 8 ++--- app/services/csv/lettings_log_csv_service.rb | 2 +- config/routes.rb | 8 ++--- spec/features/form/check_answers_page_spec.rb | 1 + .../form/conditional_questions_spec.rb | 1 + spec/features/form/form_navigation_spec.rb | 1 + spec/features/form/validations_spec.rb | 1 + .../conditional_questions_helper_spec.rb | 4 +++ .../helpers/question_attribute_helper_spec.rb | 4 +++ spec/helpers/tasklist_helper_spec.rb | 4 +++ spec/jobs/email_csv_job_spec.rb | 4 +++ spec/models/form/page_spec.rb | 4 +++ spec/models/form/question_spec.rb | 4 +++ spec/models/form/section_spec.rb | 4 +++ spec/models/form/subsection_spec.rb | 1 + spec/models/form_handler_spec.rb | 29 ++++++------------- spec/models/lettings_log_spec.rb | 4 +++ spec/models/rent_period_spec.rb | 2 +- .../validations/financial_validations_spec.rb | 4 +++ .../validations/household_validations_spec.rb | 4 +++ .../validations/shared_validations_spec.rb | 4 +++ spec/requests/form_controller_spec.rb | 4 +++ .../requests/lettings_logs_controller_spec.rb | 1 + 27 files changed, 92 insertions(+), 44 deletions(-) diff --git a/app/models/form_handler.rb b/app/models/form_handler.rb index e55e49dda..6ea022614 100644 --- a/app/models/form_handler.rb +++ b/app/models/form_handler.rb @@ -7,19 +7,24 @@ class FormHandler end def get_form(form) - @forms[form] + @forms[form].present? ? @forms[form]["form"] : nil end - def current_form - forms[forms.keys.max_by(&:to_i)] + def current_lettings_form + forms["current_lettings"]["form"] + end + + def current_sales_form + forms["current_sales"]["form"] end def sales_forms sales_sections = [] # Add section classes here e.g. Form::Sales::Property::Sections::PropertyInformation - { "2022_2023_sales" => Form.new(nil, "2022_2023_sales", sales_sections, "sales"), - "current_sales" => Form.new(nil, "#{current_collection_start_year}_#{current_collection_start_year + 1}_sales", sales_sections, "sales"), - "previous_sales" => Form.new(nil, "#{current_collection_start_year - 1}_#{current_collection_start_year}_sales", sales_sections, "sales"), - "next_sales" => Form.new(nil, "#{current_collection_start_year + 1}_#{current_collection_start_year + 2}_sales", sales_sections, "sales") } + current_form = Form.new(nil, "#{current_collection_start_year}_#{current_collection_start_year + 1}_sales", sales_sections, "sales") + previous_form = Form.new(nil, "#{current_collection_start_year - 1}_#{current_collection_start_year}_sales", sales_sections, "sales") + { "2022_2023_sales" => { "form" => Form.new(nil, "2022_2023_sales", sales_sections, "sales"), "type" => "sales" }, + "current_sales" => { "form" => current_form, "type" => "sales", "start_year" => current_form.start_date.year }, + "previous_sales" => { "form" => previous_form, "type" => "sales", "start_year" => previous_form.start_date.year } } end def lettings_forms @@ -28,13 +33,13 @@ class FormHandler Dir.glob("#{directory}/*.json").each do |form_path| form_name = File.basename(form_path, ".json") form = Form.new(form_path, form_name) - forms[form_name] = form + forms[form_name] = { "form" => form, "type" => "lettings", "start_year" => form.start_date.year } if form.start_date.year + 1 == current_collection_start_year && forms["previous_lettings"].blank? - forms["previous_lettings"] = form + forms["previous_lettings"] = { "form" => form, "type" => "lettings", "start_year" => form.start_date.year } elsif form.start_date.year == current_collection_start_year && forms["current_lettings"].blank? - forms["current_lettings"] = form + forms["current_lettings"] = { "form" => form, "type" => "lettings", "start_year" => form.start_date.year } elsif form.start_date.year - 1 == current_collection_start_year && forms["next_lettings"].blank? - forms["next_lettings"] = form + forms["next_lettings"] = { "form" => form, "type" => "lettings", "start_year" => form.start_date.year } end end end diff --git a/app/models/lettings_log.rb b/app/models/lettings_log.rb index 33d5974ce..42e0d49e8 100644 --- a/app/models/lettings_log.rb +++ b/app/models/lettings_log.rb @@ -55,7 +55,7 @@ class LettingsLog < Log RETIREMENT_AGES = { "M" => 67, "F" => 60, "X" => 67 }.freeze def form - FormHandler.instance.get_form(form_name) || FormHandler.instance.forms.first.second + FormHandler.instance.get_form(form_name) || FormHandler.instance.current_lettings_form end def recalculate_start_year! diff --git a/app/models/rent_period.rb b/app/models/rent_period.rb index 77e154f4c..d48fe20ea 100644 --- a/app/models/rent_period.rb +++ b/app/models/rent_period.rb @@ -1,5 +1,5 @@ class RentPeriod def self.rent_period_mappings - FormHandler.instance.current_form.get_question("period", nil).answer_options + FormHandler.instance.current_lettings_form.get_question("period", nil).answer_options end end diff --git a/app/models/sales_log.rb b/app/models/sales_log.rb index f73b518e5..716cd598c 100644 --- a/app/models/sales_log.rb +++ b/app/models/sales_log.rb @@ -27,7 +27,7 @@ class SalesLog < Log end def form - FormHandler.instance.get_form(form_name) || FormHandler.instance.get_form("2022_2023_sales") + FormHandler.instance.get_form(form_name) || FormHandler.instance.current_sales_form end def optional_fields diff --git a/app/models/validations/date_validations.rb b/app/models/validations/date_validations.rb index 8f8d87220..11f486d32 100644 --- a/app/models/validations/date_validations.rb +++ b/app/models/validations/date_validations.rb @@ -60,19 +60,19 @@ module Validations::DateValidations private def first_collection_start_date - @first_collection_start_date ||= FormHandler.instance.forms.map { |form| form.second.start_date }.compact.min + @first_collection_start_date ||= FormHandler.instance.forms.map { |_name, form| form["form"].start_date }.compact.min end def first_collection_end_date - @first_collection_end_date ||= FormHandler.instance.forms.map { |form| form.second.end_date }.compact.min + @first_collection_end_date ||= FormHandler.instance.forms.map { |_name, form| form["form"].end_date }.compact.min end def second_collection_start_date - @second_collection_start_date ||= FormHandler.instance.forms.map { |form| form.second.start_date }.compact.max + @second_collection_start_date ||= FormHandler.instance.forms.map { |_name, form| form["form"].start_date }.compact.max end def second_collection_end_date - @second_collection_end_date ||= FormHandler.instance.forms.map { |form| form.second.end_date }.compact.max + @second_collection_end_date ||= FormHandler.instance.forms.map { |_name, form| form["form"].end_date }.compact.max end def date_valid?(question, record) diff --git a/app/services/csv/lettings_log_csv_service.rb b/app/services/csv/lettings_log_csv_service.rb index 6070e91c2..07795b1e2 100644 --- a/app/services/csv/lettings_log_csv_service.rb +++ b/app/services/csv/lettings_log_csv_service.rb @@ -51,7 +51,7 @@ module Csv def ordered_form_questions downloaded_form_years = LettingsLog.all.map(&:collection_start_year).uniq.compact - downloaded_form_fields = downloaded_form_years.count == 1 && downloaded_form_years[0].present? ? FormHandler.instance.get_form("#{downloaded_form_years[0]}_#{downloaded_form_years[0] + 1}").questions : FormHandler.instance.forms.first.second.questions + downloaded_form_fields = downloaded_form_years.count == 1 && downloaded_form_years[0].present? ? FormHandler.instance.get_form("#{downloaded_form_years[0]}_#{downloaded_form_years[0] + 1}").questions : FormHandler.instance.current_lettings_form.questions move_checkbox_answer_options(downloaded_form_fields) end diff --git a/config/routes.rb b/config/routes.rb index 0c4409713..340778351 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -93,11 +93,11 @@ Rails.application.routes.draw do end FormHandler.instance.lettings_forms.each do |_key, form| - form.pages.map do |page| + form["form"].pages.map do |page| get page.id.to_s.dasherize, to: "form#show_page" end - form.subsections.map do |subsection| + form["form"].subsections.map do |subsection| get "#{subsection.id.to_s.dasherize}/check-answers", to: "form#check_answers" end end @@ -105,11 +105,11 @@ Rails.application.routes.draw do resources :sales_logs, path: "/sales-logs" do FormHandler.instance.sales_forms.each do |_key, form| - form.pages.map do |page| + form["form"].pages.map do |page| get page.id.to_s.dasherize, to: "form#show_page" end - form.subsections.map do |subsection| + form["form"].subsections.map do |subsection| get "#{subsection.id.to_s.dasherize}/check-answers", to: "form#check_answers" end end diff --git a/spec/features/form/check_answers_page_spec.rb b/spec/features/form/check_answers_page_spec.rb index be5a8d46a..c15f12c4d 100644 --- a/spec/features/form/check_answers_page_spec.rb +++ b/spec/features/form/check_answers_page_spec.rb @@ -42,6 +42,7 @@ RSpec.describe "Form Check Answers Page" do before do sign_in user + allow(FormHandler.instance).to receive(:current_lettings_form).and_return(FormHandler.instance.forms["2021_2022"]["form"]) end context "when the user needs to check their answers for a subsection" do diff --git a/spec/features/form/conditional_questions_spec.rb b/spec/features/form/conditional_questions_spec.rb index 051027bae..751cfc68f 100644 --- a/spec/features/form/conditional_questions_spec.rb +++ b/spec/features/form/conditional_questions_spec.rb @@ -16,6 +16,7 @@ RSpec.describe "Form Conditional Questions" do before do sign_in user + allow(FormHandler.instance).to receive(:current_lettings_form).and_return(FormHandler.instance.forms["2021_2022"]["form"]) end context "with a page where some questions are only conditionally shown, depending on how you answer the first question" do diff --git a/spec/features/form/form_navigation_spec.rb b/spec/features/form/form_navigation_spec.rb index 207ae19a3..048079998 100644 --- a/spec/features/form/form_navigation_spec.rb +++ b/spec/features/form/form_navigation_spec.rb @@ -35,6 +35,7 @@ RSpec.describe "Form Navigation" do before do sign_in user + allow(FormHandler.instance).to receive(:current_lettings_form).and_return(FormHandler.instance.forms["2021_2022"]["form"]) end describe "Create a new lettings log" do diff --git a/spec/features/form/validations_spec.rb b/spec/features/form/validations_spec.rb index 6675150e0..1fa227b1d 100644 --- a/spec/features/form/validations_spec.rb +++ b/spec/features/form/validations_spec.rb @@ -4,6 +4,7 @@ require_relative "helpers" RSpec.describe "validations" do before do sign_in user + allow(FormHandler.instance).to receive(:current_lettings_form).and_return(FormHandler.instance.forms["2021_2022"]["form"]) end include Helpers diff --git a/spec/helpers/conditional_questions_helper_spec.rb b/spec/helpers/conditional_questions_helper_spec.rb index 6a83b1d0a..c18787f80 100644 --- a/spec/helpers/conditional_questions_helper_spec.rb +++ b/spec/helpers/conditional_questions_helper_spec.rb @@ -4,6 +4,10 @@ RSpec.describe ConditionalQuestionsHelper do let(:lettings_log) { FactoryBot.build(:lettings_log) } let(:page) { lettings_log.form.get_page("armed_forces") } + before do + allow(FormHandler.instance).to receive(:current_lettings_form).and_return(FormHandler.instance.forms["2021_2022"]["form"]) + end + describe "conditional questions for page" do let(:conditional_pages) { %w[leftreg] } diff --git a/spec/helpers/question_attribute_helper_spec.rb b/spec/helpers/question_attribute_helper_spec.rb index 393db953e..d7f42e394 100644 --- a/spec/helpers/question_attribute_helper_spec.rb +++ b/spec/helpers/question_attribute_helper_spec.rb @@ -5,6 +5,10 @@ RSpec.describe QuestionAttributeHelper do let(:form) { lettings_log.form } let(:questions) { form.get_page("rent").questions } + before do + allow(FormHandler.instance).to receive(:current_lettings_form).and_return(FormHandler.instance.forms["2021_2022"]["form"]) + end + describe "html attributes" do it "returns empty hash if fields-to-add or result-field are empty " do question = form.get_page("weekly_net_income").questions.find { |q| q.id == "earnings" } diff --git a/spec/helpers/tasklist_helper_spec.rb b/spec/helpers/tasklist_helper_spec.rb index 9e770e1ff..7f5fad137 100644 --- a/spec/helpers/tasklist_helper_spec.rb +++ b/spec/helpers/tasklist_helper_spec.rb @@ -4,6 +4,10 @@ RSpec.describe TasklistHelper do let(:empty_lettings_log) { FactoryBot.create(:lettings_log) } let(:lettings_log) { FactoryBot.create(:lettings_log, :in_progress, needstype: 1) } + before do + allow(FormHandler.instance).to receive(:current_lettings_form).and_return(FormHandler.instance.forms["2021_2022"]["form"]) + end + describe "get next incomplete section" do it "returns the first subsection name if it is not completed" do expect(get_next_incomplete_section(lettings_log).id).to eq("household_characteristics") diff --git a/spec/jobs/email_csv_job_spec.rb b/spec/jobs/email_csv_job_spec.rb index b5661baf0..d248d3dfb 100644 --- a/spec/jobs/email_csv_job_spec.rb +++ b/spec/jobs/email_csv_job_spec.rb @@ -10,6 +10,10 @@ describe EmailCsvJob do let(:organisation) { user.organisation } let(:other_organisation) { FactoryBot.create(:organisation) } + before do + allow(FormHandler.instance).to receive(:current_lettings_form).and_return(FormHandler.instance.forms["2021_2022"]["form"]) + end + context "when a log exists" do let!(:lettings_log) do FactoryBot.create( diff --git a/spec/models/form/page_spec.rb b/spec/models/form/page_spec.rb index e4a780beb..ec1adff7a 100644 --- a/spec/models/form/page_spec.rb +++ b/spec/models/form/page_spec.rb @@ -15,6 +15,10 @@ RSpec.describe Form::Page, type: :model do let(:page_id) { "net_income" } let(:page_definition) { subsection_definition["pages"][page_id] } + before do + allow(FormHandler.instance).to receive(:current_lettings_form).and_return(FormHandler.instance.forms["2021_2022"]["form"]) + end + it "has an id" do expect(page.id).to eq(page_id) end diff --git a/spec/models/form/question_spec.rb b/spec/models/form/question_spec.rb index 0c0b97a64..128bab12f 100644 --- a/spec/models/form/question_spec.rb +++ b/spec/models/form/question_spec.rb @@ -17,6 +17,10 @@ RSpec.describe Form::Question, type: :model do let(:question_id) { "earnings" } let(:question_definition) { page_definition["questions"][question_id] } + before do + allow(FormHandler.instance).to receive(:current_lettings_form).and_return(FormHandler.instance.forms["2021_2022"]["form"]) + end + it "has an id" do expect(question.id).to eq(question_id) end diff --git a/spec/models/form/section_spec.rb b/spec/models/form/section_spec.rb index 52f6effc8..b4c7d7952 100644 --- a/spec/models/form/section_spec.rb +++ b/spec/models/form/section_spec.rb @@ -8,6 +8,10 @@ RSpec.describe Form::Section, type: :model do let(:section_id) { "household" } let(:section_definition) { form.form_definition["sections"][section_id] } + before do + allow(FormHandler.instance).to receive(:current_lettings_form).and_return(FormHandler.instance.forms["2021_2022"]["form"]) + end + it "has an id" do expect(section.id).to eq(section_id) end diff --git a/spec/models/form/subsection_spec.rb b/spec/models/form/subsection_spec.rb index a119a212e..49ea1ec61 100644 --- a/spec/models/form/subsection_spec.rb +++ b/spec/models/form/subsection_spec.rb @@ -14,6 +14,7 @@ RSpec.describe Form::Subsection, type: :model do before do RequestHelper.stub_http_requests + allow(FormHandler.instance).to receive(:current_lettings_form).and_return(FormHandler.instance.forms["2021_2022"]["form"]) end it "has an id" do diff --git a/spec/models/form_handler_spec.rb b/spec/models/form_handler_spec.rb index 097ed2606..ef8a05ad8 100644 --- a/spec/models/form_handler_spec.rb +++ b/spec/models/form_handler_spec.rb @@ -2,6 +2,7 @@ require "rails_helper" RSpec.describe FormHandler do let(:test_form_name) { "2021_2022" } + let(:form_handler) { described_class.instance } before { Singleton.__init__(described_class) } @@ -15,14 +16,12 @@ RSpec.describe FormHandler do end it "is able to load a current lettings form" do - form_handler = described_class.instance form = form_handler.get_form("current_lettings") expect(form).to be_a(Form) expect(form.pages.count).to eq(45) end it "is able to load a next lettings form" do - form_handler = described_class.instance form = form_handler.get_form("next_lettings") expect(form).to be_a(Form) expect(form.pages.count).to eq(12) @@ -31,37 +30,32 @@ RSpec.describe FormHandler do describe "Get all forms" do it "is able to load all the forms" do - form_handler = described_class.instance all_forms = form_handler.forms expect(all_forms.count).to be >= 1 - expect(all_forms[test_form_name]).to be_a(Form) + expect(all_forms[test_form_name]["form"]).to be_a(Form) end end describe "Get specific form" do it "is able to load a specific form" do - form_handler = described_class.instance form = form_handler.get_form(test_form_name) expect(form).to be_a(Form) expect(form.pages.count).to eq(45) end it "is able to load a current lettings form" do - form_handler = described_class.instance form = form_handler.get_form("current_lettings") expect(form).to be_a(Form) expect(form.pages.count).to eq(12) end it "is able to load a previous lettings form" do - form_handler = described_class.instance form = form_handler.get_form("previous_lettings") expect(form).to be_a(Form) expect(form.pages.count).to eq(45) end it "is able to load a current sales form" do - form_handler = described_class.instance form = form_handler.get_form("current_sales") expect(form).to be_a(Form) expect(form.pages.count).to eq(1) @@ -69,26 +63,16 @@ RSpec.describe FormHandler do end it "is able to load a previous sales form" do - form_handler = described_class.instance form = form_handler.get_form("previous_sales") expect(form).to be_a(Form) expect(form.pages.count).to eq(1) expect(form.name).to eq("2021_2022_sales") end - - it "is able to load a next sales form" do - form_handler = described_class.instance - form = form_handler.get_form("next_sales") - expect(form).to be_a(Form) - expect(form.pages.count).to eq(1) - expect(form.name).to eq("2023_2024_sales") - end end describe "Current form" do it "returns the latest form by date" do - form_handler = described_class.instance - form = form_handler.current_form + form = form_handler.current_lettings_form expect(form).to be_a(Form) expect(form.start_date.year).to eq(2022) end @@ -101,7 +85,12 @@ RSpec.describe FormHandler do end it "can get a saleslog form" do - form_handler = described_class.instance expect(form_handler.get_form("2022_2023_sales")).to be_a(Form) end + + it "keeps track of form type and start year" do + form = form_handler.forms["current_lettings"] + expect(form["type"]).to eq("lettings") + expect(form["start_year"]).to eq(2022) + end end diff --git a/spec/models/lettings_log_spec.rb b/spec/models/lettings_log_spec.rb index d53207226..bc2f1785b 100644 --- a/spec/models/lettings_log_spec.rb +++ b/spec/models/lettings_log_spec.rb @@ -5,6 +5,10 @@ RSpec.describe LettingsLog do let(:different_managing_organisation) { FactoryBot.create(:organisation) } let(:created_by_user) { FactoryBot.create(:user) } + before do + allow(FormHandler.instance).to receive(:current_lettings_form).and_return(FormHandler.instance.forms["2021_2022"]["form"]) + end + it "inherits from log" do expect(described_class).to be < Log expect(described_class).to be < ApplicationRecord diff --git a/spec/models/rent_period_spec.rb b/spec/models/rent_period_spec.rb index 5749d7660..aa5c688da 100644 --- a/spec/models/rent_period_spec.rb +++ b/spec/models/rent_period_spec.rb @@ -5,7 +5,7 @@ RSpec.describe RentPeriod, type: :model do let(:form) { Form.new("spec/fixtures/forms/2021_2022.json", "2021_2022") } before do - allow(FormHandler.instance).to receive(:current_form).and_return(form) + allow(FormHandler.instance).to receive(:current_lettings_form).and_return(form) end it "maps rent period id to display names" do diff --git a/spec/models/validations/financial_validations_spec.rb b/spec/models/validations/financial_validations_spec.rb index 3a97afe94..478b73783 100644 --- a/spec/models/validations/financial_validations_spec.rb +++ b/spec/models/validations/financial_validations_spec.rb @@ -6,6 +6,10 @@ RSpec.describe Validations::FinancialValidations do let(:validator_class) { Class.new { include Validations::FinancialValidations } } let(:record) { FactoryBot.create(:lettings_log) } + before do + allow(FormHandler.instance).to receive(:current_lettings_form).and_return(FormHandler.instance.forms["2021_2022"]["form"]) + end + describe "earnings and income frequency" do it "when earnings are provided it validates that income frequency must be provided" do record.earnings = 500 diff --git a/spec/models/validations/household_validations_spec.rb b/spec/models/validations/household_validations_spec.rb index c5e523c2b..0e070e3ff 100644 --- a/spec/models/validations/household_validations_spec.rb +++ b/spec/models/validations/household_validations_spec.rb @@ -6,6 +6,10 @@ RSpec.describe Validations::HouseholdValidations do let(:validator_class) { Class.new { include Validations::HouseholdValidations } } let(:record) { FactoryBot.create(:lettings_log) } + before do + allow(FormHandler.instance).to receive(:current_lettings_form).and_return(FormHandler.instance.forms["2021_2022"]["form"]) + end + describe "reasonable preference validations" do context "when reasonable preference is homeless" do context "when the tenant was not previously homeless" do diff --git a/spec/models/validations/shared_validations_spec.rb b/spec/models/validations/shared_validations_spec.rb index 0a6ab16c6..b92d49be3 100644 --- a/spec/models/validations/shared_validations_spec.rb +++ b/spec/models/validations/shared_validations_spec.rb @@ -7,6 +7,10 @@ RSpec.describe Validations::SharedValidations do let(:record) { FactoryBot.create(:lettings_log) } describe "numeric min max validations" do + before do + allow(FormHandler.instance).to receive(:current_lettings_form).and_return(FormHandler.instance.forms["2021_2022"]["form"]) + end + context "when validating age" do it "validates that person 1's age is a number" do record.age1 = "random" diff --git a/spec/requests/form_controller_spec.rb b/spec/requests/form_controller_spec.rb index 4b13b8895..9e48e6724 100644 --- a/spec/requests/form_controller_spec.rb +++ b/spec/requests/form_controller_spec.rb @@ -39,6 +39,10 @@ RSpec.describe FormController, type: :request do end let(:headers) { { "Accept" => "text/html" } } + before do + allow(FormHandler.instance).to receive(:current_lettings_form).and_return(FormHandler.instance.forms["2021_2022"]["form"]) + end + context "when a user is not signed in" do describe "GET" do it "does not let you get lettings logs pages you don't have access to" do diff --git a/spec/requests/lettings_logs_controller_spec.rb b/spec/requests/lettings_logs_controller_spec.rb index 8aafd30dc..d03d7c01c 100644 --- a/spec/requests/lettings_logs_controller_spec.rb +++ b/spec/requests/lettings_logs_controller_spec.rb @@ -23,6 +23,7 @@ RSpec.describe LettingsLogsController, type: :request do allow(ENV).to receive(:[]) allow(ENV).to receive(:[]).with("API_USER").and_return(api_username) allow(ENV).to receive(:[]).with("API_KEY").and_return(api_password) + allow(FormHandler.instance).to receive(:current_lettings_form).and_return(FormHandler.instance.forms["2021_2022"]["form"]) end describe "POST #create" do