|
|
|
require "rails_helper"
|
|
|
|
|
|
|
|
RSpec.describe "form/page" do
|
|
|
|
let(:lettings_log) { FactoryBot.create(:lettings_log, :in_progress) }
|
|
|
|
let(:form) { lettings_log.form }
|
|
|
|
let(:subsection) { form.get_subsection("income_and_benefits") }
|
|
|
|
let(:page) { form.get_page("net_income") }
|
|
|
|
let(:question) { page.questions.find { |q| q.id == "earnings" } }
|
|
|
|
let(:initial_page_attributes) { { description: nil, hide_subsection_label: nil } }
|
|
|
|
let(:initial_question_attributes) { { type: "numeric", answer_options: nil, prefix: "£", suffix: " every week" } }
|
|
|
|
let(:page_attributes) { {} }
|
|
|
|
let(:question_attributes) { {} }
|
|
|
|
|
|
|
|
def assign_attributes(object, attrs)
|
|
|
|
attrs.each_pair do |attr, value|
|
|
|
|
object.public_send("#{attr}=", value)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
around do |example|
|
|
|
|
Timecop.freeze(Time.zone.local(2022, 1, 1)) do
|
|
|
|
Singleton.__init__(FormHandler)
|
|
|
|
example.run
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
before do
|
|
|
|
sign_in create(:user)
|
|
|
|
assign(:log, lettings_log)
|
|
|
|
assign(:page, page)
|
|
|
|
assign(:subsection, subsection)
|
|
|
|
assign(:pages_with_errors_count, 0)
|
|
|
|
assign_attributes(page, page_attributes)
|
|
|
|
assign_attributes(question, question_attributes)
|
|
|
|
render
|
|
|
|
end
|
|
|
|
|
|
|
|
after do
|
|
|
|
# Revert any changes we've made to avoid affecting other specs as the form,
|
|
|
|
# subsection, page, question objects being acted on are in memory
|
|
|
|
assign_attributes(page, initial_page_attributes)
|
|
|
|
assign_attributes(question, initial_question_attributes)
|
|
|
|
end
|
|
|
|
|
|
|
|
context "with a page containing a description" do
|
|
|
|
let(:description) { "Test description <a class=\"govuk-link\" href=\"/test-link\">with link</a>." }
|
|
|
|
let(:page_attributes) { { description: } }
|
|
|
|
let(:expected_html) { "<p class=\"govuk-body govuk-body-m\">#{description}</p>" }
|
|
|
|
|
|
|
|
it "renders the description" do
|
|
|
|
expect(rendered).to match(expected_html)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context "with a page containing a header" do
|
|
|
|
it "renders the header and the subsection label" do
|
|
|
|
expect(rendered).to match(page.header)
|
|
|
|
expect(rendered).to match(subsection.label)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context "with a page containing a header and hide_subsection_label true" do
|
|
|
|
let(:page_attributes) { { hide_subsection_label: true } }
|
|
|
|
|
|
|
|
it "renders the header but not the subsection label" do
|
|
|
|
expect(rendered).to match(page.header)
|
|
|
|
expect(rendered).not_to match(subsection.label)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context "when rendering a numeric question with prefix and suffix" do
|
|
|
|
let(:question_attributes) { { type: "numeric", prefix: "£", suffix: "every week" } }
|
|
|
|
|
|
|
|
it "renders prefix and suffix text" do
|
|
|
|
expect(rendered).to match(/govuk-input__prefix/)
|
|
|
|
expect(rendered).to match(/£/)
|
|
|
|
expect(rendered).to match(/govuk-input__suffix/)
|
|
|
|
expect(rendered).to match("every week")
|
|
|
|
end
|
|
|
|
|
|
|
|
context "when the suffix is conditional and not a string" do
|
|
|
|
let(:question_attributes) do
|
|
|
|
{
|
|
|
|
type: "numeric",
|
|
|
|
prefix: "£",
|
|
|
|
suffix: [
|
|
|
|
{ "label": "every week", "depends_on": { "incfreq": "Weekly" } },
|
|
|
|
{ "label": "every month", "depends_on": { "incfreq": "Monthly" } },
|
|
|
|
{ "label": "every month", "depends_on": { "incfreq": "Yearly" } },
|
|
|
|
],
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
it "does not render the suffix" do
|
|
|
|
expect(rendered).not_to match(/govuk-input__suffix/)
|
|
|
|
expect(rendered).not_to match("every week")
|
|
|
|
expect(rendered).not_to match("every month")
|
|
|
|
expect(rendered).not_to match("every year")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context "with a question containing extra guidance" do
|
|
|
|
let(:expected_guidance) { /#{I18n.t("forms.2021.lettings.guidance.what_counts_as_income.content")}/ }
|
|
|
|
|
|
|
|
context "with radio type" do
|
|
|
|
let(:question_attributes) { { type: "radio", answer_options: { "1": "A", "2": "B" } } }
|
|
|
|
|
|
|
|
it "renders the guidance partial for radio questions" do
|
|
|
|
expect(rendered).to match(expected_guidance)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context "with text type" do
|
|
|
|
let(:question_attributes) { { type: "text", answer_options: nil } }
|
|
|
|
|
|
|
|
it "renders the guidance partial for text questions" do
|
|
|
|
expect(rendered).to match(expected_guidance)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context "with numeric type" do
|
|
|
|
let(:question_attributes) { { type: "numeric", answer_options: nil } }
|
|
|
|
|
|
|
|
it "renders the guidance partial for numeric questions" do
|
|
|
|
expect(rendered).to match(expected_guidance)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context "with select type" do
|
|
|
|
let(:question_attributes) { { type: "select", answer_options: { "1": "A", "2": "B" } } }
|
|
|
|
|
|
|
|
it "renders the guidance partial for select questions" do
|
|
|
|
expect(rendered).to match(expected_guidance)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context "with checkbox type" do
|
|
|
|
let(:question_attributes) { { type: "checkbox", answer_options: { "1": "A", "2": "B" } } }
|
|
|
|
|
|
|
|
it "renders the guidance partial for checkbox questions" do
|
|
|
|
expect(rendered).to match(expected_guidance)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context "with date type" do
|
|
|
|
let(:question_attributes) { { type: "date", answer_options: nil } }
|
|
|
|
|
|
|
|
it "renders the guidance partial for date questions" do
|
|
|
|
expect(rendered).to match(expected_guidance)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context "with a question containing input playback" do
|
|
|
|
let(:expected_playback) { /This is input playback/ }
|
|
|
|
|
|
|
|
context "with radio type" do
|
|
|
|
let(:question_attributes) { { type: "radio", answer_options: { "1": "A", "2": "B" } } }
|
|
|
|
|
|
|
|
before do
|
|
|
|
allow(question).to receive(:input_playback).and_return("This is input playback")
|
|
|
|
render
|
|
|
|
end
|
|
|
|
|
|
|
|
it "renders the input playback for radio questions" do
|
|
|
|
expect(rendered).to match(expected_playback)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|