diff --git a/app/controllers/concerns/accountable_resource.rb b/app/controllers/concerns/accountable_resource.rb index a7537a5a..bfdc465f 100644 --- a/app/controllers/concerns/accountable_resource.rb +++ b/app/controllers/concerns/accountable_resource.rb @@ -40,7 +40,7 @@ module AccountableResource @account.lock_saved_attributes! respond_to do |format| - format.html { redirect_to account_params[:return_to].presence || @account, notice: accountable_type.name.underscore.humanize + " account created" } + format.html { redirect_to account_params[:return_to].presence || account_path(@account), notice: accountable_type.name.underscore.humanize + " account created" } format.turbo_stream { stream_redirect_to account_params[:return_to].presence || account_path(@account), notice: accountable_type.name.underscore.humanize + " account created" } end end @@ -67,8 +67,8 @@ module AccountableResource @account.lock_saved_attributes! respond_to do |format| - format.html { redirect_back_or_to @account, notice: accountable_type.name.underscore.humanize + " account updated" } - format.turbo_stream { stream_redirect_to @account, notice: accountable_type.name.underscore.humanize + " account updated" } + format.html { redirect_back_or_to account_path(@account), notice: accountable_type.name.underscore.humanize + " account updated" } + format.turbo_stream { stream_redirect_to account_path(@account), notice: accountable_type.name.underscore.humanize + " account updated" } end end diff --git a/app/models/account_import.rb b/app/models/account_import.rb index aa4c6dfe..940bbba1 100644 --- a/app/models/account_import.rb +++ b/app/models/account_import.rb @@ -20,7 +20,10 @@ class AccountImport < Import currency: row.currency, date: Date.current, name: "Imported account value", - entryable: Valuation.new + entryable: Valuation.new( + balance: row.amount.to_d, + cash_balance: row.amount.to_d + ) ) end end diff --git a/app/views/accounts/_form.html.erb b/app/views/accounts/_form.html.erb index 0f6b8eda..bd3df388 100644 --- a/app/views/accounts/_form.html.erb +++ b/app/views/accounts/_form.html.erb @@ -14,17 +14,17 @@ <%= form.text_field :name, placeholder: t(".name_placeholder"), required: "required", label: t(".name_label") %> <% unless account.linked? %> - <%= form.money_field :balance, - label: t(".balance"), - required: true, + <%= form.money_field :balance, + label: t(".balance"), + required: true, default_currency: Current.family.currency, label_tooltip: "The current balance or value of the account, which is typically the balance reported by your financial institution." %> <% unless account.persisted? %> - <%= form.date_field :tracking_start_date, - label: "Tracking start date", - required: true, - value: 2.years.ago.to_date, + <%= form.date_field :tracking_start_date, + label: "Tracking start date", + required: true, + value: 2.years.ago.to_date, label_tooltip: "The date we will start tracking the balance for this account. If you're not sure, we recommend using the default of 2 years ago so net worth graphs have adequate historical data." %> <% end %> <% end %> diff --git a/test/controllers/api/v1/transactions_controller_test.rb b/test/controllers/api/v1/transactions_controller_test.rb index dfbcff64..0bbb0a44 100644 --- a/test/controllers/api/v1/transactions_controller_test.rb +++ b/test/controllers/api/v1/transactions_controller_test.rb @@ -8,26 +8,26 @@ class Api::V1::TransactionsControllerTest < ActionDispatch::IntegrationTest @family = @user.family @account = @family.accounts.first @transaction = @family.transactions.first - + # Destroy existing active API keys to avoid validation errors @user.api_keys.active.destroy_all - + # Create fresh API keys instead of using fixtures to avoid parallel test conflicts @api_key = ApiKey.create!( user: @user, name: "Test Read-Write Key", - scopes: ["read_write"], + scopes: [ "read_write" ], display_key: "test_rw_#{SecureRandom.hex(8)}" ) - + @read_only_api_key = ApiKey.create!( user: @user, - name: "Test Read-Only Key", - scopes: ["read"], + name: "Test Read-Only Key", + scopes: [ "read" ], display_key: "test_ro_#{SecureRandom.hex(8)}", source: "mobile" # Use different source to allow multiple keys ) - + # Clear any existing rate limit data Redis.new.del("api_rate_limit:#{@api_key.id}") Redis.new.del("api_rate_limit:#{@read_only_api_key.id}") diff --git a/test/controllers/credit_cards_controller_test.rb b/test/controllers/credit_cards_controller_test.rb index 6a270156..5fb0ec52 100644 --- a/test/controllers/credit_cards_controller_test.rb +++ b/test/controllers/credit_cards_controller_test.rb @@ -11,8 +11,8 @@ class CreditCardsControllerTest < ActionDispatch::IntegrationTest test "creates with credit card details" do assert_difference -> { Account.count } => 1, -> { CreditCard.count } => 1, - -> { Valuation.count } => 2, - -> { Entry.count } => 2 do + -> { Valuation.count } => 1, + -> { Entry.count } => 1 do post credit_cards_path, params: { account: { name: "New Credit Card", diff --git a/test/controllers/loans_controller_test.rb b/test/controllers/loans_controller_test.rb index ec590363..e12a2705 100644 --- a/test/controllers/loans_controller_test.rb +++ b/test/controllers/loans_controller_test.rb @@ -11,8 +11,8 @@ class LoansControllerTest < ActionDispatch::IntegrationTest test "creates with loan details" do assert_difference -> { Account.count } => 1, -> { Loan.count } => 1, - -> { Valuation.count } => 2, - -> { Entry.count } => 2 do + -> { Valuation.count } => 1, + -> { Entry.count } => 1 do post loans_path, params: { account: { name: "New Loan", diff --git a/test/controllers/valuations_controller_test.rb b/test/controllers/valuations_controller_test.rb index d9ee00b3..52c62ad4 100644 --- a/test/controllers/valuations_controller_test.rb +++ b/test/controllers/valuations_controller_test.rb @@ -23,7 +23,7 @@ class ValuationsControllerTest < ActionDispatch::IntegrationTest end created_entry = Entry.order(created_at: :desc).first - assert_equal "Manual account value update", created_entry.name + assert_equal "Manual value update", created_entry.name assert_equal Date.current, created_entry.date assert_equal account.balance + 100, created_entry.amount_money.to_f diff --git a/test/controllers/vehicles_controller_test.rb b/test/controllers/vehicles_controller_test.rb index bb7df9c6..37cea18d 100644 --- a/test/controllers/vehicles_controller_test.rb +++ b/test/controllers/vehicles_controller_test.rb @@ -11,8 +11,8 @@ class VehiclesControllerTest < ActionDispatch::IntegrationTest test "creates with vehicle details" do assert_difference -> { Account.count } => 1, -> { Vehicle.count } => 1, - -> { Valuation.count } => 2, - -> { Entry.count } => 2 do + -> { Valuation.count } => 1, + -> { Entry.count } => 1 do post vehicles_path, params: { account: { name: "Vehicle", diff --git a/test/fixtures/imports.yml b/test/fixtures/imports.yml index 366bb6d9..b0172532 100644 --- a/test/fixtures/imports.yml +++ b/test/fixtures/imports.yml @@ -7,3 +7,8 @@ trade: family: dylan_family type: TradeImport status: pending + +account: + family: dylan_family + type: AccountImport + status: pending diff --git a/test/models/account_import_test.rb b/test/models/account_import_test.rb new file mode 100644 index 00000000..550de6d9 --- /dev/null +++ b/test/models/account_import_test.rb @@ -0,0 +1,93 @@ +require "test_helper" + +class AccountImportTest < ActiveSupport::TestCase + include ActiveJob::TestHelper, ImportInterfaceTest + + setup do + @subject = @import = imports(:account) + end + + test "import creates accounts with valuations" do + import_csv = <<~CSV + type,name,amount,currency + depository,Main Checking,1000.00,USD + depository,Savings Account,5000.00,USD + CSV + + @import.update!( + raw_file_str: import_csv, + entity_type_col_label: "type", + name_col_label: "name", + amount_col_label: "amount", + currency_col_label: "currency" + ) + + @import.generate_rows_from_csv + + # Create mappings for account types + @import.mappings.create! key: "depository", value: "Depository", type: "Import::AccountTypeMapping" + + @import.reload + + # Store initial counts + initial_account_count = Account.count + initial_entry_count = Entry.count + initial_valuation_count = Valuation.count + + # Perform the import + @import.publish + + # Check if import succeeded + if @import.failed? + fail "Import failed with error: #{@import.error}" + end + + assert_equal "complete", @import.status + + # Check the differences + assert_equal initial_account_count + 2, Account.count, "Expected 2 new accounts" + assert_equal initial_entry_count + 2, Entry.count, "Expected 2 new entries" + assert_equal initial_valuation_count + 2, Valuation.count, "Expected 2 new valuations" + + # Verify accounts were created correctly + accounts = @import.accounts.order(:name) + assert_equal [ "Main Checking", "Savings Account" ], accounts.pluck(:name) + assert_equal [ 1000.00, 5000.00 ], accounts.map { |a| a.balance.to_f } + + # Verify valuations were created with correct fields + accounts.each do |account| + valuation = account.valuations.last + assert_not_nil valuation + assert_equal account.balance, valuation.balance + assert_equal account.balance, valuation.cash_balance + assert_equal "recon", valuation.kind + end + end + + test "column_keys returns expected keys" do + assert_equal %i[entity_type name amount currency], @import.column_keys + end + + test "required_column_keys returns expected keys" do + assert_equal %i[name amount], @import.required_column_keys + end + + test "mapping_steps returns account type mapping" do + assert_equal [ Import::AccountTypeMapping ], @import.mapping_steps + end + + test "dry_run returns expected counts" do + @import.rows.create!( + entity_type: "depository", + name: "Test Account", + amount: "1000.00", + currency: "USD" + ) + + assert_equal({ accounts: 1 }, @import.dry_run) + end + + test "max_row_count is limited to 50" do + assert_equal 50, @import.max_row_count + end +end