O2Sound_ver2_final/backend/tests/test_database_integration.py

136 lines
4.2 KiB
Python

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