feat: game lobby service

This commit is contained in:
Ilia Denisov
2026-04-25 23:20:55 +02:00
committed by GitHub
parent 32dc29359a
commit 48b0056b49
336 changed files with 57074 additions and 1418 deletions
@@ -0,0 +1,188 @@
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)
})
}
}