test_oa_wechat_notify_hook.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. """OA 微信服务号通知钩子单测。"""
  2. from unittest.mock import MagicMock, patch
  3. from app.services.oa_wechat_notify import _send_one, build_oa_detail_pagepath
  4. def test_build_pagepath_no_leading_slash():
  5. p = build_oa_detail_pagepath(instance_id="i1", task_id="t1", mode="approve")
  6. assert p.startswith("pages/")
  7. assert "mode=approve" in p
  8. assert "instanceId=i1" in p
  9. assert "taskId=t1" in p
  10. def test_send_one_routes_approval_vs_cc():
  11. db = MagicMock()
  12. user = MagicMock()
  13. user.wx_mp_openid = "mp-openid-1"
  14. user.nick_name = "张三"
  15. inst = MagicMock()
  16. inst.title = "请假"
  17. inst.initiator_user_id = "u-ini"
  18. ini = MagicMock()
  19. ini.nick_name = "李四"
  20. def query_side_effect(model):
  21. q = MagicMock()
  22. name = getattr(model, "__name__", "") or str(model)
  23. if "SysUser" in name:
  24. # first call: assignee; second: initiator (approval path may call twice)
  25. q.filter.return_value.first.side_effect = [user, ini]
  26. else:
  27. q.filter.return_value.first.return_value = inst
  28. return q
  29. db.query.side_effect = query_side_effect
  30. approval_task = MagicMock()
  31. approval_task.id = "t-appr"
  32. approval_task.instance_id = "i1"
  33. approval_task.assignee_user_id = "u1"
  34. approval_task.task_type = "approval"
  35. approval_task.status = "pending"
  36. approval_task.node_name = "主管审批"
  37. with patch(
  38. "app.services.oa_wechat_notify.send_oa_approval_notify"
  39. ) as send_appr, patch(
  40. "app.services.oa_wechat_notify.send_oa_cc_notify"
  41. ) as send_cc:
  42. _send_one(db, approval_task)
  43. send_appr.assert_called_once()
  44. send_cc.assert_not_called()
  45. kwargs = send_appr.call_args.kwargs
  46. assert kwargs["mp_openid"] == "mp-openid-1"
  47. assert "mode=approve" in kwargs["pagepath"]
  48. # reset query for cc path
  49. db.query.side_effect = query_side_effect
  50. cc_task = MagicMock()
  51. cc_task.id = "t-cc"
  52. cc_task.instance_id = "i1"
  53. cc_task.assignee_user_id = "u1"
  54. cc_task.task_type = "cc"
  55. cc_task.status = "done"
  56. cc_task.node_name = "抄送"
  57. with patch(
  58. "app.services.oa_wechat_notify.send_oa_approval_notify"
  59. ) as send_appr, patch(
  60. "app.services.oa_wechat_notify.send_oa_cc_notify"
  61. ) as send_cc:
  62. _send_one(db, cc_task)
  63. send_cc.assert_called_once()
  64. send_appr.assert_not_called()
  65. kwargs = send_cc.call_args.kwargs
  66. assert "mode=view" in kwargs["pagepath"]