import asyncio
from main import fetch_limited
def counting_fetch():
"""A fake fetch that records how many calls are waiting at the same time."""
state = {"running": 0, "peak": 0}
async def fetch(name):
state["running"] += 1
state["peak"] = max(state["peak"], state["running"])
await asyncio.sleep(0.01)
state["running"] -= 1
return name.upper()
return fetch, state
def test_results_in_order():
"""Jeder Name liefert seinen Text, in der Reihenfolge von names"""
fetch, _ = counting_fetch()
got = asyncio.run(fetch_limited(["home", "about", "blog"], fetch, 2))
assert got == ["HOME", "ABOUT", "BLOG"], f"fetch_limited lieferte {got!r}"
def test_limit_is_kept():
"""Mit limit 2 laufen nie mehr als 2 Abrufe gleichzeitig"""
fetch, state = counting_fetch()
asyncio.run(fetch_limited(["a", "b", "c", "d", "e"], fetch, 2))
assert state["peak"] == 2, f"{state['peak']} Abrufe liefen gleichzeitig, erwartet waren höchstens 2: halten Sie eine gemeinsame Semaphore um jeden Abruf"
def test_limit_is_used():
"""Mit limit 3 laufen wirklich drei Abrufe gleichzeitig"""
fetch, state = counting_fetch()
asyncio.run(fetch_limited(["a", "b", "c", "d", "e"], fetch, 3))
assert state["peak"] == 3, f"{state['peak']} Abrufe liefen gleichzeitig, erwartet waren 3: legen Sie die Semaphore einmal an, nicht in jedem Abruf"