fix(compare): coupon_name 端到端透传 + 兑换下限正向测试

代码评审(server#12 / pricebot#38)修复:
- ComparisonResultIn / comparison 模型 / DB·API 文档补 coupon_name(优惠来源名),
  否则 pydantic 在上报边界静默丢弃,记录页来源 chip 落不了地;扩展 passthrough 测试覆盖
- 新增最小额兑换正向用例,钉死 MIN_EXCHANGE_COIN=100(可兑 1 分)新下限

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
OuYingJun1024
2026-06-05 15:59:43 +08:00
parent 1893c01f54
commit 8fea6d2b5d
6 changed files with 57 additions and 5 deletions
+5 -2
View File
@@ -33,7 +33,8 @@ def _food_payload(trace_id: str) -> dict:
],
"comparison_results": [
{"platform_id": "meituan", "platform_name": "美团", "package": "com.sankuai.meituan",
"price": 123.50, "is_source": False, "rank": 1, "coupon_saved": 7.0},
"price": 123.50, "is_source": False, "rank": 1,
"coupon_saved": 7.0, "coupon_name": "外卖大额神券"},
{"platform_id": "taobao_flash", "platform_name": "淘宝闪购", "package": "com.taobao.taobao",
"price": 128.50, "is_source": True, "rank": 2},
{"platform_id": "jd_waimai", "platform_name": "京东外卖", "package": "com.jingdong.app.mall",
@@ -79,7 +80,7 @@ def test_report_and_derive(client) -> None:
def test_coupon_saved_passthrough(client) -> None:
"""红包优惠额 coupon_saved 上报→落库→读出;仅目标平台带值,源平台不带(null)。"""
"""红包优惠额 coupon_saved + 来源名 coupon_name 上报→落库→读出;仅目标平台带值,源平台不带(null)。"""
token = _login(client, "13800002010")
rid = client.post(
"/api/v1/compare/record", json=_food_payload("trace-coupon"), headers=_auth(token)
@@ -87,7 +88,9 @@ def test_coupon_saved_passthrough(client) -> None:
d = client.get(f"/api/v1/compare/records/{rid}", headers=_auth(token)).json()
by_pid = {x["platform_id"]: x for x in d["comparison_results"]}
assert by_pid["meituan"]["coupon_saved"] == 7.0 # 目标平台带值
assert by_pid["meituan"]["coupon_name"] == "外卖大额神券" # 来源名透传(pricebot#38)
assert by_pid["taobao_flash"].get("coupon_saved") is None # 源平台不带/为 null
assert by_pid["taobao_flash"].get("coupon_name") is None # 源平台无来源名
def test_source_is_cheapest_no_saving(client) -> None: