forked from erp-dev/erp
feat: mission category
This commit is contained in:
@@ -3,7 +3,8 @@ from unittest.mock import patch
|
||||
from django.test import TestCase
|
||||
|
||||
from basic_info.models import Merchant, MerchantTypeEnum
|
||||
from notifier.models import NotificationEventKeyEnum, Notifier, NotifierChannelEnum
|
||||
from mission.models import MissionCategory
|
||||
from notifier.models import NotificationEventKeyEnum, Notifier, NotifierChannelEnum, NotifierRoute
|
||||
from notifier.services import (
|
||||
dispatch_notification_event,
|
||||
enqueue_notification_event,
|
||||
@@ -15,14 +16,20 @@ from notifier.services import (
|
||||
class NotifierServiceTestCase(TestCase):
|
||||
def setUp(self):
|
||||
self.merchant = Merchant.objects.create(name="通知商户", type=MerchantTypeEnum.STORE)
|
||||
self.general_category = MissionCategory.objects.create(merchant=self.merchant, name="通用")
|
||||
self.after_sale_category = MissionCategory.objects.create(merchant=self.merchant, name="售后")
|
||||
self.notifier = Notifier.objects.create(
|
||||
merchant=self.merchant,
|
||||
name="任务创建通知",
|
||||
event_key=NotificationEventKeyEnum.MISSION_CREATED,
|
||||
channel=NotifierChannelEnum.WECOM_WEBHOOK,
|
||||
template_key="mission_created",
|
||||
config={"key": "abc123", "msgtype": "markdown"},
|
||||
)
|
||||
self.global_route = NotifierRoute.objects.create(
|
||||
merchant=self.merchant,
|
||||
notifier=self.notifier,
|
||||
event_key=NotificationEventKeyEnum.MISSION_CREATED,
|
||||
)
|
||||
|
||||
def test_render_notification_content(self):
|
||||
content = render_notification_content(
|
||||
@@ -66,28 +73,36 @@ class NotifierServiceTestCase(TestCase):
|
||||
mock_send.assert_called_once()
|
||||
|
||||
@patch("notifier.services.send_notification_with_notifier")
|
||||
def test_dispatch_notification_event_filters_by_event_and_enabled(self, mock_send):
|
||||
def test_dispatch_notification_event_filters_by_route_event_and_enabled(self, mock_send):
|
||||
mock_send.side_effect = lambda *, notifier, payload: {
|
||||
"notifier_id": notifier.id,
|
||||
"status": "sent",
|
||||
}
|
||||
Notifier.objects.create(
|
||||
replied_notifier = Notifier.objects.create(
|
||||
merchant=self.merchant,
|
||||
name="任务回应通知",
|
||||
event_key=NotificationEventKeyEnum.MISSION_REPLIED,
|
||||
channel=NotifierChannelEnum.WECOM_WEBHOOK,
|
||||
template_key="mission_replied",
|
||||
config={"key": "def456"},
|
||||
)
|
||||
Notifier.objects.create(
|
||||
NotifierRoute.objects.create(
|
||||
merchant=self.merchant,
|
||||
notifier=replied_notifier,
|
||||
event_key=NotificationEventKeyEnum.MISSION_REPLIED,
|
||||
)
|
||||
disabled_notifier = Notifier.objects.create(
|
||||
merchant=self.merchant,
|
||||
name="停用通知器",
|
||||
event_key=NotificationEventKeyEnum.MISSION_CREATED,
|
||||
channel=NotifierChannelEnum.WECOM_WEBHOOK,
|
||||
template_key="mission_created",
|
||||
is_enabled=False,
|
||||
config={"key": "ghi789"},
|
||||
)
|
||||
NotifierRoute.objects.create(
|
||||
merchant=self.merchant,
|
||||
notifier=disabled_notifier,
|
||||
event_key=NotificationEventKeyEnum.MISSION_CREATED,
|
||||
)
|
||||
|
||||
results = dispatch_notification_event(
|
||||
event_key=NotificationEventKeyEnum.MISSION_CREATED,
|
||||
@@ -95,10 +110,62 @@ class NotifierServiceTestCase(TestCase):
|
||||
payload={"mission_id": 99},
|
||||
)
|
||||
|
||||
self.assertEqual(results, [{"notifier_id": self.notifier.id, "status": "sent"}])
|
||||
self.assertEqual(
|
||||
results,
|
||||
[
|
||||
{
|
||||
"notifier_id": self.notifier.id,
|
||||
"status": "sent",
|
||||
"event_key": NotificationEventKeyEnum.MISSION_CREATED,
|
||||
"route_id": self.global_route.id,
|
||||
"route_event_key": NotificationEventKeyEnum.MISSION_CREATED,
|
||||
"route_mission_category_id": None,
|
||||
}
|
||||
],
|
||||
)
|
||||
self.assertEqual(mock_send.call_count, 1)
|
||||
self.assertEqual(mock_send.call_args.kwargs["notifier"].id, self.notifier.id)
|
||||
|
||||
@patch("notifier.services.send_notification_with_notifier")
|
||||
def test_dispatch_notification_event_prefers_category_specific_route(self, mock_send):
|
||||
mock_send.side_effect = lambda *, notifier, payload: {
|
||||
"notifier_id": notifier.id,
|
||||
"status": "sent",
|
||||
}
|
||||
specific_route = NotifierRoute.objects.create(
|
||||
merchant=self.merchant,
|
||||
notifier=self.notifier,
|
||||
event_key=NotificationEventKeyEnum.MISSION_CREATED,
|
||||
mission_category=self.after_sale_category,
|
||||
)
|
||||
|
||||
results = dispatch_notification_event(
|
||||
event_key=NotificationEventKeyEnum.MISSION_CREATED,
|
||||
merchant_id=self.merchant.id,
|
||||
payload={"mission_id": 99, "category_id": self.after_sale_category.id},
|
||||
)
|
||||
|
||||
self.assertEqual(mock_send.call_count, 1)
|
||||
self.assertEqual(results[0]["route_id"], specific_route.id)
|
||||
self.assertEqual(results[0]["route_mission_category_id"], self.after_sale_category.id)
|
||||
|
||||
@patch("notifier.services.send_notification_with_notifier")
|
||||
def test_dispatch_notification_event_falls_back_to_global_route(self, mock_send):
|
||||
mock_send.side_effect = lambda *, notifier, payload: {
|
||||
"notifier_id": notifier.id,
|
||||
"status": "sent",
|
||||
}
|
||||
|
||||
results = dispatch_notification_event(
|
||||
event_key=NotificationEventKeyEnum.MISSION_CREATED,
|
||||
merchant_id=self.merchant.id,
|
||||
payload={"mission_id": 99, "category_id": self.general_category.id},
|
||||
)
|
||||
|
||||
self.assertEqual(mock_send.call_count, 1)
|
||||
self.assertEqual(results[0]["route_id"], self.global_route.id)
|
||||
self.assertIsNone(results[0]["route_mission_category_id"])
|
||||
|
||||
@patch("notifier.tasks.dispatch_notification_event_task.delay")
|
||||
def test_enqueue_notification_event_returns_task_id(self, mock_delay):
|
||||
mock_delay.return_value.id = "task-123"
|
||||
|
||||
Reference in New Issue
Block a user