diff --git a/internal/handlers/common_test.go b/internal/handlers/common_test.go
index 071ec05..a0141d0 100644
--- a/internal/handlers/common_test.go
+++ b/internal/handlers/common_test.go
@@ -10,6 +10,7 @@ import (
"io"
"io/ioutil"
"log"
+ "mime/multipart"
"net/http"
"net/http/httptest"
"os"
@@ -158,6 +159,49 @@ func remove(client *http.Client, urlsuffix string) error {
return nil
}
+func uploadFile(client *http.Client, filename, urlsuffix string) error {
+ var buf bytes.Buffer
+ mw := multipart.NewWriter(&buf)
+
+ file, err := os.Open(filename)
+ if err != nil {
+ return err
+ }
+ defer file.Close()
+
+ filewriter, err := mw.CreateFormFile("file", filename)
+ if err != nil {
+ return err
+ }
+ if _, err := io.Copy(filewriter, file); err != nil {
+ return err
+ }
+
+ mw.Close()
+
+ response, err := client.Post(server.URL+urlsuffix, mw.FormDataContentType(), &buf)
+ if err != nil {
+ return err
+ }
+
+ body, err := ioutil.ReadAll(response.Body)
+ response.Body.Close()
+ if err != nil {
+ return err
+ }
+
+ var e handlers.Error
+ err = (&e).Read(string(body))
+ if err != nil {
+ return err
+ }
+ if e.ErrorId != 0 || len(e.ErrorString) != 0 {
+ return &e
+ }
+
+ return nil
+}
+
func RunWith(t *testing.T, d *TestData, fn TestDataFunc) {
testdata, err := d.Initialize()
if err != nil {
diff --git a/internal/handlers/gnucash_test.go b/internal/handlers/gnucash_test.go
index 5efd41e..bf66e57 100644
--- a/internal/handlers/gnucash_test.go
+++ b/internal/handlers/gnucash_test.go
@@ -1,57 +1,13 @@
package handlers_test
import (
- "bytes"
"github.com/aclindsa/moneygo/internal/handlers"
- "io"
- "io/ioutil"
- "mime/multipart"
"net/http"
- "os"
"testing"
)
func importGnucash(client *http.Client, filename string) error {
- var buf bytes.Buffer
- mw := multipart.NewWriter(&buf)
-
- file, err := os.Open(filename)
- if err != nil {
- return err
- }
- defer file.Close()
-
- filewriter, err := mw.CreateFormFile("gnucash", filename)
- if err != nil {
- return err
- }
- if _, err := io.Copy(filewriter, file); err != nil {
- return err
- }
-
- mw.Close()
-
- response, err := client.Post(server.URL+"/v1/imports/gnucash", mw.FormDataContentType(), &buf)
- if err != nil {
- return err
- }
-
- body, err := ioutil.ReadAll(response.Body)
- response.Body.Close()
- if err != nil {
- return err
- }
-
- var e handlers.Error
- err = (&e).Read(string(body))
- if err != nil {
- return err
- }
- if e.ErrorId != 0 || len(e.ErrorString) != 0 {
- return &e
- }
-
- return nil
+ return uploadFile(client, filename, "/v1/imports/gnucash")
}
func gnucashAccountBalanceHelper(t *testing.T, client *http.Client, account *handlers.Account, balance string) {
diff --git a/internal/handlers/handlers_testdata/checking_20171126.ofx b/internal/handlers/handlers_testdata/checking_20171126.ofx
new file mode 100644
index 0000000..1cb07bd
--- /dev/null
+++ b/internal/handlers/handlers_testdata/checking_20171126.ofx
@@ -0,0 +1,140 @@
+
+
+
+
+
+ 0
+ INFO
+
+ 20171126184401.091[0:GMT]
+ ENG
+
+ YCKVJ
+ 0351
+
+
+
+
+ 0549c828-f02c-43c7-81a3-de0b3f23c393
+
+ 0
+ INFO
+
+
+ USD
+
+ 115483849
+ 14839128817
+ CHECKING
+
+
+ 20170828174401.637[0:GMT]
+ 20171126184401.637[0:GMT]
+
+ CREDIT
+ 20170830120000.000[0:GMT]
+ 2843.08
+ ce2cf749-dd15-4dc7-b78d-2f9e88d8a702
+ SALARY
+ ACH Deposit 18181818199
+
+
+ DEBIT
+ 20170830120000.000[0:GMT]
+ -2354.66
+ 2bda11f4-9a9c-43fb-b67a-71f747dcf684
+ BILLPAY TO CREDIT CARD
+ ACH Debit 8181819191919
+
+
+ CHECK
+ 20170830120000.000[0:GMT]
+ -15.00
+ 62dcc92d-ba0f-4fe6-8611-d6c1b86594fc
+ 3304
+ Check
+ INCLEARING CHECK
+
+
+ DEBIT
+ 20171107120000.000[0:GMT]
+ -282.68
+ 29c74a94-f226-4980-b54c-da6fa2721d7e
+ DAYCARE o SIGONFILE
+ ACH Debit 11818191919191
+
+
+ CREDIT
+ 20171109120000.000[0:GMT]
+ 1300.98
+ 32e40e98-61c3-421c-acaa-55ae67a5f8fe
+ DIRECT DEPOSIT
+ ACH Deposit 8282828282828
+
+
+ DEBIT
+ 20171109120000.000[0:GMT]
+ -98.20
+ 4b73dbbf-aa27-4f62-b54a-ee0a9a3486d8
+ DUKEENGYPROGRESS DUKEENGYPR
+ ACH Debit 017313004099621
+
+
+ CREDIT
+ 20171115120000.000[0:GMT]
+ 1.01
+ 51c47252-4cf0-442c-b619-8a31b17ac489
+ Dividend Earned
+
+
+ DEBIT
+ 20171116120000.000[0:GMT]
+ -51.75
+ 51cb12bb-cdd9-4333-8d8d-c423f9e8f833
+ TARGET DEBIT CRD ACH TRAN
+ ACH Debit
+
+
+ DEBIT
+ 20171120120000.000[0:GMT]
+ -25.18
+ 366a5b23-2f2e-4cf0-a714-6a306bd4e909
+ TARGET DEBIT CRD ACH TRAN
+ ACH Debit
+
+
+ DEBIT
+ 20171121120000.000[0:GMT]
+ -10.71
+ 9a463f21-c6e1-4fe0-b37b-f9a8cc942cf0
+ NETFLIX COM NETFLIX COM
+ Point of Sale Debit L999 DATE 11-20
+
+
+ CREDIT
+ 20171122120000.000[0:GMT]
+ 1300.98
+ 31f165e5-569f-4530-8438-a6ceb2301335
+ DIRECT DEPOSIT
+ ACH Deposit 838383838383838
+
+
+ CREDIT
+ 20171122120000.000[0:GMT]
+ 12.50
+ 215a10dd-f3a2-4336-ab8c-f22276cad552
+ CIRCLE INTERNET CIRCLE
+ ACH Deposit 017326000283477
+
+
+
+ 2620.37
+ 20171126184401.637[0:GMT]
+
+
+ 3620.37
+ 20171126184401.637[0:GMT]
+
+
+
+
diff --git a/internal/handlers/handlers_testdata/checking_20171129.ofx b/internal/handlers/handlers_testdata/checking_20171129.ofx
new file mode 100644
index 0000000..57d440a
--- /dev/null
+++ b/internal/handlers/handlers_testdata/checking_20171129.ofx
@@ -0,0 +1,123 @@
+
+
+
+
+
+ 0
+ INFO
+
+ 20171129025346.132[0:GMT]
+ ENG
+
+ YCKVJ
+ 0351
+
+
+
+
+ 0549c828-f02c-43c7-81a3-de0b3f23c393
+
+ 0
+ INFO
+
+
+ USD
+
+ 115483849
+ 14839128817
+ CHECKING
+
+
+ 20170831174401.637[0:GMT]
+ 20171129184401.637[0:GMT]
+
+ DEBIT
+ 20171107120000.000[0:GMT]
+ -282.68
+ 29c74a94-f226-4980-b54c-da6fa2721d7e
+ DAYCARE o SIGONFILE
+ ACH Debit 11818191919191
+
+
+ CREDIT
+ 20171109120000.000[0:GMT]
+ 1300.98
+ 32e40e98-61c3-421c-acaa-55ae67a5f8fe
+ DIRECT DEPOSIT
+ ACH Deposit 8282828282828
+
+
+ DEBIT
+ 20171109120000.000[0:GMT]
+ -98.20
+ 4b73dbbf-aa27-4f62-b54a-ee0a9a3486d8
+ DUKEENGYPROGRESS DUKEENGYPR
+ ACH Debit 017313004099621
+
+
+ CREDIT
+ 20171115120000.000[0:GMT]
+ 1.01
+ 51c47252-4cf0-442c-b619-8a31b17ac489
+ Dividend Earned
+
+
+ DEBIT
+ 20171116120000.000[0:GMT]
+ -51.75
+ 51cb12bb-cdd9-4333-8d8d-c423f9e8f833
+ TARGET DEBIT CRD ACH TRAN
+ ACH Debit
+
+
+ DEBIT
+ 20171120120000.000[0:GMT]
+ -25.18
+ 366a5b23-2f2e-4cf0-a714-6a306bd4e909
+ TARGET DEBIT CRD ACH TRAN
+ ACH Debit
+
+
+ DEBIT
+ 20171121120000.000[0:GMT]
+ -10.71
+ 9a463f21-c6e1-4fe0-b37b-f9a8cc942cf0
+ NETFLIX COM NETFLIX COM
+ Point of Sale Debit L999 DATE 11-20
+
+
+ CREDIT
+ 20171122120000.000[0:GMT]
+ 1300.98
+ 31f165e5-569f-4530-8438-a6ceb2301335
+ DIRECT DEPOSIT
+ ACH Deposit 838383838383838
+
+
+ CREDIT
+ 20171122120000.000[0:GMT]
+ 12.50
+ 215a10dd-f3a2-4336-ab8c-f22276cad552
+ CIRCLE INTERNET CIRCLE
+ ACH Deposit 017326000283477
+
+
+ CREDIT
+ 20171129120000.000[0:GMT]
+ 2843.08
+ 9a52df4b-3a8d-41bb-9141-96e1e3f294cf
+ SALARY
+ ACH Deposit 18181818199
+
+
+
+ 5463.45
+ 20171129025346.132[0:GMT]
+
+
+ 6463.45
+ 20171129025346.132[0:GMT]
+
+
+
+
diff --git a/internal/handlers/ofx_test.go b/internal/handlers/ofx_test.go
new file mode 100644
index 0000000..74ce496
--- /dev/null
+++ b/internal/handlers/ofx_test.go
@@ -0,0 +1,36 @@
+package handlers_test
+
+import (
+ "net/http"
+ "strconv"
+ "testing"
+)
+
+func importOFX(client *http.Client, accountid int64, filename string) error {
+ return uploadFile(client, filename, "/v1/accounts/"+strconv.FormatInt(accountid, 10)+"/imports/ofxfile")
+}
+
+func TestImportOFX(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)
+ }
+
+ // Import and ensure it didn't return a nasty error code
+ if err = importOFX(d.clients[0], d.accounts[1].AccountId, "handlers_testdata/checking_20171126.ofx"); err != nil {
+ t.Fatalf("Error importing OFX: %s\n", err)
+ }
+ if err = importOFX(d.clients[0], d.accounts[1].AccountId, "handlers_testdata/checking_20171129.ofx"); err != nil {
+ t.Fatalf("Error importing OFX: %s\n", err)
+ }
+ })
+}
diff --git a/internal/handlers/testdata_test.go b/internal/handlers/testdata_test.go
index 5ca0eb2..88303ba 100644
--- a/internal/handlers/testdata_test.go
+++ b/internal/handlers/testdata_test.go
@@ -257,7 +257,7 @@ var data = []TestData{
UserId: 0,
SecurityId: 0,
ParentAccountId: 0,
- Type: handlers.Asset,
+ Type: handlers.Bank,
Name: "Credit Union Checking",
},
{