test: 全面迁移 pytest 并加入格式门禁
This commit is contained in:
+20
-23
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user