# -*- coding: utf-8 -*- """298-2 B07 좌측 아래 단추 줄 [?] [<] [>] [저장] [초기화]. 못박는 것 - 줄 차례 — [도각 편집] = 윗줄 · 아래 줄(help-row) = [저장] [초기화](앞 [?] [<] [>] 는 공용) · [초기화] = danger-ghost(B05 · B06 과 같은 꼴) · 맨 오른쪽. - [저장] = 이동 없이 고친 탭 저장 · 고친 것 없으면 요청 0 · 저장 뒤 단계 색 다시 읽음. - [초기화] = 물음 → 오버레이 → POST reset → CAD 자동백업(도면마다) 지움 → 다시 읽음 · [취소] = 요청 0 · 실패 = 머묾(다시 읽음 없음) · 도각 편집 중 = 막음. - 창구 = `POST /projects/{id}/design-drawings/reset` 본문 없음. Node 헬퍼 `helper_298_2_b07_buttons.cjs` 가 저장 묶음을 돌림. """ from __future__ import annotations import json import os import subprocess from pathlib import Path import pytest HERE = os.path.dirname(os.path.abspath(__file__)) B07 = Path(HERE).parents[1] / "B07_DesignDetail" def _read(name: str) -> str: return (B07 / name).read_text(encoding="utf-8").replace("\r\n", "\n") @pytest.fixture(scope="module") def out(): proc = subprocess.run( ["node", os.path.join(HERE, "helper_298_2_b07_buttons.cjs")], capture_output=True, text=True, encoding="utf-8", timeout=60, ) assert proc.returncode == 0, proc.stderr return json.loads(proc.stdout) def test_줄_차례_꼴(): page = _read("B07_DesignDetail_UI_Page.ts") assert "frameRow.append(frameEditor.button);" in page assert "actionRow.dataset.helpRow" in page assert "actionRow.append(saveButton, resetButton);" in page assert "actions.append(frameEditor.banner, frameRow, actionRow);" in page reset = page[page.index("const resetButton = createButton({") :] reset = reset[: reset.index("});")] assert 'label: L("Common_Btn_Reset")' in reset assert 'variant: "danger-ghost"' in reset assert "resetDrawings(store)" in reset save = page[page.index("const saveButton = createButton({") :] save = save[: save.index("});")] assert 'label: L("Common_Btn_Save")' in save assert "saveDrawingsNow(store, refreshStages)" in save assert "layout.setStages(state.stages)" in page assert len(page.splitlines()) <= 700 def test_창구(): api = _read("B07_DesignDetail_Api_Fetch.ts") block = api[api.index("export function resetDesignDrawings") :] block = block[: block.index("}\n")] assert "/projects/${projectId}/design-drawings/reset" in block assert '{ method: "POST" }' in block assert "body" not in block def test_저장(out): assert out["saveNone"] == {"calls": ["toast:info"], "saved": 0} assert out["saveEdited"] == { "calls": ["overlay+", "confirm:cross_s1", "overlay-", "toast:success"], "saved": 1, } def test_초기화(out): assert out["reset"] == [ "ask", "overlay+", "reset:p1", "drop:OPEN_WEB_CAD__RECOVERY__b07:p1:cover", "drop:OPEN_WEB_CAD__RECOVERY__b07:p1:cross_s1", "toast:success", "reload", "overlay-", ] assert out["resetCancel"] == ["ask"] assert out["resetFail"] == ["ask", "overlay+", "reset:p1", "toast:error", "overlay-"] assert out["resetFrame"] == ["toast:warning"]