test: 验证网页登录不影响 Client 四接口 (#52)
This commit is contained in:
@@ -623,6 +623,69 @@ func TestMigrate_v6新增用户和WebSession表(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// #52:网页登录上线后显式覆盖每一个已发布版本起点,证明 Client 现实库
|
||||
// 不会因为 v6 的用户表而卡在中间版本。v2 的两种历史结构另由上面的收敛
|
||||
// 测试持续覆盖;这里验证顺序发布的 v1-v5 路径。
|
||||
func TestMigrate_v1到v5均可升级到v6(t *testing.T) {
|
||||
for version := 1; version <= 5; version++ {
|
||||
t.Run(fmt.Sprintf("v%d", version), func(t *testing.T) {
|
||||
db := newPublishedVersionDB(t, version)
|
||||
if err := Migrate(db); err != nil {
|
||||
t.Fatalf("v%d 迁移到 v6 失败: %v", version, err)
|
||||
}
|
||||
if err := CheckSchema(db); err != nil {
|
||||
t.Fatalf("v%d 迁移后 schema 自检失败: %v", version, err)
|
||||
}
|
||||
var gotVersion int
|
||||
if err := db.QueryRow(`PRAGMA user_version`).Scan(&gotVersion); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if gotVersion != 6 {
|
||||
t.Fatalf("v%d 迁移后 user_version = %d,期望 6", version, gotVersion)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func newPublishedVersionDB(t *testing.T, version int) *sql.DB {
|
||||
t.Helper()
|
||||
db, err := Open(t.TempDir())
|
||||
if err != nil {
|
||||
t.Fatalf("打开 v%d 测试库失败: %v", version, err)
|
||||
}
|
||||
t.Cleanup(func() { db.Close() })
|
||||
|
||||
// v1/v2 使用项目实际发布过的迁移语句。v3 起由正式迁移函数继续构造,
|
||||
// 避免测试复制一份容易与生产实现漂移的 schema。
|
||||
for migrationIndex := 0; migrationIndex < version && migrationIndex < 2; migrationIndex++ {
|
||||
for statementIndex, statement := range migrations[migrationIndex] {
|
||||
if _, err := db.Exec(statement); err != nil {
|
||||
t.Fatalf("构造 v%d 时执行 v%d 第 %d 条失败: %v",
|
||||
version, migrationIndex+1, statementIndex+1, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
if _, err := db.Exec(fmt.Sprintf(`PRAGMA user_version = %d`, min(version, 2))); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if version >= 3 {
|
||||
if err := migrateV3(db); err != nil {
|
||||
t.Fatalf("构造 v%d 时执行 v3 失败: %v", version, err)
|
||||
}
|
||||
}
|
||||
if version >= 4 {
|
||||
if err := runSQLMigration(db, 4, migrationV4); err != nil {
|
||||
t.Fatalf("构造 v%d 时执行 v4 失败: %v", version, err)
|
||||
}
|
||||
}
|
||||
if version >= 5 {
|
||||
if err := runSQLMigration(db, 5, migrationV5); err != nil {
|
||||
t.Fatalf("构造 v%d 时执行 v5 失败: %v", version, err)
|
||||
}
|
||||
}
|
||||
return db
|
||||
}
|
||||
|
||||
// existingTableSet 返回库里当前存在的表名集合。
|
||||
func existingTableSet(t *testing.T, db *sql.DB) map[string]bool {
|
||||
t.Helper()
|
||||
|
||||
Reference in New Issue
Block a user