#!/usr/bin/env python3 """No-10_Plant_PID.dxf 파일을 이용한 pid_worker 테스트 스크립트""" import sys import os import json import asyncio import requests # 테스트 설정 SERVER_URL = "http://localhost:5001" DXF_FILE_PATH = "/home/windpacer/projects/ExperionCrawler/futurePlan/End-to-End P&ID Graph Pipeline/No-10_Plant_PID.dxf" def test_health(): """헬스 체크""" print("=" * 60) print("1. 헬스 체크") print("=" * 60) try: resp = requests.get(f"{SERVER_URL}/health") print(f"응답: {resp.status_code}") print(json.dumps(resp.json(), indent=2, ensure_ascii=False)) return resp.status_code == 200 except Exception as e: print(f"오류: {e}") return False def test_parse_pid_drawing(): """parse_pid_drawing 도구 테스트""" print("\n" + "=" * 60) print("2. parse_pid_drawing 도구 테스트") print("=" * 60) print(f"DXF 파일: {DXF_FILE_PATH}") payload = { "tool": "parse_pid_drawing", "params": { "filepath": DXF_FILE_PATH } } try: resp = requests.post(f"{SERVER_URL}/execute", json=payload) print(f"응답: {resp.status_code}") # 응답 본문을 문자열로 받고 JSON 파싱 response_text = resp.text print(f"응답 길이: {len(response_text)}") # 응답이 JSON 문자열로 감싸져 있는 경우 처리 if response_text.startswith('"') and response_text.endswith('"'): try: # JSON 문자열을 파싱 result = json.loads(json.loads(response_text)) except json.JSONDecodeError: print(f"중첩 JSON 파싱 실패. 응답 텍스트:\n{response_text[:500]}") return False else: try: result = json.loads(response_text) except json.JSONDecodeError: print(f"JSON 파싱 실패. 응답 텍스트:\n{response_text[:500]}") return False print(json.dumps(result, indent=2, ensure_ascii=False)) if result.get("success"): print(f"\n✅ 추출된 태그 수: {result.get('count', 0)}") if result.get("tags"): print("\n첫 5개 태그:") for tag in result["tags"][:5]: print(f" - {tag.get('tagNo')} ({tag.get('instrumentType')})") return resp.status_code == 200 and result.get("success") except Exception as e: print(f"오류: {e}") import traceback traceback.print_exc() return False def test_extract_pid_tags(): """extract_pid_tags 도구 테스트 (직접 텍스트 추출)""" print("\n" + "=" * 60) print("3. extract_pid_tags 도구 테스트") print("=" * 60) # DXF에서 텍스트 추출 try: import ezdxf doc = ezdxf.readfile(DXF_FILE_PATH) msp = doc.modelspace() texts = [] for entity in msp: if entity.dxftype() == "TEXT": texts.append(entity.dxf.text) elif entity.dxftype() == "MTEXT": from ezdxf.tools.text import plain_mtext try: plain = plain_mtext(entity.dxf.text) if plain.strip(): texts.append(plain) except Exception: pass text_content = "\n".join(texts)[:5000] # 제한 print(f"DXF에서 추출한 텍스트 길이: {len(text_content)}") print(f"첫 200자: {text_content[:200]}...") payload = { "tool": "extract_pid_tags", "params": { "text": text_content, "source_type": "dxf" } } resp = requests.post(f"{SERVER_URL}/execute", json=payload) print(f"\n응답: {resp.status_code}") result = resp.json() print(json.dumps(result, indent=2, ensure_ascii=False)) return resp.status_code == 200 except Exception as e: print(f"오류: {e}") import traceback traceback.print_exc() return False async def test_build_pid_graph_parallel(): """build_pid_graph_parallel 도구 테스트""" print("\n" + "=" * 60) print("4. build_pid_graph_parallel 도구 테스트") print("=" * 60) print(f"DXF 파일: {DXF_FILE_PATH}") payload = { "tool": "build_pid_graph_parallel", "params": { "filepath": DXF_FILE_PATH } } try: resp = requests.post(f"{SERVER_URL}/execute", json=payload) print(f"응답: {resp.status_code}") result = resp.json() print(json.dumps(result, indent=2, ensure_ascii=False)) if result.get("success"): print(f"\n✅ 그래프 ID: {result.get('graph_id')}") print(f"✅ 노드 수: {result.get('nodes', 0)}") print(f"✅ 엣지 수: {result.get('edges', 0)}") return resp.status_code == 200 and result.get("success") except Exception as e: print(f"오류: {e}") import traceback traceback.print_exc() return False def main(): print("No-10_Plant_PID.dxf를 이용한 pid_worker 테스트") print(f"서버 URL: {SERVER_URL}") print(f"DXF 파일: {DXF_FILE_PATH}") # 테스트 실행 results = [] results.append(("헬스 체크", test_health())) results.append(("parse_pid_drawing", test_parse_pid_drawing())) results.append(("extract_pid_tags", test_extract_pid_tags())) results.append(("build_pid_graph_parallel", asyncio.run(test_build_pid_graph_parallel()))) # 요약 print("\n" + "=" * 60) print("테스트 요약") print("=" * 60) for name, passed in results: status = "✅ 통과" if passed else "❌ 실패" print(f"{name}: {status}") all_passed = all(r[1] for r in results) if all_passed: print("\n🎉 모든 테스트 통과!") return 0 else: print("\n⚠️ 일부 테스트 실패") return 1 if __name__ == "__main__": sys.exit(main())