108 lines
3.9 KiB
Python
108 lines
3.9 KiB
Python
import pytest
|
|
from fastapi import HTTPException
|
|
from pydantic import ValidationError
|
|
from app.presentation.schemas.auth_schema import JoinRequest, LoginRequest
|
|
from app.presentation.schemas.useritems_schema import GetItemsRequest, UpdateItemRequest
|
|
from app.presentation.schemas.uservideo_schema import GetVideosRequest
|
|
|
|
class TestSchemaValidation:
|
|
"""Pydantic 스키마 검증 테스트"""
|
|
|
|
def test_join_request_valid(self):
|
|
"""유효한 회원가입 요청 스키마 테스트"""
|
|
request = JoinRequest(
|
|
email="test@example.com",
|
|
password="Test1234!",
|
|
password_confirm="Test1234!",
|
|
name="Test User"
|
|
)
|
|
assert request.email == "test@example.com"
|
|
assert request.name == "Test User"
|
|
|
|
def test_join_request_password_mismatch(self):
|
|
"""비밀번호 불일치 검증 테스트"""
|
|
with pytest.raises(ValidationError) as exc_info:
|
|
JoinRequest(
|
|
email="test@example.com",
|
|
password="Test1234!",
|
|
password_confirm="Different1234!",
|
|
name="Test User"
|
|
)
|
|
assert "passwords do not match" in str(exc_info.value).lower()
|
|
|
|
def test_join_request_invalid_email(self):
|
|
"""잘못된 이메일 형식 테스트"""
|
|
with pytest.raises(ValidationError) as exc_info:
|
|
JoinRequest(
|
|
email="invalid-email",
|
|
password="Test1234!",
|
|
password_confirm="Test1234!",
|
|
name="Test User"
|
|
)
|
|
assert "email" in str(exc_info.value).lower()
|
|
|
|
def test_login_request_valid(self):
|
|
"""유효한 로그인 요청 스키마 테스트"""
|
|
request = LoginRequest(
|
|
email="test@example.com",
|
|
password="Test1234!"
|
|
)
|
|
assert request.email == "test@example.com"
|
|
assert request.password == "Test1234!"
|
|
|
|
def test_get_items_request_with_pagination(self):
|
|
"""페이지네이션이 포함된 아이템 조회 요청 테스트"""
|
|
request = GetItemsRequest(
|
|
user_id=1,
|
|
page=2,
|
|
limit=20
|
|
)
|
|
assert request.user_id == 1
|
|
assert request.page == 2
|
|
assert request.limit == 20
|
|
|
|
def test_get_items_request_default_values(self):
|
|
"""기본값을 사용하는 아이템 조회 요청 테스트"""
|
|
request = GetItemsRequest(user_id=1)
|
|
assert request.user_id == 1
|
|
assert request.page == 1 # 기본값
|
|
assert request.limit == 10 # 기본값
|
|
|
|
def test_update_item_request_partial(self):
|
|
"""부분 업데이트 요청 테스트"""
|
|
request = UpdateItemRequest(
|
|
item_id=1,
|
|
name="Updated Name"
|
|
# description은 선택적
|
|
)
|
|
assert request.item_id == 1
|
|
assert request.name == "Updated Name"
|
|
assert request.description is None
|
|
|
|
@pytest.mark.parametrize("invalid_data,expected_error", [
|
|
({"user_id": "not_a_number"}, "user_id"),
|
|
({"user_id": -1}, "user_id"),
|
|
({"user_id": 1, "page": 0}, "page"),
|
|
({"user_id": 1, "limit": 101}, "limit"),
|
|
])
|
|
def test_get_items_request_invalid_data(self, invalid_data, expected_error):
|
|
"""잘못된 데이터로 아이템 조회 요청 테스트"""
|
|
with pytest.raises(ValidationError) as exc_info:
|
|
GetItemsRequest(**invalid_data)
|
|
assert expected_error in str(exc_info.value).lower()
|
|
|
|
def test_schema_json_serialization(self):
|
|
"""스키마 JSON 직렬화 테스트"""
|
|
request = LoginRequest(
|
|
email="test@example.com",
|
|
password="Test1234!"
|
|
)
|
|
|
|
# JSON으로 변환
|
|
json_data = request.model_dump_json()
|
|
assert "test@example.com" in json_data
|
|
|
|
# JSON에서 다시 객체로
|
|
parsed = LoginRequest.model_validate_json(json_data)
|
|
assert parsed.email == request.email
|