Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/controllers/pages/conditions_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ def set_routing_page
routing_page_input = Pages::RoutingPageInput.new({ routing_page_id:, form: current_form })

if routing_page_input.valid?
routing_page = PageRepository.find(page_id: routing_page_id, form_id: current_form.id)
routing_page = current_form.pages.find(routing_page_id)
redirect_to new_condition_or_show_routes_path(routing_page)
else
render template: "pages/conditions/routing_page", locals: { form: current_form, routing_page_input: }, status: :unprocessable_content
Expand Down
28 changes: 14 additions & 14 deletions app/controllers/pages_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ def delete
@routing = :start_of_secondary_skip_route

# route page is condition check page
@route_page = PageRepository.find(page_id: page.routing_conditions.first.check_page_id, form_id: current_form.id)
@route_page = page.routing_conditions.first.check_page
elsif page.routing_conditions.any?
@routing = :start_of_route

Expand All @@ -33,12 +33,12 @@ def delete
@routing = :end_of_secondary_skip_route

# route page is condition check page
@route_page = PageRepository.find(page_id: @page_goto_conditions.first.check_page_id, form_id: current_form.id)
@route_page = @page_goto_conditions.first.check_page
elsif @page_goto_conditions.any?
@routing = :end_of_route

# route page is condition routing page
@route_page = PageRepository.find(page_id: @page_goto_conditions.first.routing_page_id, form_id: current_form.id)
@route_page = @page_goto_conditions.first.routing_page
end

@delete_confirmation_input = Pages::DeleteConfirmationInput.new
Expand All @@ -63,11 +63,7 @@ def destroy
return redirect_to @back_url
end

unless PageRepository.destroy(page)
flash[:message] = "Deletion unsuccessful"
return redirect_to @back_url
end

page.destroy_and_update_form!
redirect_to form_pages_path(current_form), status: :see_other, success: t(".success", question_text: page.question_text)
end

Expand All @@ -77,11 +73,15 @@ def start_new_question
end

def move_page
page_to_move = PageRepository.find(page_id: move_params[:page_id], form_id: move_params[:form_id])
page = current_form.pages.find(move_params[:page_id])
page.move_page(move_params[:direction])

moved_page = PageRepository.move_page(page_to_move, move_params[:direction])
success_message = t("banner.success.form.page_moved",
question_text: page.question_text,
direction: move_params[:direction],
question_number: page.position)

redirect_to form_pages_path, success: t("banner.success.form.page_moved", question_text: page_to_move.question_text, direction: move_params[:direction], question_number: moved_page.position)
redirect_to form_pages_path, success: success_message
end

private
Expand All @@ -95,7 +95,7 @@ def check_user_has_permission
end

def page
@page ||= PageRepository.find(page_id: params[:page_id], form_id: current_form.id)
@page ||= current_form.pages.find(params[:page_id])
end

def draft_question
Expand All @@ -119,8 +119,8 @@ def setup_draft_question_for_existing_page

if edit_draft_question.new_record?
attributes = page.attributes
.slice(*edit_draft_question.attribute_names)
.except("id")
.slice(*edit_draft_question.attribute_names)
.except("id")
edit_draft_question.attributes = attributes
edit_draft_question.save!(validate: false)
end
Expand Down
20 changes: 10 additions & 10 deletions app/input_objects/pages/question_input.rb
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,15 @@ def submit

draft_question.save!(validate: false)

PageRepository.create!(form_id:,
question_text:,
hint_text:,
is_optional:,
is_repeatable:,
answer_settings:,
page_heading:,
guidance_markdown:,
answer_type:)
Page.create_and_update_form!(form_id:,
question_text:,
hint_text:,
is_optional:,
is_repeatable:,
answer_settings:,
page_heading:,
guidance_markdown:,
answer_type:)
end

def update_page(page)
Expand All @@ -49,7 +49,7 @@ def update_page(page)

