test_pl_plan_arrange_copy_flags.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. """Regression: arrange copy flags must not N+1 query load/delivery per plan."""
  2. from __future__ import annotations
  3. from types import SimpleNamespace
  4. from unittest.mock import MagicMock
  5. from app.services.pl_plan_arrange_copy_flags import load_plan_arrange_copy_flags
  6. def test_load_plan_arrange_copy_flags_batches_stop_lookups():
  7. plans = [
  8. SimpleNamespace(
  9. id=f"p{i}",
  10. transport_status="arranged",
  11. follow_status="pending_arrange",
  12. transport_id=f"t{i}",
  13. plan_type="direct",
  14. supplier_name="外部供方",
  15. customer_name="外部需方",
  16. destination_name="",
  17. )
  18. for i in range(5)
  19. ]
  20. transport_rows = [
  21. SimpleNamespace(
  22. id=f"t{i}",
  23. transport_status="arranged",
  24. driver_access_token="tok",
  25. site_access_token="",
  26. )
  27. for i in range(5)
  28. ]
  29. call_count = {"n": 0}
  30. def query_side_effect(model, *cols):
  31. call_count["n"] += 1
  32. q = MagicMock()
  33. q.filter.return_value = q
  34. q.distinct.return_value = q
  35. # PlTransport full objects
  36. name = getattr(model, "__name__", "") or str(model)
  37. if "PlTransport" in name and "Link" not in name and "Db" not in name and "Site" not in name:
  38. q.all.return_value = transport_rows
  39. elif "SiteLink" in name:
  40. q.all.return_value = []
  41. elif "DbLink" in name:
  42. q.all.return_value = []
  43. elif "Inbound" in name or "Outbound" in name:
  44. q.all.return_value = []
  45. elif "PlPlanLoad" in name or "Load" in name:
  46. q.all.return_value = []
  47. elif "Delivery" in name:
  48. q.all.return_value = []
  49. else:
  50. q.all.return_value = []
  51. return q
  52. db = MagicMock()
  53. db.query.side_effect = query_side_effect
  54. result = load_plan_arrange_copy_flags(db, "shanxia2.0", plans)
  55. assert len(result) == 5
  56. # 5 plans must not become ~15+ stop queries; expect a small fixed number of batch queries
  57. assert call_count["n"] <= 8
  58. for plan in plans:
  59. assert result[plan.id].can_copy_to_driver is True