From d46fd6e5d482d5ab3bfd9e8c869fadc6fe5123e8 Mon Sep 17 00:00:00 2001 From: Kat <54268893+kosiakkatrina@users.noreply.github.com> Date: Fri, 29 Nov 2024 09:52:43 +0000 Subject: [PATCH] Redirect after update --- app/controllers/form_controller.rb | 30 ++++++++++++++++++++------- spec/requests/form_controller_spec.rb | 11 ++++++++-- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/app/controllers/form_controller.rb b/app/controllers/form_controller.rb index 70b6f892b..520f663e8 100644 --- a/app/controllers/form_controller.rb +++ b/app/controllers/form_controller.rb @@ -37,8 +37,9 @@ class FormController < ApplicationController error_attributes = @log.errors.map(&:attribute) Rails.logger.info "User triggered validation(s) on: #{error_attributes.join(', ')}" @subsection = form.subsection_for_page(@page) - restore_error_field_values(@page&.questions) - render "form/page" + flash[:errors] = @log.errors + flash[:log_data] = responses_for_page + redirect_to send("#{@log.class.name.underscore}_#{@page.id}_path", @log, { referrer: request.params["referrer"], original_page_id: request.params["original_page_id"], related_question_ids: request.params["related_question_ids"] }) end else render_not_found @@ -79,11 +80,16 @@ class FormController < ApplicationController page_id = request.path.split("/")[-1].underscore @page = form.get_page(page_id) @subsection = form.subsection_for_page(@page) + if @page.routed_to?(@log, current_user) || is_referrer_type?("interruption_screen") || adding_answer_from_check_errors_page? if updated_answer_from_check_errors_page? @questions = request.params["related_question_ids"].map { |id| @log.form.get_question(id, @log) } render "form/check_errors" else + if flash[:errors].present? + restore_previous_errors(flash[:errors]) + restore_error_field_values(flash[:log_data]) + end render "form/page" end else @@ -96,13 +102,21 @@ class FormController < ApplicationController private - def restore_error_field_values(questions) - return unless questions + def restore_error_field_values(previous_responses) + return unless previous_responses - questions.each do |question| - if question&.type == "date" && @log.attributes.key?(question.id) - @log[question.id] = @log.send("#{question.id}_was") - end + previous_responses_to_reset = previous_responses.reject do |key, _| + @log.form.get_question(key, @log).type == "date" + end + + @log.assign_attributes(previous_responses_to_reset) + end + + def restore_previous_errors(previous_errors) + return unless previous_errors + + previous_errors.each do |attribute, message| + @log.errors.add attribute, message.first end end diff --git a/spec/requests/form_controller_spec.rb b/spec/requests/form_controller_spec.rb index 13d711c20..e727d8acc 100644 --- a/spec/requests/form_controller_spec.rb +++ b/spec/requests/form_controller_spec.rb @@ -582,8 +582,9 @@ RSpec.describe FormController, type: :request do allow(Rails.logger).to receive(:info) end - it "re-renders the same page with errors if validation fails" do + it "redirects to the same page with errors if validation fails" do post "/lettings-logs/#{lettings_log.id}/#{page_id.dasherize}", params: params + follow_redirect! expect(page).to have_content("There is a problem") expect(page).to have_content("Error: What is the tenant’s age?") end @@ -591,6 +592,8 @@ RSpec.describe FormController, type: :request do it "resets errors when fixed" do post "/lettings-logs/#{lettings_log.id}/#{page_id.dasherize}", params: params post "/lettings-logs/#{lettings_log.id}/#{page_id.dasherize}", params: valid_params + follow_redirect! + expect(page).not_to have_content("There is a problem") get "/lettings-logs/#{lettings_log.id}/#{page_id.dasherize}" expect(page).not_to have_content("There is a problem") end @@ -616,6 +619,7 @@ RSpec.describe FormController, type: :request do it "validates the date correctly" do post "/lettings-logs/#{lettings_log.id}/#{page_id.dasherize}", params: params + follow_redirect! expect(page).to have_content("There is a problem") end end @@ -693,6 +697,7 @@ RSpec.describe FormController, type: :request do it "validates the date correctly" do post "/lettings-logs/#{lettings_log.id}/#{page_id.dasherize}", params: params + follow_redirect! expect(page).to have_content("There is a problem") end end @@ -713,6 +718,7 @@ RSpec.describe FormController, type: :request do it "validates the date correctly" do post "/sales-logs/#{sales_log.id}/#{page_id.dasherize}", params: params + follow_redirect! expect(page).to have_content("There is a problem") end end @@ -748,8 +754,9 @@ RSpec.describe FormController, type: :request do Timecop.unfreeze end - it "re-renders the same page with errors if validation fails" do + it "redirects the same page with errors if validation fails" do post "/lettings-logs/#{lettings_log.id}/managing-organisation", params: params + follow_redirect! expect(page).to have_content("There is a problem") expect(page).to have_content("Error: Which organisation manages this letting?") end