O2Sound_ver2_final/backend/tests/test_schema_validation.py

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