"""集成测试共用工厂:客户 → 业务 → 明细的最小造数链。 回款/发货/业务三个测试文件此前各持一份逐字相同的工厂(口径漂移已经 发生:同一 _customer 三份、payload 细节靠复制维持),收口后「t_ 前缀、 默认明细行、业务日期取今日」单点维护;conftest 兜底清理按 t_ 前缀与 YW/SH/HK 编号前缀覆盖本模块全部造数。 """ import uuid from datetime import date from fastapi.testclient import TestClient _CUSTOMERS = "/api/v1/base/customers" _BUSINESSES = "/api/v1/business/businesses" def customer(client: TestClient, headers: dict) -> dict: """建一名 t_ 前缀测试客户(业务的必选引用)。""" resp = client.post( _CUSTOMERS, json={ "company_name": f"t_公司_{uuid.uuid4().hex[:8]}", "owner_name": "张老板", "customer_type": "personal", }, headers=headers, ) assert resp.status_code == 200, resp.text return resp.json()["data"] def business_item(**overrides: object) -> dict: """业务明细行入参(默认:数量 100 × 单价 100.00 = 销售额 10000)。""" body: dict = { "product_name": f"t_产品_{uuid.uuid4().hex[:8]}", "product_category": "municipal_water", "quantity": "100", "sale_price": "100.00", } body.update(overrides) return body def business_payload(customer_id: int, **overrides: object) -> dict: body: dict = { "customer_id": customer_id, "business_date": str(date.today()), "items": [business_item()], } body.update(overrides) return body def create_business(client: TestClient, headers: dict) -> dict: """建一名 t_ 客户并挂一笔默认业务(发货/回款须先有业务)。""" cust = customer(client, headers) resp = client.post(_BUSINESSES, json=business_payload(cust["id"]), headers=headers) assert resp.status_code == 200, resp.text return resp.json()["data"]