test: 验证网页登录不影响 Client 四接口 (#52)

This commit is contained in:
chengma
2026-08-09 13:56:43 +08:00
parent cbc01f8b39
commit 9959fac31a
2 changed files with 333 additions and 0 deletions
+63
View File
@@ -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()