189 lines
3.8 KiB
Go
189 lines
3.8 KiB
Go
package racename
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestPolicyCanonicalCollisions(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
policy, err := NewPolicy()
|
|
require.NoError(t, err)
|
|
|
|
tests := []struct {
|
|
name string
|
|
left string
|
|
right string
|
|
}{
|
|
{
|
|
name: "case insensitive collision",
|
|
left: "Pilot Nova",
|
|
right: "pilot nova",
|
|
},
|
|
{
|
|
name: "ascii anti fraud collision",
|
|
left: "Pilot Nova",
|
|
right: "P1lot N0va",
|
|
},
|
|
{
|
|
name: "unicode confusable collision",
|
|
left: "paypal",
|
|
right: "раураl",
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
leftKey, err := policy.Canonical(tt.left)
|
|
require.NoError(t, err)
|
|
rightKey, err := policy.Canonical(tt.right)
|
|
require.NoError(t, err)
|
|
require.Equal(t, rightKey, leftKey)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestPolicyCanonicalRejectsEmpty(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
policy, err := NewPolicy()
|
|
require.NoError(t, err)
|
|
|
|
_, err = policy.Canonical("")
|
|
require.Error(t, err)
|
|
|
|
_, err = policy.Canonical(" ")
|
|
require.Error(t, err)
|
|
}
|
|
|
|
func TestPolicyCanonicalTrimsWhitespace(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
policy, err := NewPolicy()
|
|
require.NoError(t, err)
|
|
|
|
trimmed, err := policy.Canonical("Pilot Nova")
|
|
require.NoError(t, err)
|
|
padded, err := policy.Canonical(" Pilot Nova ")
|
|
require.NoError(t, err)
|
|
require.Equal(t, trimmed, padded)
|
|
}
|
|
|
|
func TestValidateNameDelegatesToUtil(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
trimmed, err := ValidateName(" PilotNova ")
|
|
require.NoError(t, err)
|
|
require.Equal(t, "PilotNova", trimmed)
|
|
|
|
_, err = ValidateName("")
|
|
require.Error(t, err)
|
|
|
|
_, err = ValidateName(" ")
|
|
require.Error(t, err)
|
|
|
|
// Internal whitespace is rejected by util.ValidateTypeName.
|
|
_, err = ValidateName("Pilot Nova")
|
|
require.Error(t, err)
|
|
}
|
|
|
|
func TestCanonicalKeyValidate(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
require.Error(t, CanonicalKey("").Validate())
|
|
require.Error(t, CanonicalKey(" abc").Validate())
|
|
require.Error(t, CanonicalKey("abc ").Validate())
|
|
require.NoError(t, CanonicalKey("abc").Validate())
|
|
require.True(t, CanonicalKey("").IsZero())
|
|
require.False(t, CanonicalKey("abc").IsZero())
|
|
require.Equal(t, "abc", CanonicalKey("abc").String())
|
|
}
|
|
|
|
func TestPolicyCanonicalizeValid(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
policy, err := NewPolicy()
|
|
require.NoError(t, err)
|
|
|
|
key, err := policy.Canonicalize(" PilotNova ")
|
|
require.NoError(t, err)
|
|
require.NoError(t, key.Validate())
|
|
require.False(t, key.IsZero())
|
|
|
|
paddedKey, err := policy.Canonicalize("PilotNova")
|
|
require.NoError(t, err)
|
|
require.Equal(t, paddedKey, key)
|
|
}
|
|
|
|
func TestPolicyCanonicalizeEquivalences(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
policy, err := NewPolicy()
|
|
require.NoError(t, err)
|
|
|
|
cases := []struct {
|
|
name string
|
|
left string
|
|
right string
|
|
}{
|
|
{
|
|
name: "case insensitive collision",
|
|
left: "PilotNova",
|
|
right: "pilotnova",
|
|
},
|
|
{
|
|
name: "ascii anti fraud collision",
|
|
left: "PilotNova",
|
|
right: "P1l0tN0va",
|
|
},
|
|
{
|
|
name: "unicode confusable collision",
|
|
left: "paypal",
|
|
right: "раураl",
|
|
},
|
|
}
|
|
|
|
for _, tt := range cases {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
leftKey, err := policy.Canonicalize(tt.left)
|
|
require.NoError(t, err)
|
|
rightKey, err := policy.Canonicalize(tt.right)
|
|
require.NoError(t, err)
|
|
require.Equal(t, leftKey, rightKey)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestPolicyCanonicalizeRejectsInvalid(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
policy, err := NewPolicy()
|
|
require.NoError(t, err)
|
|
|
|
invalid := []struct {
|
|
name string
|
|
input string
|
|
}{
|
|
{name: "empty", input: ""},
|
|
{name: "whitespace only", input: " "},
|
|
{name: "internal space", input: "Pilot Nova"},
|
|
{name: "leading dash", input: "-Pilot"},
|
|
{name: "trailing dash", input: "Pilot-"},
|
|
}
|
|
|
|
for _, tt := range invalid {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
_, err := policy.Canonicalize(tt.input)
|
|
require.Error(t, err)
|
|
})
|
|
}
|
|
}
|