package cart import ( "testing" ) func TestNordicTaxProvider_Name(t *testing.T) { p := NewNordicTaxProvider("SE") if got := p.Name(); got != "nordic" { t.Errorf("Name() = %q, want %q", got, "nordic") } } func TestNordicTaxProvider_ComputeTax(t *testing.T) { tests := []struct { total int64 taxRate int want int64 desc string }{ {0, 25, 0, "zero total"}, {1250, 25, 250, "25 % VAT on 1250"}, {1000, 20, 166, "20 % VAT on 1000"}, {1200, 25, 240, "25 % VAT on 1200"}, {25000, 25, 5000, "25 % VAT on 25000"}, {100, 10, 9, "10 % VAT on 100"}, {100, 100, 50, "100 % VAT on 100"}, {100, 0, 0, "zero-rate"}, {100, -1, 0, "negative rate -> zero"}, } for _, tt := range tests { p := NewNordicTaxProvider("SE") got := p.ComputeTax(tt.total, tt.taxRate) if got != tt.want { t.Errorf("ComputeTax(%d, %d) [%s] = %d; want %d", tt.total, tt.taxRate, tt.desc, got, tt.want) } } } func TestNordicTaxProvider_DefaultTaxRate(t *testing.T) { tests := []struct { country string want int desc string }{ {"SE", 25, "Sweden"}, {"NO", 25, "Norway"}, {"DK", 25, "Denmark"}, {"FI", 25, "Finland"}, {"", 25, "empty -> default SE"}, {"DE", 25, "unknown -> fallback SE"}, } for _, tt := range tests { p := NewNordicTaxProvider("SE") got := p.DefaultTaxRate(tt.country) if got != tt.want { t.Errorf("DefaultTaxRate(%q) [%s] = %d; want %d", tt.country, tt.desc, got, tt.want) } } } func TestStaticTaxProvider_ComputeTax(t *testing.T) { p := NewStaticTaxProvider() tests := []struct { total int64 taxRate int want int64 }{ {1250, 25, 250}, {25000, 25, 5000}, {1000, 20, 166}, {0, 25, 0}, } for _, tt := range tests { got := p.ComputeTax(tt.total, tt.taxRate) if got != tt.want { t.Errorf("ComputeTax(%d, %d) = %d; want %d", tt.total, tt.taxRate, got, tt.want) } } } func TestStaticTaxProvider_DefaultTaxRate(t *testing.T) { p := NewStaticTaxProvider() if got := p.DefaultTaxRate("SE"); got != 0 { t.Errorf("StaticTaxProvider.DefaultTaxRate(\"SE\") = %d; want 0", got) } } func TestComputeTax(t *testing.T) { tests := []struct { total int64 taxRate int want int64 desc string }{ {1250, 25, 250, "canonical: 25 %"}, {25000, 25, 5000, "25k with 25 %% -> 5k tax"}, {0, 25, 0, "zero total"}, } for _, tt := range tests { got := ComputeTax(tt.total, tt.taxRate) if got != tt.want { t.Errorf("ComputeTax(%d, %d) [%s] = %d; want %d", tt.total, tt.taxRate, tt.desc, got, tt.want) } } } func TestTaxProviderImplementsInterface(t *testing.T) { var p TaxProvider = NewNordicTaxProvider("SE") _ = p p2 := NewStaticTaxProvider() _ = p2 }