Merge remote-tracking branch 'origin/sub_laptop_7' into main_laptop_1

This commit is contained in:
2026-10-04 21:46:45 +09:00
7 changed files with 103 additions and 14 deletions
+76
View File
@@ -0,0 +1,76 @@
"""마스터 층 읽기는 층 길 한 벌(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