From 8539ac7dec4c713fc6f3b92abf05108a261bd194 Mon Sep 17 00:00:00 2001 From: Zach Gollwitzer Date: Fri, 21 Feb 2025 08:58:06 -0500 Subject: [PATCH] Fix import configuration failures (#1876) --- app/models/import.rb | 8 ++++--- test/interfaces/import_interface_test.rb | 28 +++++++++++++++++++++++- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/app/models/import.rb b/app/models/import.rb index 1fd85d02..b28c3c81 100644 --- a/app/models/import.rb +++ b/app/models/import.rb @@ -105,8 +105,8 @@ class Import < ApplicationRecord def generate_rows_from_csv rows.destroy_all - csv_rows.each do |row| - rows.create!( + mapped_rows = csv_rows.map do |row| + { account: row[account_col_label].to_s, date: row[date_col_label].to_s, qty: sanitize_number(row[qty_col_label]).to_s, @@ -119,8 +119,10 @@ class Import < ApplicationRecord tags: row[tags_col_label].to_s, entity_type: row[entity_type_col_label].to_s, notes: row[notes_col_label].to_s - ) + } end + + rows.insert_all!(mapped_rows) end def sync_mappings diff --git a/test/interfaces/import_interface_test.rb b/test/interfaces/import_interface_test.rb index 9ee56b37..2dfa1bb4 100644 --- a/test/interfaces/import_interface_test.rb +++ b/test/interfaces/import_interface_test.rb @@ -68,7 +68,7 @@ module ImportInterfaceTest csv_data = "date,amount,name\n01/01/2024,\"1,234.56\",Test" import.update!(raw_file_str: csv_data) import.generate_rows_from_csv - + import.reload row = import.rows.first assert_equal "1234.56", row.amount end @@ -86,6 +86,7 @@ module ImportInterfaceTest csv_data = "date,amount,name\n01/01/2024,\"1.234,56\",Test" import.update!(raw_file_str: csv_data) import.generate_rows_from_csv + import.reload row = import.rows.first assert_equal "1234.56", row.amount @@ -105,6 +106,7 @@ module ImportInterfaceTest csv_data = "date,amount,name\n01/01/2024,\"1 234,56\",Test" import.update!(raw_file_str: csv_data) import.generate_rows_from_csv + import.reload row = import.rows.first assert_equal "1234.56", row.amount @@ -123,6 +125,7 @@ module ImportInterfaceTest csv_data = "date,amount,name\n01/01/2024,1234,Test" import.update!(raw_file_str: csv_data) import.generate_rows_from_csv + import.reload row = import.rows.first assert_equal "1234", row.amount @@ -143,6 +146,7 @@ module ImportInterfaceTest csv_data = "date,amount,name,currency\n01/01/2024,123.45,Test,EUR" import.update!(raw_file_str: csv_data) import.generate_rows_from_csv + import.reload row = import.rows.first assert_equal "EUR", row.currency @@ -163,6 +167,7 @@ module ImportInterfaceTest csv_data = "date,amount,name,currency\n01/01/2024,123.45,Test," import.update!(raw_file_str: csv_data) import.generate_rows_from_csv + import.reload row = import.rows.first assert_equal "USD", row.currency @@ -182,6 +187,7 @@ module ImportInterfaceTest csv_data = "date,amount,name\n01/01/2024,123.45,Test" import.update!(raw_file_str: csv_data) import.generate_rows_from_csv + import.reload row = import.rows.first assert_equal "USD", row.currency @@ -206,6 +212,7 @@ module ImportInterfaceTest "01/01/2024,1234.56,Salary,Bank Account,Income,\"monthly,salary\",Salary payment,EUR" import.update!(raw_file_str: csv_data) import.generate_rows_from_csv + import.reload row = import.rows.first assert_equal "01/01/2024", row.date @@ -230,6 +237,7 @@ module ImportInterfaceTest csv_data = "date,amount\n01/01/2024,1234.56" import.update!(raw_file_str: csv_data) import.generate_rows_from_csv + import.reload row = import.rows.first assert_equal "01/01/2024", row.date @@ -253,6 +261,7 @@ module ImportInterfaceTest csv_data = "date,amount,name,category,tags\n01/01/2024,1234.56,,," import.update!(raw_file_str: csv_data) import.generate_rows_from_csv + import.reload row = import.rows.first assert_equal "01/01/2024", row.date @@ -262,6 +271,22 @@ module ImportInterfaceTest assert_equal "", row.tags end + test "can submit configuration that results in invalid rows for user to fix later" do + import = imports(:transaction) + + csv_data = "date,amount,name\n01/01/2024,1234.56,Test" + import.update!(raw_file_str: csv_data) + import.update!( + date_format: "%Y-%m-%d" # Does not match the raw CSV date, so rows will be invalid, but still generated + ) + + import.generate_rows_from_csv + import.reload + + assert_equal "01/01/2024", import.rows.first.date + assert import.rows.first.invalid? + end + test "handles trade-specific fields" do import = imports(:transaction) import.update!( @@ -277,6 +302,7 @@ module ImportInterfaceTest csv_data = "date,amount,quantity,symbol,price\n01/01/2024,1234.56,10,AAPL,123.456" import.update!(raw_file_str: csv_data) import.generate_rows_from_csv + import.reload row = import.rows.first assert_equal "10", row.qty