117 lines
3.1 KiB
Go
117 lines
3.1 KiB
Go
package internal
|
|
|
|
import (
|
|
"bytes"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/shopspring/decimal"
|
|
)
|
|
|
|
func TestTableWriter_Write(t *testing.T) {
|
|
tNow := time.Now()
|
|
|
|
tests := []struct {
|
|
name string
|
|
items []ReportItem
|
|
wantTotalSpent decimal.Decimal
|
|
wantTotalEarned decimal.Decimal
|
|
wantTotalTaxes decimal.Decimal
|
|
wantTotalFees decimal.Decimal
|
|
}{
|
|
{
|
|
name: "empty",
|
|
},
|
|
{
|
|
name: "single item positive",
|
|
items: []ReportItem{
|
|
{
|
|
BuyValue: decimal.NewFromFloat(100.0),
|
|
SellValue: decimal.NewFromFloat(200.0),
|
|
SellTimestamp: tNow,
|
|
Taxes: decimal.NewFromFloat(2.5),
|
|
Fees: decimal.NewFromFloat(2.5),
|
|
},
|
|
},
|
|
wantTotalSpent: decimal.NewFromFloat(100.0),
|
|
wantTotalEarned: decimal.NewFromFloat(200.0),
|
|
wantTotalTaxes: decimal.NewFromFloat(2.5),
|
|
wantTotalFees: decimal.NewFromFloat(2.5),
|
|
},
|
|
{
|
|
name: "single item negative",
|
|
items: []ReportItem{
|
|
{
|
|
BuyValue: decimal.NewFromFloat(200.0),
|
|
SellValue: decimal.NewFromFloat(150.0),
|
|
SellTimestamp: tNow,
|
|
Taxes: decimal.NewFromFloat(2.5),
|
|
Fees: decimal.NewFromFloat(2.5),
|
|
},
|
|
},
|
|
wantTotalSpent: decimal.NewFromFloat(200.0),
|
|
wantTotalEarned: decimal.NewFromFloat(150.0),
|
|
wantTotalTaxes: decimal.NewFromFloat(2.5),
|
|
wantTotalFees: decimal.NewFromFloat(2.5),
|
|
},
|
|
{
|
|
name: "multiple items",
|
|
items: []ReportItem{
|
|
{
|
|
Symbol: "US1912161007",
|
|
BuyValue: decimal.NewFromFloat(100.0),
|
|
SellValue: decimal.NewFromFloat(200.0),
|
|
SellTimestamp: tNow,
|
|
Taxes: decimal.NewFromFloat(2.5),
|
|
Fees: decimal.NewFromFloat(2.5),
|
|
},
|
|
{
|
|
Symbol: "US1912161007",
|
|
BuyValue: decimal.NewFromFloat(200.0),
|
|
SellValue: decimal.NewFromFloat(150.0),
|
|
SellTimestamp: tNow.Add(1),
|
|
Taxes: decimal.NewFromFloat(2.5),
|
|
Fees: decimal.NewFromFloat(2.5),
|
|
},
|
|
},
|
|
wantTotalSpent: decimal.NewFromFloat(300.0),
|
|
wantTotalEarned: decimal.NewFromFloat(350.0),
|
|
wantTotalTaxes: decimal.NewFromFloat(5.0),
|
|
wantTotalFees: decimal.NewFromFloat(5.0),
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
buf := new(bytes.Buffer)
|
|
tw := NewTableWriter(buf)
|
|
|
|
for _, item := range tt.items {
|
|
err := tw.Write(t.Context(), item)
|
|
if err != nil {
|
|
t.Fatalf("unexpected error on write: %v", err)
|
|
}
|
|
}
|
|
|
|
if tw.table.Length() != len(tt.items) {
|
|
t.Fatalf("want %d items in table but got %d", len(tt.items), tw.table.Length())
|
|
}
|
|
|
|
if !tw.totalSpent.Equal(tt.wantTotalSpent) {
|
|
t.Errorf("want totalSpent to be %v but got %v", tt.wantTotalSpent, tw.totalSpent)
|
|
}
|
|
|
|
if !tw.totalEarned.Equal(tt.wantTotalEarned) {
|
|
t.Errorf("want totalEarned to be %v but got %v", tt.wantTotalEarned, tw.totalEarned)
|
|
}
|
|
|
|
if !tw.totalTaxes.Equal(tt.wantTotalTaxes) {
|
|
t.Errorf("want totalTaxes to be %v but got %v", tt.wantTotalTaxes, tw.totalTaxes)
|
|
}
|
|
|
|
if !tw.totalFees.Equal(tt.wantTotalFees) {
|
|
t.Errorf("want totalFees to be %v but got %v", tt.wantTotalFees, tw.totalFees)
|
|
}
|
|
})
|
|
}
|
|
}
|