""" pytest 설정 및 공통 픽스처 """ import pytest import asyncio from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from fastapi.testclient import TestClient import tempfile import os from app.main import app from app.database import get_db from app.models import Base # 테스트용 데이터베이스 설정 TEST_DATABASE_URL = "sqlite:///./test.db" engine = create_engine( TEST_DATABASE_URL, connect_args={"check_same_thread": False} ) TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) def override_get_db(): """테스트용 데이터베이스 세션""" try: db = TestingSessionLocal() yield db finally: db.close() @pytest.fixture(scope="session") def event_loop(): """이벤트 루프 픽스처""" loop = asyncio.get_event_loop_policy().new_event_loop() yield loop loop.close() @pytest.fixture(scope="function") def db_session(): """테스트용 데이터베이스 세션 픽스처""" # 테이블 생성 Base.metadata.create_all(bind=engine) # 세션 생성 session = TestingSessionLocal() try: yield session finally: session.close() # 테이블 삭제 (테스트 격리) Base.metadata.drop_all(bind=engine) @pytest.fixture(scope="function") def client(db_session): """테스트 클라이언트 픽스처""" # 데이터베이스 의존성 오버라이드 app.dependency_overrides[get_db] = override_get_db with TestClient(app) as test_client: yield test_client # 의존성 오버라이드 정리 app.dependency_overrides.clear() @pytest.fixture def sample_excel_file(): """샘플 엑셀 파일 픽스처""" import pandas as pd # 샘플 데이터 생성 data = { 'Description': [ 'PIPE, SEAMLESS, A333-6, 6", SCH40', 'ELBOW, 90DEG, A234-WPB, 4", SCH40', 'VALVE, GATE, A216-WCB, 2", 150LB', 'FLANGE, WELD NECK, A105, 3", 150LB', 'BOLT, HEX HEAD, A193-B7, M16X50' ], 'Quantity': [10, 8, 2, 4, 20], 'Unit': ['EA', 'EA', 'EA', 'EA', 'EA'] } df = pd.DataFrame(data) # 임시 파일 생성 with tempfile.NamedTemporaryFile(suffix='.xlsx', delete=False) as tmp_file: df.to_excel(tmp_file.name, index=False) yield tmp_file.name # 파일 정리 os.unlink(tmp_file.name) @pytest.fixture def sample_csv_file(): """샘플 CSV 파일 픽스처""" import pandas as pd # 샘플 데이터 생성 data = { 'Description': [ 'PIPE, SEAMLESS, A333-6, 8", SCH40', 'TEE, EQUAL, A234-WPB, 6", SCH40', 'VALVE, BALL, A216-WCB, 4", 150LB' ], 'Quantity': [5, 3, 1], 'Unit': ['EA', 'EA', 'EA'] } df = pd.DataFrame(data) # 임시 파일 생성 with tempfile.NamedTemporaryFile(suffix='.csv', delete=False, mode='w') as tmp_file: df.to_csv(tmp_file.name, index=False) yield tmp_file.name # 파일 정리 os.unlink(tmp_file.name) @pytest.fixture def sample_job_data(): """샘플 작업 데이터 픽스처""" return { "job_no": "TEST-2025-001", "job_name": "테스트 프로젝트", "client_name": "테스트 고객사", "end_user": "테스트 사용자", "epc_company": "테스트 EPC", "status": "active" } @pytest.fixture def sample_material_data(): """샘플 자재 데이터 픽스처""" return { "original_description": "PIPE, SEAMLESS, A333-6, 6\", SCH40", "classified_category": "PIPE", "classified_subcategory": "SEAMLESS", "material_grade": "A333-6", "schedule": "SCH40", "size_spec": "6\"", "quantity": 10.0, "unit": "EA", "classification_confidence": 0.95 } # 테스트 설정 pytest_plugins = []