From ffc860233678d8ac50349dd3415c59b401699032 Mon Sep 17 00:00:00 2001 From: Aaron Lindsay Date: Fri, 1 Dec 2017 21:21:55 -0500 Subject: [PATCH] testing: Add another brokerage account OFX import test --- .../handlers/handlers_testdata/brokerage.ofx | 11 +++ internal/handlers/ofx.go | 8 +- internal/handlers/ofx_test.go | 81 +++++++++++++++++++ 3 files changed, 96 insertions(+), 4 deletions(-) create mode 100644 internal/handlers/handlers_testdata/brokerage.ofx diff --git a/internal/handlers/handlers_testdata/brokerage.ofx b/internal/handlers/handlers_testdata/brokerage.ofx new file mode 100644 index 0000000..5e74125 --- /dev/null +++ b/internal/handlers/handlers_testdata/brokerage.ofx @@ -0,0 +1,11 @@ +0INFOSuccessful Sign On20171130013742ENG20160713012000Somewhere9277201927017240917209172407124984652986a59df4c3-9408-00bb-fd6d-0a06695885b10INFO20171129160000.000[-5:EST]USDinvesting.example.com7372829220160529160000.000[-5:EST]160000.000[-5:EST]20171130013742.000[-5:EST] +99397105620170315160000.000[-5:EST]20170316160000.000[-5:EST]BUY921937108CUSIP37.70010.61-400.0CASHCASHBUY +20604694120160620160000.000[-5:EST]20160623160000.000[-5:EST]BUY921909768CUSIP15.045.17987-677.70CASHCASHBUY +6359059020160729160000.000[-5:EST]20160729160000.000[-5:EST]DIVIDEND PAYMENTDIVIDEND PAYMENT78462F103CUSIPDIV1.08CASHCASH +76922351720160606160000.000[-5:EST]20160606160000.000[-5:EST]DIVIDEND REINVESTMENTDIVIDEND REINVESTMENT049560105CUSIPDIV-6.43CASH0.08674.9777 +61968901820160627160000.000[-5:EST]20160627160000.000[-5:EST]MONEY FUND REDEMPTION922906300CUSIP-21.571.021.57CASHCASHSELL +32844449920160708160000.000[-5:EST]20160713160000.000[-5:EST]SELL921909768CUSIP-10.044.260130.07442.53CASHCASHSELL +OTHER20160607160000.000[-5:EST]1000.0230048208CASH + +049560105CUSIPCASHLONG6.08690.51550.84320171128160000.000[-5:EST]Price as of date based on closing priceY921937108CUSIPCASHLONG37.7710.75406.0220171128160000.000[-5:EST]Price as of date based on closing priceYY922906300CUSIPCASHLONG24.871.024.8720171128160000.000[-5:EST]Price as of date based on closing priceNN +387.480.00.0049560105CUSIPATMOS ENERGY CORPATO90.51Price as of date based on closing priceCOMMON2.1491921909768CUSIPVANGUARD TOTAL INTL STOCK INDE921909768BUY78462F103CUSIP20SPDR SP 500 ETF78462F103SELL921937108CUSIPVanguard Total Bond Market Index Fund Investor SharesVBMFX10.75Price as of date based on closing priceOPENEND922906300CUSIPVanguard Federal Money Market FundVMFXX1.0Price as of date based on closing priceOPENEND diff --git a/internal/handlers/ofx.go b/internal/handlers/ofx.go index 68896b5..8c08a67 100644 --- a/internal/handlers/ofx.go +++ b/internal/handlers/ofx.go @@ -705,10 +705,10 @@ func (i *OFXImport) GetInvSellTran(sell *ofxgo.InvSell, curdef *Security, accoun load.Neg(&load) tradingTotal.Neg(&total) - tradingTotal.Sub(&tradingTotal, &commission) - tradingTotal.Sub(&tradingTotal, &taxes) - tradingTotal.Sub(&tradingTotal, &fees) - tradingTotal.Sub(&tradingTotal, &load) + tradingTotal.Add(&tradingTotal, &commission) + tradingTotal.Add(&tradingTotal, &taxes) + tradingTotal.Add(&tradingTotal, &fees) + tradingTotal.Add(&tradingTotal, &load) // Convert amounts to account's currency if Currency is set if ok, _ := sell.Currency.Valid(); ok { diff --git a/internal/handlers/ofx_test.go b/internal/handlers/ofx_test.go index 961d0b0..baf452a 100644 --- a/internal/handlers/ofx_test.go +++ b/internal/handlers/ofx_test.go @@ -146,3 +146,84 @@ func TestImportOFX401kMutualFunds(t *testing.T) { } }) } + +func TestImportOFXBrokerage(t *testing.T) { + RunWith(t, &data[0], func(t *testing.T, d *TestData) { + // Ensure there's only one USD currency + oldDefault, err := getSecurity(d.clients[0], d.users[0].DefaultCurrency) + if err != nil { + t.Fatalf("Error fetching default security: %s\n", err) + } + d.users[0].DefaultCurrency = d.securities[0].SecurityId + if _, err := updateUser(d.clients[0], &d.users[0]); err != nil { + t.Fatalf("Error updating user: %s\n", err) + } + if err := deleteSecurity(d.clients[0], oldDefault); err != nil { + t.Fatalf("Error removing default security: %s\n", err) + } + + // Create the brokerage account + account := &handlers.Account{ + SecurityId: d.securities[0].SecurityId, + UserId: d.users[0].UserId, + ParentAccountId: -1, + Type: handlers.Investment, + Name: "Personal Brokerage", + } + + account, err = createAccount(d.clients[0], account) + if err != nil { + t.Fatalf("Error creating 'Personal Brokerage' account: %s\n", err) + } + + // Import and ensure it didn't return a nasty error code + if err = importOFX(d.clients[0], account.AccountId, "handlers_testdata/brokerage.ofx"); err != nil { + t.Fatalf("Error importing OFX: %s\n", err) + } + accountBalanceHelper(t, d.clients[0], account, "387.48") + + // Make sure the USD trading account was created and has the right + // value + usdtrading, err := findAccount(d.clients[0], "USD", handlers.Trading, d.users[0].DefaultCurrency) + if err != nil { + t.Fatalf("Error finding USD trading account: %s\n", err) + } + accountBalanceHelper(t, d.clients[0], usdtrading, "619.96") + + // Check investment/trading balances for all securities traded + checks := []struct { + Ticker string + Name string + Balance string + TradingBalance string + }{ + {"VBMFX", "Vanguard Total Bond Market Index Fund Investor Shares", "37.70000", "-37.70000"}, + {"921909768", "VANGUARD TOTAL INTL STOCK INDE", "5.00000", "-5.00000"}, + {"ATO", "ATMOS ENERGY CORP", "0.08600", "-0.08600"}, + {"VMFXX", "Vanguard Federal Money Market Fund", "-21.57000", "21.57000"}, + } + + for _, check := range checks { + security, err := findSecurity(d.clients[0], check.Ticker, handlers.Stock) + if err != nil { + t.Fatalf("Error finding security: %s\n", err) + } + + account, err := findAccount(d.clients[0], check.Name, handlers.Investment, security.SecurityId) + if err != nil { + t.Fatalf("Error finding trading account: %s\n", err) + } + + accountBalanceHelper(t, d.clients[0], account, check.Balance) + + tradingaccount, err := findAccount(d.clients[0], check.Name, handlers.Trading, security.SecurityId) + if err != nil { + t.Fatalf("Error finding trading account: %s\n", err) + } + + accountBalanceHelper(t, d.clients[0], tradingaccount, check.TradingBalance) + } + + // TODO check reinvestment/income to make sure they're registered as income? + }) +}