package main import ( "fmt" "io" "os" "path" "testing" "github.com/google/uuid" ) func TestLedgerTransactionsBalances(t *testing.T) { ledger, err := NewLedger("./testdata/ledger.dat") if err != nil { t.Fatal(err) } transactions, err := ledger.Transactions() if err != nil { t.Fatal(err) } if len(transactions) != 2 { t.Fatal(transactions) } if want := (Transaction{ Date: "2021-07-29", Description: "Qt needs pizza n kodiak", Payee: "Withdrawal:Home:Grocery+Resturaunt:Target", Payer: "Debts:Credit:ChaseAarpChaseVisa", Amount: 37.86, }); transactions[0] != want { t.Fatalf("want \n\t%+v, got \n\t%+v", want, transactions[0]) } if want := (Transaction{ Date: "2021-07-30", Description: "Testing detecting deposits via email alerts 5421705162", Payee: "Debts:Credit:ChaseAarpChaseVisa", Payer: "AssetAccount:Cash:Uccu", Amount: 100.00, }); transactions[1] != want { t.Fatalf("want \n\t%+v, got \n\t%+v", want, transactions[1]) } for i := range transactions { t.Logf("%+v => \n%s", transactions[i], transactions[i].Marshal()) } balances, err := ledger.Balances() if err != nil { t.Fatal(err) } wantBalances := map[string]float32{ transactions[0].Payee: 37.86, transactions[0].Payer: 62.14, transactions[1].Payer: -100, } if fmt.Sprint(balances) != fmt.Sprint(wantBalances) { t.Fatalf("want \n%+v, got \n%+v", wantBalances, balances) } } func TestLedgerSetTransaction(t *testing.T) { aTransaction := func() Transaction { return Transaction{ Date: "2021-07-20", Description: uuid.New().String(), Payee: "payee", Payer: "payer", Amount: 1.23, } } path := path.Join(t.TempDir(), "ledger.dat") a, err := os.Open("./testdata/ledger.dat") if err != nil { t.Fatal(err) } b, err := os.Create(path) if err != nil { t.Fatal(err) } if _, err := io.Copy(b, a); err != nil { t.Fatal(err) } a.Close() b.Close() ledger, err := NewLedger(path) if err != nil { t.Fatal(err) } transactions, err := ledger.Transactions() if err != nil { t.Fatal(err) } was := fmt.Sprintf("%+v", transactions) transactions[0] = aTransaction() want := fmt.Sprintf("%+v", transactions) if err := ledger.SetTransaction(0, transactions[0]); err != nil { t.Fatal(err) } transactions, err = ledger.Transactions() if err != nil { t.Fatal(err) } got := fmt.Sprintf("%+v", transactions) if got == was { t.Fatal(got) } if got != want { t.Fatal(want, got) } }