import pytest from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from app.core.database import Base from app.domain.models import User, Item, Video # UserItem -> Item, UserVideo -> Video from datetime import datetime class TestDatabaseIntegration: """데이터베이스 통합 테스트 예제""" @pytest.fixture def db_session(self): """테스트용 데이터베이스 세션""" engine = create_engine("sqlite:///:memory:") Base.metadata.create_all(bind=engine) SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) session = SessionLocal() yield session session.close() def test_user_creation(self, db_session): """사용자 생성 테스트""" # 사용자 생성 user = User( email="test@example.com", hashed_password="hashed_password_123", name="Test User", is_active=True ) db_session.add(user) db_session.commit() # 조회 saved_user = db_session.query(User).filter_by(email="test@example.com").first() assert saved_user is not None assert saved_user.name == "Test User" assert saved_user.is_active == True def test_user_item_relationship(self, db_session): """사용자-아이템 관계 테스트""" # 사용자 생성 user = User( email="test@example.com", hashed_password="hashed_password_123", name="Test User" ) db_session.add(user) db_session.commit() # 아이템 생성 item = Item( user_id=user.id, name="Test Item", address="Test Address", url="https://example.com" ) db_session.add(item) db_session.commit() # 관계 확인 user_items = db_session.query(Item).filter_by(user_id=user.id).all() assert len(user_items) == 1 assert user_items[0].name == "Test Item" def test_cascade_delete(self, db_session): """Cascade 삭제 테스트""" # 사용자와 아이템 생성 user = User( email="test@example.com", hashed_password="hashed_password_123", name="Test User" ) db_session.add(user) db_session.commit() item = Item( user_id=user.id, name="Test Item", address="Test Address", url="https://example.com" ) db_session.add(item) db_session.commit() # 사용자 삭제 db_session.delete(user) db_session.commit() # 아이템도 삭제되었는지 확인 items = db_session.query(Item).all() assert len(items) == 0 @pytest.mark.parametrize("item_name,expected_count", [ ("Restaurant", 2), ("Cafe", 1), ("Shop", 3) ]) def test_filter_items_by_name(self, db_session, item_name, expected_count): """이름별 아이템 필터링 테스트""" # 사용자 생성 user = User( email="test@example.com", hashed_password="hashed_password_123", name="Test User" ) db_session.add(user) db_session.commit() # 다양한 타입의 아이템 생성 items_data = [ ("Restaurant", 2), ("Cafe", 1), ("Shop", 3) ] for name_prefix, count in items_data: for i in range(count): item = Item( user_id=user.id, name=f"{name_prefix} {i+1}", address=f"Address {name_prefix} {i+1}", url=f"https://example.com/{name_prefix.lower()}{i+1}" ) db_session.add(item) db_session.commit() # 이름으로 필터링 filtered_items = db_session.query(Item).filter( Item.user_id == user.id, Item.name.like(f"{item_name}%") ).all() assert len(filtered_items) == expected_count