"""ORM 模型 metadata 一致性测试(PostgreSQL only,2026-06-16 重构后)。 历史背景:原 test_schema_models.py 还测了 schema.py vs models.py 的 DDL 漂移。 schema.py 在这次重构中已删除(MySQL DDL 不再需要),所以只保留 ORM metadata 完整性测试。 """ from __future__ import annotations def test_orm_metadata_registers_all_tables(): """ORMBase.metadata 应该注册 18 张 PG 表(项目主业务表)。""" from app.core.db import models # 触发全部模型 import from app.core.db.orm import ORMBase # 注意:SA 2.x 的 MetaData.tables 既能按 bare name 也能按 schema-qualified name 索引 # (keyed 容器),所以用 values() 拿 Table 对象再用 .name 拿 bare 名 bare_names = {t.name for t in ORMBase.metadata.tables.values()} assert len(bare_names) == 18, f"期望 18 张 ORM 表,实际 {len(bare_names)}: {bare_names}" expected = { "config", "dataset_registry", "stocks", "indices", "kline_stock", "kline_index", "kline_5min", "moneyflow", "share", "sectors", "stock_sector_map", "industry", "sector_indices", "sector_features_daily", "market_regime_daily", "tick_trade", "longhubang_daily", "longhubang_seat", # 2026-07-01 龙虎榜 } assert bare_names == expected, f"ORM 表名集合与期望不符: {bare_names ^ expected}" def test_orm_tables_in_market_data_schema(): """所有 ORM 表应该在 market_data PG schema 下(不是 public,不是 None)。""" from app.core.db import models # 触发全部模型 import from app.core.db.orm import ORMBase bad = [] for table in ORMBase.metadata.tables.values(): if table.schema != "market_data": bad.append((table.name, table.schema)) assert not bad, f"以下表 schema 不是 market_data: {bad}"