refactor(V2): IBKR WebSocket — fix stop/start cycle, guard rails, log disconnect
Code review fixes (commit 17700d2):
- _stopped reset on start() (was stuck True after stop→start)
- _require_started guard on subscribe_*/unsubscribe (clear WSError vs AttributeError)
- _reader_loop logs disconnect via logger.warning + sets _ws=None for `connected` signal
- Class docstring documents stale-snapshot behavior + deferred reconnect
- New tests: subscribe-before-start, stop→start cycle resumption
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -84,3 +84,41 @@ async def test_subscribe_limit(fake_signer, monkeypatch):
|
||||
with pytest.raises(WSError, match="IBKR_WS_SUB_LIMIT"):
|
||||
await ws.subscribe_tick(3)
|
||||
await ws.stop()
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_subscribe_before_start_raises(fake_signer):
|
||||
ws = IBKRWebSocket(
|
||||
signer=fake_signer,
|
||||
ws_url="wss://x", base_url="https://x",
|
||||
max_subs=10, idle_timeout_s=300,
|
||||
)
|
||||
with pytest.raises(WSError, match="IBKR_WS_NOT_STARTED"):
|
||||
await ws.subscribe_tick(1)
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_start_after_stop_resumes_reader(fake_signer, monkeypatch):
|
||||
fake_ws_a = FakeWS()
|
||||
fake_ws_b = FakeWS()
|
||||
fakes = iter([fake_ws_a, fake_ws_b])
|
||||
|
||||
async def fake_connect(url, **kw):
|
||||
return next(fakes)
|
||||
|
||||
monkeypatch.setattr("cerbero_mcp.exchanges.ibkr.ws.websockets_connect", fake_connect)
|
||||
|
||||
ws = IBKRWebSocket(
|
||||
signer=fake_signer,
|
||||
ws_url="wss://x", base_url="https://x",
|
||||
max_subs=10, idle_timeout_s=300,
|
||||
)
|
||||
await ws.start()
|
||||
await ws.stop()
|
||||
# Restart with fresh fake_ws_b
|
||||
await ws.start()
|
||||
await ws.subscribe_tick(42)
|
||||
await fake_ws_b.push({"topic": "smd+42", "31": "100"})
|
||||
await asyncio.sleep(0.05)
|
||||
assert ws.get_tick_snapshot(42) is not None
|
||||
await ws.stop()
|
||||
|
||||
Reference in New Issue
Block a user