1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
from __future__ import annotations
import asyncio
from pygitweb.change_queue import ChangeQueue
class TestChangeQueue:
def test_notify_wakes_waiter_with_project_name(self) -> None:
async def scenario() -> tuple[int, str | None, int]:
queue: ChangeQueue = ChangeQueue()
waiter: asyncio.Task[str | None] = asyncio.create_task(queue.wait_for_changes(["alpha"], timeout=2.0))
await asyncio.sleep(0)
woken: int = await queue.notify("alpha")
result: str | None = await waiter
leftover: int = await queue.waiter_count()
return woken, result, leftover
woken, result, leftover = asyncio.run(scenario())
assert woken == 1
assert result == "alpha"
assert leftover == 0
def test_wait_returns_none_on_timeout(self) -> None:
async def scenario() -> tuple[str | None, int]:
queue: ChangeQueue = ChangeQueue()
outcome: str | None = await queue.wait_for_changes(["alpha"], timeout=0.05)
leftover: int = await queue.waiter_count("alpha")
return outcome, leftover
outcome, leftover = asyncio.run(scenario())
assert outcome is None
assert leftover == 0
def test_notify_only_wakes_subscribed_waiters(self) -> None:
async def scenario() -> tuple[int, str | None]:
queue: ChangeQueue = ChangeQueue()
waiter: asyncio.Task[str | None] = asyncio.create_task(queue.wait_for_changes(["alpha"], timeout=0.2))
await asyncio.sleep(0)
woken: int = await queue.notify("beta")
outcome: str | None = await waiter
return woken, outcome
woken, outcome = asyncio.run(scenario())
assert woken == 0
assert outcome is None
def test_wait_for_multiple_projects_wakes_on_any(self) -> None:
async def scenario() -> tuple[str | None, int]:
queue: ChangeQueue = ChangeQueue()
waiter: asyncio.Task[str | None] = asyncio.create_task(
queue.wait_for_changes(["alpha", "group/beta"], timeout=2.0)
)
await asyncio.sleep(0)
await queue.notify("group/beta")
outcome: str | None = await waiter
leftover: int = await queue.waiter_count()
return outcome, leftover
outcome, leftover = asyncio.run(scenario())
assert outcome == "group/beta"
assert leftover == 0
def test_notify_returns_zero_when_no_waiters(self) -> None:
async def scenario() -> int:
queue: ChangeQueue = ChangeQueue()
return await queue.notify("alpha")
assert asyncio.run(scenario()) == 0