mirror of
https://github.com/jcreek/CosmicClash.git
synced 2026-09-10 16:04:04 +00:00
74 lines
2.5 KiB
Go
74 lines
2.5 KiB
Go
package store
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/alicebob/miniredis/v2"
|
|
"github.com/cosmic-clash/cosmic-clash/server/domain"
|
|
"github.com/redis/go-redis/v9"
|
|
)
|
|
|
|
func TestCandidateProjectionRepairsPartialRedisStateFromDurableSource(t *testing.T) {
|
|
mini, err := miniredis.Run()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer mini.Close()
|
|
client := redis.NewClient(&redis.Options{Addr: mini.Addr()})
|
|
defer client.Close()
|
|
now := time.Unix(1000, 0).UTC()
|
|
candidate := domain.Candidate{TicketID: "repair-ticket", PlayerID: "repair-player", EnqueuedAt: now}
|
|
index := RedisCandidateIndex{Client: client, Prefix: "repair", TTL: time.Minute}
|
|
_, orderKey := index.keys()
|
|
if err := client.ZAdd(context.Background(), orderKey, redis.Z{Score: float64(now.UnixNano()), Member: candidate.TicketID}).Err(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
projection := CandidateProjection{Index: index, Source: func(context.Context, time.Time) ([]domain.Candidate, error) {
|
|
return []domain.Candidate{candidate}, nil
|
|
}}
|
|
got, err := projection.Snapshot(context.Background(), now)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(got) != 1 || got[0].TicketID != candidate.TicketID {
|
|
t.Fatalf("repaired projection = %+v", got)
|
|
}
|
|
}
|
|
|
|
func TestCandidateProjectionDoesNotReturnCacheWhenRepairSourceFails(t *testing.T) {
|
|
index := RedisCandidateIndex{TTL: time.Minute}
|
|
projection := CandidateProjection{Index: index, Source: func(context.Context, time.Time) ([]domain.Candidate, error) {
|
|
return nil, context.DeadlineExceeded
|
|
}}
|
|
if _, err := projection.Snapshot(context.Background(), time.Unix(1000, 0)); err == nil {
|
|
t.Fatal("cache projection succeeded without a usable Redis/index source")
|
|
}
|
|
}
|
|
|
|
func TestCandidateProjectionRepairsEmptyIndexFromDurableSource(t *testing.T) {
|
|
mini, err := miniredis.Run()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer mini.Close()
|
|
client := redis.NewClient(&redis.Options{Addr: mini.Addr()})
|
|
defer client.Close()
|
|
now := time.Unix(1000, 0).UTC()
|
|
candidate := domain.Candidate{TicketID: "miss-ticket", PlayerID: "miss-player", EnqueuedAt: now}
|
|
projection := CandidateProjection{
|
|
Index: RedisCandidateIndex{Client: client, Prefix: "miss", TTL: time.Minute},
|
|
Source: func(context.Context, time.Time) ([]domain.Candidate, error) {
|
|
return []domain.Candidate{candidate}, nil
|
|
},
|
|
}
|
|
got, err := projection.Snapshot(context.Background(), now)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(got) != 1 || got[0].TicketID != candidate.TicketID {
|
|
t.Fatalf("empty-index repair = %+v", got)
|
|
}
|
|
}
|