test_pl_arrange_auto_start_execute.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. """安排运输时自动开始执行已审批合同。"""
  2. from types import SimpleNamespace
  3. from unittest.mock import MagicMock, patch
  4. from app.services.pl_contract_plan_qty import auto_start_execute_approved_contracts
  5. def test_auto_start_execute_promotes_approved_only():
  6. approved = SimpleNamespace(id="c1", status="approved", update_by=None, update_time=None)
  7. executing = SimpleNamespace(id="c2", status="executing", update_by=None, update_time=None)
  8. by_id = {"c1": approved, "c2": executing}
  9. db = MagicMock()
  10. def query(_model):
  11. q = MagicMock()
  12. q.filter.return_value = q
  13. def first():
  14. # Retrieve id from filter call history is hard; use sequential pops
  15. return None
  16. q.first.side_effect = first
  17. return q
  18. db.query.side_effect = query
  19. plan = SimpleNamespace(id="p1", contract_id=None)
  20. call_ids = []
  21. def fake_query(model):
  22. q = MagicMock()
  23. q.filter.return_value = q
  24. def first():
  25. # Peek last equality on id from filter args — use call order instead
  26. cid = call_ids.pop(0) if call_ids else None
  27. return by_id.get(cid)
  28. q.first.side_effect = first
  29. return q
  30. with patch(
  31. "app.services.pl_contract_plan_qty.contract_ids_linked_to_plan",
  32. return_value={"c1", "c2"},
  33. ):
  34. # Ensure deterministic order
  35. with patch(
  36. "app.services.pl_contract_plan_qty.contract_ids_linked_to_plan",
  37. return_value=["c1", "c2"],
  38. ):
  39. db.query.side_effect = fake_query
  40. call_ids.extend(["c1", "c2"])
  41. started = auto_start_execute_approved_contracts(
  42. db, tenant_no="shanxia2.0", plan=plan, user_id="u1"
  43. )
  44. assert started == ["c1"]
  45. assert approved.status == "executing"
  46. assert approved.update_by == "u1"
  47. assert executing.status == "executing"