2026-08-05 17:57:32 +08:00
|
|
|
import os
|
|
|
|
|
from pathlib import Path
|
|
|
|
|
|
|
|
|
|
import pytest
|
|
|
|
|
from alembic import command
|
|
|
|
|
from alembic.config import Config
|
|
|
|
|
from sqlalchemy import Engine, create_engine, inspect
|
|
|
|
|
|
2026-08-05 22:45:57 +08:00
|
|
|
from zhixing_server.bootstrap.config import get_settings, sqlalchemy_database_url
|
|
|
|
|
|
2026-08-05 17:57:32 +08:00
|
|
|
|
|
|
|
|
@pytest.mark.integration
|
2026-08-05 22:45:57 +08:00
|
|
|
def test_postgres_migration_creates_market_data_contract(
|
|
|
|
|
monkeypatch: pytest.MonkeyPatch,
|
|
|
|
|
) -> None:
|
2026-08-05 17:57:32 +08:00
|
|
|
database_url = os.getenv("ZHIXING_TEST_DATABASE_URL")
|
|
|
|
|
if not database_url:
|
|
|
|
|
pytest.skip("set ZHIXING_TEST_DATABASE_URL to run PostgreSQL integration tests")
|
|
|
|
|
|
2026-08-05 22:45:57 +08:00
|
|
|
monkeypatch.setenv("ZHIXING_DATABASE_URL", database_url)
|
|
|
|
|
get_settings.cache_clear()
|
2026-08-05 17:57:32 +08:00
|
|
|
server_root = Path(__file__).parents[2]
|
|
|
|
|
config = Config(str(server_root / "alembic.ini"))
|
2026-08-05 22:45:57 +08:00
|
|
|
sqlalchemy_url = sqlalchemy_database_url(database_url)
|
|
|
|
|
config.set_main_option("sqlalchemy.url", sqlalchemy_url.replace("%", "%%"))
|
|
|
|
|
engine: Engine = create_engine(sqlalchemy_url)
|
2026-08-05 17:57:32 +08:00
|
|
|
command.upgrade(config, "head")
|
|
|
|
|
try:
|
|
|
|
|
tables = set(inspect(engine).get_table_names())
|
|
|
|
|
assert {
|
|
|
|
|
"market_stock",
|
|
|
|
|
"market_daily_bar",
|
|
|
|
|
"market_daily_basic",
|
|
|
|
|
"market_sync_batch",
|
|
|
|
|
"market_sync_item",
|
2026-08-11 11:20:13 +08:00
|
|
|
"market_integrity_check",
|
|
|
|
|
"market_integrity_issue",
|
2026-08-09 09:34:46 +08:00
|
|
|
"selection_run",
|
|
|
|
|
"selection_run_item",
|
|
|
|
|
"selection_signal",
|
2026-08-29 17:22:39 +08:00
|
|
|
"sector_radar_source_snapshot",
|
|
|
|
|
"sector_radar_membership",
|
|
|
|
|
"sector_radar_stock_fact",
|
|
|
|
|
"sector_radar_publication",
|
|
|
|
|
"sector_radar_ranking",
|
2026-08-05 17:57:32 +08:00
|
|
|
} <= tables
|
|
|
|
|
finally:
|
|
|
|
|
engine.dispose()
|
2026-08-05 22:45:57 +08:00
|
|
|
get_settings.cache_clear()
|