mcp-adb/tests/test_screenshot.py
Ryan Malloy 3614ba8f8f Replace dict returns with typed Pydantic response models across all 65 tools
Every tool now returns a structured BaseModel instead of dict[str, Any],
giving callers attribute access, IDE autocomplete, and schema validation.
Adds ~30 model classes to models.py and updates all test assertions.
2026-02-11 03:57:25 -07:00

133 lines
4.6 KiB
Python

"""Tests for screenshot mixin (capture, screen size, density, record)."""
import pytest
from tests.conftest import fail, ok
class TestScreenshot:
async def test_capture(self, server, ctx, tmp_path, monkeypatch):
from src.config import get_config
get_config().default_screenshot_dir = str(tmp_path)
server.run_shell_args.return_value = ok()
server.run_adb.return_value = ok()
result = await server.screenshot(ctx, filename="test.png")
assert result.success is True
assert result.local_path is not None
assert "test.png" in result.local_path
async def test_capture_failure(self, server, ctx):
server.run_shell_args.return_value = fail("no screen")
result = await server.screenshot(ctx)
assert result.success is False
assert result.error is not None
async def test_pull_failure(self, server, ctx):
server.run_shell_args.return_value = ok()
server.run_adb.return_value = fail("pull failed")
result = await server.screenshot(ctx)
assert result.success is False
class TestScreenSize:
async def test_physical(self, server):
server.run_shell_args.return_value = ok(stdout="Physical size: 1080x1920")
result = await server.screen_size()
assert result.success is True
assert result.width == 1080
assert result.height == 1920
async def test_override(self, server):
server.run_shell_args.return_value = ok(
stdout="Physical size: 1080x1920\nOverride size: 720x1280"
)
result = await server.screen_size()
assert result.success is True
# Should parse the first match
assert result.width == 1080
async def test_failure(self, server):
server.run_shell_args.return_value = fail("error")
result = await server.screen_size()
assert result.success is False
class TestScreenDensity:
async def test_density(self, server):
server.run_shell_args.return_value = ok(stdout="Physical density: 420")
result = await server.screen_density()
assert result.success is True
assert result.dpi == 420
async def test_failure(self, server):
server.run_shell_args.return_value = fail("error")
result = await server.screen_density()
assert result.success is False
class TestScreenOnOff:
async def test_screen_on(self, server):
server.run_shell_args.return_value = ok()
result = await server.screen_on()
assert result.success is True
assert result.action == "screen_on"
async def test_screen_off(self, server):
server.run_shell_args.return_value = ok()
result = await server.screen_off()
assert result.action == "screen_off"
class TestScreenRecord:
@pytest.mark.usefixtures("_dev_mode")
async def test_record(self, server, ctx, tmp_path):
from src.config import get_config
get_config().default_screenshot_dir = str(tmp_path)
server.run_shell_args.side_effect = [ok(), ok()] # record + rm
server.run_adb.return_value = ok() # pull
result = await server.screen_record(
ctx,
filename="test.mp4",
duration_seconds=5,
)
assert result.success is True
assert result.duration_seconds == 5
@pytest.mark.usefixtures("_dev_mode")
async def test_duration_capped(self, server, ctx, tmp_path):
from src.config import get_config
get_config().default_screenshot_dir = str(tmp_path)
server.run_shell_args.side_effect = [ok(), ok()]
server.run_adb.return_value = ok()
result = await server.screen_record(ctx, duration_seconds=999)
assert result.duration_seconds == 180 # Capped at 180
@pytest.mark.usefixtures("_no_dev_mode")
async def test_requires_dev_mode(self, server, ctx):
result = await server.screen_record(ctx)
assert result.success is False
class TestScreenSetSize:
@pytest.mark.usefixtures("_dev_mode")
async def test_set(self, server):
server.run_shell_args.return_value = ok()
result = await server.screen_set_size(720, 1280)
assert result.success is True
assert result.width == 720
@pytest.mark.usefixtures("_dev_mode")
async def test_reset(self, server):
server.run_shell_args.return_value = ok()
result = await server.screen_reset_size()
assert result.success is True
assert result.action == "reset_size"
@pytest.mark.usefixtures("_no_dev_mode")
async def test_requires_dev_mode(self, server):
result = await server.screen_set_size(720, 1280)
assert result.success is False