mirror of
https://github.com/nesquena/hermes-webui.git
synced 2026-05-23 10:50:14 +00:00
0f86030f5f
- Remove duplicate mobile-close-btn from HTML - Remove dead .mobile-close-btn CSS rules; unhide .close-preview at all viewports - Change btnClearPreview tooltip from 'Hide workspace panel' to 'Close' - Update tests across test_sprint41.py, test_sprint44.py, test_issue781.py, and test_mobile_layout.py to match new single-button model
77 lines
2.7 KiB
Python
77 lines
2.7 KiB
Python
"""
|
|
Tests for issue #781 — duplicate X close button in workspace preview header.
|
|
|
|
The fix: a single btnClearPreview (.close-preview) is the only close button,
|
|
visible on all devices. The mobile-close-btn element was removed entirely.
|
|
|
|
Verifies that:
|
|
- .close-preview is NOT hidden by any media query (visible everywhere)
|
|
- .mobile-close-btn has no CSS rules remaining (element removed from HTML)
|
|
"""
|
|
|
|
import re
|
|
import os
|
|
|
|
CSS_PATH = os.path.join(os.path.dirname(__file__), "..", "static", "style.css")
|
|
|
|
|
|
def _load_css():
|
|
with open(CSS_PATH, "r", encoding="utf-8") as f:
|
|
return f.read()
|
|
|
|
|
|
def _extract_media_block(css, media_query_pattern):
|
|
"""Extract the content of a @media block by tracking brace depth.
|
|
|
|
Returns the inner text (between the outermost braces) of the first
|
|
@media block matching media_query_pattern (a regex applied to the @media
|
|
line itself).
|
|
"""
|
|
# Find the start of the @media declaration
|
|
m = re.search(media_query_pattern, css)
|
|
assert m, f"Media query matching {media_query_pattern!r} not found in style.css"
|
|
|
|
# Walk forward from the opening brace to find its matching close brace
|
|
start = css.index("{", m.start())
|
|
depth = 0
|
|
for i in range(start, len(css)):
|
|
if css[i] == "{":
|
|
depth += 1
|
|
elif css[i] == "}":
|
|
depth -= 1
|
|
if depth == 0:
|
|
return css[start + 1 : i] # content between { and }
|
|
raise AssertionError("Unmatched brace in CSS after @media block")
|
|
|
|
|
|
_MEDIA_900_PATTERN = r"@media\s*\(\s*max-width\s*:\s*900px\s*\)"
|
|
|
|
|
|
def test_close_preview_not_hidden_in_900px_block():
|
|
"""The single close button (.close-preview) must NOT be hidden in any media query."""
|
|
css = _load_css()
|
|
block = _extract_media_block(css, _MEDIA_900_PATTERN)
|
|
assert ".close-preview" not in block, (
|
|
".close-preview must not appear in @media(max-width:900px) block — "
|
|
"the single X button should be visible on all devices"
|
|
)
|
|
|
|
|
|
def test_mobile_close_btn_not_in_css():
|
|
"""mobile-close-btn CSS rules should have been removed entirely."""
|
|
css = _load_css()
|
|
assert ".mobile-close-btn" not in css, (
|
|
".mobile-close-btn CSS rule still present — the element was removed "
|
|
"from HTML so its styles should be cleaned up too"
|
|
)
|
|
|
|
|
|
def test_close_preview_visible_in_base_css():
|
|
"""Outside media queries, .close-preview must NOT be display:none."""
|
|
css = _load_css()
|
|
# Simple check: find all .close-preview rules and ensure none set display:none
|
|
for m in re.finditer(r"\.close-preview\s*\{([^}]*)\}", css):
|
|
assert "display:none" not in m.group(1).replace(" ", ""), (
|
|
".close-preview must not be hidden by any CSS rule"
|
|
)
|