136 lines
4.2 KiB
Python
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
|