You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

63 lines
2.0 KiB
Go

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 verifies custom validation tags reject invalid inputs.
func TestValidator_CustomTags(t *testing.T) {
v := NewValidator()
require.Error(t, v.ValidateVar("bad!", "alphanum_space"))
require.Error(t, v.ValidateVar("<b>hi</b>", "no_html"))
require.Error(t, v.ValidateVar("javascript:alert(1)", "safe_text"))
require.Error(t, v.ValidateVar("A", "player_name"))
}
// TestValidator_ValidateReturnsDomainError ensures struct validation returns a domain error with messages.
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 field validation returns a domain error.
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 JSON tag names appear in validation error text.
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"))
}