122 lines
3.6 KiB
Python
122 lines
3.6 KiB
Python
"""Tests for client command."""
|
|
|
|
from unittest.mock import AsyncMock, MagicMock
|
|
|
|
import pytest
|
|
|
|
from mudlib.caps import ClientCaps
|
|
from mudlib.commands.help import cmd_client
|
|
from mudlib.player import Player, players
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
def clear_state():
|
|
players.clear()
|
|
yield
|
|
players.clear()
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_writer():
|
|
writer = MagicMock()
|
|
writer.write = MagicMock()
|
|
writer.drain = AsyncMock()
|
|
writer.send_gmcp = MagicMock()
|
|
writer.send_msdp = MagicMock()
|
|
writer.local_option = MagicMock()
|
|
writer.local_option.enabled = MagicMock(return_value=True)
|
|
writer.remote_option = MagicMock()
|
|
writer.remote_option.enabled = MagicMock(return_value=True)
|
|
writer.get_extra_info = MagicMock(
|
|
side_effect=lambda key: {
|
|
"TERM": "TINTIN",
|
|
"cols": 191,
|
|
"rows": 54,
|
|
}.get(key)
|
|
)
|
|
return writer
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_client_shows_protocols(mock_writer):
|
|
"""Test client command shows GMCP and MSDP status."""
|
|
p = Player(name="Test", writer=mock_writer)
|
|
p.caps = ClientCaps(ansi=True, truecolor=True)
|
|
await cmd_client(p, "")
|
|
|
|
output = mock_writer.write.call_args[0][0]
|
|
assert "GMCP: active" in output
|
|
assert "MSDP: active" in output
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_client_shows_terminal_info(mock_writer):
|
|
"""Test client command shows terminal type and size."""
|
|
p = Player(name="Test", writer=mock_writer)
|
|
p.caps = ClientCaps(ansi=True)
|
|
await cmd_client(p, "")
|
|
|
|
output = mock_writer.write.call_args[0][0]
|
|
assert "type: TINTIN" in output
|
|
assert "size: 191x54" in output
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_client_shows_color_depth(mock_writer):
|
|
"""Test client command shows color depth."""
|
|
p = Player(name="Test", writer=mock_writer)
|
|
p.caps = ClientCaps(ansi=True, truecolor=True, colors_256=True)
|
|
await cmd_client(p, "")
|
|
|
|
output = mock_writer.write.call_args[0][0]
|
|
assert "colors: truecolor" in output
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_client_shows_mtts_flags(mock_writer):
|
|
"""Test client command shows MTTS capabilities."""
|
|
p = Player(name="Test", writer=mock_writer)
|
|
p.caps = ClientCaps(ansi=True, vt100=True, utf8=True, colors_256=True)
|
|
await cmd_client(p, "")
|
|
|
|
output = mock_writer.write.call_args[0][0]
|
|
assert "ANSI" in output
|
|
assert "VT100" in output
|
|
assert "UTF-8" in output
|
|
assert "256 colors" in output
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_client_not_negotiated(mock_writer):
|
|
"""Test client command when protocols not negotiated."""
|
|
mock_writer.local_option.enabled.return_value = False
|
|
mock_writer.remote_option.enabled.return_value = False
|
|
|
|
p = Player(name="Test", writer=mock_writer)
|
|
p.caps = ClientCaps()
|
|
await cmd_client(p, "")
|
|
|
|
output = mock_writer.write.call_args[0][0]
|
|
assert "GMCP: not active" in output
|
|
assert "MSDP: not active" in output
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_client_no_mtts():
|
|
"""Test client command with no MTTS capabilities."""
|
|
writer = MagicMock()
|
|
writer.write = MagicMock()
|
|
writer.drain = AsyncMock()
|
|
writer.local_option = MagicMock()
|
|
writer.local_option.enabled = MagicMock(return_value=False)
|
|
writer.remote_option = MagicMock()
|
|
writer.remote_option.enabled = MagicMock(return_value=False)
|
|
writer.get_extra_info = MagicMock(return_value=None)
|
|
|
|
p = Player(name="Test", writer=writer)
|
|
p.caps = ClientCaps()
|
|
await cmd_client(p, "")
|
|
|
|
output = writer.write.call_args[0][0]
|
|
assert "type: unknown" in output
|
|
assert "MTTS: none detected" in output
|