mirror of
https://github.com/HKUDS/nanobot.git
synced 2026-05-20 08:32:25 +00:00
* feat(settings): expand settings api payload * feat(webui): build app-style settings center * feat(webui): add centered chat search dialog * fix(webui): shorten chat search label * fix(webui): center dialog entrance animation * fix(webui): simplify chat search results * fix(webui): tighten mobile settings navigation * feat(webui): persist sidebar state * feat(webui): add sidebar organization controls * refactor(webui): organize backend helpers * refactor(webui): remove utils compatibility shims * refactor(session): move shared webui helpers out of webui package * feat(webui): add image generation settings * style(webui): refine settings overview layout * fix(webui): localize settings zh-CN copy * style(webui): add settings status indicators * feat(webui): show sidebar run indicators * fix(webui): persist sidebar run indicators * fix(webui): highlight settings pending status * fix(webui): align settings test with provider update * fix(utils): preserve legacy webui helper imports
56 lines
1.8 KiB
Python
56 lines
1.8 KiB
Python
"""Tests for WebSocket turn timing strip bookkeeping."""
|
|
|
|
from unittest.mock import AsyncMock, MagicMock
|
|
|
|
import pytest
|
|
|
|
from nanobot.bus.events import InboundMessage
|
|
from nanobot.session import webui_turns as wth
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
def _clear_turn_wall_clock() -> None:
|
|
wth._WEBSOCKET_TURN_WALL_STARTED_AT.clear()
|
|
yield
|
|
wth._WEBSOCKET_TURN_WALL_STARTED_AT.clear()
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_publish_turn_run_status_running_records_wall_clock() -> None:
|
|
bus = MagicMock()
|
|
bus.publish_outbound = AsyncMock()
|
|
msg = InboundMessage(channel="websocket", sender_id="u", chat_id="chat-a", content="hi")
|
|
|
|
await wth.publish_turn_run_status(bus, msg, "running")
|
|
|
|
assert "chat-a" in wth._WEBSOCKET_TURN_WALL_STARTED_AT
|
|
t0 = wth.websocket_turn_wall_started_at("chat-a")
|
|
assert isinstance(t0, float)
|
|
call = bus.publish_outbound.await_args[0][0]
|
|
assert call.chat_id == "chat-a"
|
|
assert call.metadata.get("started_at") == t0
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_publish_turn_run_status_idle_clears_wall_clock() -> None:
|
|
bus = MagicMock()
|
|
bus.publish_outbound = AsyncMock()
|
|
msg = InboundMessage(channel="websocket", sender_id="u", chat_id="chat-b", content="hi")
|
|
|
|
await wth.publish_turn_run_status(bus, msg, "running")
|
|
assert wth.websocket_turn_wall_started_at("chat-b") is not None
|
|
|
|
await wth.publish_turn_run_status(bus, msg, "idle")
|
|
assert wth.websocket_turn_wall_started_at("chat-b") is None
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_publish_turn_run_status_non_websocket_noop_registry() -> None:
|
|
bus = MagicMock()
|
|
bus.publish_outbound = AsyncMock()
|
|
msg = InboundMessage(channel="telegram", sender_id="u", chat_id="1", content="hi")
|
|
|
|
await wth.publish_turn_run_status(bus, msg, "running")
|
|
|
|
assert wth._WEBSOCKET_TURN_WALL_STARTED_AT == {}
|