Files
NtR-soudcloud-fetcher/tests/test_websocket.py

101 lines
2.6 KiB
Python
Raw Permalink Normal View History

import pytest
from ntr_fetcher.websocket import AnnounceManager
@pytest.fixture
def manager():
return AnnounceManager()
def test_no_bots_initially(manager):
assert manager.bot_count == 0
@pytest.mark.asyncio
async def test_bot_subscribe_and_broadcast(manager):
received = []
class FakeWS:
async def send_json(self, data):
received.append(data)
ws = FakeWS()
manager.add_client(ws, role="bot", client_id="test-bot", remote_addr="127.0.0.1")
assert manager.bot_count == 1
await manager.broadcast({"type": "announce", "message": "Now Playing: Song #1"})
assert len(received) == 1
assert received[0]["message"] == "Now Playing: Song #1"
manager.remove_client(ws)
assert manager.bot_count == 0
@pytest.mark.asyncio
async def test_viewer_not_counted_as_bot(manager):
received = []
class FakeWS:
async def send_json(self, data):
received.append(data)
ws = FakeWS()
manager.add_client(ws, role="viewer")
assert manager.bot_count == 0
await manager.broadcast({"type": "announce", "message": "test"})
assert len(received) == 1
manager.remove_client(ws)
assert manager.bot_count == 0
@pytest.mark.asyncio
async def test_broadcast_skips_dead_connections(manager):
class DeadWS:
async def send_json(self, data):
raise Exception("connection closed")
ws = DeadWS()
manager.add_client(ws, role="bot", client_id="dead-bot")
assert manager.bot_count == 1
await manager.broadcast({"type": "announce", "message": "test"})
assert manager.bot_count == 0
@pytest.mark.asyncio
async def test_bot_clients_returns_metadata(manager):
class FakeWS:
async def send_json(self, data):
pass
ws = FakeWS()
manager.add_client(ws, role="bot", client_id="limnoria-prod", remote_addr="10.0.0.5")
clients = manager.bot_clients
assert len(clients) == 1
assert clients[0]["client_id"] == "limnoria-prod"
assert clients[0]["remote_addr"] == "10.0.0.5"
assert "connected_at" in clients[0]
@pytest.mark.asyncio
async def test_status_broadcast_includes_clients(manager):
received = []
class FakeWS:
async def send_json(self, data):
received.append(data)
bot = FakeWS()
viewer = FakeWS()
manager.add_client(bot, role="bot", client_id="my-bot", remote_addr="1.2.3.4")
manager.add_client(viewer, role="viewer")
await manager.broadcast_status()
for msg in received:
assert msg["type"] == "status"
assert msg["subscribers"] == 1
assert len(msg["clients"]) == 1
assert msg["clients"][0]["client_id"] == "my-bot"