feat: backend service

This commit is contained in:
Ilia Denisov
2026-05-06 10:14:55 +03:00
committed by GitHub
parent 3e2622757e
commit f446c6a2ac
1486 changed files with 49720 additions and 266401 deletions
+122
View File
@@ -0,0 +1,122 @@
package lobby
import (
"testing"
"time"
"github.com/google/uuid"
)
func TestCachePutGetRemoveGame(t *testing.T) {
c := NewCache()
g := GameRecord{
GameID: uuid.New(),
Status: GameStatusEnrollmentOpen,
GameName: "Test Game",
CreatedAt: time.Now(),
}
if _, ok := c.GetGame(g.GameID); ok {
t.Fatalf("GetGame on empty cache returned ok=true")
}
c.PutGame(g)
got, ok := c.GetGame(g.GameID)
if !ok || got.GameID != g.GameID {
t.Fatalf("GetGame after PutGame: ok=%v, got=%v", ok, got)
}
c.RemoveGame(g.GameID)
if _, ok := c.GetGame(g.GameID); ok {
t.Fatalf("GetGame after RemoveGame: ok=true")
}
}
func TestCachePutGameEvictsOnTerminalStatus(t *testing.T) {
c := NewCache()
g := GameRecord{
GameID: uuid.New(),
Status: GameStatusEnrollmentOpen,
GameName: "Test Game",
}
c.PutGame(g)
if _, ok := c.GetGame(g.GameID); !ok {
t.Fatalf("PutGame did not insert")
}
g.Status = GameStatusFinished
c.PutGame(g)
if _, ok := c.GetGame(g.GameID); ok {
t.Fatalf("PutGame with finished did not evict")
}
}
func TestCachePutMembershipEvictsOnNonActive(t *testing.T) {
c := NewCache()
gameID := uuid.New()
c.PutGame(GameRecord{GameID: gameID, Status: GameStatusEnrollmentOpen})
m := Membership{
MembershipID: uuid.New(),
GameID: gameID,
UserID: uuid.New(),
Status: MembershipStatusActive,
}
c.PutMembership(m)
if got := c.MembershipsForGame(gameID); len(got) != 1 {
t.Fatalf("MembershipsForGame after add = %d, want 1", len(got))
}
m.Status = MembershipStatusRemoved
c.PutMembership(m)
if got := c.MembershipsForGame(gameID); len(got) != 0 {
t.Fatalf("MembershipsForGame after remove = %d, want 0", len(got))
}
}
func TestCachePutRaceNameAndEvict(t *testing.T) {
c := NewCache()
owner := uuid.New()
entry := RaceNameEntry{
Name: "Andromeda",
Canonical: CanonicalKey("andromeda"),
Status: RaceNameStatusReservation,
OwnerUserID: owner,
GameID: uuid.New(),
}
c.PutRaceName(entry)
got, ok := c.GetRaceName(entry.Canonical)
if !ok || got.Canonical != entry.Canonical {
t.Fatalf("GetRaceName: ok=%v, got=%v", ok, got)
}
c.EvictUserRaceNames(owner)
if _, ok := c.GetRaceName(entry.Canonical); ok {
t.Fatalf("EvictUserRaceNames did not evict")
}
}
func TestCacheReadyDefaultsFalse(t *testing.T) {
c := NewCache()
if c.Ready() {
t.Fatalf("Ready() before Warm = true, want false")
}
}
func TestCacheSizesZero(t *testing.T) {
c := NewCache()
games, members, raceNames := c.Sizes()
if games != 0 || members != 0 || raceNames != 0 {
t.Fatalf("Sizes() on empty = (%d,%d,%d), want (0,0,0)", games, members, raceNames)
}
}
func TestCacheEvictOwnerGames(t *testing.T) {
c := NewCache()
owner := uuid.New()
otherOwner := uuid.New()
owned := GameRecord{GameID: uuid.New(), Status: GameStatusEnrollmentOpen, OwnerUserID: &owner}
other := GameRecord{GameID: uuid.New(), Status: GameStatusEnrollmentOpen, OwnerUserID: &otherOwner}
c.PutGame(owned)
c.PutGame(other)
c.EvictOwnerGames(owner)
if _, ok := c.GetGame(owned.GameID); ok {
t.Fatalf("EvictOwnerGames did not evict owned game")
}
if _, ok := c.GetGame(other.GameID); !ok {
t.Fatalf("EvictOwnerGames evicted unrelated game")
}
}