Files
Aislo/resources/tester/test_b07_dxf_clip.py
T

80 lines
3.2 KiB
Python

"""B07 DXF 붙여넣기 — 클립보드 DXF 글 · 끌어다 놓은 DXF·DWG 파일 → 웹 CAD 엔티티 · 도면층."""
from pathlib import Path
from fastapi import FastAPI
from fastapi.testclient import TestClient
from B07_DesignDetail.B07_DesignDetail_Engine_Frame_Import import dxf_text_to_entities
from B07_DesignDetail.B07_DesignDetail_Router_Frame import router
SAMPLE = Path("resources/tester/fixtures/b07_webclip_sample.dxf").read_text(encoding="utf-8")
app = FastAPI()
app.include_router(router)
client = TestClient(app)
def test_engine_keeps_layer_names_and_shapes():
entities, layers = dxf_text_to_entities(SAMPLE)
kinds = sorted(entity["type"] for entity in entities)
# 선 1 · 닫힌 폴리선 1 · 원(선분 묶음) 1 · 글 1
assert kinds == ["Line", "PolyLine", "PolyLine", "Text"]
assert {entity["layerId"] for entity in entities} == {"구조물", "치수글"}
assert [layer["name"] for layer in layers] == ["구조물", "치수글"]
assert layers[0]["color"] == "#ff0000" # ACI 1
text = next(entity for entity in entities if entity["type"] == "Text")
assert text["shapeData"]["label"] == "배수관 D600"
assert text["shapeData"]["basePoint"] == {"x": 5.0, "y": 50.0}
line = next(entity for entity in entities if entity["type"] == "Line")
assert line["shapeData"]["endPoint"] == {"x": 100.0, "y": 0.0} # 원좌표 그대로
def test_route_returns_entities():
response = client.post("/api/projects/dxf-clip", json={"text": SAMPLE})
assert response.status_code == 200
body = response.json()
assert body["entity_count"] == 4
assert [layer["name"] for layer in body["layers"]] == ["구조물", "치수글"]
def test_route_rejects_broken_text():
response = client.post("/api/projects/dxf-clip", json={"text": " 0\nSECTION\n 2\nENTITIES\n"})
assert response.status_code == 400
assert response.json()["status"] == "error"
# 끌어다 놓기 — 오토캐드 WBLOCK(DWG) · DXFOUT(DXF) 로 저장한 파일
DWG = Path("resources/knowledge/original/경쟁사 프로그램/오솔길/OSK_sym/REpyo.dwg")
def test_file_route_reads_dxf():
response = client.post(
"/api/projects/dxf-clip/file",
files={"file": ("클립.dxf", SAMPLE.encode("utf-8"), "application/octet-stream")},
)
assert response.status_code == 200
body = response.json()
assert body["entity_count"] == 4
assert [layer["name"] for layer in body["layers"]] == ["구조물", "치수글"]
def test_file_route_reads_dwg():
response = client.post(
"/api/projects/dxf-clip/file",
files={"file": (DWG.name, DWG.read_bytes(), "application/octet-stream")},
)
assert response.status_code == 200
assert response.json()["entity_count"] > 0
def test_file_route_explains_unreadable():
wrong = client.post("/api/projects/dxf-clip/file", files={"file": ("a.pdf", b"%PDF", "x")})
assert wrong.status_code == 400
assert "DXF 또는 DWG" in wrong.json()["message"]
newer = client.post(
"/api/projects/dxf-clip/file", files={"file": ("a.dwg", b"AC1035" + b"\0" * 64, "x")}
)
assert newer.status_code == 400
assert "AutoCAD 2018 DWG 또는 DXF" in newer.json()["message"]