test_run_supply_pipeline.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. """Compatibility wrapper tests for the durable pipeline."""
  2. from __future__ import annotations
  3. from unittest.mock import patch
  4. from supply_infra.pipeline.run_service import RunSubmission
  5. from supply_infra.scheduler.jobs.run_supply_pipeline import run_supply_pipeline
  6. @patch("supply_infra.scheduler.jobs.run_supply_pipeline.submit_pipeline_run")
  7. def test_pipeline_wrapper_only_submits_durable_run(mock_submit) -> None:
  8. mock_submit.return_value = RunSubmission(
  9. run_id="run-1",
  10. created=True,
  11. status="queued",
  12. biz_dt="20260721",
  13. )
  14. result = run_supply_pipeline("20260721")
  15. assert result["run_id"] == "run-1"
  16. assert result["status"] == "queued"
  17. assert result["dry_run"] is False
  18. mock_submit.assert_called_once()
  19. @patch("supply_infra.scheduler.jobs.run_supply_pipeline.get_pipeline_run")
  20. @patch("supply_infra.scheduler.jobs.run_supply_pipeline.submit_pipeline_run")
  21. def test_wait_reads_terminal_state_from_mysql(mock_submit, mock_get) -> None:
  22. mock_submit.return_value = RunSubmission(
  23. run_id="run-2",
  24. created=True,
  25. status="queued",
  26. biz_dt="20260721",
  27. )
  28. mock_get.return_value = {
  29. "run_id": "run-2",
  30. "status": "failed",
  31. "error_message": "strict gate failed",
  32. }
  33. result = run_supply_pipeline("20260721", wait=True, poll_seconds=0.01)
  34. assert result["success"] is False
  35. assert result["status"] == "failed"
  36. @patch("supply_infra.scheduler.jobs.run_supply_pipeline.submit_pipeline_run")
  37. def test_submit_validation_error_is_not_hidden(mock_submit) -> None:
  38. mock_submit.side_effect = ValueError("Invalid biz_dt")
  39. try:
  40. run_supply_pipeline("invalid-date")
  41. except ValueError as exc:
  42. assert "Invalid biz_dt" in str(exc)
  43. else:
  44. raise AssertionError("validation error must propagate to the CLI/API boundary")