fix(growth): stabilize comparison coverage cohort
This commit is contained in:
@@ -330,6 +330,45 @@ def test_pchome_growth_coverage_states_are_mutually_exclusive():
|
||||
assert stats["comparison_metric_contract"]["state_partition"]["mutually_exclusive"] is True
|
||||
|
||||
|
||||
def test_pchome_growth_coverage_scope_is_fixed_before_mapping_priority():
|
||||
from services.pchome_revenue_growth_service import build_pchome_growth_opportunities
|
||||
|
||||
engine = create_engine("sqlite:///:memory:")
|
||||
_seed_growth_tables(engine)
|
||||
with engine.begin() as conn:
|
||||
conn.execute(text("""
|
||||
INSERT INTO daily_sales_snapshot
|
||||
("商品ID", "商品名稱", snapshot_date, "總業績", "數量", "商品館")
|
||||
VALUES
|
||||
('PCH-3', '營收第三名', '2026-06-14', 150000, 30, '保養'),
|
||||
('PCH-4', '營收第四名', '2026-06-14', 145000, 29, '保養'),
|
||||
('PCH-5', '營收第五名', '2026-06-14', 140000, 28, '保養'),
|
||||
('PCH-6', '營收第六名', '2026-06-14', 135000, 27, '保養')
|
||||
"""))
|
||||
|
||||
payload = build_pchome_growth_opportunities(engine, limit=5)
|
||||
product_ids = {
|
||||
item["pchome_product_id"] for item in payload["opportunities"]
|
||||
}
|
||||
contract = payload["stats"]["comparison_metric_contract"]
|
||||
|
||||
assert "PCH-1" in product_ids
|
||||
assert "PCH-2" not in product_ids
|
||||
assert contract["version"] == "pchome_comparison_coverage_v3"
|
||||
assert contract["scope"] == "top_5_revenue_products"
|
||||
assert contract["numerator"] == 1
|
||||
assert contract["denominator"] == 5
|
||||
assert contract["rate"] == 20.0
|
||||
assert contract["scope_membership"] == {
|
||||
"selection_stage": "before_action_priority_scoring",
|
||||
"ranking": "max_current_or_previous_7d_revenue_desc_then_qty_desc_then_product_id_asc",
|
||||
"member_count": 5,
|
||||
"fingerprint_sha256": contract["scope_membership"]["fingerprint_sha256"],
|
||||
"mapping_status_can_change_membership": False,
|
||||
}
|
||||
assert len(contract["scope_membership"]["fingerprint_sha256"]) == 24
|
||||
|
||||
|
||||
def test_momo_review_candidates_return_dual_store_links_and_plain_reasons():
|
||||
from services.external_market_offer_service import list_momo_review_candidates
|
||||
|
||||
|
||||
Reference in New Issue
Block a user