- 새 M02_Library_Delete: 쓰는 줄 미리 보기(종류 · 이름 · 키 · 줄 · 층) · 권한 밖 409 막힘 목록 ·
확인 몸이면 쓰는 문서의 그 줄 지움(store.write 정본 다시 셈) 뒤 문서 지움 · _합친것/ 기록
(지운 문서 · 자리 · 고친 문서 앞판) · 되돌림(그새 고친 문서는 건너뜀) · 단가산출 바탕 · 더한줄 열쇠 당김
- 미리 보기 길 POST {kind}-tree/delete-check · undo 길이 지움 기록도 되돌림 · 합친 것 목록에 「지움」
- 나무 고침 몸 확인 칸 · 세션을 나무 고침에 넘김 · 옛 _refuse_used 걷음
- 화면: 지우기 앞 경고 창(쓰는 곳 N · 표 · 프로젝트 사본 영향 없음 · 되돌림 자리) · 부품 상자
확인창에 detail 칸(넓은 판 · 안 스크롤)
- 시험: 새 test_735_1 · test_716_4 의 쓰는 곳 409 시험을 확인 없음 409 + 목록 꼴로 고침
(지움이 막힘에서 경고 뒤 지움으로 바뀜)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
125 lines
5.9 KiB
Python
125 lines
5.9 KiB
Python
"""서고 나무 폴더(PLAN 716-4) — 종류 인자 · 안에 든 것째 지움 · 쓰는 곳 409 · 여럿 · 복사 붙여넣기.
|
|
|
|
임시 storage.
|
|
|
|
`/api/m02/layers/{층}/{종류}-tree` = 일위대가(precombo) · 단가산출(sangeun) 따로 ·
|
|
폴더 지우기 = 안의 문서 파일째(모두 검사 뒤 한 번에 · 바깥에서 쓰면 확인 없이는 409 + 목록 ·
|
|
지우는 것끼리 참조는 됨) ·
|
|
`대상` 여럿 옮기기 · 지우기 · `…-tree/paste` = 새 키 · 같은 폴더 이름 「(1)」 · 본뜬 = 원본.
|
|
"""
|
|
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
from fastapi.testclient import TestClient
|
|
|
|
from M02_MasterTemplete import M02_Precombo_Folders as pre
|
|
from M02_MasterTemplete import M02_Template_Layers as layers
|
|
from resources.tester.test_m02_precombo_folders import Tree, client # noqa: F401 — 같은 임시 층
|
|
|
|
MINE = {"층": "personal", "주인": "7/42"}
|
|
SK = "/api/m02/layers/personal/library/sangeun"
|
|
|
|
|
|
def _sk(c: TestClient, name: str, **doc) -> str:
|
|
body = {"문서": {"이름": name, "단위": "㎡", "더한줄": [], **doc}}
|
|
res = c.post(SK, json=body)
|
|
assert res.status_code == 200, res.text
|
|
return res.json()["이름"]
|
|
|
|
|
|
def _files(kind: str) -> list[str]:
|
|
return sorted(p.stem for p in (layers.personal_dir(7, 42) / kind).glob("*.json"))
|
|
|
|
|
|
def _sk_tree(c: TestClient) -> Tree:
|
|
t = Tree(c)
|
|
t.url = "/api/m02/layers/personal/sangeun-tree"
|
|
t.now = c.get(t.url).json()
|
|
return t
|
|
|
|
|
|
def test_종류마다_따로_자리_파일(client: TestClient): # noqa: F811
|
|
_sk(client, "갑")
|
|
sk = _sk_tree(client)
|
|
sk.do(op="add-folder", 경로=[], 이름="단가")
|
|
sk.do(op="move", 키="SK-000001", 새경로=["단가"])
|
|
assert Tree(client).now["폴더"] == [] # 일위대가 나무는 그대로
|
|
root = layers.personal_dir(7, 42)
|
|
assert (root / pre.file_of("sangeun")).is_file()
|
|
assert not (root / pre.file_of("precombo")).exists()
|
|
assert client.get("/api/m02/layers/personal/labor-tree").status_code == 422 # 모르는 종류
|
|
|
|
|
|
def test_폴더_지우기는_안에_든_것째_지우는_것끼리_참조는_됨(client: TestClient): # noqa: F811
|
|
a = _sk(client, "바탕")
|
|
b = _sk(client, "위", 바탕={"참조": {**MINE, "키": a}})
|
|
sk = _sk_tree(client)
|
|
sk.do(op="add-folder", 경로=[], 이름="묶음")
|
|
sk.do(op="add-folder", 경로=["묶음"], 이름="안")
|
|
sk.do(op="move", 키=a, 새경로=["묶음", "안"])
|
|
sk.do(op="move", 키=b, 새경로=["묶음"])
|
|
got = sk.do(op="delete", 경로=["묶음"])
|
|
assert sorted(got["알림"]["지운문서"]) == [a, b]
|
|
assert _files("sangeun") == [] and sk.now["폴더"] == []
|
|
|
|
|
|
def test_바깥에서_쓰면_확인_없이는_409_목록_아무것도_안_지움(client: TestClient): # noqa: F811
|
|
a = _sk(client, "바탕")
|
|
body = {
|
|
"문서": {"이름": "쓰는 일위대가", "단위": "㎡", "담은로직": [{"참조": {**MINE, "키": a}}]}
|
|
}
|
|
assert client.post("/api/m02/layers/personal/library/precombo", json=body).status_code == 200
|
|
sk = _sk_tree(client)
|
|
sk.do(op="add-folder", 경로=[], 이름="묶음")
|
|
sk.do(op="move", 키=a, 새경로=["묶음"])
|
|
detail = sk.do(409, op="delete", 경로=["묶음"])["detail"] # 735-1 — 확인 뒤 그 줄째 지움
|
|
assert "쓰는 곳" in detail["까닭"]
|
|
assert [(r["이름"], r["키"], r["줄"]) for r in detail["쓰는곳"]] == [
|
|
("쓰는 일위대가", a, "1째")
|
|
]
|
|
assert _files("sangeun") == [a] and client.get(sk.url).json()["폴더"] == [["묶음"]]
|
|
|
|
|
|
def test_여럿_옮기기_지우기(client: TestClient): # noqa: F811
|
|
t = Tree(client) # 개인 층 일위대가 SC-000001~3
|
|
t.do(op="add-folder", 경로=[], 이름="가")
|
|
t.do(op="add-folder", 경로=[], 이름="나")
|
|
t.do(
|
|
op="move", 대상=[{"키": "SC-000001"}, {"키": "SC-000002"}, {"경로": ["나"]}], 새경로=["가"]
|
|
)
|
|
assert t.now["폴더"] == [["가"], ["가", "나"]]
|
|
assert t.now["자리"] == {"SC-000001": ["가"], "SC-000002": ["가"]}
|
|
got = t.do(op="delete", 대상=[{"경로": ["가"]}, {"키": "SC-000001"}, {"키": "SC-000003"}])
|
|
assert sorted(got["알림"]["지운문서"]) == ["SC-000001", "SC-000002", "SC-000003"]
|
|
assert _files("precombo") == [] and t.now["폴더"] == []
|
|
|
|
|
|
def test_복사_붙여넣기_새_키_같은_이름_폴더는_1(client: TestClient): # noqa: F811
|
|
t = Tree(client)
|
|
t.do(op="add-folder", 경로=[], 이름="가")
|
|
t.do(op="add-folder", 경로=["가"], 이름="속")
|
|
t.do(op="move", 키="SC-000001", 새경로=["가", "속"])
|
|
url = "/api/m02/layers/personal/precombo-tree/paste"
|
|
picks = [{"경로": ["가"]}, {"경로": [], "키": "SC-000002"}]
|
|
res = client.post(url, json={"from_layer": "personal", "대상": picks, "경로": ["가"]})
|
|
assert res.status_code == 200, res.text
|
|
got = res.json()
|
|
assert got["알림"]["만든문서"] == ["SC-000004", "SC-000005"]
|
|
assert ["가", "가"] in got["폴더"] and ["가", "가", "속"] in got["폴더"]
|
|
assert got["자리"]["SC-000004"] == ["가", "가", "속"] and got["자리"]["SC-000005"] == ["가"]
|
|
again = client.post(url, json={"from_layer": "personal", "대상": [{"경로": ["가"]}]}).json()
|
|
assert ["가(1)"] in again["폴더"] # 같은 이름 = 「(1)」
|
|
doc = client.get("/api/m02/layers/personal/templates/precombo/SC-000005").json()["문서"]
|
|
assert doc["이름"] == "나" and doc["본뜬"]["키"] == "SC-000002"
|
|
bad = client.post(url, json={"from_layer": "personal", "대상": [{"키": "SC-000099"}]})
|
|
assert bad.status_code == 404
|
|
|
|
|
|
@pytest.mark.parametrize("kind", ["precombo", "sangeun"])
|
|
def test_순수_지우기_알림(kind: str, tmp_path: Path):
|
|
doc = {"폴더": [["가"], ["가", "나"]], "자리": {"X-1": ["가", "나"], "X-2": []}}
|
|
out, note = pre.apply(doc, {"op": "delete", "경로": ["가"]}, {"X-1", "X-2"})
|
|
assert out == {"폴더": [], "자리": {}} and note["지운문서"] == ["X-1"]
|
|
assert pre.file_of(kind) == f"{kind}_폴더.json"
|