From 03ec3247f9cb0e1ff0dba003ef04aa30c4a67c23 Mon Sep 17 00:00:00 2001 From: Bel LaPointe Date: Mon, 30 Aug 2021 10:14:35 -0400 Subject: [PATCH] ledger.newtransaction --- ledger.go | 16 +++++++++++++ ledger_test.go | 55 +++++++++++++++++++++++++++++++-------------- transaction.go | 15 +++++++++++++ transaction_test.go | 18 +++++++++++++++ 4 files changed, 87 insertions(+), 17 deletions(-) diff --git a/ledger.go b/ledger.go index 5c7a31c..2a97e97 100755 --- a/ledger.go +++ b/ledger.go @@ -8,6 +8,7 @@ import ( "io/ioutil" "os" "path" + "time" ) type Ledger struct { @@ -24,6 +25,21 @@ func NewLedger(path string) (Ledger, error) { }, err } +func (ledger Ledger) NewTransaction() error { + transactions, err := ledger.Transactions() + if err != nil { + return err + } + transactions = append(transactions, Transaction{ + Date: time.Now().Format("2006-01-02"), + Description: "?", + Payer: "?", + Payee: "?", + Amount: 0, + }) + return ledger.SetTransactions(transactions) +} + func (ledger Ledger) SetTransaction(i int, transaction Transaction) error { transactions, err := ledger.Transactions() if err != nil { diff --git a/ledger_test.go b/ledger_test.go index 6618e1f..b92b45a 100755 --- a/ledger_test.go +++ b/ledger_test.go @@ -2,7 +2,7 @@ package main import ( "fmt" - "io" + "io/ioutil" "os" "path" "testing" @@ -10,8 +10,19 @@ import ( "github.com/google/uuid" ) +func testLedgerFile(t *testing.T) string { + path := path.Join(t.TempDir(), t.Name()+".dat") + if b, err := ioutil.ReadFile("./testdata/ledger.dat"); err != nil { + t.Fatal(err) + } else if err := ioutil.WriteFile(path, b, os.ModePerm); err != nil { + t.Fatal(err) + } + return path +} + func TestLedgerTransactionsBalances(t *testing.T) { - ledger, err := NewLedger("./testdata/ledger.dat") + path := testLedgerFile(t) + ledger, err := NewLedger(path) if err != nil { t.Fatal(err) } @@ -67,21 +78,7 @@ func TestLedgerSetTransaction(t *testing.T) { 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() - + path := testLedgerFile(t) ledger, err := NewLedger(path) if err != nil { t.Fatal(err) @@ -109,3 +106,27 @@ func TestLedgerSetTransaction(t *testing.T) { t.Fatal(want, got) } } + +func TestLedgerNewTransaction(t *testing.T) { + path := testLedgerFile(t) + ledger, err := NewLedger(path) + if err != nil { + t.Fatal(err) + } + transactions, err := ledger.Transactions() + if err != nil { + t.Fatal(err) + } + wantTransactions := append(transactions, newStubTransaction()) + ledger.NewTransaction() + if err != nil { + t.Fatal(err) + } + gotTransactions, err := ledger.Transactions() + if err != nil { + t.Fatal(err) + } + if fmt.Sprint(wantTransactions) != fmt.Sprint(gotTransactions) { + t.Fatal(wantTransactions, gotTransactions) + } +} diff --git a/transaction.go b/transaction.go index 740315d..a7c9c6d 100755 --- a/transaction.go +++ b/transaction.go @@ -8,6 +8,7 @@ import ( "io" "strconv" "strings" + "time" ) type Transaction struct { @@ -18,6 +19,20 @@ type Transaction struct { Amount float32 } +const ( + UnknownAccount = "?" +) + +func newStubTransaction() Transaction { + return Transaction{ + Date: time.Now().Format("2006-01-02"), + Description: UnknownAccount, + Payer: UnknownAccount, + Payee: UnknownAccount, + Amount: 0, + } +} + func readTransaction(r io.Reader) (Transaction, error) { lines := make([][]byte, 3) for i := range lines { diff --git a/transaction_test.go b/transaction_test.go index ce9eb2c..510d1b0 100755 --- a/transaction_test.go +++ b/transaction_test.go @@ -6,6 +6,24 @@ import ( "testing" ) +func TestNewStubTransaction(t *testing.T) { + want := Transaction{ + Date: "1", + Amount: 0, + Payer: UnknownAccount, + Payee: UnknownAccount, + Description: UnknownAccount, + } + got := newStubTransaction() + if got.Date == "" { + t.Fatal(got.Date) + } + got.Date = want.Date + if want != got { + t.Fatal(want, got) + } +} + func TestWords(t *testing.T) { input := ` hello world