test_oa_applicant_progress_notify.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. """申请人进度通知(每步审批结果)单测。"""
  2. from unittest.mock import MagicMock, patch
  3. from app.core.config import settings
  4. from app.services.oa_wechat_notify import (
  5. RESULT_FAIL,
  6. RESULT_OTHER,
  7. RESULT_PASS,
  8. RESULT_TRANSFER,
  9. _send_applicant_progress,
  10. map_oa_action_to_result,
  11. )
  12. def test_map_oa_action_to_result():
  13. assert map_oa_action_to_result("approve") == RESULT_PASS
  14. assert map_oa_action_to_result("reject") == RESULT_FAIL
  15. assert map_oa_action_to_result("transfer") == RESULT_TRANSFER
  16. assert map_oa_action_to_result("return") == RESULT_OTHER
  17. assert map_oa_action_to_result("add_sign") == RESULT_OTHER
  18. assert map_oa_action_to_result("unknown") == RESULT_OTHER
  19. def test_send_applicant_progress_skips_without_mp():
  20. db = MagicMock()
  21. inst = MagicMock()
  22. inst.id = "i1"
  23. inst.app_id = "app1"
  24. inst.title = "请假"
  25. inst.initiator_user_id = "u-ini"
  26. inst.del_flag = 0
  27. ini = MagicMock()
  28. ini.nick_name = "张三"
  29. ini.wx_mp_openid = ""
  30. app = MagicMock()
  31. app.app_name = "请假申请"
  32. actor = MagicMock()
  33. actor.nick_name = "李四"
  34. def query_side_effect(model):
  35. q = MagicMock()
  36. name = getattr(model, "__name__", "") or str(model)
  37. if "OaInstance" in name:
  38. q.filter.return_value.first.return_value = inst
  39. elif "OaApp" in name:
  40. q.filter.return_value.first.return_value = app
  41. elif "SysUser" in name:
  42. # initiator then actor
  43. q.filter.return_value.first.side_effect = [ini, actor]
  44. else:
  45. q.filter.return_value.first.return_value = None
  46. return q
  47. db.query.side_effect = query_side_effect
  48. with patch(
  49. "app.services.oa_wechat_notify.send_oa_applicant_progress_notify"
  50. ) as send:
  51. _send_applicant_progress(
  52. db,
  53. instance_id="i1",
  54. actor_user_id="u-actor",
  55. result=RESULT_PASS,
  56. task_id="t1",
  57. )
  58. send.assert_not_called()
  59. def test_send_applicant_progress_payload_args():
  60. db = MagicMock()
  61. inst = MagicMock()
  62. inst.id = "i1"
  63. inst.app_id = "app1"
  64. inst.title = "请假"
  65. inst.initiator_user_id = "u-ini"
  66. ini = MagicMock()
  67. ini.nick_name = "张三"
  68. ini.wx_mp_openid = "mp-ini"
  69. app = MagicMock()
  70. app.app_name = "请假申请"
  71. actor = MagicMock()
  72. actor.nick_name = "李四"
  73. user_queue = [ini, actor]
  74. def query_side_effect(model):
  75. q = MagicMock()
  76. name = getattr(model, "__name__", "") or str(model)
  77. if "OaInstance" in name:
  78. q.filter.return_value.first.return_value = inst
  79. elif "OaApp" in name:
  80. q.filter.return_value.first.return_value = app
  81. elif "SysUser" in name:
  82. q.filter.return_value.first.side_effect = lambda: user_queue.pop(0)
  83. else:
  84. q.filter.return_value.first.return_value = None
  85. return q
  86. db.query.side_effect = query_side_effect
  87. with patch(
  88. "app.services.oa_wechat_notify.send_oa_applicant_progress_notify"
  89. ) as send:
  90. _send_applicant_progress(
  91. db,
  92. instance_id="i1",
  93. actor_user_id="u-actor",
  94. result=RESULT_PASS,
  95. task_id="t1",
  96. )
  97. send.assert_called_once()
  98. kwargs = send.call_args.kwargs
  99. assert kwargs["mp_openid"] == "mp-ini"
  100. assert kwargs["business_name"] == "张三 - 请假申请"
  101. assert kwargs["process_name"] == "请假申请"
  102. assert kwargs["approver_name"] == "李四"
  103. assert kwargs["result"] == RESULT_PASS
  104. assert "mode=view" in kwargs["pagepath"]
  105. assert "instanceId=i1" in kwargs["pagepath"]
  106. assert (
  107. "%2Fpages%2Foa%2Fmine%2Findex" in kwargs["pagepath"]
  108. or "/pages/oa/mine/index" in kwargs["pagepath"]
  109. )
  110. # 我发起的查看:不强制带 taskId
  111. assert "taskId=0" not in kwargs["pagepath"]