From 21495a016c3b27b4f32a7a4dc4ef10a82e291944 Mon Sep 17 00:00:00 2001
From: Kat <katrina@kosiak.co.uk>
Date: Thu, 20 Jun 2024 15:26:47 +0100
Subject: [PATCH] Add routing for sales

---
 ...eck_answers_summary_list_card_component.rb |   2 +-
 app/controllers/check_errors_controller.rb    |   4 +-
 app/controllers/form_controller.rb            |  12 +-
 .../confirm_clear_answer.html.erb             |   2 +-
 app/views/form/check_errors.html.erb          |   6 +-
 config/routes.rb                              |   3 +-
 spec/requests/check_errors_controller_spec.rb | 166 ++++++++++++++----
 7 files changed, 150 insertions(+), 45 deletions(-)

diff --git a/app/components/check_answers_summary_list_card_component.rb b/app/components/check_answers_summary_list_card_component.rb
index c95d1dd64..f229b76d4 100644
--- a/app/components/check_answers_summary_list_card_component.rb
+++ b/app/components/check_answers_summary_list_card_component.rb
@@ -36,7 +36,7 @@ class CheckAnswersSummaryListCardComponent < ViewComponent::Base
 
   def correct_validation_action_href(question, log, _related_question_ids)
     if question.displayed_as_answered?(log)
-      lettings_log_confirm_clear_answer_path(log, question_id: question.id)
+      send("#{log.model_name.param_key}_confirm_clear_answer_path", log, question_id: question.id)
     else
       send("#{log.model_name.param_key}_#{question.page.id}_path", log, referrer: "check_errors", related_question_ids: request.query_parameters["related_question_ids"], original_page_id: request.query_parameters["original_page_id"])
     end
diff --git a/app/controllers/check_errors_controller.rb b/app/controllers/check_errors_controller.rb
index 8a69106a9..6defeddc2 100644
--- a/app/controllers/check_errors_controller.rb
+++ b/app/controllers/check_errors_controller.rb
@@ -7,10 +7,10 @@ class CheckErrorsController < ApplicationController
   def confirm_clear_answer
     return render_not_found unless @log
 
-    @related_question_ids = params["lettings_log"].keys.reject { |id| id == "page_id" }
+    @related_question_ids = params[@log.model_name.param_key].keys.reject { |id| id == "page_id" }
     question_id = @related_question_ids.find { |id| !params[id].nil? }
     @question = @log.form.get_question(question_id, @log)
-    @page = @log.form.get_page(params["lettings_log"]["page_id"])
+    @page = @log.form.get_page(params[@log.model_name.param_key]["page_id"])
   end
 
 private
diff --git a/app/controllers/form_controller.rb b/app/controllers/form_controller.rb
index 2e170d4d5..abeb2a7a1 100644
--- a/app/controllers/form_controller.rb
+++ b/app/controllers/form_controller.rb
@@ -227,9 +227,9 @@ private
       return send("#{@log.class.name.underscore}_#{previous_interruption_screen_page_id}_path", @log, { referrer: previous_interruption_screen_referrer, original_log_id: original_duplicate_log_id_from_query }.compact)
     end
 
-    if params["lettings_log"]["check_errors"]
-      @page = form.get_page(params["lettings_log"]["page"])
-      return send("#{@log.class.name.underscore}_#{params['lettings_log']['original_page_id']}_path", @log, { check_errors: true, related_question_ids: params["lettings_log"]["related_question_ids"].split(" ") }.compact)
+    if params[@log.model_name.param_key]["check_errors"]
+      @page = form.get_page(params[@log.model_name.param_key]["page"])
+      return send("#{@log.class.name.underscore}_#{params[@log.model_name.param_key]['original_page_id']}_path", @log, { check_errors: true, related_question_ids: params[@log.model_name.param_key]["related_question_ids"].split(" ") }.compact)
     end
 
     is_new_answer_from_check_answers = is_referrer_type?("check_answers_new_answer")
@@ -395,11 +395,11 @@ private
   end
 
   def render_check_errors_page
-    if params["lettings_log"]["clear_question_id"]
-      question_id = params["lettings_log"]["clear_question_id"]
+    if params[@log.model_name.param_key]["clear_question_id"]
+      question_id = params[@log.model_name.param_key]["clear_question_id"]
       @log.form.get_question(question_id, @log).page.questions.map(&:id).each { |id| @log[id] = nil }
       @log.save!
