- test_m02_item_list: 헬퍼 가짜 모듈에 진짜 common_util_time 연결 · TZ=Asia/Seoul 고정 · 서버 수정일 = UTC Z 20자(593-1)
- test_m02_hopyo_screen: 도면 양식 칸이 조건 없이 놓임(720-4) - 찾는 글 drawing ? 를 drawing, 로
- test_m02_layer_screen: const drawing = opt.isSystem 를 조건 없는 section(L("M02_KindDrawing")) 글로
- test_m02_practice: 차례 확인 글 drawing ? 를 drawing, 로
- test_m02_structure_def_screen: 지난 판 저장일 = UTC Z 초 단위(593-1) - 길이 16 을 꼴 확인으로
- test_m02_structure_option_groups: 옵션 줄은 716-3 에서 좌측 칸을 떠남 - 있다는 단언을 없다는 단언으로
- test_m02_structure_options: 같은 까닭 - 옵션 줄 단언을 없음으로, 구조물 조합 → 도면 양식 → 실무문서 차례만 확인
- test_m02_df_convert: 옛 사본 폴더가 낡아 어긋남 - 정본과 다르면 다시 복사 · 전수 대조는 열 줄에 하나(약 1분, AISLO_DF_FULL=1 이면 전수 약 12분) · 일꾼 동시 Node 호출로 드문 실패는 혼자 한 번 더
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
60 lines
2.9 KiB
Python
60 lines
2.9 KiB
Python
"""실무문서(PLAN 39-2) — 옛 마스터 일위대가 조합 표 통째 · 시스템 관리자만 통째 지우기.
|
|
|
|
못박는 것
|
|
- `DELETE /api/m02/practice?판=` = 시스템 관리자만(그 밖 403) · 판 다르면 409 ·
|
|
구조물이 쓰는 조합이 있으면 409(아무것도 안 지움) · 지우면 줄 0 · 마스터 틀 검사 그대로.
|
|
- 화면(`Practice.ts`) = 마스터 층 · 시스템 관리자만 · 물음 두 번 · 상세 읽기만.
|
|
정본(마스터)은 읽기만 · 쓰기는 임시 사본.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
from pathlib import Path
|
|
|
|
from M01_MasterData import M01_MasterData_Store as m01
|
|
from M01_MasterData import M01_MasterData_Store_Combo as combo_store
|
|
from M02_MasterTemplete import M02_MasterTemplete_Combo_Store as combos
|
|
from resources.tester.test_m02_combo_layers import _as, _list, master_copy, world # noqa: F401
|
|
|
|
ROOT = Path(__file__).resolve().parents[2]
|
|
M02 = ROOT / "M02_MasterTemplete"
|
|
|
|
|
|
def _drop(client, 판: str, want: int) -> dict:
|
|
res = client.delete("/api/m02/practice", params={"판": 판})
|
|
assert res.status_code == want, res.text
|
|
return res.json()
|
|
|
|
|
|
def test_통째_지우기_시스템_관리자만_판_쓰는_곳(world, master_copy, monkeypatch): # noqa: F811
|
|
admin = _as(world, "SYSTEM_ADMIN")
|
|
before = _list(admin, "system")
|
|
assert before["줄"] # 사본에 옛 조합이 있음
|
|
for role in ("USER", "ADMIN"):
|
|
_drop(_as(world, role), before["판"], 403)
|
|
admin = _as(world, "SYSTEM_ADMIN")
|
|
_drop(admin, "옛판", 409)
|
|
used = before["줄"][0]["키"]
|
|
monkeypatch.setattr(combo_store, "combo_users", lambda k: ["항목 하나"] if k == used else [])
|
|
got = _drop(admin, before["판"], 409)
|
|
assert "항목 하나" in json.dumps(got, ensure_ascii=False)
|
|
assert len(_list(admin, "system")["줄"]) == len(before["줄"]) # 아무것도 안 지움
|
|
monkeypatch.setattr(combo_store, "combo_users", lambda k: [])
|
|
got = _drop(admin, before["판"], 200)
|
|
assert got["줄"] == [] and len(got["지운조합"]) == len(before["줄"])
|
|
doc = json.loads((master_copy / combos.FILE).read_text(encoding="utf-8"))
|
|
assert doc["줄"] == [] and m01.cm.check_form(combos.FILE, doc) == []
|
|
again = _list(admin, "system")
|
|
assert _drop(admin, again["판"], 200)["지운조합"] == [] # 빈 표 = 그대로
|
|
|
|
|
|
def test_화면_시스템_관리자_마스터만_물음_두_번_읽기만():
|
|
side = (M02 / "M02_MasterTemplete_UI_Side.ts").read_text("utf-8")
|
|
assert "const practice = opt.isSystem" in side # 720-4 — 시스템 관리자면 늘
|
|
order = side.split('className: "m02-side__lists ui-sidebar-panel",')[1].split("});")[0]
|
|
assert order.index("drawing,") < order.index("practice ?") # 도면 양식 아래
|
|
view = (M02 / "M02_MasterTemplete_Practice.ts").read_text("utf-8")
|
|
assert view.count("showConfirmDialog(") == 2
|
|
assert "dropPractice(" in view and "createInputField" not in view # 고칠 칸 없음
|