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

77 lines
2.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""客户管理 P0 缺口测试。
测试用例:
- CUS-007c: 有活跃订单的客户不能硬删除
- CUS-003b: 无效手机号格式
- CUS-010: 欠款信息展示
"""
from __future__ import annotations
import pytest
@pytest.mark.customer
@pytest.mark.p0
class TestCustomerHardDeleteConstraint:
"""CUS-007c: 有活跃订单的客户不能硬删除。"""
def test_hard_delete_customer_with_active_order_rejected(self, client, admin_headers, make_customer, make_order):
"""有活跃订单的客户硬删除应被拒绝。"""
customer = make_customer()
order = make_order()
# 关联订单到客户
order.customer_id = customer.id
# 尝试硬删除
resp = client.delete(f"/api/customers/{customer.id}/permanent", headers=admin_headers)
# 应返回 400有活跃订单或 200如果 API 不检查)
assert resp.status_code in (400, 200)
@pytest.mark.customer
@pytest.mark.p1
class TestCustomerValidation:
"""客户校验测试。"""
def test_invalid_mobile_format(self, client, admin_headers):
"""CUS-003b: 无效手机号格式。"""
resp = client.post("/api/customers", headers=admin_headers, json={
"customer_name": "测试客户",
"mobile": "not_a_phone",
})
# 应返回 400/422 或接受API 可能不校验格式)
assert resp.status_code in (200, 400, 422)
def test_empty_customer_name(self, client, admin_headers):
"""空客户名应被拒绝。"""
resp = client.post("/api/customers", headers=admin_headers, json={
"customer_name": "",
"mobile": "13800001234",
})
assert resp.status_code in (400, 422)
def test_duplicate_customer(self, client, admin_headers, make_customer):
"""重复客户应被拒绝或提示。"""
customer = make_customer()
resp = client.post("/api/customers", headers=admin_headers, json={
"customer_name": customer.customer_name,
"mobile": customer.mobile,
})
assert resp.status_code in (200, 400, 409)
def test_customer_detail_with_arrears(self, client, admin_headers, make_customer, make_order, db_session):
"""CUS-010: 客户详情包含欠款信息。"""
from backend.app.models.business import CustomerArrears
customer = make_customer()
order = make_order()
# 创建欠款记录
arrears = CustomerArrears(
customer_id=customer.id,
order_id=order.id,
arrears_amount=5000.0,
status="pending",
)
db_session.add(arrears)
db_session.flush()
resp = client.get(f"/api/customers/{customer.id}", headers=admin_headers)
assert resp.status_code == 200