-      @questions = params["lettings_log"].keys.reject { |id| %w[clear_question_id page].include?(id) }.map { |id| @log.form.get_question(id, @log) }
+      @questions = params[@log.model_name.param_key].keys.reject { |id| %w[clear_question_id page].include?(id) }.map { |id| @log.form.get_question(id, @log) }
     else
       responses_for_page = responses_for_page(@page)
       @log.assign_attributes(responses_for_page)
diff --git a/app/views/check_errors/confirm_clear_answer.html.erb b/app/views/check_errors/confirm_clear_answer.html.erb
index 08ca98119..37d6cdc19 100644
--- a/app/views/check_errors/confirm_clear_answer.html.erb
+++ b/app/views/check_errors/confirm_clear_answer.html.erb
@@ -9,7 +9,7 @@
     </h1>
 
     <%= govuk_warning_text(text: "This action is permanent") %>
-      <%= form_with model: @log, url: send("lettings_log_#{@page.id}_path", @log), method: "post", local: true do |f| %>
+      <%= form_with model: @log, url: send("#{@log.model_name.param_key}_#{@page.id}_path", @log), method: "post", local: true do |f| %>
 
       <% @related_question_ids.each do |id| %>
         <%= f.hidden_field id, value: @log[id] %>
diff --git a/app/views/form/check_errors.html.erb b/app/views/form/check_errors.html.erb
index 6e7cc47ea..03e5c231e 100644
--- a/app/views/form/check_errors.html.erb
+++ b/app/views/form/check_errors.html.erb
@@ -1,7 +1,7 @@
 <div class="govuk-grid-row">
   <div class="govuk-grid-column-three-quarters-from-desktop">
 
-    <%= form_with model: @log, url: lettings_log_confirm_clear_answer_path(@log), method: "post", local: true do |f| %>
+    <%= form_with model: @log, url: send("#{@log.model_name.param_key}_confirm_clear_answer_path", @log), method: "post", local: true do |f| %>
       <%= f.govuk_error_summary %>
       <%= f.hidden_field :page_id, value: @page.id %>
 
@@ -11,7 +11,7 @@
             Make sure these answers are correct:
           </span>
           <span class="govuk-body govuk-!-text-align-right govuk-grid-column-one-third">
-            <%= govuk_link_to "Clear all", lettings_log_confirm_clear_all_answers_path(@log) %>
+            <%= govuk_link_to "Clear all", send("#{@log.model_name.param_key}_confirm_clear_all_answers_path", @log) %>
           </span>
         </div>
       </h1>
@@ -49,7 +49,7 @@
                 </dd>
                 <dd class="govuk-summary-list__actions">
                   <% if question.displayed_as_answered?(@log) %>
-                    <input type="submit" value="Clear" name=<%= question.id %> class="govuk-body govuk-link submit-button-link" >
+                    <input type="submit" value="Clear" class="govuk-body govuk-link submit-button-link" name="<%= question.id %>">
                   <% else %>
                     <%= govuk_link_to "Answer", send("#{@log.model_name.param_key}_#{question.page.id}_path", @log, referrer: "check_errors", original_page_id: @page.id, related_question_ids: applicable_questions.map(&:id)) %>
                   <% end %>
diff --git a/config/routes.rb b/config/routes.rb
index 5b1404129..3a4579126 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -214,7 +214,6 @@ Rails.application.routes.draw do
     get "delete-duplicates", to: "duplicate_logs#delete_duplicates"
     post "confirm-clear-answer", to: "check_errors#confirm_clear_answer"
     post "confirm-clear-all-answers", to: "check_errors#confirm_clear_all_answers"
-    post "clear-answer", to: "check_errors#clear_answer"
 
     collection do
       get "csv-download", to: "lettings_logs#download_csv"
@@ -285,6 +284,8 @@ Rails.application.routes.draw do
     get "delete-confirmation", to: "sales_logs#delete_confirmation"
     get "duplicate-logs", to: "duplicate_logs#show"
     get "delete-duplicates", to: "duplicate_logs#delete_duplicates"
+    post "confirm-clear-answer", to: "check_errors#confirm_clear_answer"
+    post "confirm-clear-all-answers", to: "check_errors#confirm_clear_all_answers"
 
     collection do
       get "csv-download", to: "sales_logs#download_csv"
