Files
Aislo/resources/tester/test_552_1_ui_kit.py
T
eomsangdonandClaude Opus 5.5 aaac17db4c feat(ui-kit): 부품 모음 화면 틀 — 시스템 관리자만 · 밝음 / 어두움 나란히 · 상태 다섯 칸 · 크기 여덟 단 (PLAN 552-1)
- 대시보드 세부 페이지 `#/b01-account?view=ui-kit` 등록부 한 줄(시스템 관리 묶음 · SYSTEM_ADMIN 만)
- ui_template_ui_kit.ts — 테마 칸마다 iframe(data-theme)에 지금 CSS 를 옮겨 실제 값으로 그림
- ui_template_ui_kit_parts.ts — 표준 부품 30 줄(552-2 기본 · 552-3 묶음 · 552-4 틀) · 머리 = 부품 규칙(자리 · 이름 · data-size · data-state · 색 · 아이콘)
- 지금 PageKit · 공용 부품 견본(단추 · 입력 · 고르기 · 탭 · 배지 · 표 · ⋯ · 빈 상태 · 설정 줄 · 아이콘) · 나머지 빈 자리
- test_546 시스템 메뉴 기대값에 ui-kit 더함 · 새 지킴 시험 test_552_1_ui_kit

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 20:49:09 +09:00

68 lines
2.6 KiB
Python

"""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