test_oa_initiator_select_by_node.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. """OA 发起人自选:按节点 map"""
  2. import unittest
  3. from unittest.mock import MagicMock, patch
  4. from app.services.oa_engine import (
  5. OaEngineError,
  6. _create_tasks_for_node,
  7. _ids_for_initiator_select_node,
  8. _normalize_initiator_select_by_node,
  9. )
  10. class TestNormalizeMap(unittest.TestCase):
  11. def test_normalize_dedupe_preserve_order(self):
  12. raw = {"n1": ["u1", "u1", " u2 ", ""], "n2": "bad"}
  13. out = _normalize_initiator_select_by_node(raw)
  14. self.assertEqual(out["n1"], ["u1", "u2"])
  15. self.assertNotIn("n2", out)
  16. def test_ids_for_node(self):
  17. m = {"a1": ["u9"]}
  18. self.assertEqual(_ids_for_initiator_select_node(m, "a1"), ["u9"])
  19. self.assertEqual(_ids_for_initiator_select_node(m, "missing"), [])
  20. class TestCreateTasksInitiatorSelect(unittest.TestCase):
  21. def _inst(self):
  22. inst = MagicMock()
  23. inst.id = "inst1"
  24. inst.tenant_no = "zkxw"
  25. inst.initiator_user_id = "init"
  26. inst.initiator_dept_id = "d1"
  27. inst.current_round = 1
  28. return inst
  29. def test_cc_empty_skips_without_resolve(self):
  30. db = MagicMock()
  31. node = {
  32. "id": "cc1",
  33. "type": "cc",
  34. "name": "抄送人",
  35. "approverConfig": {"assigneeType": "initiator_select"},
  36. }
  37. ver = MagicMock()
  38. ver.advanced_settings_json = "{}"
  39. with patch("app.services.oa_engine.resolve_assignees") as resolve:
  40. created = _create_tasks_for_node(
  41. db,
  42. inst=self._inst(),
  43. node=node,
  44. ver=ver,
  45. user_id="init",
  46. initiator_select_by_node={},
  47. )
  48. resolve.assert_not_called()
  49. self.assertEqual(created, [])
  50. def test_approval_empty_raises(self):
  51. db = MagicMock()
  52. node = {
  53. "id": "a1",
  54. "type": "approval",
  55. "name": "审批人",
  56. "approverConfig": {"assigneeType": "initiator_select", "signMode": "or"},
  57. }
  58. ver = MagicMock()
  59. ver.advanced_settings_json = "{}"
  60. with self.assertRaises(OaEngineError):
  61. _create_tasks_for_node(
  62. db,
  63. inst=self._inst(),
  64. node=node,
  65. ver=ver,
  66. user_id="init",
  67. initiator_select_by_node={"a1": []},
  68. )
  69. def test_approval_uses_node_ids(self):
  70. db = MagicMock()
  71. node = {
  72. "id": "a1",
  73. "type": "approval",
  74. "name": "审批人",
  75. "approverConfig": {"assigneeType": "initiator_select", "signMode": "or"},
  76. }
  77. ver = MagicMock()
  78. ver.advanced_settings_json = "{}"
  79. with patch(
  80. "app.services.oa_engine.resolve_assignees",
  81. return_value=(["u1"], {"resolve_source": "initiator_select"}),
  82. ) as resolve:
  83. with patch("app.services.oa_engine.generate_uuid", return_value="t1"):
  84. with patch("app.services.oa_engine._next_task_order_num", return_value=1):
  85. created = _create_tasks_for_node(
  86. db,
  87. inst=self._inst(),
  88. node=node,
  89. ver=ver,
  90. user_id="init",
  91. initiator_select_by_node={"a1": ["u1"], "other": ["u9"]},
  92. )
  93. self.assertEqual(len(created), 1)
  94. kwargs = resolve.call_args.kwargs
  95. self.assertEqual(kwargs.get("initiator_select_user_ids"), ["u1"])
  96. if __name__ == "__main__":
  97. unittest.main()