dingdanquanliucheng/backend/tests/test_logistics_extended.py
2026-06-19 23:03:14 +08:00

130 lines
5.0 KiB
Python

"""物流管理扩展测试。
测试用例:
- TASK-001c: 物流任务列表查询
- TASK-001d: 物流任务详情
- TASK-001e: 更新运单号
- TASK-001f: 取消物流任务
- LOG-001: 手动添加物流轨迹
- LOG-002: 查询物流轨迹
- TASK-013b: 批量提交运单号
- TASK-013c: 查询运单列表
"""
from __future__ import annotations
import pytest
@pytest.mark.logistics
@pytest.mark.p1
class TestLogisticsTaskCRUD:
"""物流任务 CRUD 扩展。"""
def test_task_list(self, client, admin_headers, make_task):
"""TASK-001c: 物流任务列表查询。"""
make_task()
resp = client.get("/api/logistics/tasks", headers=admin_headers)
assert resp.status_code == 200
assert "list" in resp.json()["data"]
def test_task_detail(self, client, admin_headers, make_task):
"""TASK-001d: 物流任务详情。"""
task = make_task()
resp = client.get(f"/api/logistics/tasks/{task.id}", headers=admin_headers)
assert resp.status_code == 200
def test_update_tracking_number(self, client, admin_headers, make_task):
"""TASK-001e: 更新运单号。"""
task = make_task()
resp = client.put(f"/api/logistics/tasks/{task.id}/tracking", headers=admin_headers, json={
"tracking_number": "SF1234567890",
"express_company": "顺丰",
})
assert resp.status_code in (200, 422)
def test_cancel_logistics_task(self, client, admin_headers, make_task):
"""TASK-001f: 取消物流任务。"""
task = make_task(status="pending")
resp = client.post(f"/api/logistics/tasks/{task.id}/cancel", headers=admin_headers, json={
"cancel_reason": "客户取消",
})
assert resp.status_code in (200, 400)
def test_create_task_invalid_order(self, client, admin_headers):
"""无效订单创建任务应失败。"""
resp = client.post("/api/logistics/tasks", headers=admin_headers, json={
"order_id": 99999,
"driver_id": 5,
"pickup_address": "工厂",
"delivery_address": "仓库",
})
assert resp.status_code in (400, 404, 422)
def test_driver_task_detail(self, client, driver_headers, make_task):
"""司机查看任务详情。"""
task = make_task(driver_id=5)
resp = client.get(f"/api/driver/tasks/{task.id}", headers=driver_headers)
assert resp.status_code == 200
def test_driver_accept_task(self, client, driver_headers, make_task):
"""司机接单。"""
task = make_task(status="pending", driver_id=5)
resp = client.post(f"/api/driver/tasks/{task.id}/accept", headers=driver_headers, json={})
assert resp.status_code in (200, 422)
def test_driver_pickup_task(self, client, driver_headers, make_task):
"""司机提货。"""
task = make_task(status="accepted", driver_id=5)
resp = client.post(f"/api/driver/tasks/{task.id}/pickup", headers=driver_headers, json={})
assert resp.status_code in (200, 400, 422)
def test_driver_deliver_task(self, client, driver_headers, make_task):
"""司机送达。"""
task = make_task(status="picked_up", driver_id=5)
resp = client.post(f"/api/driver/tasks/{task.id}/deliver", headers=driver_headers, json={})
assert resp.status_code in (200, 422)
@pytest.mark.logistics
@pytest.mark.p1
class TestLogisticsTrace:
"""物流轨迹测试。"""
def test_create_logistics_trace(self, client, admin_headers, make_order):
"""LOG-001: 手动添加物流轨迹。"""
order = make_order(order_status="approved")
resp = client.post(f"/api/logistics/{order.id}/trace", headers=admin_headers, json={
"description": "货物已发出",
"source": "manual",
})
assert resp.status_code in (200, 404, 422)
def test_query_logistics_trace(self, client, admin_headers, make_order):
"""LOG-002: 查询物流轨迹。"""
order = make_order(order_status="approved")
resp = client.get(f"/api/logistics/{order.id}/trace", headers=admin_headers)
assert resp.status_code == 200
@pytest.mark.logistics
@pytest.mark.p1
class TestWaybill:
"""运单管理测试。"""
def test_submit_waybills(self, client, driver_headers, make_task):
"""TASK-013b: 批量提交运单号。"""
task = make_task(status="accepted", driver_id=5)
resp = client.post(f"/api/driver/tasks/{task.id}/waybills", headers=driver_headers, json={
"waybills": [
{"tracking_number": "SF001", "express_company": "顺丰"},
{"tracking_number": "YT002", "express_company": "圆通"},
]
})
assert resp.status_code in (200, 422)
def test_list_waybills(self, client, driver_headers, make_task):
"""TASK-013c: 查询运单列表。"""
task = make_task(status="accepted", driver_id=5)
resp = client.get(f"/api/driver/tasks/{task.id}/waybills", headers=driver_headers)
assert resp.status_code == 200