test(M02): 구조물 번호 시험이 실제 구조물집계표 대신 견본 표를 읽음
- 사용자가 화면에서 제목 · 열을 고쳐도 번호 시험이 안 밀림 · 번호 규칙 시험은 그대로 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EUypcnp5d1gU2aeKh9F2H7
This commit is contained in:
@@ -6,7 +6,6 @@
|
||||
"""
|
||||
|
||||
import json
|
||||
import shutil
|
||||
|
||||
import pytest
|
||||
from fastapi import FastAPI
|
||||
@@ -16,17 +15,15 @@ from common_util import common_util_spreadsheet as spreadsheet
|
||||
from M02_MasterTemplete import M02_MasterTemplete_Router as router_module
|
||||
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
|
||||
|
||||
REAL = store.FOLDER
|
||||
SERVER = {"s1": {"A1": {"수": "42"}}}
|
||||
LINKS = {"p1": {"시트": "s1", "칸": "B2"}} # 알약 연결 — 서버는 속을 안 봄(sub7 계약)
|
||||
|
||||
|
||||
@pytest.fixture()
|
||||
def client(tmp_path, monkeypatch):
|
||||
for kind in store.KINDS:
|
||||
(tmp_path / kind).mkdir()
|
||||
shutil.copy(REAL / "table/구조물집계표.json", tmp_path / "table")
|
||||
write_sample_table(tmp_path) # 실제 마스터 양식은 안 읽음
|
||||
monkeypatch.setattr(store, "FOLDER", tmp_path)
|
||||
|
||||
def fake(book):
|
||||
@@ -92,7 +89,7 @@ def test_다른_열_내용을_복사해_가져옴_연결도_같이(client, kind,
|
||||
assert r.status_code == 200
|
||||
ms = client.get(f"/api/m02/templates/{kind}/ms").json()["문서"]
|
||||
assert (ms["시트"][0]["칸"], ms["연결"]) == ({"A1": {"식": "1+1"}}, LINKS)
|
||||
assert (ms[key], ms["열"]) == (f"{head}10010100", "ms") # 번호 · 열은 받는 쪽 그대로
|
||||
assert (ms[key], ms["열"]) == (f"{head}05010100", "ms") # 번호 · 열은 받는 쪽 그대로
|
||||
assert ms["계산값"] == SERVER # 서버가 다시 풂
|
||||
assert client.post(f"/api/m02/{kind}/ms/copy", params={"from": "없는열"}).status_code == 404
|
||||
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
`resources/tester/spreadsheet/test_spreadsheet_store.py`."""
|
||||
|
||||
import json
|
||||
import shutil
|
||||
|
||||
import pytest
|
||||
from fastapi import FastAPI
|
||||
@@ -14,14 +13,49 @@ from M02_MasterTemplete import M02_MasterTemplete_Store as store
|
||||
from M02_MasterTemplete import M02_Template_Layers as layers
|
||||
from M02_MasterTemplete.M02_MasterTemplete_Router import router
|
||||
|
||||
REAL = store.FOLDER
|
||||
# 견본 구조물집계표 — 실제 마스터 양식은 사용자가 화면에서 고치므로 시험은 이 견본만 읽음
|
||||
_SAMPLE_COLUMNS = [
|
||||
("no", ["NO", None, None, None], "글"),
|
||||
("sta", ["측점", None, None, None], "글"),
|
||||
("rv", ["돌기슭막이", "(형태마다)", "H=(높이마다)", None], "수"),
|
||||
("c1", ["돌기슭막이", "(형태마다)", "새 열", None], "수"),
|
||||
("pv_b", ["콘크리트포장", "T=(두께마다)", "B", None], "수"),
|
||||
("pv_l", ["콘크리트포장", "T=(두께마다)", "L", None], "수"),
|
||||
("pv_a", ["콘크리트포장", "T=(두께마다)", "A", None], "수"),
|
||||
("pv_jt", ["콘크리트포장", "T=(두께마다)", "줄눈", None], "수"),
|
||||
("pp_len", ["관공", "(관종 · 관경마다)", "L", None], "수"),
|
||||
("pp_cp", ["관공", "(관종 · 관경마다)", "커플링밴드", None], "수"),
|
||||
("fb", ["세월교", "(관경 × 련수마다)", None, None], "수"),
|
||||
("ms", ["돌쌓기", "(쌓기마다)", "H=(높이마다)", None], "수"),
|
||||
("be", ["소단", None, None, None], "수"),
|
||||
("h_rip_c", ["돌붙임", "찰붙임", None, None], "수"),
|
||||
("h_rip_m", ["돌붙임", "메붙임", None, None], "수"),
|
||||
("memo", ["비고", None, None, None], "글"),
|
||||
]
|
||||
|
||||
|
||||
def write_sample_table(folder) -> None:
|
||||
"""임시 폴더에 종류 폴더 · 견본 구조물집계표를 만듦(`store.FOLDER` 자리)."""
|
||||
for kind in store.KINDS:
|
||||
(folder / kind).mkdir(exist_ok=True)
|
||||
table = {
|
||||
"양식": store.STRUCTURE_TABLE,
|
||||
"종류": "표",
|
||||
"판": 1,
|
||||
"층": ["종류", "분류1", "분류2", "분류3"],
|
||||
"열": [{"id": i, "머리": h, "단위": None, "꼴": k} for i, h, k in _SAMPLE_COLUMNS],
|
||||
"줄": [],
|
||||
"합계줄": [],
|
||||
"보기": {},
|
||||
}
|
||||
(folder / "table" / f"{store.STRUCTURE_TABLE}.json").write_text(
|
||||
json.dumps(table, ensure_ascii=False), encoding="utf-8"
|
||||
)
|
||||
|
||||
|
||||
@pytest.fixture()
|
||||
def client(tmp_path, monkeypatch):
|
||||
for kind in store.KINDS:
|
||||
(tmp_path / kind).mkdir()
|
||||
shutil.copy(REAL / "table/구조물집계표.json", tmp_path / "table")
|
||||
write_sample_table(tmp_path)
|
||||
monkeypatch.setattr(store, "FOLDER", tmp_path)
|
||||
app = FastAPI()
|
||||
app.include_router(router)
|
||||
@@ -117,10 +151,11 @@ def test_제목행으로_번호_매김_한_번_옮김(client, tmp_path):
|
||||
"c1": "01010200", # 같은 종류 · 분류1 · 다음 분류2
|
||||
"pv_b": "02010100", # 콘크리트포장 · T=(두께마다) · B
|
||||
"pv_l": "02010200",
|
||||
"fb": "06010000", # 세월교 · (관경 × 련수마다) · 분류2 없음 = 00
|
||||
"be": "14000000", # 소단 — 분류 모두 없음
|
||||
"h_rip_c": "27010000", # 돌붙임 · 찰붙임
|
||||
"h_rip_m": "27020000", # 돌붙임 · 메붙임 — 분류1 다음 번호
|
||||
"pp_len": "03010100",
|
||||
"fb": "04010000", # 세월교 · (관경 × 련수마다) · 분류2 없음 = 00
|
||||
"be": "06000000", # 소단 — 분류 모두 없음
|
||||
"h_rip_c": "07010000", # 돌붙임 · 찰붙임
|
||||
"h_rip_m": "07020000", # 돌붙임 · 메붙임 — 분류1 다음 번호
|
||||
}
|
||||
for column, code in expect.items():
|
||||
assert numbers[column] == _num(code), column
|
||||
@@ -147,8 +182,8 @@ def test_집계표_저장_때_새_열은_만들고_지운_열은_같이_지움(c
|
||||
assert "pv_a" not in numbers and "note2" not in numbers
|
||||
for kind_ in ("structure", "area", "material"):
|
||||
assert client.get(f"/api/m02/templates/{kind_}/pv_a").status_code == 404
|
||||
assert numbers["pv_x"] == _num("02010600") # 지운 04 는 비워 둠 · 무리 다음
|
||||
assert numbers["zz"] == _num("37000000") # 새 종류 = 종류 다음 번호
|
||||
assert numbers["pv_x"] == _num("02010500") # 지운 pv_a(03)는 비워 둠 · 무리 다음
|
||||
assert numbers["zz"] == _num("08000000") # 새 종류 = 종류 다음 번호
|
||||
assert numbers["pv_y"] == _num("02010101") # pv_b 무리 안 분류3 다음 번호
|
||||
|
||||
|
||||
@@ -161,7 +196,7 @@ def test_다른_열_도면을_복사해_가져옴(client):
|
||||
assert r.status_code == 200
|
||||
ms = client.get("/api/m02/templates/structure/ms").json()["문서"]
|
||||
assert ms["도면"]["entities"] == [{"type": "circle"}]
|
||||
assert (ms["도번"], ms["열"]) == ("SD10010100", "ms") # 번호 · 열은 받는 쪽 그대로
|
||||
assert (ms["도번"], ms["열"]) == ("SD05010100", "ms") # 번호 · 열은 받는 쪽 그대로
|
||||
assert client.get("/api/m02/templates/structure/rv").json()["문서"]["도번"] == "SD01010100"
|
||||
bad = client.post("/api/m02/structures/ms/copy", params={"from": "없는열"})
|
||||
assert bad.status_code == 404
|
||||
|
||||
Reference in New Issue
Block a user