package payments import "testing" func TestValidateProduct(t *testing.T) { pack := ProductInput{ Title: "100 chips", Atoms: []AtomLine{{Atom: "chips", Quantity: 100}}, Prices: []PriceLine{{Method: "direct", Currency: CurrencyRUB, Amount: 14900}}, } value := ProductInput{ Title: "5 hints", Atoms: []AtomLine{{Atom: "hints", Quantity: 5}}, Prices: []PriceLine{{Method: "", Currency: CurrencyChip, Amount: 50}}, } tests := []struct { name string in ProductInput sellable bool wantErr bool }{ {"valid pack", pack, true, false}, {"valid value", value, true, false}, {"pack with a benefit atom", ProductInput{Title: "x", Atoms: []AtomLine{{"chips", 100}, {"hints", 5}}, Prices: pack.Prices}, true, true}, {"pack without money price", ProductInput{Title: "x", Atoms: pack.Atoms, Prices: value.Prices}, true, true}, {"value without chip price", ProductInput{Title: "x", Atoms: value.Atoms, Prices: pack.Prices}, true, true}, {"tournament sellable is refused", ProductInput{Title: "cup", Atoms: []AtomLine{{"tournament", 1}}, Prices: value.Prices}, true, true}, {"tournament draft is allowed", ProductInput{Title: "cup", Atoms: []AtomLine{{"tournament", 1}}}, false, false}, {"unknown atom", ProductInput{Title: "x", Atoms: []AtomLine{{"gold", 1}}}, false, true}, {"duplicate atom", ProductInput{Title: "x", Atoms: []AtomLine{{"hints", 1}, {"hints", 2}}}, false, true}, {"non-positive quantity", ProductInput{Title: "x", Atoms: []AtomLine{{"hints", 0}}}, false, true}, {"chip price with a method", ProductInput{Title: "x", Atoms: value.Atoms, Prices: []PriceLine{{Method: "direct", Currency: CurrencyChip, Amount: 50}}}, true, true}, {"money price without a method", ProductInput{Title: "x", Atoms: pack.Atoms, Prices: []PriceLine{{Method: "", Currency: CurrencyRUB, Amount: 149}}}, true, true}, {"duplicate price", ProductInput{Title: "x", Atoms: pack.Atoms, Prices: []PriceLine{{Method: "direct", Currency: CurrencyRUB, Amount: 1}, {Method: "direct", Currency: CurrencyRUB, Amount: 2}}}, true, true}, {"empty title", ProductInput{Title: " ", Atoms: value.Atoms, Prices: value.Prices}, true, true}, {"no atoms", ProductInput{Title: "x", Prices: value.Prices}, true, true}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { err := validateProduct(tt.in, tt.sellable) if (err != nil) != tt.wantErr { t.Fatalf("validateProduct = %v, wantErr %v", err, tt.wantErr) } }) } }