forked from erp-dev/erp
fin
This commit is contained in:
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user