mcp-adb/tests/test_screenshot.py
Ryan Malloy fb297f7937 Add pytest suite (216 tests) and fix UI/notification parser bugs
Test infrastructure with conftest fixtures mocking run_shell_args/run_adb
for device-free testing across all 8 mixins.

Fixed: UI parser regex couldn't match hyphenated XML attributes
(content-desc, resource-id). Notification parser captured trailing
parenthesis in package names.
2026-02-11 03:38:37 -07:00

133 lines
4.7 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