"""Regression tests for the shared layout-assertion helpers.""" from __future__ import annotations import pytest try: from playwright.sync_api import sync_playwright except Exception: sync_playwright = None from tests._layout_helpers import ( assert_layout_sane, assert_no_raw_i18n_keys, collect_layout_violations, ) def _require_playwright(): if sync_playwright is None: pytest.skip("playwright is unavailable; run `playwright install chromium`") return sync_playwright _BROWSER_ARGS = ["--no-sandbox", "--disable-dev-shm-usage"] _SCOPE_FIXTURE_HTML = """\
Content
""" _OVERLAP_FIXTURE_HTML = """\
A very long unbreakable column label
Value text
""" _RAW_STRING_FIXTURE_HTML = """\ workspace_hidden_files_visible """ def test_layout_sane_on_master_pages(): """Clean-master assertion: the real app has zero violations in the safe scope.""" sp = _require_playwright() from tests._pytest_port import BASE # degenerate excluded: the composer has two intentional off-screen a11y # proxies (fileInput, modelSelect) that are not layout bugs _LIVE_CHECKS = ["overlap", "clip", "container-escape", "raw-string"] with sp() as pw: browser = pw.chromium.launch(headless=True, args=_BROWSER_ARGS) try: for path in ["/", "/#settings", "/#sessions"]: ctx = browser.new_context(viewport={"width": 1280, "height": 720}) page = ctx.new_page() page.goto(BASE + path, wait_until="domcontentloaded") page.wait_for_selector("#msg, .app, body", timeout=10000) assert_layout_sane(page, scope_selector=".layout > main", checks=_LIVE_CHECKS) ctx.close() finally: browser.close() def test_default_scope_vs_full_body(): """Scoping to main.main excludes collapsed rightpanel noise; body scope catches it.""" sp = _require_playwright() with sp() as pw: browser = pw.chromium.launch(headless=True, args=_BROWSER_ARGS) try: page = browser.new_page(viewport={"width": 1280, "height": 720}) page.set_content(_SCOPE_FIXTURE_HTML) assert_layout_sane(page, scope_selector="main.main") violations = collect_layout_violations(page, scope_selector="body") assert violations, "expected violations from collapsed rightpanel under body scope" finally: browser.close() def test_injected_overlap_detected(): """A flex row where a nowrap label's negative margin pulls it over its sibling's box.""" sp = _require_playwright() with sp() as pw: browser = pw.chromium.launch(headless=True, args=_BROWSER_ARGS) try: page = browser.new_page(viewport={"width": 320, "height": 200}) page.set_content(_OVERLAP_FIXTURE_HTML) violations = collect_layout_violations(page, checks=["overlap"]) overlap = [v for v in violations if v["type"] == "overlap"] assert overlap, "expected an overlap violation from the unshrinkable flex column" finally: browser.close() def test_raw_i18n_key_detected(): """A raw snake_case i18n key rendered as text should fail the raw-string check.""" sp = _require_playwright() with sp() as pw: browser = pw.chromium.launch(headless=True, args=_BROWSER_ARGS) try: page = browser.new_page(viewport={"width": 320, "height": 200}) page.set_content(_RAW_STRING_FIXTURE_HTML) with pytest.raises(AssertionError): assert_no_raw_i18n_keys(page) finally: browser.close()