package repository import ( "context" "os" "testing" "evobgp/internal/db" "evobgp/internal/pipeline" "github.com/google/uuid" ) func TestPostgresPruneUnreferencedPrefixSnapshotsIntegration(t *testing.T) { dsn := os.Getenv("EVOBGP_TEST_DATABASE_URL") if dsn == "" { t.Skip("EVOBGP_TEST_DATABASE_URL not set") } ctx := context.Background() pool, err := db.OpenPostgresPool(ctx, dsn) if err != nil { t.Fatal(err) } defer pool.Close() pg, err := NewPostgres(ctx, pool, false) if err != nil { t.Fatal(err) } snapID := uuid.NewString() hash := normalizeSnapshotHash("sha256:test-orphan-" + snapID) if _, err := pool.Exec(ctx, `INSERT INTO prefix_snapshot (id, content_hash) VALUES ($1::uuid, $2)`, snapID, hash); err != nil { t.Fatal(err) } if _, err := pool.Exec(ctx, ` INSERT INTO prefix_snapshot_row (snapshot_id, ord, prefix, source) VALUES ($1::uuid, 0, '203.0.113.0/24', 'test')`, snapID); err != nil { t.Fatal(err) } snaps, rows, err := pg.pruneUnreferencedPrefixSnapshots(ctx, 50) if err != nil { t.Fatal(err) } if snaps < 1 || rows < 1 { t.Fatalf("expected orphan cleanup, got snaps=%d rows=%d", snaps, rows) } var n int if err := pool.QueryRow(ctx, `SELECT COUNT(*)::int FROM prefix_snapshot WHERE id = $1::uuid`, snapID).Scan(&n); err != nil { t.Fatal(err) } if n != 0 { t.Fatalf("snapshot still exists") } } func TestPostgresEstimateRevisionPruneIntegration(t *testing.T) { dsn := os.Getenv("EVOBGP_TEST_DATABASE_URL") if dsn == "" { t.Skip("EVOBGP_TEST_DATABASE_URL not set") } ctx := context.Background() pool, err := db.OpenPostgresPool(ctx, dsn) if err != nil { t.Fatal(err) } defer pool.Close() pg, err := NewPostgres(ctx, pool, false) if err != nil { t.Fatal(err) } tenant := uuid.NewString() cutoff := pipeline.RevisionCutoffFromMinutes(15) est, err := pg.EstimateRevisionPrune(tenant, cutoff, 15) if err != nil { t.Fatal(err) } if est.RevisionCount != 0 { t.Fatalf("expected 0 revisions for empty tenant, got %d", est.RevisionCount) } }