Merge remote-tracking branch 'origin/sub_laptop_7' into main_laptop_1
This commit is contained in:
@@ -5,7 +5,8 @@
|
||||
저장본 것을 다시 끼움(열 차례 = 저장본 · 보인 고침은 받음).
|
||||
② 표 부품 `lockHead` — 열 더하기 · 지우기 · 머리 · 층 이름 고치기 없음(단위 · 조회 후 선택은
|
||||
그대로).
|
||||
③ 좌측 패널에 나무 없음 · 페이지가 나무를 편집 칸 왼쪽(`aside`)에 · 「구조물 조합」일 때만 보임.
|
||||
③ 나무는 좌측 패널 「구조물 조합」 줄 아래(층 단추 + 나무 · PLAN 29-2) · 상세 위쪽 찾기 칸은
|
||||
「구조물 조합」일 때만.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
@@ -88,19 +89,23 @@ def test_참조표는_열_머리를_못_고침():
|
||||
assert "getDoc: () => comboMerge(loaded, shown.getDoc())" in main
|
||||
|
||||
|
||||
def test_나무는_편집_칸_왼쪽_좌측_패널엔_없음():
|
||||
def test_나무는_좌측_패널_찾기_칸은_상세_위쪽():
|
||||
side = _text(M02 / "M02_MasterTemplete_UI_Side.ts")
|
||||
assert "createTreePanel" not in side and "M02_TreeTitle" not in side
|
||||
assert "tree?: HTMLElement[];" in side and "...(opt.tree ?? [])," in side
|
||||
assert 'info.이름 === STRUCTURE_TABLE ? L("M02_KindTable")' in side # 좌측 줄 이름
|
||||
page = _text(M02 / "M02_MasterTemplete_UI_Page.ts")
|
||||
assert "createTreePanel({" in page and "aside," in page and "tree.select(column)" in page
|
||||
assert "createTreePanel({" in page and "tree.select(column)" in page
|
||||
assert 'tree: [layerBar("구조물조합"), tree.root],' in page and "search: tree.search," in page
|
||||
main = _text(M02 / "M02_MasterTemplete_UI_Main.ts")
|
||||
assert 'at.kind === "table" && at.name === STRUCTURE_TABLE && at.layer !== "project"' in main
|
||||
assert 'isCombo(next) ? L("M02_KindTable")' in main # 상세 제목
|
||||
assert main.count("showAside();") == 3 # 열 때 · 양식 밖 화면 · 처음
|
||||
assert "if (extras.search) extras.search.hidden = !isCombo(sel);" in main
|
||||
locale = _text(ROOT / "ui_template" / "ui_template_locale_m2.ts")
|
||||
assert 'M02_KindTable: ["구조물 조합"' in locale
|
||||
assert ".m02-shell__tree[hidden]" in _text(M02 / "M02_MasterTemplete_UI_Style.css")
|
||||
assert ".m02-shell" not in _text(
|
||||
M02 / "M02_MasterTemplete_UI_Style.css"
|
||||
) # 상세 왼쪽 나무 자리 없앰
|
||||
tree = _text(M02 / "M02_MasterTemplete_TreePanel.ts")
|
||||
assert (
|
||||
'error instanceof StaleError && error.message === "HTTP 409"' in tree
|
||||
|
||||
@@ -77,12 +77,15 @@ def test_나무_고침_알림(got):
|
||||
|
||||
|
||||
def test_뿌리를_바꿔도_일위대가_화면_유지_해시도_맞춤():
|
||||
"""브레인 검증 흠(27-2b) — 뿌리 줄은 두 벌(구조물 · 일위대가) · 어느 줄을 누르든 지금 화면 ·
|
||||
좌측 「일위대가 라이브러리」를 열면 해시 `open=일위대가`(다시 그리지 않고 주소만)."""
|
||||
"""브레인 검증 흠(27-2b) · 29-2 — 층 단추 두 벌(일위대가 라이브러리 · 구조물 조합 줄 아래) ·
|
||||
일위대가 단추로 층을 바꾸면 일위대가 화면 그대로 · 좌측 「일위대가 라이브러리」를 열면 해시
|
||||
`open=일위대가`(다시 그리지 않고 주소만)."""
|
||||
page = (ROOT / "M02_MasterTemplete/M02_MasterTemplete_UI_Page.ts").read_text("utf-8")
|
||||
assert 'open: OpenTarget = view === "일위대가" ? "일위대가" : "구조물조합"' in page
|
||||
assert page.count("go: (next, nextOwner) => void go(next, nextOwner),") == 2 # 두 벌 같은 길
|
||||
assert '"일위대가")' not in page.split("const laborRoots")[1].split("const roots")[0]
|
||||
assert "go: (next, nextOwner) => void go(next, nextOwner, open)," in page # 두 벌 같은 길
|
||||
assert (
|
||||
'bar: layerBar("일위대가"),' in page
|
||||
and 'tree: [layerBar("구조물조합"), tree.root],' in page
|
||||
)
|
||||
labor = page.split("buildLaborSection({")[1].split("make:")[0]
|
||||
assert 'mark("일위대가")' in labor # 여는 순간 해시 open
|
||||
assert "history.replaceState" in page # hashchange 없이(화면 다시 안 그림)
|
||||
|
||||
@@ -87,17 +87,50 @@ def test_주소_인자를_라우트에서_뗌():
|
||||
assert 'open: "구조물조합", root: "personal"' in picker and "layer=personal" not in picker
|
||||
|
||||
|
||||
def test_한_화면_뿌리_셋():
|
||||
"""27-1b · c — 뿌리 셋 한 화면 · 다른 뿌리 = 해시로 다시 세움(저장 안 한 고침은 먼저 물음) ·
|
||||
떠나면 층 길을 시스템으로 되돌림 · 목록은 펼칠 때 · 나무 부품은 owner · 자료 길을 받음."""
|
||||
@pytest.mark.skipif(shutil.which("node") is None, reason="node 가 없음")
|
||||
def test_볼_회사는_시스템_관리자만_고름():
|
||||
"""29-2 — 시스템 관리자 = 해시 company · sessionStorage aislo.adminCompany · 자기 회사 차례 ·
|
||||
그 밖 = 자기 회사(해시 company 무시) · 모양 틀린 값은 버림."""
|
||||
found = re.search(r"^export function viewCompany[\s\S]*?^}", _text(LAYER), re.M)
|
||||
assert found, "viewCompany 를 못 찾음"
|
||||
script = (
|
||||
"interface SessionUser { role?: string; company_id?: number | null }\n"
|
||||
"interface Entry { company: string | null }\n"
|
||||
"let saved: string | null = null;\n"
|
||||
"(globalThis as any).sessionStorage = { getItem: () => saved };\n"
|
||||
+ found.group(0).replace("export ", "")
|
||||
+ "\nconst sys = { role: 'SYSTEM_ADMIN', company_id: 1 };"
|
||||
+ "\nconst admin = { role: 'ADMIN', company_id: 3 };"
|
||||
+ "\nconst out = [viewCompany({ company: '3' }, sys), viewCompany({ company: null }, sys)];"
|
||||
+ "\nsaved = '5';"
|
||||
+ "\nout.push(viewCompany({ company: null }, sys), viewCompany({ company: '3' }, sys));"
|
||||
+ "\nout.push(viewCompany({ company: '9' }, admin), viewCompany({ company: 'x' }, sys));"
|
||||
+ "\nconsole.log(JSON.stringify(out));"
|
||||
)
|
||||
result = subprocess.run(
|
||||
["node", "--experimental-strip-types", "--no-warnings",
|
||||
"--input-type=module-typescript", "-e", script],
|
||||
capture_output=True, text=True, encoding="utf-8", timeout=60,
|
||||
) # fmt: skip
|
||||
assert result.returncode == 0, result.stderr
|
||||
assert json.loads(result.stdout) == ["3", "1", "5", "3", "3", "1"]
|
||||
|
||||
|
||||
def test_층_단추_셋_사람_고르기():
|
||||
"""27-1b · 29-2 — 층 단추 셋 · 다른 층 = 해시로 다시 세움(저장 안 한 고침은 먼저 물음) ·
|
||||
떠나면 층 길을 시스템으로 되돌림 · 회사 → 사람 펼침 없음 · 「사람 고르기」 = 같은 줄 select ·
|
||||
나무 부품은 owner · 자료 길을 받음."""
|
||||
page = _text(M02 / "M02_MasterTemplete_UI_Page.ts")
|
||||
assert "createLibraryRoots(" in page and "setActiveLayer(layer, owner)" in page
|
||||
assert "createLayerBar({" in page and "setActiveLayer(layer, owner)" in page
|
||||
assert "const company = viewCompany(entry, user);" in page
|
||||
assert "await main.confirmLeave()" in page.split("const go =")[1].split("navigateTo(")[0]
|
||||
assert 'dispose: () => setActiveLayer("system")' in page
|
||||
assert "side.reveal(entry.open)" in page
|
||||
roots = _text(M02 / "M02_MasterTemplete_TreePanel_Roots.ts")
|
||||
assert 'fetchOwners("company")' in roots and 'fetchOwners("personal", company)' in roots
|
||||
assert "if (!kids.hidden && !loaded) void fill();" in roots # 펼칠 때 불러옴
|
||||
assert 'fetchOwners("company")' not in roots # 회사 목록 펼침 없앰
|
||||
assert 'fetchOwners("personal", opt.company)' in roots
|
||||
assert "if (companyAdmin && opt.company) row.append(buildPeople(opt)); // 같은 줄" in roots
|
||||
assert 'if (select.value) opt.go("personal", select.value);' in roots
|
||||
panel = _text(M02 / "M02_MasterTemplete_TreePanel.ts")
|
||||
assert (
|
||||
"api.fetch(opt.layer, owner)" in panel
|
||||
|
||||
Reference in New Issue
Block a user