package main import ( "testing" ) // helper to create a cart grain with items and deliveries func newTestCart() *CartGrain { return &CartGrain{Items: []*CartItem{}, Deliveries: []*CartDelivery{}, Vouchers: []*Voucher{}, Notifications: []CartNotification{}} } func TestCartGrainUpdateTotalsBasic(t *testing.T) { c := newTestCart() // Item1 price 1250 (ex 1000 vat 250) org price higher -> discount 200 per unit item1Price := Price{IncVat: 1250, VatRates: map[float32]int64{25: 250}} item1Org := &Price{IncVat: 1500, VatRates: map[float32]int64{25: 300}} item2Price := Price{IncVat: 2000, VatRates: map[float32]int64{25: 400}} c.Items = []*CartItem{ {Id: 1, Price: item1Price, OrgPrice: item1Org, Quantity: 2}, {Id: 2, Price: item2Price, OrgPrice: &item2Price, Quantity: 1}, } deliveryPrice := Price{IncVat: 4900, VatRates: map[float32]int64{25: 980}} c.Deliveries = []*CartDelivery{{Id: 1, Price: deliveryPrice, Items: []uint32{1, 2}}} c.UpdateTotals() // Expected totals: sum inc vat of items * qty plus delivery // item1 total inc = 1250*2 = 2500 // item2 total inc = 2000*1 = 2000 // delivery inc = 4900 expectedInc := int64(2500 + 2000 + 4900) if c.TotalPrice.IncVat != expectedInc { t.Fatalf("TotalPrice IncVat expected %d got %d", expectedInc, c.TotalPrice.IncVat) } // Discount: current implementation computes (OrgPrice - Price) ignoring quantity -> 1500-1250=250 if c.TotalDiscount.IncVat != 250 { t.Fatalf("TotalDiscount expected 250 got %d", c.TotalDiscount.IncVat) } } func TestCartGrainUpdateTotalsNoItems(t *testing.T) { c := newTestCart() c.UpdateTotals() if c.TotalPrice.IncVat != 0 || c.TotalDiscount.IncVat != 0 { t.Fatalf("expected zero totals got %+v", c) } }