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
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"))
|
|
}
|