1
0
forked from erp-dev/erp

feat: message-api for mission via wecomm agent

This commit is contained in:
2026-05-14 09:30:38 +08:00
parent 9359013b4c
commit f409f2e6ee
38 changed files with 2085 additions and 49 deletions

View File

@@ -1,5 +1,6 @@
from django.test import TestCase
from django.contrib.contenttypes.models import ContentType
from types import SimpleNamespace
from unittest.mock import patch
from django.utils import timezone
@@ -23,6 +24,9 @@ from mission.signals import (
mission_replied,
mission_reply_rejected,
)
from mission.payload_processors import _split_structured_description
from notifier.models import NotificationEventKeyEnum, Notifier, NotifierChannelEnum, NotifierRoute
from notifier.services import dispatch_notification_event
class MissionModelTestCase(TestCase):
@@ -546,6 +550,26 @@ class MissionModelTestCase(TestCase):
self.assertEqual(received, [(Mission, self.mission.id, self.creator.id)])
def test_split_structured_description_v1(self):
title, body, url, image_url = _split_structured_description(
"系统首行\n标题一\n款式图:https://images.yuwen.cloud/abc.jpg\n标题二\n\n正文一\n正文二\n手机端链接: https://example.com/detail"
)
self.assertEqual(title, "标题一\n标题二")
self.assertEqual(body, "正文一\n正文二")
self.assertEqual(url, "https://example.com/detail")
self.assertEqual(image_url, "https://images.yuwen.cloud/abc.jpg")
def test_split_structured_description_v1_without_blank_line_uses_title_only(self):
title, body, url, image_url = _split_structured_description(
"系统首行\n标题一\n款式图:https://images.yuwen.cloud/abc.jpg\n标题二\n手机端链接: https://example.com/detail"
)
self.assertEqual(title, "标题一\n标题二")
self.assertEqual(body, "")
self.assertEqual(url, "https://example.com/detail")
self.assertEqual(image_url, "https://images.yuwen.cloud/abc.jpg")
@patch("mission.handlers.enqueue_notification_event")
def test_mission_created_handler_enqueues_notifier_event(self, mock_enqueue):
with self.captureOnCommitCallbacks(execute=True):
@@ -556,6 +580,28 @@ class MissionModelTestCase(TestCase):
self.assertEqual(mock_enqueue.call_args.kwargs["merchant_id"], self.merchant.id)
self.assertEqual(mock_enqueue.call_args.kwargs["payload"]["mission_id"], mission.id)
@patch("mission.handlers.enqueue_notification_event")
def test_mission_created_handler_applies_category_payload_processor(self, mock_enqueue):
self.default_category.payload_processor = "structured_description_v1"
self.default_category.save(update_fields=["payload_processor", "updated_at"])
with self.captureOnCommitCallbacks(execute=True):
mission = create_mission(
creator=self.creator,
description=(
"系统首行\n标题一\n款式图:https://images.yuwen.cloud/abc.jpg\n标题二\n\n正文一\n正文二\n"
"手机端链接: https://example.com/detail"
),
)
payload = mock_enqueue.call_args.kwargs["payload"]
self.assertEqual(payload["mission_id"], mission.id)
self.assertEqual(payload["payload_processor"], "structured_description_v1")
self.assertEqual(payload["parsed_description_title"], "标题一\n标题二")
self.assertEqual(payload["parsed_description_body"], "正文一\n正文二")
self.assertEqual(payload["parsed_description_url"], "https://example.com/detail")
self.assertEqual(payload["parsed_description_image_url"], "https://images.yuwen.cloud/abc.jpg")
@patch("mission.handlers.enqueue_notification_event")
def test_create_ending_reply_handler_enqueues_replied_and_completed_notifications(self, mock_enqueue):
with self.captureOnCommitCallbacks(execute=True):
@@ -614,3 +660,67 @@ class MissionModelTestCase(TestCase):
mock_enqueue.assert_called_once()
self.assertEqual(mock_enqueue.call_args.kwargs["event_key"], "mission.cancelled")
self.assertEqual(mock_enqueue.call_args.kwargs["payload"]["mission_id"], self.mission.id)
@patch("notifier.backends.send_message_api_news_to_agents")
@patch("notifier.tasks.dispatch_notification_event_task.delay")
def test_mission_created_can_flow_to_message_api_news_with_structured_description_template(
self,
mock_delay,
mock_send_news,
):
self.default_category.payload_processor = "structured_description_v1"
self.default_category.save(update_fields=["payload_processor", "updated_at"])
notifier = Notifier.objects.create(
merchant=self.merchant,
name="结构化描述图文通知",
channel=NotifierChannelEnum.MESSAGE_API,
template_key="mission_structured_description_news",
config={
"agent_ids": [1000007],
"image_url": "https://cdn.example.com/covers/mission-news.png",
},
)
NotifierRoute.objects.create(
merchant=self.merchant,
notifier=notifier,
event_key=NotificationEventKeyEnum.MISSION_CREATED,
mission_category=self.default_category,
)
mock_send_news.return_value = [
{
"agent_id": 1000007,
"ok": True,
"response": {"errcode": 0, "errmsg": "ok"},
"error": None,
}
]
def inline_delay(*, event_key, merchant_id, payload):
dispatch_notification_event(
event_key=event_key,
merchant_id=merchant_id,
payload=payload,
)
return SimpleNamespace(id="task-inline-1")
mock_delay.side_effect = inline_delay
with self.captureOnCommitCallbacks(execute=True):
create_mission(
creator=self.creator,
category=self.default_category,
description=(
"系统首行\n标题一\n款式图:https://images.yuwen.cloud/abc.jpg\n标题二\n\n正文一\n正文二\n"
"手机端链接: https://example.com/detail"
),
)
mock_send_news.assert_called_once()
self.assertEqual(mock_send_news.call_args.kwargs["agent_ids"], [1000007])
self.assertEqual(mock_send_news.call_args.kwargs["title"], "标题一\n标题二")
self.assertEqual(mock_send_news.call_args.kwargs["description"], "正文一\n正文二")
self.assertEqual(mock_send_news.call_args.kwargs["url"], "https://example.com/detail")
self.assertEqual(
mock_send_news.call_args.kwargs["image_url"],
"https://images.yuwen.cloud/abc.jpg",
)