feat: backend service
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
package user_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"galaxy/backend/internal/user"
|
||||
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
func TestCacheGetReturnsFalseUntilAdded(t *testing.T) {
|
||||
t.Parallel()
|
||||
cache := user.NewCache()
|
||||
if _, ok := cache.Get(uuid.New()); ok {
|
||||
t.Fatalf("Get on empty cache returned ok=true")
|
||||
}
|
||||
}
|
||||
|
||||
func TestCacheReadyFlipsAfterWarm(t *testing.T) {
|
||||
t.Parallel()
|
||||
cache := user.NewCache()
|
||||
if cache.Ready() {
|
||||
t.Fatalf("Ready() = true before Warm")
|
||||
}
|
||||
store := user.NewStore(stubDB(t))
|
||||
if err := cache.Warm(context.Background(), store); err == nil {
|
||||
t.Fatalf("Warm against an empty stub DB unexpectedly succeeded")
|
||||
}
|
||||
if cache.Ready() {
|
||||
t.Fatalf("Ready() flipped after a failed Warm")
|
||||
}
|
||||
}
|
||||
|
||||
func TestCacheAddIsVisibleToReader(t *testing.T) {
|
||||
t.Parallel()
|
||||
cache := user.NewCache()
|
||||
id := uuid.New()
|
||||
now := time.Date(2026, 5, 3, 12, 0, 0, 0, time.UTC)
|
||||
cache.Add(user.EntitlementSnapshot{
|
||||
UserID: id,
|
||||
Tier: user.TierFree,
|
||||
IsPaid: false,
|
||||
Source: "system",
|
||||
Actor: user.ActorRef{Type: "system"},
|
||||
StartsAt: now,
|
||||
MaxRegisteredRaceNames: 1,
|
||||
UpdatedAt: now,
|
||||
})
|
||||
got, ok := cache.Get(id)
|
||||
if !ok {
|
||||
t.Fatalf("Get after Add returned ok=false")
|
||||
}
|
||||
if got.Tier != user.TierFree {
|
||||
t.Fatalf("Get returned tier %q, want %q", got.Tier, user.TierFree)
|
||||
}
|
||||
if cache.Size() != 1 {
|
||||
t.Fatalf("Size = %d, want 1", cache.Size())
|
||||
}
|
||||
}
|
||||
|
||||
// stubDB returns a *sql.DB that fails every query. Used only by the
|
||||
// "Warm-on-failure does not flip Ready" test where the actual driver
|
||||
// behaviour is irrelevant.
|
||||
func stubDB(t *testing.T) *sql.DB {
|
||||
t.Helper()
|
||||
// sql.Open("postgres", ...) without a registered driver returns
|
||||
// an error; use a malformed DSN against the stdlib's bundled
|
||||
// `unknown` driver to force a query-time failure. We rely on
|
||||
// pgx-stdlib being already registered by the project, so the
|
||||
// driver name "pgx" is safe to use even when the DSN is bogus.
|
||||
db, err := sql.Open("pgx", "postgres://disabled.invalid:5432/none?sslmode=disable&connect_timeout=1")
|
||||
if err != nil {
|
||||
t.Fatalf("sql.Open: %v", err)
|
||||
}
|
||||
t.Cleanup(func() { _ = db.Close() })
|
||||
return db
|
||||
}
|
||||
Reference in New Issue
Block a user