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