feat(server): 新增 ProgressHub 进程内进度发布/订阅单例
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
import asyncio
|
||||
import pytest
|
||||
from genesis.server.hub import ProgressHub
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_subscribe_receives_emitted_event():
|
||||
h = ProgressHub()
|
||||
h.register_loop(asyncio.get_running_loop())
|
||||
q = h.subscribe("s1")
|
||||
h.emit("s1", {"type": "progress", "step": "parse", "status": "ok"})
|
||||
event = await asyncio.wait_for(q.get(), 1.0)
|
||||
assert event["step"] == "parse"
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_unsubscribe_stops_delivery():
|
||||
h = ProgressHub()
|
||||
h.register_loop(asyncio.get_running_loop())
|
||||
q = h.subscribe("s1")
|
||||
h.unsubscribe("s1", q)
|
||||
h.emit("s1", {"type": "progress"})
|
||||
with pytest.raises(asyncio.TimeoutError):
|
||||
await asyncio.wait_for(q.get(), 0.2)
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_multiple_subscribers_all_receive():
|
||||
h = ProgressHub()
|
||||
h.register_loop(asyncio.get_running_loop())
|
||||
q1, q2 = h.subscribe("s1"), h.subscribe("s1")
|
||||
h.emit("s1", {"type": "progress", "step": "gen"})
|
||||
a = await asyncio.wait_for(q1.get(), 1.0)
|
||||
b = await asyncio.wait_for(q2.get(), 1.0)
|
||||
assert a["step"] == b["step"] == "gen"
|
||||
Reference in New Issue
Block a user