diff --git a/spec/requests/check_errors_controller_spec.rb b/spec/requests/check_errors_controller_spec.rb
index c62c78b5f..2145e2c7c 100644
--- a/spec/requests/check_errors_controller_spec.rb
+++ b/spec/requests/check_errors_controller_spec.rb
@@ -3,14 +3,20 @@ require "rails_helper"
 RSpec.describe CheckErrorsController, type: :request do
   let(:page) { Capybara::Node::Simple.new(response.body) }
   let(:user) { create(:user, :data_coordinator) }
-  let(:lettings_log) { create(:lettings_log, :duplicate, assigned_to: user) }
+  let(:lettings_log) { create(:lettings_log, :setup_completed, assigned_to: user) }
+  let(:sales_log) { create(:sales_log, :shared_ownership_setup_complete, assigned_to: user) }
 
   describe "check errors page" do
     context "when user is not signed in" do
-      it "redirects to sign in page" do
+      it "redirects to sign in page for lettings" do
         post "/lettings-logs/#{lettings_log.id}/net-income", params: {}
         expect(response).to redirect_to("/account/sign-in")
       end
+
+      it "redirects to sign in page for sales" do
+        post "/sales-logs/#{sales_log.id}/buyer-1-income", params: {}
+        expect(response).to redirect_to("/account/sign-in")
+      end
     end
 
     context "when the user is from different organisation" do
@@ -20,38 +26,66 @@ RSpec.describe CheckErrorsController, type: :request do
         sign_in other_user
       end
 
-      it "renders page not found" do
+      it "renders page not found for lettings" do
         post "/lettings-logs/#{lettings_log.id}/net-income", params: {}
         expect(response).to have_http_status(:not_found)
       end
+
+      it "renders page not found for sales" do
+        post "/sales-logs/#{sales_log.id}/buyer-1-income", params: {}
+        expect(response).to have_http_status(:not_found)
+      end
     end
 
     context "when user is signed in" do
-      let(:params) do
-        {
-          id: lettings_log.id,
-          lettings_log: {
-            page: "income_amount",
-            earnings: "100000",
-            incfreq: "1",
-          },
-          check_errors: "",
-        }
-      end
+      context "with multiple error fields and answered questions for lettings" do
+        let(:params) do
+          {
+            id: lettings_log.id,
+            lettings_log: {
+              page: "income_amount",
+              earnings: "100000",
+              incfreq: "1",
+            },
+            check_errors: "",
+          }
+        end
 
-      before do
-        lettings_log.update(needstype: 1, declaration: 1, ecstat1: 10, hhmemb: 2, net_income_known: 0, incfreq: 1, earnings: 1000)
+        before do
+          lettings_log.update!(needstype: 1, declaration: 1, ecstat1: 10, hhmemb: 2, net_income_known: 0, incfreq: 1, earnings: 1000)
+          sign_in user
+          post "/lettings-logs/#{lettings_log.id}/income-amount", params: params
+        end
+
+        it "displays correct clear links" do
+          expect(page).to have_selector("input[type=submit][value='Clear']", count: 3)
+          expect(page).to have_link("Clear all", href: "/lettings-logs/#{lettings_log.id}/confirm-clear-all-answers")
+        end
       end
 
-      context "with multiple error fields and answered questions" do
+      context "with multiple error fields and answered questions for sales" do
+        let(:params) do
+          {
+            id: sales_log.id,
+            sales_log: {
+              page: "buyer_1_income",
+              income1: "100000",
+              la: "E09000001",
+              ownershipsch: "1",
+            },
+            check_errors: "",
+          }
+        end
+
         before do
+          sales_log.update!(income1: 1000, la: "E09000001")
           sign_in user
-          post "/lettings-logs/#{lettings_log.id}/income-amount", params: params
+          post "/sales-logs/#{sales_log.id}/buyer-1-income", params: params
         end
 
         it "displays correct clear links" do
           expect(page).to have_button("Clear", count: 3)
-          expect(page).to have_link("Clear all", href: "/lettings-logs/#{lettings_log.id}/confirm-clear-all-answers")
+          expect(page).to have_link("Clear all", href: "/sales-logs/#{sales_log.id}/confirm-clear-all-answers")
         end
       end
     end
@@ -59,10 +93,15 @@ RSpec.describe CheckErrorsController, type: :request do
 
   describe "confirm clear answer page" do
     context "when user is not signed in" do
-      it "redirects to sign in page" do
+      it "redirects to sign in page for lettings" do
         post "/lettings-logs/#{lettings_log.id}/confirm-clear-answer", params: {}
         expect(response).to redirect_to("/account/sign-in")
       end
