From 28be962302c9c341eb8e8673b9cdb3c1a4b31f90 Mon Sep 17 00:00:00 2001 From: Phil Lee Date: Tue, 21 Mar 2023 12:24:20 +0000 Subject: [PATCH] summarise setup errors only if there are any --- ...lk_upload_error_summary_table_component.rb | 12 +- ...load_error_summary_table_component_spec.rb | 147 +++++++++++------- 2 files changed, 98 insertions(+), 61 deletions(-) diff --git a/app/components/bulk_upload_error_summary_table_component.rb b/app/components/bulk_upload_error_summary_table_component.rb index 909fb5f0d..8dddb61d2 100644 --- a/app/components/bulk_upload_error_summary_table_component.rb +++ b/app/components/bulk_upload_error_summary_table_component.rb @@ -12,7 +12,7 @@ class BulkUploadErrorSummaryTableComponent < ViewComponent::Base end def sorted_errors - @sorted_errors ||= bulk_upload + @sorted_errors ||= setup_errors.presence || bulk_upload .bulk_upload_errors .group(:col, :field, :error) .having("count(*) > ?", display_threshold) @@ -26,6 +26,16 @@ class BulkUploadErrorSummaryTableComponent < ViewComponent::Base private + def setup_errors + @setup_errors ||= bulk_upload + .bulk_upload_errors + .where(category: "setup") + .group(:col, :field, :error) + .having("count(*) > ?", display_threshold) + .count + .sort_by { |el| el[0][0].rjust(3, "0") } + end + def display_threshold DISPLAY_THRESHOLD end diff --git a/spec/components/bulk_upload_error_summary_table_component_spec.rb b/spec/components/bulk_upload_error_summary_table_component_spec.rb index 4c307515c..32da38119 100644 --- a/spec/components/bulk_upload_error_summary_table_component_spec.rb +++ b/spec/components/bulk_upload_error_summary_table_component_spec.rb @@ -9,87 +9,114 @@ RSpec.describe BulkUploadErrorSummaryTableComponent, type: :component do stub_const("BulkUploadErrorSummaryTableComponent::DISPLAY_THRESHOLD", 0) end - context "when no errors" do - it "does not renders any tables" do - result = render_inline(component) - expect(result).not_to have_selector("table") + describe "#sorted_errors" do + context "when no errors" do + it "does not renders any tables" do + result = render_inline(component) + expect(result).not_to have_selector("table") + end end - end - context "when below threshold" do - before do - stub_const("BulkUploadErrorSummaryTableComponent::DISPLAY_THRESHOLD", 16) + context "when below threshold" do + before do + stub_const("BulkUploadErrorSummaryTableComponent::DISPLAY_THRESHOLD", 16) - create(:bulk_upload_error, bulk_upload:, col: "A", row: 1) - end + create(:bulk_upload_error, bulk_upload:, col: "A", row: 1) + end - it "does not render tables" do - result = render_inline(component) - expect(result).to have_selector("table", count: 0) + it "does not render tables" do + result = render_inline(component) + expect(result).to have_selector("table", count: 0) + end end - end - context "when there are 2 independent errors" do - let!(:error_2) { create(:bulk_upload_error, bulk_upload:, col: "B", row: 2) } - let!(:error_1) { create(:bulk_upload_error, bulk_upload:, col: "A", row: 1) } + context "when there are 2 independent errors" do + let!(:error_2) { create(:bulk_upload_error, bulk_upload:, col: "B", row: 2) } + let!(:error_1) { create(:bulk_upload_error, bulk_upload:, col: "A", row: 1) } - it "renders table for each error" do - result = render_inline(component) - expect(result).to have_selector("table", count: 2) - end + it "renders table for each error" do + result = render_inline(component) + expect(result).to have_selector("table", count: 2) + end - it "renders by col order" do - result = render_inline(component) - order = result.css("table thead th:nth-of-type(2)").map(&:content) - expect(order).to eql(["Column A", "Column B"]) - end + it "renders by col order" do + result = render_inline(component) + order = result.css("table thead th:nth-of-type(2)").map(&:content) + expect(order).to eql(["Column A", "Column B"]) + end - it "render correct data" do - result = render_inline(component) + it "render correct data" do + result = render_inline(component) - table_1 = result.css("table").first.css("th, td").map(&:content) + table_1 = result.css("table").first.css("th, td").map(&:content) - expect(table_1).to eql([ - bulk_upload.prefix_namespace::RowParser.question_for_field(error_1.field.to_sym).to_s, - "Column A", - error_1.error, - "1 error", - ]) + expect(table_1).to eql([ + bulk_upload.prefix_namespace::RowParser.question_for_field(error_1.field.to_sym).to_s, + "Column A", + error_1.error, + "1 error", + ]) - table_2 = result.css("table")[1].css("th, td").map(&:content) + table_2 = result.css("table")[1].css("th, td").map(&:content) - expect(table_2).to eql([ - bulk_upload.prefix_namespace::RowParser.question_for_field(error_2.field.to_sym).to_s, - "Column B", - error_2.error, - "1 error", - ]) + expect(table_2).to eql([ + bulk_upload.prefix_namespace::RowParser.question_for_field(error_2.field.to_sym).to_s, + "Column B", + error_2.error, + "1 error", + ]) + end end - end - context "when there are 2 grouped errors" do - let!(:error_1) { create(:bulk_upload_error, bulk_upload:, col: "A", row: 1, field: "field_1") } + context "when there are 2 grouped errors" do + let!(:error_1) { create(:bulk_upload_error, bulk_upload:, col: "A", row: 1, field: "field_1") } - before do - create(:bulk_upload_error, bulk_upload:, col: "A", row: 2, field: "field_1") - end + before do + create(:bulk_upload_error, bulk_upload:, col: "A", row: 2, field: "field_1") + end + + it "renders 1 table combining the errors" do + result = render_inline(component) + expect(result).to have_selector("table", count: 1) + end - it "renders 1 table combining the errors" do - result = render_inline(component) - expect(result).to have_selector("table", count: 1) + it "render correct data" do + result = render_inline(component) + + table_1 = result.css("table").css("th, td").map(&:content) + + expect(table_1).to eql([ + bulk_upload.prefix_namespace::RowParser.question_for_field(error_1.field.to_sym).to_s, + "Column A", + error_1.error, + "2 errors", + ]) + end end - it "render correct data" do - result = render_inline(component) + context "when mix of setup and other errors" do + let!(:error_1) { create(:bulk_upload_error, bulk_upload:, col: "A", row: 1, category: "setup") } - table_1 = result.css("table").css("th, td").map(&:content) + before do + create(:bulk_upload_error, bulk_upload:, col: "B", row: 2, category: nil) + end + + it "only returns the setup errors" do + result = render_inline(component) + + tables = result.css("table") - expect(table_1).to eql([ - bulk_upload.prefix_namespace::RowParser.question_for_field(error_1.field.to_sym).to_s, - "Column A", - error_1.error, - "2 errors", - ]) + expect(tables.size).to be(1) + + table = result.css("table").css("th, td").map(&:content) + + expect(table).to eql([ + bulk_upload.prefix_namespace::RowParser.question_for_field(error_1.field.to_sym).to_s, + "Column A", + error_1.error, + "1 error", + ]) + end end end