test_preflight.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. from __future__ import annotations
  2. from supply_infra.config import InfraSettings
  3. from supply_infra.pipeline.preflight import (
  4. REQUIRED_PIPELINE_TABLES,
  5. evaluate_preflight,
  6. )
  7. def _settings(**overrides) -> InfraSettings:
  8. values = {
  9. "MYSQL_PASSWORD": "mysql-secret",
  10. "ODPS_ACCESS_ID": "odps-id",
  11. "ODPS_ACCESS_KEY": "odps-secret",
  12. "ODPS_PROJECT": "project",
  13. "SCHEDULER_ENABLED": True,
  14. "AIGC_API_TOKEN": "aigc-secret",
  15. "LOG_OSS_UPLOAD_ENABLED": False,
  16. }
  17. values.update(overrides)
  18. return InfraSettings(_env_file=None, **values)
  19. def test_preflight_passes_for_complete_runtime_contract() -> None:
  20. result = evaluate_preflight(
  21. infra=_settings(AUTH_COOKIE_SECURE=True),
  22. openrouter_configured=True,
  23. table_names=set(REQUIRED_PIPELINE_TABLES),
  24. current_revision="head-1",
  25. expected_revision="head-1",
  26. require_scheduler=True,
  27. require_secure_cookie=True,
  28. )
  29. assert result.passed is True
  30. assert result.errors == []
  31. assert result.checks["pipeline_step_count"] == 15
  32. def test_preflight_blocks_silent_partial_startup() -> None:
  33. result = evaluate_preflight(
  34. infra=_settings(
  35. SCHEDULER_ENABLED=False,
  36. AIGC_API_TOKEN="",
  37. CATEGORY_MATCH_API_URL="",
  38. ),
  39. openrouter_configured=False,
  40. table_names={"pipeline_run"},
  41. current_revision="old-head",
  42. expected_revision="new-head",
  43. require_scheduler=True,
  44. require_secure_cookie=True,
  45. )
  46. assert result.passed is False
  47. assert any("SCHEDULER_ENABLED" in item for item in result.errors)
  48. assert any("OPENROUTER_API_KEY" in item for item in result.errors)
  49. assert any("AIGC_API_TOKEN" in item for item in result.errors)
  50. assert any("CATEGORY_MATCH_API_URL" in item for item in result.errors)
  51. assert any("迁移版本不一致" in item for item in result.errors)
  52. assert any("缺少流水线依赖表" in item for item in result.errors)
  53. assert any("AUTH_COOKIE_SECURE" in item for item in result.errors)