require "rails_helper" RSpec.describe FormHandler do let(:form_handler) { described_class.instance } before do Timecop.freeze(Time.utc(2022, 9, 20)) Singleton.__init__(described_class) end after do Timecop.unfreeze Singleton.__init__(described_class) end context "when accessing a form in a different year" do before do Timecop.freeze(Time.utc(2021, 8, 3)) Singleton.__init__(described_class) end after do Timecop.unfreeze Singleton.__init__(described_class) # reload FormHandler Instance to update form definitions between runs end it "is able to load a current lettings form" do 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 = form_handler.get_form("next_lettings") expect(form).to be_a(Form) expect(form.pages.count).to eq(12) end end describe "Get all forms" do it "is able to load all the forms" do all_forms = form_handler.forms expect(all_forms.count).to be >= 1 expect(all_forms["current_sales"]).to be_a(Form) end end describe "Get specific form" do it "is able to load a current lettings form" do 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 = 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 = form_handler.get_form("current_sales") expect(form).to be_a(Form) expect(form.pages.count).to eq(20) expect(form.name).to eq("2022_2023_sales") end it "is able to load a previous sales form" do form = form_handler.get_form("previous_sales") expect(form).to be_a(Form) expect(form.pages.count).to eq(20) expect(form.name).to eq("2021_2022_sales") end end describe "Current form" do it "returns the latest form by date" do form = form_handler.current_lettings_form expect(form).to be_a(Form) expect(form.start_date.year).to eq(2022) end end describe "Current collection start year" do context "when the date is after 1st of April" do before do Timecop.freeze(Time.utc(2022, 8, 3)) end after do Timecop.unfreeze end it "returns the same year as the current start year" do expect(form_handler.current_collection_start_year).to eq(2022) end it "returns the correct current lettings form name" do expect(form_handler.form_name_from_start_year(2022, "lettings")).to eq("current_lettings") end it "returns the correct previous lettings form name" do expect(form_handler.form_name_from_start_year(2021, "lettings")).to eq("previous_lettings") end it "returns the correct next lettings form name" do expect(form_handler.form_name_from_start_year(2023, "lettings")).to eq("next_lettings") end it "returns the correct current sales form name" do expect(form_handler.form_name_from_start_year(2022, "sales")).to eq("current_sales") end it "returns the correct previous sales form name" do expect(form_handler.form_name_from_start_year(2021, "sales")).to eq("previous_sales") end it "returns the correct next sales form name" do expect(form_handler.form_name_from_start_year(2023, "sales")).to eq("next_sales") end end context "with the date before 1st of April" do before do Timecop.freeze(Time.utc(2022, 2, 3)) end after do Timecop.unfreeze end it "returns the previous year as the current start year" do expect(form_handler.current_collection_start_year).to eq(2021) end it "returns the correct current lettings form name" do expect(form_handler.form_name_from_start_year(2021, "lettings")).to eq("current_lettings") end it "returns the correct previous lettings form name" do expect(form_handler.form_name_from_start_year(2020, "lettings")).to eq("previous_lettings") end it "returns the correct next lettings form name" do expect(form_handler.form_name_from_start_year(2022, "lettings")).to eq("next_lettings") end it "returns the correct current sales form name" do expect(form_handler.form_name_from_start_year(2021, "sales")).to eq("current_sales") end it "returns the correct previous sales form name" do expect(form_handler.form_name_from_start_year(2020, "sales")).to eq("previous_sales") end it "returns the correct next sales form name" do expect(form_handler.form_name_from_start_year(2022, "sales")).to eq("next_sales") end end end it "loads the form once at boot time" do form_handler = described_class.instance expect(Form).not_to receive(:new).with(:any, "current_sales") expect(form_handler.get_form("current_sales")).to be_a(Form) end it "correctly sets form type and start year" do form = form_handler.forms["current_lettings"] expect(form.type).to eq("lettings") expect(form.start_date.year).to eq(2022) end end