Files
ewoooc/tests/test_marketplace_product_matcher.py
OoO 205b9ea3f6
All checks were successful
CD Pipeline / deploy (push) Successful in 1m11s
強化商品線配對與組合 veto
2026-05-19 23:13:54 +08:00

134 lines
4.9 KiB
Python

from sqlalchemy import create_engine, text
def test_marketplace_matcher_accepts_same_product_identity():
from services.marketplace_product_matcher import score_marketplace_match
diagnostics = score_marketplace_match(
"理膚寶水 B5 修復霜 40ml",
"理膚寶水 全面修復霜 B5 40ml",
momo_price=699,
competitor_price=679,
)
assert diagnostics.score >= 0.9
assert diagnostics.hard_veto is False
assert "brand_match" in diagnostics.tags
assert "spec_match" in diagnostics.tags
def test_marketplace_matcher_rejects_brand_conflict_even_when_volume_matches():
from services.marketplace_product_matcher import score_marketplace_match
diagnostics = score_marketplace_match(
"【蘭蔻】官方直營 玫瑰霜60ml+玫瑰精露150ml",
"LOREAL Paris 巴黎萊雅 金致臻顏花蜜奢養膠原輕盈乳霜_60ml",
momo_price=18765,
competitor_price=1249,
)
assert diagnostics.score < 0.76
assert diagnostics.hard_veto is True
assert "brand_conflict" in diagnostics.reasons
def test_marketplace_matcher_rejects_volume_conflict_for_same_brand():
from services.marketplace_product_matcher import score_marketplace_match
diagnostics = score_marketplace_match(
"【CLARINS 克蘭詩】黃金亮眼萃20mlX2囤貨組",
"【CLARINS克蘭詩】黃金雙萃精華 75ml",
momo_price=4500,
competitor_price=3549,
)
assert diagnostics.score < 0.76
assert diagnostics.hard_veto is True
assert "volume_conflict" in diagnostics.reasons
def test_marketplace_matcher_handles_bundle_piece_count():
from services.marketplace_product_matcher import score_marketplace_match
diagnostics = score_marketplace_match(
"【Relove】馬甲纖纖飲-莓果風味X3盒 共72包",
"【3入超值組】Relove 馬甲纖纖飲 24包/7克",
momo_price=4590,
competitor_price=4590,
)
assert diagnostics.score >= 0.76
assert diagnostics.hard_veto is False
def test_marketplace_matcher_accepts_strong_model_line_without_specs():
from services.marketplace_product_matcher import score_marketplace_match
diagnostics = score_marketplace_match(
"【Stadler Form】Sophie 無線香氛水氧機 水氧機 香氛機",
"【瑞士Stadler Form】無線香氛水氧機 露營燈造型 Sophie",
momo_price=3780,
competitor_price=3980,
)
assert diagnostics.score >= 0.76
assert diagnostics.hard_veto is False
assert "strong_product_line_match" in diagnostics.reasons
def test_marketplace_matcher_rejects_bundle_to_single_even_when_brand_matches():
from services.marketplace_product_matcher import score_marketplace_match
diagnostics = score_marketplace_match(
"【NARS】小白餅閨蜜分享組(裸光蜜粉餅/定妝蜜粉)",
"【NARS】裸光蜜粉餅(小白餅) 10g",
momo_price=3300,
competitor_price=1099,
)
assert diagnostics.score < 0.76
assert diagnostics.hard_veto is True
assert "bundle_offer_conflict" in diagnostics.reasons
def test_marketplace_matcher_does_not_promote_wide_price_refill_candidate():
from services.marketplace_product_matcher import score_marketplace_match
diagnostics = score_marketplace_match(
"【蘭蔻】官方直營 絕對完美永生玫瑰逆齡乳霜60ml補充瓶",
"LANCOME蘭蔻 絕對完美永生玫瑰逆齡乳霜 60ml",
momo_price=11205,
competitor_price=5349,
)
assert diagnostics.score < 0.76
assert diagnostics.hard_veto is True
assert "refill_pack_conflict" in diagnostics.reasons
assert "strong_product_line_match" not in diagnostics.reasons
def test_batch_compare_top_uses_latest_momo_price_not_revenue(monkeypatch):
from services import pchome_crawler
engine = create_engine("sqlite:///:memory:")
with engine.begin() as conn:
conn.execute(text("CREATE TABLE products (id INTEGER PRIMARY KEY, name TEXT, i_code TEXT)"))
conn.execute(text("CREATE TABLE daily_sales (product_id INTEGER, revenue NUMERIC, date TEXT)"))
conn.execute(text("CREATE TABLE price_records (id INTEGER PRIMARY KEY, product_id INTEGER, price NUMERIC, timestamp TEXT)"))
conn.execute(text("INSERT INTO products VALUES (1, '理膚寶水 B5 修復霜 40ml', 'SKU001')"))
conn.execute(text("INSERT INTO daily_sales VALUES (1, 999999, '2026-05-19')"))
conn.execute(text("INSERT INTO price_records VALUES (1, 1, 699, '2026-05-19 10:00:00')"))
calls = []
def fake_compare_product(name, momo_price, momo_icode=""):
calls.append((name, momo_price, momo_icode))
return {"found": True, "momo_price": momo_price}
monkeypatch.setattr(pchome_crawler, "compare_product", fake_compare_product)
results = pchome_crawler.batch_compare_top(engine, top_n=1)
assert results == [{"found": True, "momo_price": 699.0}]
assert calls == [("理膚寶水 B5 修復霜 40ml", 699.0, "SKU001")]