import uuid from app.api.scenes import _diversify_pages def _ids(n, origin): return [(uuid.uuid4(), origin) for _ in range(n)] def _mixed(flood_share=0.7, n=300, others=("b", "c", "d")): """Jak feed 2026-09-19: jedno zrodlo zalewa, reszta kapie, wszystko w kolejnosci czasu.""" items, k = [], 0 for i in range(n): if (i % 10) < flood_share * 10: items.append((uuid.uuid4(), "flood")) else: items.append((uuid.uuid4(), others[k % len(others)])) k += 1 return items def test_flood_is_capped_while_other_sources_exist(): items = _mixed() pages = _diversify_pages(items, 10, 1 / 3) origin = dict(items) # 90 scen z innych zrodel wystarcza na 15 stron po 6; tyle stron trzyma limit for pg in pages[:15]: assert len(pg) == 10 assert sum(origin[i] == "flood" for i in pg) <= 4 def test_nothing_is_lost_and_pages_are_full(): items = _mixed() pages = _diversify_pages(items, 10, 1 / 3) assert sorted(i for pg in pages for i in pg) == sorted(i for i, _ in items) assert all(len(pg) == 10 for pg in pages[:-1]) def test_two_sources_still_fill_pages(): items = _ids(40, "a") + _ids(40, "b") pages = _diversify_pages(items, 10, 1 / 3) assert all(len(pg) == 10 for pg in pages) def test_order_within_source_is_kept(): items = _mixed() flat = [i for pg in _diversify_pages(items, 10, 1 / 3) for i in pg] for src in ("flood", "b", "c", "d"): mine = [i for i, o in items if o == src] mine_set = set(mine) assert [i for i in flat if i in mine_set] == mine