Browse Source

first pass at implementing flexible code-based form fixtures for testing

pull/1568/head
Arthur Campbell 3 years ago
parent
commit
b48a7a0860
  1. 4
      app/models/form_handler.rb
  2. 25
      spec/factories/form.rb
  3. 5
      spec/factories/page.rb
  4. 6
      spec/factories/question.rb
  5. 5
      spec/factories/section.rb
  6. 5
      spec/factories/subsection.rb
  7. 56
      spec/models/form_handler_spec.rb

4
app/models/form_handler.rb

@ -125,9 +125,9 @@ class FormHandler
forms.count { |form| now.between?(form.start_date, form.end_date) } > 1 forms.count { |form| now.between?(form.start_date, form.end_date) } > 1
end end
def use_fake_forms! def use_fake_forms!(fake_forms = nil)
@directories = ["spec/fixtures/forms"] @directories = ["spec/fixtures/forms"]
@forms = get_all_forms @forms = fake_forms || get_all_forms
end end
def use_real_forms! def use_real_forms!

25
spec/factories/form.rb

@ -0,0 +1,25 @@
class FormFixture < Form
attr_accessor :sections, :subsections, :pages, :questions
end
class FormFactory
def initialize(year:, type:)
@year = year
@type = type
end
def with_sections(sections)
@sections = sections
self
end
def build
form = FormFixture.new(nil, @year, [], @type)
@sections.each { |section| section.form = form }
form.sections = @sections
form.subsections = form.sections.flat_map(&:subsections)
form.pages = form.subsections.flat_map(&:pages)
form.questions = form.pages.flat_map(&:questions)
form
end
end

5
spec/factories/page.rb

@ -0,0 +1,5 @@
FactoryBot.define do
factory :page, class: "Form::Page" do
initialize_with { new(id, nil, nil) }
end
end

6
spec/factories/question.rb

@ -0,0 +1,6 @@
FactoryBot.define do
factory :question, class: "Form::Question" do
initialize_with { new(id, nil, nil) }
type { "text" }
end
end

5
spec/factories/section.rb

@ -0,0 +1,5 @@
FactoryBot.define do
factory :section, class: "Form::Section" do
initialize_with { new(id, nil, nil) }
end
end

5
spec/factories/subsection.rb

@ -0,0 +1,5 @@
FactoryBot.define do
factory :subsection, class: "Form::Subsection" do
initialize_with { new(id, nil, nil) }
end
end

56
spec/models/form_handler_spec.rb

@ -254,18 +254,50 @@ RSpec.describe FormHandler do
end end
it "inserts questions from previous years that do not appear in more recent years in the correct position" do it "inserts questions from previous years that do not appear in more recent years in the correct position" do
current_sales_question_ids = described_class.instance.forms["current_sales"].questions.map(&:id).uniq original_section = build(
previous_sales_question_ids = described_class.instance.forms["previous_sales"].questions.map(&:id).uniq :section,
obsolete_question_ids = previous_sales_question_ids - current_sales_question_ids id: "original_section",
expect(obsolete_question_ids.count).to be_positive subsections: [
obsolete_question_ids.each do |obsolete_id| build(
index = previous_sales_question_ids.index(obsolete_id) :subsection,
previous_question_id = previous_sales_question_ids[index - 1] id: "original_subsection",
expect(result).to(include { |q| q.id == id }) pages: [
index_of_previous_question_in_result = result.index { |q| q.id == previous_question_id } build(:page, id: "1", questions: [build(:question, id: "1")]),
index_of_obsolete_question_in_result = result.index { |q| q.id == obsolete_id } build(:page, id: "1a_deprecated", questions: [build(:question, id: "1a_deprecated")]),
expect(index_of_obsolete_question_in_result).to be index_of_previous_question_in_result + 1 build(:page, id: "2", questions: [build(:question, id: "2")]),
end build(:page, id: "3", questions: [build(:question, id: "3")]),
]
)
]
)
new_section = build(
:section,
id: "new_section",
subsections: [
build(
:subsection,
id: "new_subsection",
pages: [
build(:page, id: "1", questions: [build(:question, id: "1")]),
build(:page, id: "2", questions: [build(:question, id: "2")]),
build(:page, id: "2a_new", questions: [build(:question, id: "2a_new")]),
build(:page, id: "3", questions: [build(:question, id: "3")]),
]
)
]
)
original_form = FormFactory.new(year: 1066, type: "sales")
.with_sections([original_section])
.build
new_form = FormFactory.new(year: 1485, type: "sales")
.with_sections([new_section])
.build
fake_forms = {
earlier_sales: original_form,
newer_sales: new_form,
}
described_class.instance.use_fake_forms!(fake_forms)
expect(result.map(&:id)).to eq %w[1 1a_deprecated 2 2a_new 3]
end end
end end
# rubocop:enable RSpec/PredicateMatcher # rubocop:enable RSpec/PredicateMatcher

Loading…
Cancel
Save