Files
Agent-System/internal/db/testdb.go
T
weichenandCursor c2d4e9a55c test(docduty): add isolated PG heal, backfill, and concurrency fixtures
Require TEST_DATABASE_URL and refuse agent_system_dev. Script creates a
throwaway database, runs packages serially, then drops it.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-13 22:16:44 +00:00

52 lines
1.3 KiB
Go

package db
import (
"context"
"os"
"strings"
"sync"
"testing"
"github.com/jackc/pgx/v5/pgxpool"
)
var (
migrateOnceMu sync.Mutex
migratedDSNs = map[string]error{}
)
// RunMigrationsOnceForTest 同一 DSN 只迁一次,避免并行包抢同一隔离库。
func RunMigrationsOnceForTest(ctx context.Context, pool *pgxpool.Pool, dsn string) error {
key := strings.TrimSpace(dsn)
migrateOnceMu.Lock()
defer migrateOnceMu.Unlock()
if err, ok := migratedDSNs[key]; ok {
return err
}
err := RunMigrations(ctx, pool, ResolveMigrationsDir())
migratedDSNs[key] = err
return err
}
const testDatabaseEnv = "TEST_DATABASE_URL"
// RequireTestDatabaseURL 集成测试必须显式提供隔离测试库,禁止默认连开发库。
func RequireTestDatabaseURL(t *testing.T) string {
t.Helper()
dsn := strings.TrimSpace(os.Getenv(testDatabaseEnv))
if dsn == "" {
t.Fatalf("%s must be set for PostgreSQL integration tests (refusing default dev database)", testDatabaseEnv)
}
return dsn
}
// SkipIfNoTestDatabaseURL 无隔离测试库时跳过(单元测试包内可选 PG 用例)。
func SkipIfNoTestDatabaseURL(t *testing.T) string {
t.Helper()
dsn := strings.TrimSpace(os.Getenv(testDatabaseEnv))
if dsn == "" {
t.Skipf("%s not set; skipping PostgreSQL integration test", testDatabaseEnv)
}
return dsn
}