Files
cmpdd/tests/test_models.py
T

89 lines
2.9 KiB
Python
Raw Normal View History

"""核心数据模型与状态枚举测试(T-002)。"""
import unittest
from datetime import datetime
from decimal import Decimal
from src.core.models import OrderTask
from src.core.status import TaskStatus
class TaskStatusTest(unittest.TestCase):
# 与 04-architecture.md §3.4 中英映射表保持一致
EXPECTED = {
TaskStatus.PENDING: "待执行",
TaskStatus.RUNNING: "执行中",
TaskStatus.MANUAL: "待人工",
TaskStatus.SUCCESS: "成功",
TaskStatus.FAILED: "失败",
TaskStatus.CANCELLED: "已取消",
}
def test_members_complete(self):
"""枚举成员恰好为文档定义的六个。"""
self.assertEqual(set(TaskStatus), set(self.EXPECTED))
def test_display_name(self):
for status, zh in self.EXPECTED.items():
self.assertEqual(status.display_name, zh)
def test_display_names_unique(self):
names = [s.display_name for s in TaskStatus]
self.assertEqual(len(names), len(set(names)))
def test_from_display_roundtrip(self):
for status in TaskStatus:
self.assertIs(TaskStatus.from_display(status.display_name), status)
def test_from_display_unknown_raises(self):
with self.assertRaises(ValueError):
TaskStatus.from_display("不存在的状态")
class OrderTaskTest(unittest.TestCase):
def _minimal(self) -> OrderTask:
return OrderTask(
task_id="T1",
row_index=2,
product_url="https://example.com/p",
sku_text="颜色=黑色;尺码=XL",
quantity=1,
)
def test_defaults(self):
task = self._minimal()
self.assertEqual(task.status, TaskStatus.PENDING)
self.assertEqual(task.sku_items, {})
self.assertIsNone(task.order_no)
self.assertIsNone(task.expected_amount)
def test_sku_items_not_shared(self):
"""default_factory 确保每个实例拥有独立 dict,不互相串改。"""
a = self._minimal()
b = self._minimal()
a.sku_items["颜色"] = "黑色"
self.assertEqual(b.sku_items, {})
def test_full_construction(self):
task = OrderTask(
task_id="T2",
row_index=3,
product_url="https://example.com/p2",
sku_text="套餐=单件",
quantity=2,
sku_items={"套餐": "单件"},
product_name="测试商品",
expected_amount=Decimal("9.90"),
max_pay_amount=Decimal("10.00"),
status=TaskStatus.SUCCESS,
order_no="2026000001",
started_at=datetime(2026, 6, 24, 10, 0, 0),
)
self.assertEqual(task.quantity, 2)
self.assertEqual(task.expected_amount, Decimal("9.90"))
self.assertEqual(task.status, TaskStatus.SUCCESS)
self.assertEqual(task.sku_items["套餐"], "单件")
if __name__ == "__main__":
unittest.main()