79 lines
2.5 KiB
Go
79 lines
2.5 KiB
Go
package csv_test
|
|
|
|
import (
|
|
"bytes"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/nmoniz/any2anexoj/internal"
|
|
"github.com/nmoniz/any2anexoj/internal/writing/csv"
|
|
"github.com/shopspring/decimal"
|
|
)
|
|
|
|
func TestWriter_Render(t *testing.T) {
|
|
aw := internal.NewAggregatorWriter()
|
|
ctx := t.Context()
|
|
|
|
items := []internal.ReportItem{
|
|
{
|
|
Symbol: "AAPL",
|
|
Nature: internal.NatureG01,
|
|
BrokerCountry: 826, // United Kingdom
|
|
AssetCountry: 840, // United States
|
|
BuyValue: decimal.NewFromFloat(100.50),
|
|
BuyTimestamp: time.Date(2023, 1, 15, 0, 0, 0, 0, time.UTC),
|
|
SellValue: decimal.NewFromFloat(150.75),
|
|
SellTimestamp: time.Date(2023, 6, 20, 0, 0, 0, 0, time.UTC),
|
|
Fees: decimal.NewFromFloat(2.50),
|
|
Taxes: decimal.NewFromFloat(5.00),
|
|
},
|
|
{
|
|
Symbol: "VWRL",
|
|
Nature: internal.NatureG20,
|
|
BrokerCountry: 196, // Portugal equivalent demo
|
|
AssetCountry: 372, // Ireland
|
|
BuyValue: decimal.NewFromFloat(200.00),
|
|
BuyTimestamp: time.Date(2024, 2, 1, 0, 0, 0, 0, time.UTC),
|
|
SellValue: decimal.NewFromFloat(250.25),
|
|
SellTimestamp: time.Date(2024, 7, 10, 0, 0, 0, 0, time.UTC),
|
|
Fees: decimal.NewFromFloat(1.00),
|
|
Taxes: decimal.NewFromFloat(0.00),
|
|
},
|
|
}
|
|
|
|
for _, ri := range items {
|
|
if err := aw.Write(ctx, ri); err != nil {
|
|
t.Fatalf("write report item: %v", err)
|
|
}
|
|
}
|
|
|
|
var buf bytes.Buffer
|
|
if err := csv.NewWriter(&buf).Render(aw); err != nil {
|
|
t.Fatalf("render: %v", err)
|
|
}
|
|
|
|
out := buf.String()
|
|
|
|
wantHeader := "source_country,code,realization_year,realization_month,realization_day,realization_value,acquisition_year,acquisition_month,acquisition_day,acquisition_value,expenses,foreign_tax_paid,counter_country"
|
|
if !strings.HasPrefix(out, wantHeader+"\n") {
|
|
t.Errorf("expected header row %q, got output:\n%s", wantHeader, out)
|
|
}
|
|
|
|
wantRow1 := "840,G01,2023,6,20,150.75,2023,1,15,100.50,2.50,5.00,826"
|
|
if !strings.Contains(out, wantRow1+"\n") {
|
|
t.Errorf("expected row 1 %q in output:\n%s", wantRow1, out)
|
|
}
|
|
|
|
wantRow2 := "372,G20,2024,7,10,250.25,2024,2,1,200.00,1.00,0.00,196"
|
|
if !strings.Contains(out, wantRow2+"\n") {
|
|
t.Errorf("expected row 2 %q in output:\n%s", wantRow2, out)
|
|
}
|
|
|
|
// Make sure the header only appears once and we have exactly 1 header + 2 data rows.
|
|
lines := strings.Split(strings.TrimRight(out, "\n"), "\n")
|
|
if got, want := len(lines), 3; got != want {
|
|
t.Errorf("expected %d lines (1 header + 2 rows), got %d:\n%s", want, got, out)
|
|
}
|
|
}
|