1
0
forked from erp-dev/erp
This commit is contained in:
2026-07-05 13:53:17 +08:00
parent 4538e51ad5
commit e1cc6df122
24 changed files with 3030 additions and 495 deletions

View File

@@ -1,8 +1,11 @@
from datetime import datetime
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 django.utils import timezone
from rest_framework.test import APIClient
from basic_info import models as basic_models
@@ -258,7 +261,146 @@ class MissionV2APITest(TestCase):
resp = self.client.get("/api/v2/missions/")
self.assertEqual(resp.status_code, 200)
self.assertEqual([item["id"] for item in resp.data], [visible.id])
self.assertEqual([item["id"] for item in resp.data["results"]], [visible.id])
self.assertEqual(resp.data["count"], 1)
def test_list_missions_supports_limit_offset_pagination(self):
_first = self._create_mission(description="第一条任务")
second = self._create_mission(description="第二条任务")
resp = self.client.get("/api/v2/missions/?limit=1&offset=0")
self.assertEqual(resp.status_code, 200)
self.assertEqual(resp.data["count"], 2)
self.assertEqual(len(resp.data["results"]), 1)
self.assertEqual(resp.data["results"][0]["id"], second.id)
self.assertIsNotNone(resp.data["next"])
def test_my_only_returns_related_missions_by_default(self):
created_by_me = self._create_mission(description="我创建的未完结任务")
participant_mission = mission_models.Mission.objects.create(
merchant=self.merchant,
category=self.default_category,
creator=self.participant,
description="我参与的未完结任务",
)
mission_models.MissionParticipant.objects.create(
merchant=self.merchant,
mission=participant_mission,
employee=self.employee,
)
unrelated = mission_models.Mission.objects.create(
merchant=self.merchant,
category=self.default_category,
creator=self.participant,
description="同商户但与我无关",
)
completed = self._create_mission(description="已完成任务")
completed.is_completed = True
completed.save(update_fields=["is_completed", "updated_at"])
cancelled = self._create_mission(description="已取消任务")
cancelled.is_cancelled = True
cancelled.save(update_fields=["is_cancelled", "updated_at"])
cross_merchant = mission_models.Mission.objects.create(
merchant=self.other_merchant,
category=self.other_category,
creator=self.other_employee,
description="跨商户任务",
)
resp = self.client.get("/api/v2/missions/my/")
self.assertEqual(resp.status_code, 200)
ids = {item["id"] for item in resp.data["results"]}
self.assertEqual(ids, {created_by_me.id, participant_mission.id, completed.id, cancelled.id})
self.assertNotIn(unrelated.id, ids)
self.assertNotIn(cross_merchant.id, ids)
self.assertEqual(resp.data["count"], 4)
def test_my_supports_status_urgent_created_by_me_created_at_range_and_pagination(self):
tz = timezone.get_current_timezone()
old_time = timezone.make_aware(datetime(2026, 7, 2, 10, 0, 0), tz)
day_time = timezone.make_aware(datetime(2026, 7, 3, 23, 30, 0), tz)
next_day_time = timezone.make_aware(datetime(2026, 7, 4, 0, 0, 0), tz)
old_urgent = self._create_mission(description="更早的紧急任务")
old_urgent.is_urgent = True
old_urgent.save(update_fields=["is_urgent", "updated_at"])
in_range_urgent = self._create_mission(description="当天紧急任务")
in_range_urgent.is_urgent = True
in_range_urgent.save(update_fields=["is_urgent", "updated_at"])
in_range_normal = self._create_mission(description="当天普通任务")
next_day_urgent = self._create_mission(description="次日紧急任务")
next_day_urgent.is_urgent = True
next_day_urgent.save(update_fields=["is_urgent", "updated_at"])
completed_urgent = self._create_mission(description="当天已完成紧急任务")
completed_urgent.is_urgent = True
completed_urgent.is_completed = True
completed_urgent.save(update_fields=["is_urgent", "is_completed", "updated_at"])
mission_models.Mission.objects.filter(id=old_urgent.id).update(created_at=old_time)
mission_models.Mission.objects.filter(id=in_range_urgent.id).update(created_at=day_time)
mission_models.Mission.objects.filter(id=in_range_normal.id).update(created_at=day_time)
mission_models.Mission.objects.filter(id=next_day_urgent.id).update(created_at=next_day_time)
mission_models.Mission.objects.filter(id=completed_urgent.id).update(created_at=day_time)
resp = self.client.get(
"/api/v2/missions/my/?created_by_me=true&is_completed=false&is_cancelled=false&is_urgent=true"
"&created_at_from=2026-07-03&created_at_to=2026-07-03&limit=1&offset=0"
)
self.assertEqual(resp.status_code, 200)
self.assertEqual(resp.data["count"], 1)
self.assertEqual([item["id"] for item in resp.data["results"]], [in_range_urgent.id])
def test_my_status_counts_groups_related_missions_without_duplicates(self):
open_created = self._create_mission(description="我创建的未完成任务")
mission_models.MissionParticipant.objects.create(
merchant=self.merchant,
mission=open_created,
employee=self.employee,
)
mission_models.MissionParticipant.objects.create(
merchant=self.merchant,
mission=open_created,
employee=self.participant,
)
completed_created = self._create_mission(description="我创建的已完成任务")
completed_created.is_completed = True
completed_created.save(update_fields=["is_completed", "updated_at"])
cancelled_participant = mission_models.Mission.objects.create(
merchant=self.merchant,
category=self.default_category,
creator=self.participant,
description="我参与的已取消任务",
is_cancelled=True,
)
mission_models.MissionParticipant.objects.create(
merchant=self.merchant,
mission=cancelled_participant,
employee=self.employee,
)
mission_models.Mission.objects.create(
merchant=self.merchant,
category=self.default_category,
creator=self.participant,
description="同商户但与我无关",
)
mission_models.Mission.objects.create(
merchant=self.other_merchant,
category=self.other_category,
creator=self.other_employee,
description="跨商户任务",
is_completed=True,
)
resp = self.client.get("/api/v2/missions/my/status-counts/")
self.assertEqual(resp.status_code, 200)
self.assertEqual(resp.data, {"total": 3, "open": 1, "completed": 1, "cancelled": 1})
def test_list_missions_by_printing_order_returns_nested_replies_and_extra(self):
mission = mission_models.Mission.objects.create(