test: 全面迁移 pytest 并加入格式门禁

This commit is contained in:
yml2213
2026-08-30 19:19:32 +08:00
parent 3ce1c7a51b
commit 13b5aedd1d
26 changed files with 1374 additions and 888 deletions
+20 -23
View File
@@ -11,7 +11,6 @@
"""
import tempfile
import unittest
from pathlib import Path
from alembic import command
@@ -42,28 +41,24 @@ def _migration_config() -> Config:
return config
class MigrationSmokeTests(unittest.TestCase):
class TestMigrationSmoke:
def test_chain_is_linear_and_head_matches_latest_file(self):
directory = ScriptDirectory.from_config(_migration_config())
heads = directory.get_heads()
self.assertEqual(len(heads), 1, f"迁移链出现多个头版本(存在分叉): {heads}")
self.assertEqual(heads[0], HEAD_REVISION, f"头版本 {heads[0]} 与最新迁移不一致")
assert len(heads) == 1, f"迁移链出现多个头版本(存在分叉): {heads}"
assert heads[0] == HEAD_REVISION, f"头版本 {heads[0]} 与最新迁移不一致"
version_files = sorted(path.name for path in VERSIONS_DIR.glob("*.py"))
revisions = list(directory.walk_revisions())
revision_ids = {revision.revision for revision in revisions}
self.assertEqual(
len(revision_ids),
len(version_files),
"迁移文件数量与已加载修订数量不一致(存在无法加载的脚本)",
assert len(revision_ids) == len(version_files), (
"迁移文件数量与已加载修订数量不一致(存在无法加载的脚本)"
)
for revision in revisions:
if revision.down_revision is not None:
self.assertIn(
revision.down_revision,
revision_ids,
f"{revision.revision} 引用了不存在的父版本 {revision.down_revision}",
assert revision.down_revision in revision_ids, (
f"{revision.revision} 引用了不存在的父版本 {revision.down_revision}"
)
def test_all_migration_scripts_compile(self):
@@ -86,18 +81,20 @@ class MigrationSmokeTests(unittest.TestCase):
inspector = inspect(create_engine(f"sqlite:///{db_path}"))
db_tables = set(inspector.get_table_names())
self.assertTrue(db_tables, "迁移链未创建任何表")
assert db_tables
model_tables = Base.metadata.tables
missing_tables = set(model_tables) - db_tables
self.assertFalse(missing_tables, f"模型要求但迁移未创建的表: {missing_tables}")
assert not missing_tables
all_db_indexes = set()
for name, table in model_tables.items():
db_columns = {column["name"] for column in inspector.get_columns(name)}
db_columns = {
column["name"] for column in inspector.get_columns(name)
}
model_columns = set(table.columns.keys())
missing_columns = model_columns - db_columns
self.assertFalse(missing_columns, f"{name} 迁移后缺少列: {missing_columns}")
assert not missing_columns
db_indexes = {
index["name"]
@@ -105,16 +102,16 @@ class MigrationSmokeTests(unittest.TestCase):
if not index["name"].startswith("sqlite_autoindex")
}
all_db_indexes |= db_indexes
model_indexes = {index.name for index in table.indexes if index.name}
model_indexes = {
index.name for index in table.indexes if index.name
}
missing_indexes = model_indexes - db_indexes
self.assertFalse(
missing_indexes, f"{name} 迁移后缺少索引: {missing_indexes}"
)
assert not missing_indexes
# 迁移新增的复合查询索引(不入模型,但应存在)。
for index_name in EXTRA_INDEXES:
self.assertIn(
index_name, all_db_indexes, f"迁移链未创建索引 {index_name}"
assert index_name in all_db_indexes, (
f"迁移链未创建索引 {index_name}"
)
finally:
database_module.DATABASE_URL = original_url
database_module.DATABASE_URL = original_url