"""마스터 층 읽기는 층 길 한 벌(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