"""B01 대시보드 좌측 패널 시험(99-2) — 권한별 항목 · 해시 유지 · 공용 오버레이. 화면 조작은 ORCA.""" from __future__ import annotations import re from pathlib import Path ROOT = Path(__file__).resolve().parents[2] B01 = ROOT / "B01_Dashboard" def _text(name: str) -> str: return (B01 / name).read_text(encoding="utf-8") def _items(role: str) -> list[str]: """panelItems 안 권한별 return 목록의 항목 이름(key) 차례.""" body = re.search(r"^function panelItems\([\s\S]*?^}", _text("B01_Dashboard_UI_Page.ts"), re.M) assert body lists = re.findall(r"^( *)return \[\n([\s\S]*?)^\1\];", body.group(0), re.M) part = lists[["SYSTEM_ADMIN", "ADMIN", "USER"].index(role)][1] found = re.findall(r'one\(\s*"(\w+)"|^ {4,6}(settings|temp|company|myInfo),', part, re.M) names = [a or b for a, b in found] return ["profile" if n == "myInfo" else n for n in names] def test_권한별_항목_차례(): assert _items("SYSTEM_ADMIN") == [ "resources", "settings", "projects", "temp", "users", "requests", "companies", "profile", "logs", ] # fmt: skip assert _items("ADMIN") == [ "settings", "projects", "temp", "members", "requests", "company", "profile", ] # fmt: skip assert _items("USER") == ["settings", "projects", "temp", "company", "profile"] def test_고른_항목_해시에_남김(): panel = _text("B01_Dashboard_UI_SidePanel.ts") assert 'currentQuery().get("tab")' in panel assert "history.replaceState" in panel # hashchange 를 안 일으킴 page = _text("B01_Dashboard_UI_Page.ts") assert "show(pickActiveKey(items), false)" in page # 다시 그려도 같은 항목 assert 'const ADMIN_COMPANY_KEY = "aislo.adminCompany";' in page def test_공용_좌측_패널_부품(): page = _text("B01_Dashboard_UI_Page.ts") assert "createWorkflowOverlays" in page and "showProjectName: false" in page assert "is-options-open" in page panel = _text("B01_Dashboard_UI_SidePanel.ts") assert "ui-sidebar-list" in panel and "ui-sidebar-row" in panel # 옛 탭 줄 · 해시 탭 부품 없음 assert not (B01 / "B01_Dashboard_UI_Tabs.ts").exists() # 좁은 화면(≤860) — 고르면 접음 assert "max-width: 860px" in page