+
+      it "redirects to sign in page for sales" do
+        post "/sales-logs/#{sales_log.id}/confirm-clear-answer", params: {}
+        expect(response).to redirect_to("/account/sign-in")
+      end
     end
 
     context "when the user is from different organisation" do
@@ -72,14 +111,19 @@ RSpec.describe CheckErrorsController, type: :request do
         sign_in other_user
       end
 
-      it "renders page not found" do
+      it "renders page not found for lettings" do
         post "/lettings-logs/#{lettings_log.id}/confirm-clear-answer", params: {}
         expect(response).to have_http_status(:not_found)
       end
+
+      it "renders page not found for sales" do
+        post "/sales-logs/#{sales_log.id}/confirm-clear-answer", params: {}
+        expect(response).to have_http_status(:not_found)
+      end
     end
 
     context "when user is signed in" do
-      context "and clearing specific question" do
+      context "and clearing specific lettings question" do
         let(:params) do
           {
             id: lettings_log.id,
@@ -105,18 +149,47 @@ RSpec.describe CheckErrorsController, type: :request do
           expect(page).to have_button("Confirm and continue")
         end
       end
-    end
-  end
 
-  describe "confirm clear all answers page" do
+      context "and clearing specific sales question" do
+        let(:params) do
+          {
+            id: sales_log.id,
+            sales_log: {
+              income1: "100000",
+              la: "E09000001",
+              ownershipsch: "1",
+              page_id: "buyer_1_income",
+            },
+            income1: "",
+          }
+        end
+
+        before do
+          sign_in user
+          post "/sales-logs/#{sales_log.id}/confirm-clear-answer", params:
+        end
+
+        it "displays correct clear links" do
+          expect(page).to have_content("Are you sure you want to clear Buyer 1’s gross annual income?")
+          expect(page).to have_content("This action is permanent")
+          expect(page).to have_link("Cancel")
+          expect(page).to have_button("Confirm and continue")
+        end
+      end
+    end
   end
 
   describe "clear answer" do
     context "when user is not signed in" do
-      it "redirects to sign in page" do
+      it "redirects to sign in page for lettings" do
         post "/lettings-logs/#{lettings_log.id}/income-amount", params: {}
         expect(response).to redirect_to("/account/sign-in")
       end
+
+      it "redirects to sign in page for sales" do
+        post "/sales-logs/#{sales_log.id}/buyer-1-income", params: {}
+        expect(response).to redirect_to("/account/sign-in")
+      end
     end
 
     context "when the user is from different organisation" do
@@ -126,14 +199,19 @@ RSpec.describe CheckErrorsController, type: :request do
         sign_in other_user
       end
 
-      it "renders page not found" do
+      it "renders page not found for lettings" do
         post "/lettings-logs/#{lettings_log.id}/income-amount", params: {}
         expect(response).to have_http_status(:not_found)
       end
+
+      it "renders page not found for sales" do
+        post "/sales-logs/#{lettings_log.id}/buyer-1-income", params: {}
+        expect(response).to have_http_status(:not_found)
+      end
     end
 
     context "when user is signed in" do
-      context "and clearing specific question" do
+      context "and clearing specific lettings question" do
         let(:params) do
           {
             id: lettings_log.id,
@@ -157,11 +235,37 @@ RSpec.describe CheckErrorsController, type: :request do
           expect(page).to have_content("Make sure these answers are correct")
           expect(page).to have_content("You didn’t answer this question")
           expect(page).to have_link("Answer")
+          expect(lettings_log.reload.earnings).to eq(nil)
         end
       end
-    end
-  end
 
-  describe "clear all answers" do
+      context "and clearing specific sales question" do
+        let(:params) do
+          {
+            id: sales_log.id,
+            sales_log: {
+              income1: "100000",
+              la: "E09000001",
+              ownershipsch: "1",
+              clear_question_id: "income1",
+              page: "buyer_1_income",
+            },
+            check_errors: "",
+          }
+        end
+
+        before do
+          sign_in user
+          post "/sales-logs/#{sales_log.id}/buyer-1-income", params:
+        end
+
+        it "displays correct clear links" do
+          expect(page).to have_content("Make sure these answers are correct")
+          expect(page).to have_content("You didn’t answer this question")
+          expect(page).to have_link("Answer")
+          expect(sales_log.reload.income1).to eq(nil)
+        end
+      end
+    end
   end
 end