"""온보딩/프로필 연락처(phone) 형식 검증 회귀 테스트. 2026-07-27 전수 순회에서 발견: 온보딩 연락처에 "전화번호아님텍스트" 같은 임의 문자열을 넣어도 클라이언트·서버 모두 통과되어 DB에 저장됐다. OnboardingRequest / UserProfilePatch 는 숫자 9~15자리(하이픈·공백·괄호·점· 선행 + 허용)만 받아야 한다. """ from __future__ import annotations import unittest from pydantic import ValidationError from .routes.users import OnboardingRequest, UserProfilePatch def _onboarding_kwargs(**overrides: object) -> dict: base: dict = { "legal_name": "검증 사용자", "affiliation": "한신대학교", "department": "상담심리학과", "grade_level": "3학년", "phone": "010-1234-5678", "contact_address": "경기도 오산시 한신대길 137", "nickname": "검증", "self_introduction": "연락처 검증 테스트 사용자입니다.", "avatar_url": "", "terms_accepted": True, "privacy_accepted": True, } base.update(overrides) return base class OnboardingPhoneValidationTest(unittest.TestCase): def test_onboarding_rejects_non_numeric_phone_text(self) -> None: with self.assertRaises(ValidationError): OnboardingRequest(**_onboarding_kwargs(phone="전화번호아님텍스트")) def test_onboarding_rejects_phone_with_too_few_digits(self) -> None: with self.assertRaises(ValidationError): OnboardingRequest(**_onboarding_kwargs(phone="010-12")) def test_onboarding_accepts_common_korean_phone_formats(self) -> None: for phone in ( "010-1234-5678", "01012345678", "010 1234 5678", "02-123-4567", "031-8000-9000", "+82-10-1234-5678", ): with self.subTest(phone=phone): req = OnboardingRequest(**_onboarding_kwargs(phone=phone)) self.assertEqual(req.phone, phone.strip()) def test_profile_patch_rejects_non_numeric_phone_text(self) -> None: with self.assertRaises(ValidationError): UserProfilePatch(phone="전화번호아님텍스트") def test_profile_patch_allows_omitted_phone(self) -> None: patch = UserProfilePatch() self.assertIsNone(patch.phone) if __name__ == "__main__": unittest.main()