"""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"]