from goodnews.lanes import build_lane_pool, known_lane_keys, DEFAULT_LANES def test_pool_shape_and_pinned(): pool = build_lane_pool({"science": 100}, {"space": 200, "food": 0, "innovation": 99}) pinned_keys = [p["key"] for p in pool["pinned"]] assert pinned_keys == ["today", "latest"] # Highlights + Latest, always first assert pool["default"] == DEFAULT_LANES names = [g["name"] for g in pool["groups"]] assert names == ["Moods", "Topics", "Discovery"] # pinned lanes are never part of the selectable pool. assert "today" not in known_lane_keys(pool) and "latest" not in known_lane_keys(pool) def test_topics_are_bare_keys_tags_are_prefixed(): pool = build_lane_pool({"science": 5}, {}) topics = next(g for g in pool["groups"] if g["name"] == "Topics")["lanes"] assert any(l["key"] == "science" for l in topics) # bare topic key disc = next(g for g in pool["groups"] if g["name"] == "Discovery")["lanes"] assert all(l["key"].startswith("tag:") for l in disc) def test_volume_gate_and_always_offer(): # space/food are always offered; a low-volume non-curated tag is dropped. pool = build_lane_pool({}, {"space": 1, "food": 0, "resilience": 3, "innovation": 999}) disc_keys = {l["key"] for l in next(g for g in pool["groups"] if g["name"] == "Discovery")["lanes"]} assert "tag:space" in disc_keys and "tag:food" in disc_keys assert "tag:innovation" in disc_keys # over threshold assert "tag:resilience" not in disc_keys # under threshold, not curated def test_topic_named_tags_excluded_from_discovery(): # a tag that duplicates a primary topic must not appear as a Discovery lane pool = build_lane_pool({}, {"science": 999, "technology": 999}) disc_keys = {l["key"] for l in next(g for g in pool["groups"] if g["name"] == "Discovery")["lanes"]} assert "tag:science" not in disc_keys and "tag:technology" not in disc_keys