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) } }