forked from erp-dev/erp
feat: prod clean
This commit is contained in:
@@ -1,10 +1,13 @@
|
||||
from django.core.cache import cache
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.contrib.auth.models import Permission
|
||||
from django.contrib.contenttypes.models import ContentType
|
||||
from django.test import TestCase
|
||||
from rest_framework.test import APIClient
|
||||
|
||||
from basic_info import models as basic_models
|
||||
from mission import models as mission_models
|
||||
from printing import models as printing_models
|
||||
|
||||
|
||||
def grant_permission(user, codename):
|
||||
@@ -14,6 +17,7 @@ def grant_permission(user, codename):
|
||||
|
||||
class MissionV2APITest(TestCase):
|
||||
def setUp(self):
|
||||
cache.clear()
|
||||
self.client = APIClient()
|
||||
self.merchant = basic_models.Merchant.objects.create(
|
||||
name="任务商户",
|
||||
@@ -49,6 +53,31 @@ class MissionV2APITest(TestCase):
|
||||
merchant=self.other_merchant,
|
||||
name="其他员工",
|
||||
)
|
||||
self.customer = basic_models.Customer.objects.create(
|
||||
merchant=self.merchant,
|
||||
name="任务客户",
|
||||
mobile="13800138000",
|
||||
)
|
||||
self.other_customer = basic_models.Customer.objects.create(
|
||||
merchant=self.other_merchant,
|
||||
name="其他客户",
|
||||
mobile="13800138001",
|
||||
)
|
||||
self.printing_order = printing_models.PrintingOrder.objects.create(
|
||||
merchant=self.merchant,
|
||||
customer=self.customer,
|
||||
fabric="测试面料",
|
||||
width="150cm",
|
||||
created_by=self.user,
|
||||
)
|
||||
self.other_printing_order = printing_models.PrintingOrder.objects.create(
|
||||
merchant=self.other_merchant,
|
||||
customer=self.other_customer,
|
||||
fabric="其他面料",
|
||||
width="160cm",
|
||||
created_by=self.user,
|
||||
)
|
||||
self.printing_order_content_type = ContentType.objects.get_for_model(printing_models.PrintingOrder)
|
||||
self.client.force_authenticate(user=self.user)
|
||||
|
||||
def test_create_mission_uses_default_status_and_current_employee(self):
|
||||
@@ -56,6 +85,7 @@ class MissionV2APITest(TestCase):
|
||||
"/api/v2/missions/",
|
||||
{
|
||||
"description": "跟进客户问题",
|
||||
"extra": {"source": "api-test", "priority": 1},
|
||||
"participant_ids": [self.participant.id],
|
||||
},
|
||||
format="json",
|
||||
@@ -71,8 +101,10 @@ class MissionV2APITest(TestCase):
|
||||
self.assertFalse(mission.is_cancelled)
|
||||
self.assertFalse(mission.notify_if_unreplied)
|
||||
self.assertEqual(mission.unreplied_notify_max_count, 5)
|
||||
self.assertEqual(mission.extra, {"source": "api-test", "priority": 1})
|
||||
self.assertEqual(resp.data["category"], self.default_category.id)
|
||||
self.assertEqual(resp.data["category_name"], "通用")
|
||||
self.assertEqual(resp.data["extra"], {"source": "api-test", "priority": 1})
|
||||
self.assertEqual(list(mission.participants.values_list("employee_id", flat=True)), [self.participant.id])
|
||||
|
||||
def test_create_mission_supports_unreplied_notification_fields(self):
|
||||
@@ -165,6 +197,7 @@ class MissionV2APITest(TestCase):
|
||||
{
|
||||
"description": "更新后的任务",
|
||||
"category": self.followup_category.id,
|
||||
"extra": {"channel": "wechat"},
|
||||
"participant_ids": [self.participant.id],
|
||||
},
|
||||
format="json",
|
||||
@@ -174,10 +207,26 @@ class MissionV2APITest(TestCase):
|
||||
mission.refresh_from_db()
|
||||
self.assertEqual(mission.description, "更新后的任务")
|
||||
self.assertEqual(mission.category, self.followup_category)
|
||||
self.assertEqual(mission.extra, {"channel": "wechat"})
|
||||
self.assertEqual(resp.data["category"], self.followup_category.id)
|
||||
self.assertEqual(resp.data["category_name"], "跟进")
|
||||
self.assertEqual(resp.data["extra"], {"channel": "wechat"})
|
||||
self.assertEqual(list(mission.participants.values_list("employee_id", flat=True)), [self.participant.id])
|
||||
|
||||
def test_create_mission_reply_supports_extra(self):
|
||||
mission = self._create_mission()
|
||||
|
||||
resp = self.client.post(
|
||||
f"/api/v2/missions/{mission.id}/replies/",
|
||||
{"content": "已记录", "extra": {"attachment_ids": [1, 2]}},
|
||||
format="json",
|
||||
)
|
||||
|
||||
self.assertEqual(resp.status_code, 201)
|
||||
reply = mission_models.MissionReply.objects.get(id=resp.data["id"])
|
||||
self.assertEqual(reply.extra, {"attachment_ids": [1, 2]})
|
||||
self.assertEqual(resp.data["extra"], {"attachment_ids": [1, 2]})
|
||||
|
||||
def test_patch_mission_updates_unreplied_notification_fields(self):
|
||||
mission = self._create_mission()
|
||||
|
||||
@@ -211,6 +260,152 @@ class MissionV2APITest(TestCase):
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertEqual([item["id"] for item in resp.data], [visible.id])
|
||||
|
||||
def test_list_missions_by_printing_order_returns_nested_replies_and_extra(self):
|
||||
mission = mission_models.Mission.objects.create(
|
||||
merchant=self.merchant,
|
||||
category=self.default_category,
|
||||
creator=self.employee,
|
||||
description="印花订单任务",
|
||||
content_type=self.printing_order_content_type,
|
||||
content_id=self.printing_order.id,
|
||||
extra={"source": "printing-order"},
|
||||
)
|
||||
mission_models.MissionReply.objects.create(
|
||||
merchant=self.merchant,
|
||||
mission=mission,
|
||||
responder=self.employee,
|
||||
content="已跟进",
|
||||
extra={"attachment_ids": [101]},
|
||||
)
|
||||
mission_models.Mission.objects.create(
|
||||
merchant=self.merchant,
|
||||
category=self.followup_category,
|
||||
creator=self.employee,
|
||||
description="其他订单任务",
|
||||
content_type=self.printing_order_content_type,
|
||||
content_id=self.other_printing_order.id,
|
||||
)
|
||||
|
||||
resp = self.client.get(f"/api/v2/missions/by-printing-order/{self.printing_order.id}/")
|
||||
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertEqual(len(resp.data), 1)
|
||||
self.assertEqual(resp.data[0]["id"], mission.id)
|
||||
self.assertEqual(resp.data[0]["extra"], {"source": "printing-order"})
|
||||
self.assertEqual(len(resp.data[0]["replies"]), 1)
|
||||
self.assertEqual(resp.data[0]["replies"][0]["content"], "已跟进")
|
||||
self.assertEqual(resp.data[0]["replies"][0]["extra"], {"attachment_ids": [101]})
|
||||
|
||||
def test_list_missions_by_printing_order_supports_category_filter(self):
|
||||
mission_models.Mission.objects.create(
|
||||
merchant=self.merchant,
|
||||
category=self.default_category,
|
||||
creator=self.employee,
|
||||
description="通用任务",
|
||||
content_type=self.printing_order_content_type,
|
||||
content_id=self.printing_order.id,
|
||||
)
|
||||
followup_mission = mission_models.Mission.objects.create(
|
||||
merchant=self.merchant,
|
||||
category=self.followup_category,
|
||||
creator=self.employee,
|
||||
description="跟进任务",
|
||||
content_type=self.printing_order_content_type,
|
||||
content_id=self.printing_order.id,
|
||||
)
|
||||
|
||||
resp = self.client.get(
|
||||
f"/api/v2/missions/by-printing-order/{self.printing_order.id}/?category_ids={self.followup_category.id}"
|
||||
)
|
||||
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertEqual([item["id"] for item in resp.data], [followup_mission.id])
|
||||
|
||||
def test_list_missions_by_printing_order_supports_lightweight_mode(self):
|
||||
mission = mission_models.Mission.objects.create(
|
||||
merchant=self.merchant,
|
||||
category=self.default_category,
|
||||
creator=self.employee,
|
||||
description="轻量任务",
|
||||
content_type=self.printing_order_content_type,
|
||||
content_id=self.printing_order.id,
|
||||
)
|
||||
mission_models.MissionParticipant.objects.create(
|
||||
merchant=self.merchant,
|
||||
mission=mission,
|
||||
employee=self.participant,
|
||||
)
|
||||
mission_models.MissionReply.objects.create(
|
||||
merchant=self.merchant,
|
||||
mission=mission,
|
||||
responder=self.employee,
|
||||
content="已处理",
|
||||
ends_task=True,
|
||||
)
|
||||
|
||||
resp = self.client.get(
|
||||
f"/api/v2/missions/by-printing-order/{self.printing_order.id}/?include_details=false"
|
||||
)
|
||||
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertEqual(len(resp.data), 1)
|
||||
self.assertEqual(resp.data[0]["id"], mission.id)
|
||||
self.assertNotIn("participants", resp.data[0])
|
||||
self.assertNotIn("has_ending_reply", resp.data[0])
|
||||
self.assertNotIn("can_reply", resp.data[0])
|
||||
self.assertNotIn("replies", resp.data[0])
|
||||
|
||||
def test_list_missions_by_printing_order_rejects_invalid_include_details(self):
|
||||
resp = self.client.get(
|
||||
f"/api/v2/missions/by-printing-order/{self.printing_order.id}/?include_details=maybe"
|
||||
)
|
||||
|
||||
self.assertEqual(resp.status_code, 400)
|
||||
self.assertIn("include_details", resp.data)
|
||||
|
||||
def test_list_missions_by_printing_order_uses_separate_cache_by_detail_mode(self):
|
||||
mission = mission_models.Mission.objects.create(
|
||||
merchant=self.merchant,
|
||||
category=self.default_category,
|
||||
creator=self.employee,
|
||||
description="缓存任务",
|
||||
content_type=self.printing_order_content_type,
|
||||
content_id=self.printing_order.id,
|
||||
)
|
||||
mission_models.MissionReply.objects.create(
|
||||
merchant=self.merchant,
|
||||
mission=mission,
|
||||
responder=self.employee,
|
||||
content="首次回复",
|
||||
)
|
||||
|
||||
detailed_resp = self.client.get(f"/api/v2/missions/by-printing-order/{self.printing_order.id}/")
|
||||
lightweight_resp = self.client.get(
|
||||
f"/api/v2/missions/by-printing-order/{self.printing_order.id}/?include_details=false"
|
||||
)
|
||||
|
||||
mission_models.MissionReply.objects.create(
|
||||
merchant=self.merchant,
|
||||
mission=mission,
|
||||
responder=self.employee,
|
||||
content="后续回复",
|
||||
)
|
||||
|
||||
detailed_cached_resp = self.client.get(f"/api/v2/missions/by-printing-order/{self.printing_order.id}/")
|
||||
lightweight_cached_resp = self.client.get(
|
||||
f"/api/v2/missions/by-printing-order/{self.printing_order.id}/?include_details=false"
|
||||
)
|
||||
|
||||
self.assertEqual(len(detailed_resp.data[0]["replies"]), 1)
|
||||
self.assertEqual(len(detailed_cached_resp.data[0]["replies"]), 1)
|
||||
self.assertNotIn("replies", lightweight_resp.data[0])
|
||||
self.assertNotIn("replies", lightweight_cached_resp.data[0])
|
||||
|
||||
def test_list_missions_by_printing_order_rejects_cross_merchant_order(self):
|
||||
resp = self.client.get(f"/api/v2/missions/by-printing-order/{self.other_printing_order.id}/")
|
||||
|
||||
self.assertEqual(resp.status_code, 404)
|
||||
|
||||
def test_delete_mission_is_not_allowed(self):
|
||||
mission = self._create_mission()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user