package db import ( "context" "os" "sync" "testing" "time" "github.com/jackc/pgx/v5/pgxpool" ) // TestMigrateConcurrent runs Migrate from two goroutines against a real // Postgres and asserts neither errors (the advisory lock serializes them; // the loser sees every version recorded and no-ops). Requires a live DB: // set PANEL_TEST_DSN to run, e.g. // // PANEL_TEST_DSN=postgres://user:pw@localhost:5432/panel_test go test ./controller/internal/db/ // // Skipped otherwise — no Postgres is assumed on dev machines or CI. func TestMigrateConcurrent(t *testing.T) { dsn := os.Getenv("PANEL_TEST_DSN") if dsn == "" { t.Skip("PANEL_TEST_DSN not set; migration lock test needs a live Postgres") } ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() pool, err := pgxpool.New(ctx, dsn) if err != nil { t.Fatalf("connect: %v", err) } defer pool.Close() var wg sync.WaitGroup errs := make([]error, 2) for i := 0; i < 2; i++ { wg.Add(1) go func(i int) { defer wg.Done() errs[i] = Migrate(ctx, pool) }(i) } wg.Wait() for i, e := range errs { if e != nil { t.Errorf("concurrent Migrate %d: %v", i, e) } } }