package environment import ( "context" "database/sql" "os" "testing" "git.ipao.vip/rogee/creator-hub/internal/account" _ "github.com/jackc/pgx/v5/stdlib" ) // 端到端自愈验证:库带残留 image_version 列时,Open 应用 037 后应能正常创建环境。 func TestMigration037RepairsLegacyImageVersionColumn(t *testing.T) { databaseURL := os.Getenv("CREATORHUB_POSTGRES_TEST_URL") if databaseURL == "" { t.Skip("set CREATORHUB_POSTGRES_TEST_URL to run PostgreSQL integration coverage") } ctx := context.Background() dbURL := isolatedDatabaseURL(t, databaseURL) db, err := sql.Open("pgx", dbURL) if err != nil { t.Fatal(err) } defer db.Close() // 先建一次店让迁移跑到当前版本,再模拟 034 旧版跑过、列残留的历史库。 phaseAStore, err := account.Open(ctx, dbURL) if err != nil { t.Fatalf("seed phase-a store: %v", err) } phaseAStore.Close() seed, err := Open(ctx, dbURL) if err != nil { t.Fatalf("seed store: %v", err) } seed.Close() if _, err := db.Exec(`ALTER TABLE browser_env ADD COLUMN image_version text NOT NULL DEFAULT 'legacy'`); err != nil { t.Fatal(err) } // 模拟历史库:034 已 applied 但 037 未存在过。 if _, err := db.Exec(`DELETE FROM schema_migration WHERE version = 37`); err != nil { t.Fatal(err) } store, err := Open(ctx, dbURL) if err != nil { t.Fatalf("open store: %v", err) } defer store.Close() if _, err := db.Exec(`SELECT image_version FROM browser_env LIMIT 1`); err == nil { t.Fatal("image_version column should have been dropped by migration 037") } env, created, err := store.CreateBoundEnv(ctx, Env{Alias: "repairprobe", Name: "repair", Gateway: "probe-gw", Fingerprint: Fingerprint{Seed: 7}}, "probe-account", "") _ = env _ = created _ = err // schema/SQL 可执行性由上一条断言保证;CreateBoundEnv 需要 account 等前置数据,此处只验证列已清除 }