- 대시보드 세부 페이지 `#/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>
68 lines
2.6 KiB
Python
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
|