Browse Source

summarise setup errors only if there are any

pull/1451/head
Phil Lee 3 years ago
parent
commit
28be962302
  1. 12
      app/components/bulk_upload_error_summary_table_component.rb
  2. 147
      spec/components/bulk_upload_error_summary_table_component_spec.rb

12
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

147
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

Loading…
Cancel
Save