draft_question.save!(validate: false)

PageRepository.save!(page)
page.save_and_update_form
end

def default_options
Expand Down
14 changes: 8 additions & 6 deletions app/models/page.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,12 @@ class Page < ApplicationRecord

attribute :answer_settings, DataStructType.new

def self.create_and_update_form!(...)
page = Page.new(...)
page.save_and_update_form
page
end

def destroy_and_update_form!
form = self.form
destroy! && form.update!(question_section_completed: false)
Expand Down Expand Up @@ -97,12 +103,8 @@ def as_form_document_step
private

def update_form
# TODO: https://trello.com/c/dg9CFPgp/1503-user-triggers-state-change-from-live-to-livewithdraft
# Will not be needed when users can trigger this event themselves through the UI
form.create_draft_from_live_form! if form.live?
form.create_draft_from_archived_form! if form.archived?

form.update!(question_section_completed: false)
form.question_section_completed = false
form.save_draft!
end

def guidance_fields_presence
Expand Down
52 changes: 0 additions & 52 deletions app/services/page_repository.rb

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,26 +1,23 @@
require "rails_helper"

feature "Add/editing a single question", type: :feature do
let(:form) { create :form, pages: }
let(:fake_page) { build :page, form_id: form.id, id: 2 }
let(:group) { create(:group, organisation: standard_user.organisation) }

before do
allow(PageRepository).to receive_messages(find: fake_page, create!: fake_page)

GroupForm.create!(group:, form_id: form.id)
create(:membership, group:, user: standard_user, added_by: standard_user)

login_as standard_user
end

context "when a form has no existing pages" do
let(:pages) { [] }
let(:form) { create :form }

scenario "add a question for each type of answer" do
when_i_am_viewing_an_existing_form
and_i_want_to_create_or_edit_a_page

Page::ANSWER_TYPES.each do |answer_type|
when_i_am_viewing_an_existing_form
and_i_want_to_create_or_edit_a_page
and_i_select_a_type_of_answer_option(answer_type)
and_i_provide_a_question_text(answer_type)

Expand All @@ -39,13 +36,9 @@
end

context "when a form has existing pages" do
let(:pages) do
existing_pages = []
5.times { |id| existing_pages.push(build(:page, id:)) }
existing_pages
end
let(:form) { create :form, :with_pages }

scenario "add a question for each type of answer" do
scenario "add a question" do
when_i_am_viewing_an_existing_form
and_i_want_to_create_or_edit_a_page
and_i_can_see_a_list_of_existing_pages
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,6 @@
before do
allow(ConditionRepository).to receive_messages(create!: true)

pages.each do |page|
allow(PageRepository).to receive(:find).with(page_id: page.id.to_s, form_id: form.id).and_return(page)
end

GroupForm.create! group:, form_id: form.id
create(:membership, group:, user: standard_user, added_by: standard_user)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,6 @@
create(:page, :with_selection_settings, form:, is_optional: true)
create(:page, :with_text_settings, form:, input_type: "long_text")

allow(PageRepository).to receive_messages(create!: true)

pages.each do |page|
allow(PageRepository).to receive(:find).with(page_id: page.id.to_s, form_id: form.id).and_return(page)
end
allow(PageRepository).to receive(:create!).with(hash_including(form_id: 1))

GroupForm.create! group:, form_id: form.id
create(:membership, group:, user: standard_user, added_by: standard_user)

Expand Down
4 changes: 0 additions & 4 deletions spec/features/form/share_a_preview_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,8 @@
feature "Share a preview", type: :feature do
let(:form) { create :form, :with_pages, name: "Test form" }
let(:group) { create(:group, organisation: standard_user.organisation, status: "active") }
let(:fake_page) { build :page, form_id: form.id, id: 2 }

before do
allow(PageRepository).to receive(:find).with(page_id: "2", form_id: form.id).and_return(fake_page)
allow(PageRepository).to receive(:create!).with(hash_including(form_id: 1))

