Files
odysseus/tests/test_tile_manager_snap_zones_js.py

118 lines
3.9 KiB
Python
Raw Permalink Normal View History

"""Regression coverage for desktop modal tile snap edge zones."""
import json
import shutil
import subprocess
import textwrap
from pathlib import Path
import pytest
_REPO = Path(__file__).resolve().parent.parent
_HELPER = _REPO / "static" / "js" / "tileManager.js"
_HAS_NODE = shutil.which("node") is not None
def _run_tile_case():
script = textwrap.dedent(
f"""
globalThis.window = {{
innerWidth: 1200,
innerHeight: 800,
addEventListener() {{}},
}};
globalThis.document = {{
readyState: 'loading',
body: {{ appendChild() {{}} }},
documentElement: {{ style: {{ setProperty() {{}}, removeProperty() {{}} }} }},
addEventListener() {{}},
getElementById() {{ return null; }},
querySelector() {{ return null; }},
querySelectorAll() {{ return []; }},
createElement() {{
return {{
style: {{}},
classList: {{ add() {{}}, remove() {{}} }},
remove() {{}},
}};
}},
}};
globalThis.requestAnimationFrame = (fn) => fn();
globalThis.MutationObserver = class {{
observe() {{}}
disconnect() {{}}
}};
const mod = await import('{_HELPER.as_posix()}');
const pick = (zone) => zone ? {{
name: zone.name,
rect: {{
left: zone.rect.left,
top: zone.rect.top,
width: zone.rect.width,
height: zone.rect.height,
}},
}} : null;
const memoryModal = {{ id: 'memory-modal' }};
const memoryContent = {{ closest() {{ return memoryModal; }} }};
const settingsModal = {{ id: 'settings-modal' }};
const settingsContent = {{ closest() {{ return settingsModal; }} }};
console.log(JSON.stringify({{
fullscreen: pick(mod._zoneForPointerForTests(500, 0)),
maximize: pick(mod._zoneForPointerForTests(500, 8)),
top: pick(mod._zoneForPointerForTests(500, 20)),
left: pick(mod._zoneForPointerForTests(20, 300)),
right: pick(mod._zoneForPointerForTests(1190, 300)),
bottom: pick(mod._zoneForPointerForTests(500, 790)),
memoryBottom: pick(mod._zoneForContentForTests(memoryContent, 500, 790)),
settingsTop: pick(mod._zoneForContentForTests(settingsContent, 500, 20)),
settingsRight: pick(mod._zoneForContentForTests(settingsContent, 1190, 300)),
}}));
"""
)
proc = subprocess.run(
["node", "--input-type=module"],
input=script,
capture_output=True,
text=True,
cwd=str(_REPO),
timeout=30,
)
assert proc.returncode == 0, proc.stderr
return json.loads(proc.stdout.strip())
@pytest.mark.skipif(not _HAS_NODE, reason="node binary not on PATH")
def test_tile_manager_detects_all_four_workspace_edges():
zones = _run_tile_case()
assert zones["fullscreen"]["name"] == "fullscreen"
assert zones["maximize"]["name"] == "maximize"
assert zones["top"] == {
"name": "top-half",
"rect": {"left": 4, "top": 4, "width": 1192, "height": 396},
}
assert zones["left"] == {
"name": "left-half",
"rect": {"left": 4, "top": 4, "width": 596, "height": 792},
}
assert zones["right"] == {
"name": "right-half",
"rect": {"left": 600, "top": 4, "width": 596, "height": 792},
}
assert zones["bottom"] == {
"name": "bottom-half",
"rect": {"left": 4, "top": 400, "width": 1192, "height": 396},
}
@pytest.mark.skipif(not _HAS_NODE, reason="node binary not on PATH")
def test_regular_tool_modals_are_not_limited_to_fullscreen_only():
zones = _run_tile_case()
assert zones["memoryBottom"]["name"] == "bottom-half"
assert zones["settingsTop"] is None
assert zones["settingsRight"]["name"] == "right-half"