"""OA 评论 @提到 复用抄送模板推送单测。""" from unittest.mock import MagicMock, patch from urllib.parse import parse_qs, urlparse from app.services.oa_wechat_notify import ( RETURN_MENTIONS, _build_mention_title, _send_mention_one, build_oa_detail_pagepath, schedule_oa_mention_notifies, ) def test_return_mentions_path(): assert RETURN_MENTIONS == "/pages/oa/mentions/index" def test_build_mention_title(): assert _build_mention_title("张三") == "张三 在评论中提到了你" assert _build_mention_title("") == "有人在评论中提到了你" def test_mention_pagepath_mode_view_return_mentions(): p = build_oa_detail_pagepath( instance_id="i1", task_id="", mode="view", return_path=RETURN_MENTIONS, ) q = parse_qs(urlparse("x://" + p).query) assert q["mode"] == ["view"] assert "taskId" not in q assert q["returnPath"] == [RETURN_MENTIONS] def test_send_mention_one_uses_cc_template_fields(): db = MagicMock() mentioned = MagicMock() mentioned.wx_mp_openid = "mp-m1" mentioned.nick_name = "李四" commenter = MagicMock() commenter.nick_name = "张三" inst = MagicMock() inst.id = "i1" inst.app_id = "app1" inst.title = "请假" inst.del_flag = 0 app = MagicMock() app.app_name = "请假申请" user_queue = [mentioned, commenter] def query_side_effect(model): q = MagicMock() name = getattr(model, "__name__", "") or str(model) if "OaInstance" in name: q.filter.return_value.first.return_value = inst elif "OaApp" in name: q.filter.return_value.first.return_value = app elif "SysUser" in name: q.filter.return_value.first.side_effect = lambda: user_queue.pop(0) else: q.filter.return_value.first.return_value = None return q db.query.side_effect = query_side_effect with patch("app.services.oa_wechat_notify.send_oa_cc_notify") as send: _send_mention_one( db, instance_id="i1", mentioned_user_id="u2", commenter_user_id="u1", ) send.assert_called_once() kwargs = send.call_args.kwargs assert kwargs["mp_openid"] == "mp-m1" assert kwargs["title"] == "张三 在评论中提到了你" assert kwargs["applicant"] == "张三" assert kwargs["process_name"] == "请假申请" assert "mode=view" in kwargs["pagepath"] assert ( "%2Fpages%2Foa%2Fmentions%2Findex" in kwargs["pagepath"] or "/pages/oa/mentions/index" in kwargs["pagepath"] ) def test_send_mention_one_skips_without_mp(): db = MagicMock() mentioned = MagicMock() mentioned.wx_mp_openid = "" mentioned.nick_name = "李四" def query_side_effect(model): q = MagicMock() name = getattr(model, "__name__", "") or str(model) if "SysUser" in name: q.filter.return_value.first.return_value = mentioned else: q.filter.return_value.first.return_value = None return q db.query.side_effect = query_side_effect with patch("app.services.oa_wechat_notify.send_oa_cc_notify") as send: _send_mention_one( db, instance_id="i1", mentioned_user_id="u2", commenter_user_id="u1", ) send.assert_not_called() def test_schedule_oa_mention_notifies_noop_when_disabled(): with patch("app.services.oa_wechat_notify.settings") as st, patch( "app.services.oa_wechat_notify.threading.Thread" ) as th: st.WX_MP_NOTIFY_ENABLED = False schedule_oa_mention_notifies( instance_id="i1", commenter_user_id="u1", mentioned_user_ids=["u2"], ) th.assert_not_called() def test_schedule_oa_mention_notifies_starts_thread_when_enabled(): with patch("app.services.oa_wechat_notify.settings") as st, patch( "app.services.oa_wechat_notify.threading.Thread" ) as th: st.WX_MP_NOTIFY_ENABLED = True schedule_oa_mention_notifies( instance_id="i1", commenter_user_id="u1", mentioned_user_ids=["u2", "u3"], ) th.assert_called_once() kwargs = th.call_args.kwargs assert kwargs["kwargs"]["instance_id"] == "i1" assert kwargs["kwargs"]["commenter_user_id"] == "u1" assert kwargs["kwargs"]["mentioned_user_ids"] == ["u2", "u3"]