- 지움(git rm) 15 파일 3,318 줄: Hopyo_Check · CheckRows · Choose · WizardSk · SkApi · SkLines · logic/SkPick · logic/Draft · Left · Lost · Pick · SheetMake · Kids · ToItem · Compare(모두 옛 확인 창 · 마법사 단가산출 · 안 이은 줄 길 몫 · 부르는 곳 0) - 단추 판단: 엑셀 보기 [저장](체크 호표) · [모두 고정으로 들여오기] 화면 단추 걷음 → 만들기 = [옮기기] 하나 · 모두 고정 서버 길(Builder · build_all)은 B09 · 붙여넣기가 써서 남김 · 목록 체크 칸 · 모달 껍데기(openHopyoSheet · raise · lower) 걷음 - Import: 「안 이은 줄」 띠 · [안 이은 줄 고르기] · 남은 줄 셈 걷음 · [끝내기] = 물음(확인하고 안 옮긴 수 = 판정 고름 캐시 moveBody) - Api: 옛 맞춤 타입 · 길(readHopyoOne · guessHopyo · buildHopyo · buildHopyoAll · leftHopyo · listHopyoPicks · hopyoSiblings · buildHopyoItem …) 걷음 · POLL_MS · HOPYO_BUILT 옮겨 옴 · 목록 꼴 = 1차 판정 줄상태(Judge.view) - Labor_Pick: withHopyo(실무 호표 덧줄) → withSangeun(찾아 넣기 창 표시만) · Detail · Table 부름 바꿈 - Ledger: unitField 옮겨 옴 · SheetNav: 옛 확인 캐시 칠 걷음 · UI_Page: [구조물 조합으로] 듣기 걷음 - CSS: 옛 확인 창 · 고르기 창 규칙 34 걷음(481 → 287 줄) · 390 폭 = 줄 판 열리면 위 칸 넓힘 · 줄 판 높이 바닥 16rem 시험 정리(까닭 = 지운 화면 파일만 읽음): - 지움: test_729_3_hopyo_left_screen · test_746_2_hopyo_compare_screen · test_778_5_sk_pick_screen · helper_729_3 · helper_m02_hopyo_check · pick · seam - test_m02_hopyo_screen = 좌측 판 · 끝내기 둘만 · 627 · helper_778_5 = SheetSk 판 바꿈만 · 785_4 · 721 · 717_4 · 720 · 739_1 = 지금 꼴로 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
101 lines
5.5 KiB
Python
101 lines
5.5 KiB
Python
"""M02 폴더 · 층 · 단가산출 이름(PLAN 720 · 내역 16) — 임시 storage + 화면 글 대조.
|
|
|
|
720-1 단가산출 · 일위대가 층 단추 = 저장 안 한 고침 물음 → 그 층 목록표 ·
|
|
720-2 최상위 폴더 = 메뉴 줄 · 층 줄 「+」 같은 `addFolder([])` ·
|
|
720-3 문서 [이름 바꾸기] = 읽고 `이름` 만 갈아 저장(층 목록 제목 새 이름 · 다른 칸 그대로) ·
|
|
720-4 구조물 조합 층 = 제자리 바꿈(해시 이동 없음).
|
|
"""
|
|
|
|
from pathlib import Path
|
|
|
|
from fastapi.testclient import TestClient
|
|
|
|
from resources.tester.test_m02_precombo_folders import client # noqa: F401 — 같은 임시 층
|
|
|
|
M02 = Path(__file__).resolve().parents[2] / "M02_MasterTemplete"
|
|
ITEM = "/api/m02/layers/personal/templates/{}/{}"
|
|
|
|
|
|
def _text(name: str) -> str:
|
|
return (M02 / name).read_text(encoding="utf-8")
|
|
|
|
|
|
def _rows(c: TestClient, kind: str) -> dict[str, dict]:
|
|
rows = c.get("/api/m02/layers/personal/templates").json()["양식"]
|
|
return {r["이름"]: r for r in rows if r["종류"] == kind}
|
|
|
|
|
|
def _rename(c: TestClient, kind: str, key: str, name: str) -> None:
|
|
"""화면 `renameDoc` 과 같은 길 — 읽고 `이름` 만 갈아 같은 판으로 저장"""
|
|
got = c.get(ITEM.format(kind, key)).json()
|
|
body = {"판": got.get("판") or "", "문서": {**got["문서"], "이름": name}}
|
|
res = c.put(ITEM.format(kind, key), json=body)
|
|
assert res.status_code == 200, res.text
|
|
|
|
|
|
def test_일위대가_이름_바꾸기는_이름만(client: TestClient): # noqa: F811
|
|
before = client.get(ITEM.format("precombo", "SC-000002")).json()["문서"]
|
|
_rename(client, "precombo", "SC-000002", "나 고침")
|
|
after = client.get(ITEM.format("precombo", "SC-000002")).json()["문서"]
|
|
assert after["이름"] == "나 고침"
|
|
assert {k: v for k, v in after.items() if k != "이름"} == {
|
|
k: v for k, v in before.items() if k != "이름"
|
|
}
|
|
rows = _rows(client, "precombo")
|
|
assert rows["SC-000002"]["제목"] == "나 고침" and rows["SC-000001"]["제목"] == "가"
|
|
|
|
|
|
def test_단가산출_이름_바꾸기_목록_제목(client: TestClient): # noqa: F811
|
|
body = {"문서": {"이름": "갑", "단위": "㎡", "바탕": None, "더한줄": []}}
|
|
res = client.post("/api/m02/layers/personal/library/sangeun", json=body)
|
|
assert res.status_code == 200, res.text
|
|
key = res.json()["이름"]
|
|
_rename(client, "sangeun", key, "을")
|
|
assert _rows(client, "sangeun")[key]["제목"] == "을"
|
|
assert client.get(ITEM.format("sangeun", key)).json()["문서"]["단위"] == "㎡"
|
|
|
|
|
|
def test_화면_층_단추_최상위_폴더_이름_바꾸기():
|
|
page = _text("M02_MasterTemplete_UI_Page.ts")
|
|
lib = _text("M02_MasterTemplete_UI_Side_Library.ts")
|
|
# 720-1 — 다른 층 단추 = 물음 뒤 목록표
|
|
assert "setPre(next), void main.open(precomboList(pre))" in page
|
|
assert "void main.open(sangeunList(sk))" in page.split("const skBar")[1].split("reselect:")[0]
|
|
# 720-2 — 층 줄 「+」 = 서고 칸 맨 위 메뉴 · 메뉴 줄 = 같은 addFolder([])
|
|
assert page.count(" add,\n") == 3 # 구조물 조합 · 일위대가 · 단가산출
|
|
assert "onClick: (event) => openTreeMenu(event, menuAt([]))" in lib
|
|
assert "add.hidden = !at.canWrite;" in lib and "opt.bar(addTools)" in lib
|
|
assert lib.count('L("M02_TreeAddTopFolder"), () => void addFolder([])') == 1 # 폴더 줄
|
|
assert '{ label: L("M02_TreeAddTopFolder"), run: () => void addFolder([])' in lib # 문서 줄
|
|
tree = _text("M02_MasterTemplete_TreePanel.ts")
|
|
assert '{ label: L("M02_TreeAddTopFolder"), run: () => void addFolder([]) }' in tree
|
|
# 720-3 — 문서 줄 [이름 바꾸기] · 저장 뒤 머리 제목
|
|
assert "run: () => void renameDoc(row)" in lib
|
|
assert "이름: name }" in lib and "saveTemplate(at.layer, kind, row.이름, null" in lib
|
|
main = _text("M02_MasterTemplete_UI_Main.ts")
|
|
assert "title.textContent = at.label = named ? `${at.name} ${named}` : at.name;" in main
|
|
|
|
|
|
def test_구조물_조합_층_제자리_바꿈():
|
|
"""720-4 — 해시 이동 없음 · replaceState · 나무 · 층 줄 · 띠를 감싼 칸에 갈아 끼움 · 권한 = 함수 ·
|
|
도면 양식 = 누구나(단추는 관리자) · 불러오기 장부 = 열 때 층 · 권한."""
|
|
page = _text("M02_MasterTemplete_UI_Page.ts")
|
|
assert "navigateTo" not in page
|
|
switch = page.split("const switchStructure = async")[1].split("const go =")[0]
|
|
assert "history.replaceState(" in switch and "build();" in switch
|
|
assert "await main.openTable(layer, null, true);" in switch
|
|
assert "if (mine !== turn) return;" in switch # 늦게 온 옛 고름 버림
|
|
build = page.split("const build = (): void => {")[1].split("const settleLayer")[0]
|
|
assert "topHost.replaceChildren(" in build and "treeHost.replaceChildren(" in build
|
|
assert "tree: [treeHost]," in page and "top: topHost," in page
|
|
assert "() => isAdmin," in page and 'isSystem: user?.role === "SYSTEM_ADMIN",' in page
|
|
assert "afterItem" not in page # 785-7 [구조물 조합으로](옛 확인 창 몫) 듣기 걷음
|
|
side = _text("M02_MasterTemplete_UI_Side.ts")
|
|
assert "const drawing = section(" in side and "practice" not in side # 732-1
|
|
# 도면 양식 칸 = 누구나 · 단추만 관리자(720-4 덧)
|
|
assert "const drawing = opt.isSystem" not in side
|
|
assert "if (!opt.isSystem) return [];" in side
|
|
assert "items = await listTemplates(layer, null);" in side
|
|
hopyo = _text("M02_MasterTemplete_Hopyo_Side.ts")
|
|
assert "buildHopyoLedger({ scope: pageScope(), canWrite: opt.canWrite() })" in hopyo
|