1
0
Fork 0
mirror of https://github.com/maybe-finance/maybe.git synced 2025-07-24 15:49:39 +02:00

Plaid sync tests and multi-currency investment support (#1531)
Some checks are pending
Publish Docker image / ci (push) Waiting to run
Publish Docker image / Build docker image (push) Blocked by required conditions

* Plaid sync tests and multi-currency investment support

* Fix system test

* Cleanup

* Remove data migration
This commit is contained in:
Zach Gollwitzer 2024-12-12 08:56:52 -05:00 committed by GitHub
parent b2a56aefc1
commit 800eb4c146
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
21 changed files with 406 additions and 165 deletions

View file

@ -13,7 +13,7 @@ class Account::SyncerTest < ActiveSupport::TestCase
)
end
test "converts foreign account balances to family currency" do
test "converts foreign account balances and holdings to family currency" do
@account.family.update! currency: "USD"
@account.update! currency: "EUR"
@ -27,10 +27,19 @@ class Account::SyncerTest < ActiveSupport::TestCase
]
)
Account::HoldingCalculator.any_instance.expects(:calculate).returns(
[
Account::Holding.new(security: securities(:aapl), date: 1.day.ago.to_date, amount: 500, currency: "EUR"),
Account::Holding.new(security: securities(:aapl), date: Date.current, amount: 500, currency: "EUR")
]
)
Account::Syncer.new(@account).run
assert_equal [ 1000, 1000 ], @account.balances.where(currency: "EUR").chronological.map(&:balance)
assert_equal [ 1200, 2000 ], @account.balances.where(currency: "USD").chronological.map(&:balance)
assert_equal [ 500, 500 ], @account.holdings.where(currency: "EUR").chronological.map(&:amount)
assert_equal [ 600, 1000 ], @account.holdings.where(currency: "USD").chronological.map(&:amount)
end
test "purges stale balances and holdings" do

View file

@ -59,13 +59,4 @@ class AccountTest < ActiveSupport::TestCase
assert_equal 0, @account.series(currency: "NZD").values.count
end
end
test "calculates shares owned of holding for date" do
account = accounts(:investment)
security = securities(:aapl)
assert_equal 10, account.holding_qty(security, date: Date.current)
assert_equal 10, account.holding_qty(security, date: 1.day.ago.to_date)
assert_equal 0, account.holding_qty(security, date: 2.days.ago.to_date)
end
end

View file

@ -0,0 +1,82 @@
require "test_helper"
class PlaidInvestmentSyncTest < ActiveSupport::TestCase
include PlaidTestHelper
setup do
@plaid_account = plaid_accounts(:one)
end
test "syncs basic investments and handles cash holding" do
assert_equal 0, @plaid_account.account.entries.count
assert_equal 0, @plaid_account.account.holdings.count
plaid_aapl_id = "aapl_id"
transactions = [
create_plaid_investment_transaction({
investment_transaction_id: "inv_txn_1",
security_id: plaid_aapl_id,
quantity: 10,
price: 200,
date: 5.days.ago.to_date,
type: "buy"
})
]
holdings = [
create_plaid_cash_holding,
create_plaid_holding({
security_id: plaid_aapl_id,
quantity: 10,
institution_price: 200,
cost_basis: 2000
})
]
securities = [
create_plaid_security({
security_id: plaid_aapl_id,
close_price: 200,
ticker_symbol: "AAPL"
})
]
# Cash holding should be ignored, resulting in 1, NOT 2 total holdings after sync
assert_difference -> { Account::Trade.count } => 1,
-> { Account::Transaction.count } => 0,
-> { Account::Holding.count } => 1,
-> { Security.count } => 0 do
PlaidInvestmentSync.new(@plaid_account).sync!(
transactions: transactions,
holdings: holdings,
securities: securities
)
end
end
# Some cash transactions from Plaid are labeled as type: "cash" while others are linked to a "cash" security
# In both cases, we should treat them as cash-only transactions (not trades)
test "handles cash investment transactions" do
transactions = [
create_plaid_investment_transaction({
price: 1,
quantity: 5,
amount: 5,
type: "fee",
subtype: "miscellaneous fee",
security_id: PLAID_TEST_CASH_SECURITY_ID
})
]
assert_difference -> { Account::Trade.count } => 0,
-> { Account::Transaction.count } => 1,
-> { Security.count } => 0 do
PlaidInvestmentSync.new(@plaid_account).sync!(
transactions: transactions,
holdings: [ create_plaid_cash_holding ],
securities: [ create_plaid_cash_security ]
)
end
end
end