- M02_MasterTemplete_Router_Drawing.py — B07 Engine_Frame_Import · title_block_fields 다시 씀 - 자리표 키 목록 18 개(프로젝트 14 · 도면 4) · project_id 를 주면 표제란 값 함께 - main.py include 는 sub1 몫 - 시험 test_m02_router_drawing.py Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PxvYb5ufV1kWdBvZbpDfu6
59 lines
1.9 KiB
Python
59 lines
1.9 KiB
Python
"""M02 도면 양식 서버 길 — 자리표 키 목록 · 도각 파일 불러오기 (PLAN 10-3)."""
|
|
|
|
import io
|
|
import json
|
|
import re
|
|
from pathlib import Path
|
|
|
|
from fastapi import FastAPI
|
|
from fastapi.testclient import TestClient
|
|
|
|
from M02_MasterTemplete.M02_MasterTemplete_Router_Drawing import DRAWING_FIELDS, router
|
|
|
|
app = FastAPI()
|
|
app.include_router(router)
|
|
client = TestClient(app)
|
|
|
|
|
|
def test_fields_cover_system_placeholders():
|
|
# 시스템 도면 양식에 박힌 자리표는 전부 키 목록에 있다 — 없으면 화면이 모르는 칸이 생긴다.
|
|
keys = {key for key, _, _ in DRAWING_FIELDS}
|
|
used = set()
|
|
for path in Path("resources/master_template/drawing").glob("00_*.json"):
|
|
text = json.dumps(json.loads(path.read_text(encoding="utf-8")), ensure_ascii=False)
|
|
used |= {match.strip() for match in re.findall(r"\{\{\s*([^}]+?)\s*\}\}", text)}
|
|
assert used and used <= keys, used - keys
|
|
|
|
|
|
def test_fields_without_project():
|
|
response = client.get("/api/m02/drawing-fields")
|
|
assert response.status_code == 200
|
|
body = response.json()
|
|
assert [item["key"] for item in body["fields"]] == [key for key, _, _ in DRAWING_FIELDS]
|
|
assert body["values"] == {}
|
|
|
|
|
|
def test_import_rejects_other_files():
|
|
response = client.post(
|
|
"/api/m02/drawing-import", files={"file": ("a.txt", b"hello", "text/plain")}
|
|
)
|
|
assert response.status_code == 400
|
|
assert "DXF" in response.json()["message"]
|
|
|
|
|
|
def test_import_dxf():
|
|
import ezdxf
|
|
|
|
document = ezdxf.new()
|
|
document.modelspace().add_line((0, 0), (100, 50))
|
|
stream = io.StringIO()
|
|
document.write(stream)
|
|
response = client.post(
|
|
"/api/m02/drawing-import",
|
|
files={"file": ("frame.dxf", stream.getvalue().encode("utf-8"), "application/dxf")},
|
|
)
|
|
assert response.status_code == 200, response.text
|
|
body = response.json()
|
|
assert body["entity_count"] == 1
|
|
assert body["drawing"]["entities"][0]["type"] == "Line"
|