package validation // Tests for custom validation tags and error formatting behavior. import ( "strings" "testing" "github.com/stretchr/testify/require" errs "knowfoolery/backend/shared/domain/errors" ) type sampleStruct struct { Name string `json:"name" validate:"required"` } type playerStruct struct { PlayerName string `json:"player_name" validate:"required,player_name"` } // TestValidator_CustomTags ensures validator custom tags behavior is handled correctly. func TestValidator_CustomTags(t *testing.T) { v := NewValidator() require.Error(t, v.ValidateVar("bad!", "alphanum_space")) require.Error(t, v.ValidateVar("hi", "no_html")) require.Error(t, v.ValidateVar("javascript:alert(1)", "safe_text")) require.Error(t, v.ValidateVar("A", "player_name")) } // TestValidator_ValidateReturnsDomainError ensures validator validate returns domain error behavior is handled correctly. func TestValidator_ValidateReturnsDomainError(t *testing.T) { v := NewValidator() err := v.Validate(sampleStruct{}) require.Error(t, err) var domainErr *errs.DomainError require.ErrorAs(t, err, &domainErr) require.Equal(t, errs.CodeValidationFailed, domainErr.Code) require.True(t, strings.Contains(domainErr.Message, "name is required")) } // TestValidator_ValidateVarReturnsDomainError ensures validator validate var returns domain error behavior is handled correctly. func TestValidator_ValidateVarReturnsDomainError(t *testing.T) { v := NewValidator() err := v.ValidateVar("bad", "email") require.Error(t, err) var domainErr *errs.DomainError require.ErrorAs(t, err, &domainErr) require.Equal(t, errs.CodeValidationFailed, domainErr.Code) require.Contains(t, domainErr.Message, "must be a valid email") } // TestValidator_JSONTagNameMapping ensures validator json tag name mapping behavior is handled correctly. func TestValidator_JSONTagNameMapping(t *testing.T) { v := NewValidator() err := v.Validate(playerStruct{PlayerName: "A"}) require.Error(t, err) require.True(t, strings.Contains(err.Error(), "player_name must be a valid player name")) }