test_pl_plan_product_upsert.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. """build_plan_product / upsert 应保持 id 稳定,并拒绝外键无效的产品行 id。"""
  2. from unittest.mock import MagicMock
  3. import pytest
  4. from fastapi import HTTPException
  5. from app.schemas.pl.plan import PlanProductCreate
  6. from app.services import pl_plan_service as svc
  7. from app.services.pl_plan_service import (
  8. build_plan_product,
  9. resolve_plan_product_id_for_upsert,
  10. )
  11. def _minimal_prod(**kwargs) -> PlanProductCreate:
  12. data = {
  13. "product_id": "crm-p1",
  14. "product_no": "P001",
  15. "product_name": "甲醇",
  16. }
  17. data.update(kwargs)
  18. return PlanProductCreate(**data)
  19. def test_build_plan_product_keeps_row_id():
  20. result = build_plan_product(
  21. tenant_no="t1",
  22. plan_id="plan-1",
  23. plan_type="outbound",
  24. prod=_minimal_prod(),
  25. order_num=0,
  26. user_id="u1",
  27. dept_id="d1",
  28. product_row_id="pp-1",
  29. )
  30. assert result.id == "pp-1"
  31. def test_build_plan_product_generates_when_missing(monkeypatch):
  32. monkeypatch.setattr(svc, "generate_uuid", lambda: "gen-1")
  33. result = build_plan_product(
  34. tenant_no="t1",
  35. plan_id="plan-1",
  36. plan_type="outbound",
  37. prod=_minimal_prod(),
  38. order_num=0,
  39. user_id="u1",
  40. dept_id="d1",
  41. )
  42. assert result.id == "gen-1"
  43. def test_upsert_plan_product_rejects_foreign_id():
  44. with pytest.raises(HTTPException) as ei:
  45. resolve_plan_product_id_for_upsert(
  46. plan_id="plan-1",
  47. payload_id="pp-other-plan",
  48. existing_by_id={},
  49. )
  50. assert ei.value.status_code == 422
  51. def test_upsert_plan_product_keeps_payload_id():
  52. existing = MagicMock()
  53. existing.id = "pp-keep"
  54. existing.plan_id = "plan-1"
  55. row_id, row = resolve_plan_product_id_for_upsert(
  56. plan_id="plan-1",
  57. payload_id="pp-keep",
  58. existing_by_id={"pp-keep": existing},
  59. )
  60. assert row_id == "pp-keep"
  61. assert row is existing
  62. def test_upsert_plan_product_generates_when_missing(monkeypatch):
  63. monkeypatch.setattr(svc, "generate_uuid", lambda: "new-pp")
  64. row_id, row = resolve_plan_product_id_for_upsert(
  65. plan_id="plan-1",
  66. payload_id=None,
  67. existing_by_id={},
  68. )
  69. assert row_id == "new-pp"
  70. assert row is None