6 changed files with 128 additions and 25 deletions
@ -0,0 +1,25 @@ |
|||||||
|
<%= govuk_table do |table| %> |
||||||
|
<% table.caption(size: "m", text: bulk_upload.filename) %> |
||||||
|
|
||||||
|
<% table.head do |head| %> |
||||||
|
<% head.row do |row| %> |
||||||
|
<% row.cell(text: "Column", header: true) %> |
||||||
|
<% row.cell(text: "Number of rows", header: true) %> |
||||||
|
<% row.cell(text: "Question", header: true) %> |
||||||
|
<% row.cell(text: "Error", header: true) %> |
||||||
|
<% row.cell(text: "Specification", header: true) %> |
||||||
|
<% end %> |
||||||
|
<% end %> |
||||||
|
|
||||||
|
<% table.body do |body| %> |
||||||
|
<% sorted_errors.each do |error| %> |
||||||
|
<% body.row do |row| %> |
||||||
|
<% row.cell(text: error[0][0]) %> |
||||||
|
<% row.cell(text: error[1]) %> |
||||||
|
<% row.cell(text: BulkUpload::Lettings::Validator.question_for_field(error[0][1].to_sym)) %> |
||||||
|
<% row.cell(text: error[0][2]) %> |
||||||
|
<% row.cell(text: error[0][1]) %> |
||||||
|
<% end %> |
||||||
|
<% end %> |
||||||
|
<% end %> |
||||||
|
<% end %> |
||||||
@ -0,0 +1,17 @@ |
|||||||
|
class BulkUploadErrorSummaryTableComponent < ViewComponent::Base |
||||||
|
attr_reader :bulk_upload |
||||||
|
|
||||||
|
def initialize(bulk_upload:) |
||||||
|
@bulk_upload = bulk_upload |
||||||
|
|
||||||
|
super |
||||||
|
end |
||||||
|
|
||||||
|
def sorted_errors |
||||||
|
@sorted_errors ||= bulk_upload |
||||||
|
.bulk_upload_errors |
||||||
|
.group(:col, :field, :error) |
||||||
|
.count |
||||||
|
.sort_by { |el| el[0][0].rjust(3, "0") } |
||||||
|
end |
||||||
|
end |
||||||
@ -0,0 +1,81 @@ |
|||||||
|
require "rails_helper" |
||||||
|
|
||||||
|
RSpec.describe BulkUploadErrorSummaryTableComponent, type: :component do |
||||||
|
subject(:component) { described_class.new(bulk_upload:) } |
||||||
|
|
||||||
|
let(:bulk_upload) { create(:bulk_upload) } |
||||||
|
|
||||||
|
context "when no errors" do |
||||||
|
it "does not renders any rows" do |
||||||
|
result = render_inline(component) |
||||||
|
expect(result).not_to have_selector("tbody tr") |
||||||
|
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) } |
||||||
|
|
||||||
|
it "renders rows for each error" do |
||||||
|
result = render_inline(component) |
||||||
|
expect(result).to have_selector("tbody tr", count: 2) |
||||||
|
end |
||||||
|
|
||||||
|
it "renders rows by col order" do |
||||||
|
result = render_inline(component) |
||||||
|
order = result.css("tbody tr td:nth-of-type(1)").map(&:content) |
||||||
|
expect(order).to eql(%w[A B]) |
||||||
|
end |
||||||
|
|
||||||
|
it "render correct data" do |
||||||
|
result = render_inline(component) |
||||||
|
|
||||||
|
row_1 = result.css("tbody tr:nth-of-type(1) td").map(&:content) |
||||||
|
|
||||||
|
expect(row_1).to eql([ |
||||||
|
"A", |
||||||
|
"1", |
||||||
|
BulkUpload::Lettings::Validator.question_for_field(error_1.field.to_sym), |
||||||
|
error_1.error, |
||||||
|
error_1.field, |
||||||
|
]) |
||||||
|
|
||||||
|
row_2 = result.css("tbody tr:nth-of-type(2) td").map(&:content) |
||||||
|
|
||||||
|
expect(row_2).to eql([ |
||||||
|
"B", |
||||||
|
"1", |
||||||
|
BulkUpload::Lettings::Validator.question_for_field(error_2.field.to_sym), |
||||||
|
error_2.error, |
||||||
|
error_2.field, |
||||||
|
]) |
||||||
|
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") } |
||||||
|
|
||||||
|
before do |
||||||
|
create(:bulk_upload_error, bulk_upload:, col: "A", row: 2, field: "field_1") |
||||||
|
end |
||||||
|
|
||||||
|
it "renders 1 row combining the errors" do |
||||||
|
result = render_inline(component) |
||||||
|
expect(result).to have_selector("tbody tr", count: 1) |
||||||
|
end |
||||||
|
|
||||||
|
it "render correct data" do |
||||||
|
result = render_inline(component) |
||||||
|
|
||||||
|
row_1 = result.css("tbody tr:nth-of-type(1) td").map(&:content) |
||||||
|
|
||||||
|
expect(row_1).to eql([ |
||||||
|
"A", |
||||||
|
"2", |
||||||
|
BulkUpload::Lettings::Validator.question_for_field(error_1.field.to_sym), |
||||||
|
error_1.error, |
||||||
|
error_1.field, |
||||||
|
]) |
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
Loading…
Reference in new issue