package data import ( "context" "testing" "time" "neuralhunt/internal/auth" ) func TestInactiveNonWinnerCleanupProtectsWinnersAndRecentClients(t *testing.T) { ctx := context.Background() db, err := OpenSQLite(ctx, t.TempDir()+"/cleanup.db") if err != nil { t.Fatal(err) } defer db.Close() s := New(db) jwk := auth.PublicJWK{Kty: "EC", Crv: "P-256", X: "AQ", Y: "Ag"} for _, id := range []string{"old_delete", "old_winner", "recent_keep"} { if err := s.UpsertClient(ctx, id, jwk); err != nil { t.Fatal(err) } } old := time.Now().UTC().Add(-45 * 24 * time.Hour).UnixMilli() recent := time.Now().UTC().Add(-2 * time.Hour).UnixMilli() if _, err := db.ExecContext(ctx, `UPDATE clients SET last_seen=? WHERE id IN ('old_delete','old_winner')`, old); err != nil { t.Fatal(err) } if _, err := db.ExecContext(ctx, `UPDATE clients SET last_seen=? WHERE id='recent_keep'`, recent); err != nil { t.Fatal(err) } if err := s.EnsureActiveTasks(ctx, 1, 32); err != nil { t.Fatal(err) } var taskID string if err := db.QueryRowContext(ctx, `SELECT id FROM tasks LIMIT 1`).Scan(&taskID); err != nil { t.Fatal(err) } if _, err := db.ExecContext(ctx, `UPDATE tasks SET winner_client_id=? WHERE id=?`, "old_winner", taskID); err != nil { t.Fatal(err) } cutoff := time.Now().UTC().Add(-30 * 24 * time.Hour).UnixMilli() candidates, err := s.InactiveNonWinnerClients(ctx, cutoff) if err != nil { t.Fatal(err) } if len(candidates) != 1 || candidates[0].ClientID != "old_delete" { t.Fatalf("unexpected candidates: %+v", candidates) } wins, err := s.OldWinnerCount(ctx, cutoff) if err != nil || wins != 1 { t.Fatalf("protected winner count=%d err=%v", wins, err) } deleted, err := s.DeleteInactiveNonWinnerClients(ctx, cutoff, []string{"old_delete", "old_winner", "recent_keep"}) if err != nil { t.Fatal(err) } if len(deleted) != 1 || deleted[0] != "old_delete" { t.Fatalf("unexpected deleted: %#v", deleted) } if s.ClientExists(ctx, "old_delete") { t.Fatal("old non-winner should have been deleted") } if !s.ClientExists(ctx, "old_winner") { t.Fatal("winner must be protected") } if !s.ClientExists(ctx, "recent_keep") { t.Fatal("recent client must be protected") } }