Files
geMoldInsight/tests/test_sales_order_delivered_freeze.py
T
2026-07-30 10:30:50 +08:00

80 lines
2.5 KiB
Python

import pytest
@pytest.mark.anyio
async def test_delivered_sales_order_cannot_be_updated_or_deleted(client):
payload = {
"customer_id": 1,
"delivery_date": None,
"remark": "test",
"items": [
{
"product_id": None,
"product_sku": "MOLD-001",
"product_name": "模具001",
"product_category": "模具",
"product_unit": "套",
"quantity": 1,
"unit_price": 1000.0,
"remark": None,
}
],
}
create_resp = await client.post("/api/sales-orders", json=payload)
assert create_resp.status_code == 201
order = create_resp.json()
order_id = order["id"]
status_resp = await client.patch(f"/api/sales-orders/{order_id}/status", json={"status": "delivered"})
assert status_resp.status_code == 200
update_resp = await client.put(f"/api/sales-orders/{order_id}", json=payload)
assert update_resp.status_code == 400 # 已交付订单禁止修改(服务层守卫)
delete_resp = await client.delete(f"/api/sales-orders/{order_id}")
assert delete_resp.status_code == 400
# delivered → paid 是允许的(业务上先交货再收款),但 delivered → manufacturing 不允许
patch_resp = await client.patch(f"/api/sales-orders/{order_id}/status", json={"status": "manufacturing"})
assert patch_resp.status_code == 400
@pytest.mark.anyio
async def test_non_delivered_sales_order_can_be_updated(client):
payload = {
"customer_id": 1,
"delivery_date": None,
"remark": "test",
"items": [
{
"product_id": None,
"product_sku": "MOLD-002",
"product_name": "模具002",
"product_category": "模具",
"product_unit": "套",
"quantity": 1,
"unit_price": 2000.0,
"remark": None,
}
],
}
create_resp = await client.post("/api/sales-orders", json=payload)
assert create_resp.status_code == 201
order_id = create_resp.json()["id"]
payload2 = {
**payload,
"remark": "changed",
"items": [
{
**payload["items"][0],
"quantity": 2,
}
],
}
update_resp = await client.put(f"/api/sales-orders/{order_id}", json=payload2)
assert update_resp.status_code == 200
assert float(update_resp.json()["total_amount"]) == 4000.0