package db import ( "testing" ) // testDSN returns the configured DSN, skipping the test when neither the env var // nor a config file supplies one (DSN no longer has a built-in default). func testDSN(t *testing.T) string { t.Helper() dsn, _, err := DSN() if err != nil { t.Skipf("no database config (%v) — skipping", err) } return dsn } // TestOpenSeed opens the live dev PG, applies schema, seeds, and verifies the // builtin agents + their variable catalog exist. Skips if PG is unreachable. func TestOpenSeed(t *testing.T) { d, err := Open(testDSN(t)) if err != nil { t.Skipf("postgres unavailable (%v) — skipping", err) } defer d.Close() wantAgents := len(builtinAgents) var agents int if err := d.QueryRow(`SELECT count(*) FROM agents WHERE builtin`).Scan(&agents); err != nil { t.Fatal(err) } if agents != wantAgents { t.Fatalf("want %d builtin agents, got %d", wantAgents, agents) } // planner should have at least its seeded catalog vars wantPlannerVars := 0 for _, a := range builtinAgents { if a.key == "planner" { wantPlannerVars = len(a.vars) break } } var plannerVars int if err := d.QueryRow(` SELECT count(*) FROM agent_prompt_vars v JOIN agents a ON a.id = v.agent_id WHERE a.key = 'planner'`).Scan(&plannerVars); err != nil { t.Fatal(err) } if plannerVars < wantPlannerVars { t.Fatalf("want at least %d planner vars, got %d", wantPlannerVars, plannerVars) } // re-open must be idempotent (no duplicate agents) d2, err := Open(testDSN(t)) if err != nil { t.Fatal(err) } defer d2.Close() if err := d2.QueryRow(`SELECT count(*) FROM agents WHERE builtin`).Scan(&agents); err != nil { t.Fatal(err) } if agents != wantAgents { t.Fatalf("after re-open want %d agents, got %d", wantAgents, agents) } }