GroupForm.create!(group:, form_id: form.id)
create(:membership, group:, user: standard_user, added_by: standard_user, role: :group_admin)

Expand Down
8 changes: 2 additions & 6 deletions spec/input_objects/pages/question_input_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

RSpec.describe Pages::QuestionInput, type: :model do
let(:form) { create :form }
let(:question_input) { build :question_input, answer_type:, question_text:, draft_question:, is_optional:, is_repeatable: }
let(:question_input) { build :question_input, answer_type:, question_text:, draft_question:, is_optional:, is_repeatable:, form_id: form.id }
let(:draft_question) { build :draft_question, question_text:, form_id: form.id }
let(:question_text) { "What is your full name?" }
let(:is_optional) { "false" }
Expand Down Expand Up @@ -258,8 +258,6 @@

context "when form is valid valid" do
before do
allow(PageRepository).to receive(:create!)

question_input.question_text = "How old are you?"
question_input.hint_text = "As a number"
question_input.is_optional = "false"
Expand All @@ -286,7 +284,7 @@
end

describe "#update_page" do
let(:page) { build(:page, form_id: 1) }
let(:page) { create(:page, form:) }

it "returns false if the form is invalid" do
allow(question_input).to receive(:invalid?).and_return(true)
Expand All @@ -295,8 +293,6 @@

context "when form is valid valid" do
before do
allow(PageRepository).to receive(:save!).and_return(page)

question_input.question_text = "How old are you?"
question_input.hint_text = "As a number"
question_input.is_optional = "false"
Expand Down
68 changes: 68 additions & 0 deletions spec/models/page_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -328,6 +328,74 @@
end
end

describe ".create_and_update_form!" do
let(:form) { create(:form, question_section_completed: true) }
let(:page_params) do
{ form_id: form.id,
question_text: "What is the name of your organisation?",
hint_text: "Some hint text",
is_optional: true,
is_repeatable: false,
answer_settings:,
page_heading: "A page heading",
guidance_markdown: "some guidance markdown",
answer_type: }
end
let(:answer_type) { "organisation_name" }
let(:answer_settings) { {} }

it "creates a page" do
expect {
described_class.create_and_update_form!(**page_params)
}.to change(described_class, :count).by(1)
end

it "creates with the parameters provided" do
page = described_class.create_and_update_form!(**page_params)
expect(page.question_text).to eq(page_params[:question_text])
expect(page.hint_text).to eq(page_params[:hint_text])
expect(page.is_optional).to eq(page_params[:is_optional])
expect(page.is_repeatable).to eq(page_params[:is_repeatable])
expect(page.page_heading).to eq(page_params[:page_heading])
expect(page.guidance_markdown).to eq(page_params[:guidance_markdown])
expect(page.answer_type).to eq(page_params[:answer_type])
end

it "returns the page" do
expect(described_class.create_and_update_form!(**page_params)).to be_a(described_class)
end

it "associates the page with a form" do
described_class.create_and_update_form!(**page_params)
expect(described_class.last.form).to eq(form)
end

context "when the form question section is complete" do
let(:form) { create(:form_record, question_section_completed: true) }

it "updates the form to mark the question section as incomplete" do
expect {
described_class.create_and_update_form!(**page_params)
}.to change { form.reload.question_section_completed }.to(false)
end
end

context "when the page has answer settings" do
let(:answer_type) { "selection" }
let(:answer_settings) { { only_one_option: "true", selection_options: [] } }

it "saves the answer settings to the database" do
described_class.create!(**page_params)
expect(described_class.last).to have_attributes(
"answer_settings" => DataStruct.new({
"only_one_option" => "true",
"selection_options" => [],
}),
)
end
end
end

describe "#destroy_and_update_form!" do
let(:page) { create :page_record }
let(:form) { page.form }
Expand Down
Loading