68 lines
3.6 KiB
Go
68 lines
3.6 KiB
Go
package repo
|
|
|
|
import (
|
|
"path/filepath"
|
|
"testing"
|
|
"time"
|
|
|
|
"browser.local/platform/domain"
|
|
)
|
|
|
|
func TestSCUMProjectionRepositoriesCopyFilterAndPersist(t *testing.T) {
|
|
path := filepath.Join(t.TempDir(), "metadata.json")
|
|
store, err := NewFileStore(path)
|
|
if err != nil {
|
|
t.Fatalf("create file store: %v", err)
|
|
}
|
|
stamp := time.Date(2026, 8, 10, 9, 0, 0, 0, time.UTC)
|
|
freshness := domain.SCUMProjectionFreshnessState{Status: domain.SCUMProjectionFresh, ObservationID: "obs-1", Source: "run", QueryKey: "scum.player.profile", Sequence: 7, Checksum: "sha256:projection", ObservedAt: stamp, ReceivedAt: stamp.Add(time.Second)}
|
|
state := domain.SCUMPlayerLiveState{ID: "state-1", ServerInstanceID: "server-1", GamePlayerRecordID: "game-player-1", GamePlayerID: "steam-1", UserProfileID: "profile-1", SteamID: "steam-1", DisplayName: "Moon", SquadID: "squad-1", UnknownFields: map[string]any{"schemaField": "kept"}, Freshness: freshness, CreatedAt: stamp, UpdatedAt: stamp}
|
|
if err := store.SCUMPlayerLiveStates().Create(state); err != nil {
|
|
t.Fatalf("create state: %v", err)
|
|
}
|
|
got, err := store.SCUMPlayerLiveStates().Get(state.ID)
|
|
if err != nil {
|
|
t.Fatalf("get state: %v", err)
|
|
}
|
|
got.UnknownFields["schemaField"] = "mutated"
|
|
again, err := store.SCUMPlayerLiveStates().Get(state.ID)
|
|
if err != nil {
|
|
t.Fatalf("get state again: %v", err)
|
|
}
|
|
if again.UnknownFields["schemaField"] != "kept" {
|
|
t.Fatalf("state was not copy-isolated: %+v", again.UnknownFields)
|
|
}
|
|
filtered, err := store.SCUMPlayerLiveStates().List(domain.SCUMProjectionFilter{ServerInstanceID: "server-1", UserProfileID: "profile-1", Search: "moon"})
|
|
if err != nil || len(filtered) != 1 {
|
|
t.Fatalf("filter states=%+v err=%v", filtered, err)
|
|
}
|
|
if err := store.SCUMSquads().Create(domain.SCUMSquad{ID: "squad-1", ServerInstanceID: "server-1", SquadID: "squad-1", Name: "Crystal", Freshness: freshness}); err != nil {
|
|
t.Fatalf("create squad: %v", err)
|
|
}
|
|
if err := store.SCUMVehicles().Create(domain.SCUMVehicle{ID: "vehicle-1", ServerInstanceID: "server-1", VehicleID: "veh-1", Label: "Unknown vehicle", Freshness: freshness}); err != nil {
|
|
t.Fatalf("create vehicle: %v", err)
|
|
}
|
|
if err := store.SCUMFlags().Create(domain.SCUMFlag{ID: "flag-1", ServerInstanceID: "server-1", FlagID: "flag-1", OwnerSquadID: "squad-1", Freshness: freshness}); err != nil {
|
|
t.Fatalf("create flag: %v", err)
|
|
}
|
|
if err := store.SCUMCurrentPositions().Create(domain.SCUMCurrentPosition{ID: "position-1", ServerInstanceID: "server-1", SubjectType: domain.SCUMProjectionSubjectPlayer, SubjectID: "steam-1", GamePlayerRecordID: "game-player-1", X: 1, Y: 2, HasCoordinates: true, Freshness: freshness}); err != nil {
|
|
t.Fatalf("create position: %v", err)
|
|
}
|
|
reloaded, err := NewFileStore(path)
|
|
if err != nil {
|
|
t.Fatalf("reload file store: %v", err)
|
|
}
|
|
reloadedStates, err := reloaded.SCUMPlayerLiveStates().List(domain.SCUMProjectionFilter{ServerInstanceID: "server-1", SquadID: "squad-1"})
|
|
if err != nil || len(reloadedStates) != 1 || reloadedStates[0].Freshness.QueryKey != "scum.player.profile" {
|
|
t.Fatalf("unexpected reloaded states=%+v err=%v", reloadedStates, err)
|
|
}
|
|
vehicles, err := reloaded.SCUMVehicles().List(domain.SCUMProjectionFilter{ServerInstanceID: "server-1", Search: "unknown"})
|
|
if err != nil || len(vehicles) != 1 {
|
|
t.Fatalf("unexpected reloaded vehicles=%+v err=%v", vehicles, err)
|
|
}
|
|
positions, err := reloaded.SCUMCurrentPositions().List(domain.SCUMProjectionFilter{ServerInstanceID: "server-1", SubjectType: domain.SCUMProjectionSubjectPlayer})
|
|
if err != nil || len(positions) != 1 || !positions[0].HasCoordinates {
|
|
t.Fatalf("unexpected reloaded positions=%+v err=%v", positions, err)
|
|
}
|
|
}
|