5 changed files with 531 additions and 37 deletions
@ -0,0 +1,70 @@
|
||||
class BulkUpload::Sales::LogCreator |
||||
attr_reader :bulk_upload, :path |
||||
|
||||
def initialize(bulk_upload:, path:) |
||||
@bulk_upload = bulk_upload |
||||
@path = path |
||||
end |
||||
|
||||
def call |
||||
row_parsers.each do |row_parser| |
||||
row_parser.valid? |
||||
|
||||
next if row_parser.blank_row? |
||||
|
||||
row_parser.log.blank_invalid_non_setup_fields! |
||||
row_parser.log.bulk_upload = bulk_upload |
||||
row_parser.log.skip_update_status = true |
||||
row_parser.log.status = "pending" |
||||
|
||||
row_parser.log.status_cache = row_parser.log.calculate_status |
||||
|
||||
begin |
||||
row_parser.log.save! |
||||
rescue StandardError => e |
||||
Sentry.capture_exception(e) |
||||
end |
||||
end |
||||
end |
||||
|
||||
private |
||||
|
||||
def csv_parser |
||||
@csv_parser ||= case bulk_upload.year |
||||
when 2022 |
||||
BulkUpload::Sales::Year2022::CsvParser.new(path:) |
||||
when 2023 |
||||
BulkUpload::Sales::Year2023::CsvParser.new(path:) |
||||
else |
||||
raise "csv parser not found" |
||||
end |
||||
end |
||||
|
||||
def row_offset |
||||
csv_parser.row_offset |
||||
end |
||||
|
||||
def col_offset |
||||
csv_parser.col_offset |
||||
end |
||||
|
||||
def row_parsers |
||||
return @row_parsers if @row_parsers |
||||
|
||||
@row_parsers = csv_parser.row_parsers |
||||
|
||||
@row_parsers.each do |row_parser| |
||||
row_parser.bulk_upload = bulk_upload |
||||
end |
||||
|
||||
@row_parsers |
||||
end |
||||
|
||||
def body_rows |
||||
csv_parser.body_rows |
||||
end |
||||
|
||||
def rows |
||||
csv_parser.rows |
||||
end |
||||
end |
||||
@ -0,0 +1,99 @@
|
||||
require "rails_helper" |
||||
|
||||
RSpec.describe BulkUpload::Sales::LogCreator do |
||||
subject(:service) { described_class.new(bulk_upload:, path:) } |
||||
|
||||
let(:owning_org) { create(:organisation, old_visible_id: 123) } |
||||
let(:user) { create(:user, organisation: owning_org) } |
||||
|
||||
let(:bulk_upload) { create(:bulk_upload, :sales, user:) } |
||||
let(:path) { file_fixture("2022_23_sales_bulk_upload.csv") } |
||||
|
||||
describe "#call" do |
||||
context "when a valid csv with new log" do |
||||
it "creates a new log" do |
||||
expect { service.call }.to change(SalesLog, :count) |
||||
end |
||||
|
||||
it "create a log with pending status" do |
||||
service.call |
||||
expect(SalesLog.last.status).to eql("pending") |
||||
end |
||||
|
||||
it "associates log with bulk upload" do |
||||
service.call |
||||
|
||||
log = SalesLog.last |
||||
expect(log.bulk_upload).to eql(bulk_upload) |
||||
expect(bulk_upload.sales_logs).to include(log) |
||||
end |
||||
end |
||||
|
||||
context "when a valid csv with several blank rows" do |
||||
let(:file) { Tempfile.new } |
||||
let(:path) { file.path } |
||||
let(:log) { SalesLog.new } |
||||
|
||||
before do |
||||
file.write(BulkUpload::LogToCsv.new(log:, col_offset: 0).to_2022_sales_csv_row) |
||||
file.write(BulkUpload::LogToCsv.new(log:, col_offset: 0).to_2022_sales_csv_row) |
||||
file.write(BulkUpload::LogToCsv.new(log:, col_offset: 0).to_2022_sales_csv_row) |
||||
file.rewind |
||||
end |
||||
|
||||
it "ignores them and does not create the logs" do |
||||
expect { service.call }.not_to change(SalesLog, :count) |
||||
end |
||||
end |
||||
|
||||
context "when a valid csv with row with one invalid non setup field" do |
||||
let(:file) { Tempfile.new } |
||||
let(:path) { file.path } |
||||
let(:log) do |
||||
build( |
||||
:sales_log, |
||||
:completed, |
||||
age1: 5, |
||||
owning_organisation: owning_org, |
||||
) |
||||
end |
||||
|
||||
before do |
||||
file.write(BulkUpload::LogToCsv.new(log:, col_offset: 0).to_2022_sales_csv_row) |
||||
file.rewind |
||||
end |
||||
|
||||
it "creates the log" do |
||||
expect { service.call }.to change(SalesLog, :count).by(1) |
||||
end |
||||
|
||||
it "blanks invalid field" do |
||||
service.call |
||||
|
||||
record = SalesLog.last |
||||
expect(record.age1).to be_blank |
||||
end |
||||
end |
||||
|
||||
context "when pre-creating logs" do |
||||
subject(:service) { described_class.new(bulk_upload:, path:) } |
||||
|
||||
it "creates a new log" do |
||||
expect { service.call }.to change(SalesLog, :count) |
||||
end |
||||
|
||||
it "creates a log with correct states" do |
||||
service.call |
||||
|
||||
last_log = SalesLog.last |
||||
|
||||
expect(last_log.status).to eql("pending") |
||||
expect(last_log.status_cache).to eql("completed") |
||||
end |
||||
end |
||||
|
||||
context "when valid csv with existing log" do |
||||
xit "what should happen?" |
||||
end |
||||
end |
||||
end |
||||
Loading…
Reference in new issue