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", }, {