- Api_Fetch: 시스템 층도 /layers/system/… (양식 목록 · 읽기 · 저장 · 지우기 · 번호 · 장부 · 새 도면 · 복사) — 옛 /api/m02/templates/* 부름 0 - 서버: GET /layers/system/structure-options(읽기 로그인 누구나 · 고쳐 씀은 옛 길 그대로) · 층 양식 목록에 쓰는곳(지우기 확인 전 막음) - 「〇〇로 복사…」 폴더 창 칸 글 「복사할 폴더」 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EYJJRCfHfdCGNhmXTjQKV7
77 lines
3.0 KiB
Python
77 lines
3.0 KiB
Python
"""마스터 층 읽기는 층 길 한 벌(39-8 · sub1 검증 흠 H2) — 회사 관리자 · 일반도 `/layers/system/…` 로
|
|
표 · 카드 · 일위대가 · 번호 · 장부 · 옵션을 읽음(200) · 쓰기는 서버가 그대로 막음(403).
|
|
|
|
시스템 층 = 견본 표(임시 폴더) · storage = 임시 폴더.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
import pytest
|
|
from fastapi import FastAPI
|
|
from fastapi.testclient import TestClient
|
|
|
|
from common_util.common_util_auth import verify_session
|
|
from config import config_system
|
|
from M02_MasterTemplete import M02_MasterTemplete_Router_Items as items_router
|
|
from M02_MasterTemplete import M02_MasterTemplete_Router_Layers as layers_router
|
|
from M02_MasterTemplete import M02_MasterTemplete_Store as store
|
|
from M02_MasterTemplete import M02_Template_Layers as layers
|
|
from resources.tester.test_m02_structure import write_sample_table
|
|
|
|
SYS = "/api/m02/layers/system"
|
|
TABLE = f"{SYS}/templates/table/구조물집계표"
|
|
|
|
|
|
@pytest.fixture()
|
|
def world(tmp_path, monkeypatch) -> dict[str, Any]:
|
|
system = tmp_path / "system"
|
|
system.mkdir()
|
|
write_sample_table(system)
|
|
monkeypatch.setattr(store, "FOLDER", system)
|
|
monkeypatch.setattr(layers, "SYSTEM_ROOT", system)
|
|
(tmp_path / "storage").mkdir()
|
|
monkeypatch.setattr(config_system, "STORAGE_BASE_DIR", str(tmp_path / "storage"))
|
|
with store.at(system):
|
|
store.create_structure("rv")
|
|
session: dict[str, Any] = {"user_id": 42, "company_id": 7, "role": "USER", "is_master": False}
|
|
app = FastAPI()
|
|
app.include_router(items_router.router)
|
|
app.include_router(layers_router.router)
|
|
app.dependency_overrides[verify_session] = lambda: session
|
|
return {"client": TestClient(app), "session": session}
|
|
|
|
|
|
@pytest.mark.parametrize("role", ["USER", "ADMIN", "SYSTEM_ADMIN"])
|
|
def test_세_계정_모두_마스터_층_읽기_200(world, role):
|
|
world["session"]["role"] = role
|
|
client = world["client"]
|
|
for url in (
|
|
f"{SYS}/templates",
|
|
TABLE,
|
|
f"{SYS}/templates/structure/rv",
|
|
f"{SYS}/templates/labor/rv",
|
|
f"{SYS}/templates/area/rv",
|
|
f"{SYS}/structures/numbers",
|
|
f"{SYS}/structure-combos",
|
|
f"{SYS}/structure-options",
|
|
):
|
|
assert client.get(url).status_code == 200, url
|
|
rows = client.get(f"{SYS}/templates").json()["양식"]
|
|
table = next(r for r in rows if (r["종류"], r["이름"]) == ("table", "구조물집계표"))
|
|
assert table["쓰는곳"] # 지우기 확인 창 전에 막는 글
|
|
|
|
|
|
@pytest.mark.parametrize("role", ["USER", "ADMIN"])
|
|
def test_회사_관리자_일반은_마스터_쓰기_403(world, role):
|
|
world["session"]["role"] = role
|
|
client = world["client"]
|
|
got = client.get(TABLE).json()
|
|
put = client.put(TABLE, json={"판": got["판"], "문서": got["문서"]})
|
|
assert put.status_code == 403
|
|
assert client.post(f"{SYS}/structures/c1").status_code == 403
|
|
assert client.post(f"{SYS}/labor/rv/copy?from=rv").status_code == 403
|
|
gone = client.delete(f"{SYS}/templates/area/rv?판=x")
|
|
assert gone.status_code == 403
|