| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 |
- //go:build unit
- package service
- import (
- "testing"
- "github.com/stretchr/testify/require"
- )
- func TestValidatePlanRequired_AllValid(t *testing.T) {
- err := validatePlanRequired("Pro", 1, 9.99, 30, "days", nil)
- require.NoError(t, err)
- }
- func TestValidatePlanRequired_EmptyName(t *testing.T) {
- err := validatePlanRequired("", 1, 9.99, 30, "days", nil)
- require.Error(t, err)
- require.Contains(t, err.Error(), "plan name")
- }
- func TestValidatePlanRequired_WhitespaceName(t *testing.T) {
- err := validatePlanRequired(" ", 1, 9.99, 30, "days", nil)
- require.Error(t, err)
- require.Contains(t, err.Error(), "plan name")
- }
- func TestValidatePlanRequired_ZeroGroupID(t *testing.T) {
- err := validatePlanRequired("Pro", 0, 9.99, 30, "days", nil)
- require.Error(t, err)
- require.Contains(t, err.Error(), "group")
- }
- func TestValidatePlanRequired_NegativeGroupID(t *testing.T) {
- err := validatePlanRequired("Pro", -1, 9.99, 30, "days", nil)
- require.Error(t, err)
- require.Contains(t, err.Error(), "group")
- }
- func TestValidatePlanRequired_ZeroPrice(t *testing.T) {
- err := validatePlanRequired("Pro", 1, 0, 30, "days", nil)
- require.Error(t, err)
- require.Contains(t, err.Error(), "price")
- }
- func TestValidatePlanRequired_NegativePrice(t *testing.T) {
- err := validatePlanRequired("Pro", 1, -5, 30, "days", nil)
- require.Error(t, err)
- require.Contains(t, err.Error(), "price")
- }
- func TestValidatePlanRequired_ZeroValidityDays(t *testing.T) {
- err := validatePlanRequired("Pro", 1, 9.99, 0, "days", nil)
- require.Error(t, err)
- require.Contains(t, err.Error(), "validity days")
- }
- func TestValidatePlanRequired_NegativeValidityDays(t *testing.T) {
- err := validatePlanRequired("Pro", 1, 9.99, -7, "days", nil)
- require.Error(t, err)
- require.Contains(t, err.Error(), "validity days")
- }
- func TestValidatePlanRequired_EmptyValidityUnit(t *testing.T) {
- err := validatePlanRequired("Pro", 1, 9.99, 30, "", nil)
- require.Error(t, err)
- require.Contains(t, err.Error(), "validity unit")
- }
- func TestValidatePlanRequired_WhitespaceValidityUnit(t *testing.T) {
- err := validatePlanRequired("Pro", 1, 9.99, 30, " ", nil)
- require.Error(t, err)
- require.Contains(t, err.Error(), "validity unit")
- }
- func TestValidatePlanRequired_NameValidatedFirst(t *testing.T) {
- err := validatePlanRequired("", 0, 0, 0, "", nil)
- require.Error(t, err)
- require.Contains(t, err.Error(), "plan name")
- }
- func TestValidatePlanRequired_TrimmedValidName(t *testing.T) {
- err := validatePlanRequired(" Pro ", 1, 9.99, 30, "days", nil)
- require.NoError(t, err)
- }
- func TestValidatePlanRequired_NegativeOriginalPrice(t *testing.T) {
- neg := -10.0
- err := validatePlanRequired("Pro", 1, 9.99, 30, "days", &neg)
- require.Error(t, err)
- require.Contains(t, err.Error(), "original price")
- }
- func TestValidatePlanRequired_ZeroOriginalPrice(t *testing.T) {
- zero := 0.0
- err := validatePlanRequired("Pro", 1, 9.99, 30, "days", &zero)
- require.NoError(t, err)
- }
- func TestValidatePlanRequired_ValidOriginalPrice(t *testing.T) {
- op := 19.99
- err := validatePlanRequired("Pro", 1, 9.99, 30, "days", &op)
- require.NoError(t, err)
- }
- // --- validatePlanPatch tests ---
- func TestValidatePlanPatch_NegativeOriginalPrice(t *testing.T) {
- neg := -5.0
- err := validatePlanPatch(UpdatePlanRequest{OriginalPrice: &neg})
- require.Error(t, err)
- require.Contains(t, err.Error(), "original price")
- }
- func TestValidatePlanPatch_ZeroOriginalPrice(t *testing.T) {
- zero := 0.0
- err := validatePlanPatch(UpdatePlanRequest{OriginalPrice: &zero})
- require.NoError(t, err)
- }
- func TestValidatePlanPatch_ValidOriginalPrice(t *testing.T) {
- op := 29.99
- err := validatePlanPatch(UpdatePlanRequest{OriginalPrice: &op})
- require.NoError(t, err)
- }
- func TestValidatePlanPatch_NilOriginalPrice(t *testing.T) {
- err := validatePlanPatch(UpdatePlanRequest{OriginalPrice: nil})
- require.NoError(t, err)
- }
- // --- validatePlanPatch: other fields ---
- func ptrStr(s string) *string { return &s }
- func ptrInt(i int) *int { return &i }
- func ptrInt64(i int64) *int64 { return &i }
- func ptrFloat(f float64) *float64 { return &f }
- func TestValidatePlanPatch_EmptyName(t *testing.T) {
- err := validatePlanPatch(UpdatePlanRequest{Name: ptrStr("")})
- require.Error(t, err)
- require.Contains(t, err.Error(), "plan name")
- }
- func TestValidatePlanPatch_ValidName(t *testing.T) {
- err := validatePlanPatch(UpdatePlanRequest{Name: ptrStr("Basic")})
- require.NoError(t, err)
- }
- func TestValidatePlanPatch_ZeroGroupID(t *testing.T) {
- err := validatePlanPatch(UpdatePlanRequest{GroupID: ptrInt64(0)})
- require.Error(t, err)
- require.Contains(t, err.Error(), "group")
- }
- func TestValidatePlanPatch_NegativePrice(t *testing.T) {
- err := validatePlanPatch(UpdatePlanRequest{Price: ptrFloat(-1)})
- require.Error(t, err)
- require.Contains(t, err.Error(), "price")
- }
- func TestValidatePlanPatch_ZeroPrice(t *testing.T) {
- err := validatePlanPatch(UpdatePlanRequest{Price: ptrFloat(0)})
- require.Error(t, err)
- require.Contains(t, err.Error(), "price")
- }
- func TestValidatePlanPatch_ValidPrice(t *testing.T) {
- err := validatePlanPatch(UpdatePlanRequest{Price: ptrFloat(9.99)})
- require.NoError(t, err)
- }
- func TestValidatePlanPatch_ZeroValidityDays(t *testing.T) {
- err := validatePlanPatch(UpdatePlanRequest{ValidityDays: ptrInt(0)})
- require.Error(t, err)
- require.Contains(t, err.Error(), "validity days")
- }
- func TestValidatePlanPatch_EmptyValidityUnit(t *testing.T) {
- err := validatePlanPatch(UpdatePlanRequest{ValidityUnit: ptrStr("")})
- require.Error(t, err)
- require.Contains(t, err.Error(), "validity unit")
- }
- func TestValidatePlanPatch_ValidValidityUnit(t *testing.T) {
- err := validatePlanPatch(UpdatePlanRequest{ValidityUnit: ptrStr("days")})
- require.NoError(t, err)
- }
- func TestValidatePlanPatch_AllNil(t *testing.T) {
- err := validatePlanPatch(UpdatePlanRequest{})
- require.NoError(t, err)
- }
- // --- normalizePlanCurrency tests ---
- // Empty must stay empty (not coerced to the default payment currency),
- // so existing plans keep rendering without any currency label.
- func TestNormalizePlanCurrency_EmptyKeepsEmpty(t *testing.T) {
- currency, err := normalizePlanCurrency("")
- require.NoError(t, err)
- require.Equal(t, "", currency)
- }
- func TestNormalizePlanCurrency_WhitespaceKeepsEmpty(t *testing.T) {
- currency, err := normalizePlanCurrency(" ")
- require.NoError(t, err)
- require.Equal(t, "", currency)
- }
- func TestNormalizePlanCurrency_LowercaseNormalized(t *testing.T) {
- currency, err := normalizePlanCurrency("nzd")
- require.NoError(t, err)
- require.Equal(t, "NZD", currency)
- }
- func TestNormalizePlanCurrency_ValidUppercase(t *testing.T) {
- currency, err := normalizePlanCurrency("USD")
- require.NoError(t, err)
- require.Equal(t, "USD", currency)
- }
- func TestNormalizePlanCurrency_TooShort(t *testing.T) {
- _, err := normalizePlanCurrency("NZ")
- require.Error(t, err)
- require.Contains(t, err.Error(), "currency")
- }
- func TestNormalizePlanCurrency_TooLong(t *testing.T) {
- _, err := normalizePlanCurrency("NZDD")
- require.Error(t, err)
- require.Contains(t, err.Error(), "currency")
- }
- func TestNormalizePlanCurrency_NonLetter(t *testing.T) {
- _, err := normalizePlanCurrency("N2D")
- require.Error(t, err)
- require.Contains(t, err.Error(), "currency")
- }
|