"""552-1 부품 모음 화면 지킴 시험 — 화면 확인은 ORCA. · `#/b01-account?view=ui-kit` = 시스템 관리자만(다른 역할은 메뉴에 없고 주소로 와도 홈) · 부품 목록 = 열쇠 겹침 없음 · 세 묶음(552-2 기본 · 552-3 묶음 · 552-4 틀) · 파일은 ui_template_ 안 · 크기 여덟 단 · 상태 다섯 칸 · 밝음 / 어두움 두 칸(iframe data-theme) · 날 색 없음 """ from __future__ import annotations import re import shutil from pathlib import Path import pytest from test_546_b01_shell import MENU, _run_views ROOT = Path(__file__).resolve().parents[2] UI = ROOT / "ui_template" def _text(path: Path) -> str: return path.read_text(encoding="utf-8") @pytest.mark.skipif(shutil.which("node") is None, reason="node 가 없음") def test_시스템_관리자만(): out = _run_views( MENU + "console.log(JSON.stringify(['USER','ADMIN','FOREST','SYSTEM_ADMIN'].map(" "(r) => [menu(r).includes('system:ui-kit'), viewFor('ui-kit', r).key])));" ) assert out == [[False, "home"], [False, "home"], [False, "home"], [True, "ui-kit"]] def test_부품_목록(): src = _text(UI / "ui_template_ui_kit_parts.ts") rows = re.findall( r'\{ key: "([^"]+)", name: "[^"]+", group: "(\w+)",[^\n]*file: "([^"]+)"', src ) keys = [k for k, _, _ in rows] assert len(keys) == len(set(keys)) >= 25 assert {g for _, g, _ in rows} == {"basic", "compound", "frame"} assert all(f.startswith("ui_template_") and f.endswith(".ts") for _, _, f in rows) # 묶음 차례 그대로 — 창마다 자기 덩어리만 고침 groups = [g for _, g, _ in rows] assert groups == sorted(groups, key=["basic", "compound", "frame"].index) assert "KIT_SIZES = [18, 20, 22, 24, 28, 32, 36, 42] as const" in src assert 'KIT_STATES = ["default", "hover", "active", "disabled", "error"] as const' in src # 규칙 머리 — 크기 · 상태 · 색 · 아이콘 for word in ( 'data-size="18|20|22|24|28|32|36|42"', 'data-state="hover"', "--draw-*", "icon(name, size)", ): assert word in src, word def test_밝음_어두움_두_칸(): view = _text(UI / "ui_template_ui_kit.ts") assert 'panes.append(themePane("light"), themePane("dark"))' in view assert "doc.documentElement.dataset.theme = theme" in view assert "frame.srcdoc" in view # 표준 모드 문서 css = _text(UI / "ui_template_ui_kit.css") assert not re.search(r"#[0-9a-fA-F]{3,8}\b|rgba?\(", css) # 색 = 공통 값만 for path in (view, _text(UI / "ui_template_ui_kit_parts.ts"), css): assert len(path.splitlines()) <= 700