package repo import ( "path/filepath" "testing" "time" "browser.local/platform/domain" ) func TestClientManagerLifecycleRepositoriesPersistAndFilter(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, 7, 18, 3, 0, 0, 0, time.UTC) installation := domain.ClientManagerInstallation{ID: "cm-install-1", ServerInstanceID: "server-1", PluginID: "game.scum", ProfileKey: "scum-client-manager", RunEndpointID: "run-1", TargetOS: "linux", TargetArch: "amd64", Status: domain.ClientManagerLifecycleOnline, Phase: "healthy", ActiveVersion: "1.0.0", ActiveArtifactID: "artifact-1", KeyGeneration: 2, DeploymentGeneration: 3, Health: domain.ClientManagerHealthHealthy, LastSeenAt: stamp, CreatedAt: stamp, UpdatedAt: stamp} if err := store.ClientManagerInstallations().Create(installation); err != nil { t.Fatalf("persist installation: %v", err) } session := domain.ClientManagerSession{ID: "cm-session-1", InstallationID: installation.ID, ServerInstanceID: installation.ServerInstanceID, ProfileKey: installation.ProfileKey, RunEndpointID: installation.RunEndpointID, ArtifactID: installation.ActiveArtifactID, KeyGeneration: 2, DeploymentGeneration: 3, TokenHash: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", Capabilities: []string{"component.register", "component.heartbeat"}, Status: domain.ClientManagerSessionActive, LastSeenAt: stamp, ExpiresAt: stamp.Add(15 * time.Minute), CreatedAt: stamp, UpdatedAt: stamp} if err := store.ClientManagerSessions().Create(session); err != nil { t.Fatalf("persist session: %v", err) } nonce := domain.ClientManagerRegistrationNonce{ID: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", InstallationID: installation.ID, CreatedAt: stamp, ExpiresAt: stamp.Add(5 * time.Minute)} if err := store.ClientManagerNonces().Create(nonce); err != nil { t.Fatalf("persist nonce: %v", err) } restarted, err := NewFileStore(path) if err != nil { t.Fatalf("reload file store: %v", err) } installations, err := restarted.ClientManagerInstallations().List(domain.ClientManagerInstallationFilter{ServerInstanceID: "server-1", ProfileKey: "scum-client-manager", Status: domain.ClientManagerLifecycleOnline}) if err != nil || len(installations) != 1 || installations[0].DeploymentGeneration != 3 { t.Fatalf("unexpected persisted installations: items=%+v err=%v", installations, err) } sessions, err := restarted.ClientManagerSessions().List(domain.ClientManagerSessionFilter{InstallationID: installation.ID, Status: domain.ClientManagerSessionActive}) if err != nil || len(sessions) != 1 { t.Fatalf("unexpected persisted sessions: items=%+v err=%v", sessions, err) } sessions[0].Capabilities[0] = "mutated" stored, _ := restarted.ClientManagerSessions().Get(session.ID) if stored.Capabilities[0] != "component.register" { t.Fatalf("repository returned shared capability storage: %+v", stored) } expired, err := restarted.ClientManagerNonces().List(domain.ClientManagerNonceFilter{ExpiresBefore: stamp.Add(6 * time.Minute)}) if err != nil || len(expired) != 1 { t.Fatalf("unexpected nonce expiry filter: items=%+v err=%v", expired, err) } if err := restarted.ClientManagerNonces().Delete(nonce.ID); err != nil { t.Fatalf("delete expired nonce: %v", err) } if _, err := restarted.ClientManagerNonces().Get(nonce.ID); err != ErrNotFound { t.Fatalf("expected deleted nonce, got %v", err) } }