|
|
|
@@ -140,6 +140,75 @@ def test_harvest_done_failed_derives_fail_reason(client) -> None:
|
|
|
|
|
assert rec.information == "比价过程出错,请稍后重试" # 原文案仍留存
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _done_params_platforms_no_isbest() -> dict:
|
|
|
|
|
"""id 3304 型:done 帧 platforms 全平台「相似替换/仅供参考」(has_dish_diff),pricebot
|
|
|
|
|
一个 is_best 都没标,但有有价目标(美团 57.8 < 源淘宝闪购 60.8)。"""
|
|
|
|
|
return {
|
|
|
|
|
"platforms": [
|
|
|
|
|
{"role": "source", "platform_id": "eleme", "platform_name": "淘宝闪购",
|
|
|
|
|
"package": "me.ele", "price": 60.8, "is_best": False, "has_dish_diff": False,
|
|
|
|
|
"store_name": "窑鸡王", "items": [{"name": "招牌窑鸡 整只-香辣", "qty": 1}]},
|
|
|
|
|
{"role": "target", "platform_id": "meituan_waimai", "platform_name": "美团外卖",
|
|
|
|
|
"package": "com.sankuai.meituan.takeoutnew", "price": 57.8, "is_best": False,
|
|
|
|
|
"has_dish_diff": True},
|
|
|
|
|
{"role": "target", "platform_id": "jd_waimai_standalone", "platform_name": "京东外卖",
|
|
|
|
|
"package": "com.jd.waimai", "price": 74.9, "is_best": False, "has_dish_diff": True},
|
|
|
|
|
],
|
|
|
|
|
"information": "美团更便宜(含相似商品替换)",
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_harvest_done_platforms_no_isbest_falls_back_to_cheapest_target(client) -> None:
|
|
|
|
|
"""回归(id 3304):platforms 全无 is_best(全平台相似替换)但有有价目标 → best 应兜底取
|
|
|
|
|
有价目标里最低那家,不能让 best_*/saved 整条落 NULL(否则首页价 0.00 / 记录页无最低红框 /
|
|
|
|
|
省额丢失)。"""
|
|
|
|
|
tid = _tid()
|
|
|
|
|
with SessionLocal() as db:
|
|
|
|
|
crud.harvest_running(db, trace_id=tid, user_id=None)
|
|
|
|
|
rec, _ = crud.harvest_done(db, trace_id=tid, user_id=None,
|
|
|
|
|
done_params=_done_params_platforms_no_isbest())
|
|
|
|
|
assert rec.status == "success"
|
|
|
|
|
assert rec.best_platform_id == "meituan_waimai" # 有价目标里最低
|
|
|
|
|
assert rec.best_price_cents == 5780 # 57.8 元
|
|
|
|
|
assert rec.source_price_cents == 6080 # 源淘宝闪购 60.8
|
|
|
|
|
assert rec.saved_amount_cents == 300 # 60.8 - 57.8
|
|
|
|
|
assert rec.is_source_best is False # 兜底选的是目标,非源
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _done_params_no_isbest_source_cheapest() -> dict:
|
|
|
|
|
"""无 is_best 且源本身最便宜:源淘宝闪购 50.0 < 全部 dish-diff 目标(美团 57.8 / 京东 74.9)。
|
|
|
|
|
此时不能强选更贵的目标当 best(否则 saved 变负、污染「累计发现可省」),应回落源。"""
|
|
|
|
|
return {
|
|
|
|
|
"platforms": [
|
|
|
|
|
{"role": "source", "platform_id": "eleme", "platform_name": "淘宝闪购",
|
|
|
|
|
"package": "me.ele", "price": 50.0, "is_best": False, "has_dish_diff": False,
|
|
|
|
|
"store_name": "窑鸡王", "items": [{"name": "招牌窑鸡 整只-香辣", "qty": 1}]},
|
|
|
|
|
{"role": "target", "platform_id": "meituan_waimai", "platform_name": "美团外卖",
|
|
|
|
|
"package": "com.sankuai.meituan.takeoutnew", "price": 57.8, "is_best": False,
|
|
|
|
|
"has_dish_diff": True},
|
|
|
|
|
{"role": "target", "platform_id": "jd_waimai_standalone", "platform_name": "京东外卖",
|
|
|
|
|
"package": "com.jd.waimai", "price": 74.9, "is_best": False, "has_dish_diff": True},
|
|
|
|
|
],
|
|
|
|
|
"information": "源平台已是最低(其余为相似替换)",
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_harvest_done_no_isbest_source_cheapest_falls_back_to_source(client) -> None:
|
|
|
|
|
"""回归:无 is_best 且源最便宜 → best 回落源(与 _derive「全目标缺菜回落源、不虚报省」同语义),
|
|
|
|
|
saved=0、is_source_best=True,绝不因强选更贵目标而让 saved 变负、倒扣「累计发现可省」。"""
|
|
|
|
|
tid = _tid()
|
|
|
|
|
with SessionLocal() as db:
|
|
|
|
|
crud.harvest_running(db, trace_id=tid, user_id=None)
|
|
|
|
|
rec, _ = crud.harvest_done(db, trace_id=tid, user_id=None,
|
|
|
|
|
done_params=_done_params_no_isbest_source_cheapest())
|
|
|
|
|
assert rec.status == "success"
|
|
|
|
|
assert rec.best_platform_id == "eleme" # 回落到源(源最便宜)
|
|
|
|
|
assert rec.best_price_cents == 5000 # 源 50.0
|
|
|
|
|
assert rec.source_price_cents == 5000
|
|
|
|
|
assert rec.saved_amount_cents == 0 # 没省到,绝不为负
|
|
|
|
|
assert rec.is_source_best is True # 源就是最便宜
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_harvest_abort_cancels_running(client) -> None:
|
|
|
|
|
tid = _tid()
|
|
|
|
|
with SessionLocal() as db:
|
|
|
|
|