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.
133 lines
4.7 KiB
Python
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
|