Coverage for src / mysingle / auth / router / verify.py: 0%

21 statements  

« prev     ^ index     » next       coverage.py v7.12.0, created at 2025-12-02 00:58 +0900

1from fastapi import APIRouter, Body, Request, status 

2from pydantic import EmailStr 

3 

4from ..exceptions import ( 

5 UserAlreadyVerified, 

6 UserInactive, 

7 UserNotExists, 

8) 

9from ..schemas import UserResponse 

10from ..user_manager import UserManager 

11 

12user_manager = UserManager() 

13 

14 

15def get_verify_router() -> APIRouter: 

16 """이메일 검증을 위한 라우터 생성""" 

17 router = APIRouter() 

18 

19 @router.post( 

20 "/request-verify-token", 

21 status_code=status.HTTP_202_ACCEPTED, 

22 ) 

23 async def request_verify_token( 

24 request: Request, 

25 email: EmailStr = Body(..., embed=True), 

26 ) -> None: 

27 """ 

28 이메일 검증 토큰을 요청합니다. 

29 

30 보안을 위해 이메일 존재 여부와 관계없이 항상 202 응답을 반환합니다. 

31 """ 

32 try: 

33 user = await user_manager.get_by_email(email) 

34 await user_manager.request_verify(user, request) 

35 except ( 

36 UserNotExists, 

37 UserInactive, 

38 UserAlreadyVerified, 

39 ): 

40 # 보안: 사용자 존재 여부를 노출하지 않음 

41 pass 

42 

43 return None 

44 

45 @router.post( 

46 "/verify", 

47 response_model=UserResponse, 

48 ) 

49 async def verify( 

50 request: Request, 

51 token: str = Body(..., embed=True), 

52 ) -> UserResponse: 

53 """ 

54 이메일 검증 토큰을 사용하여 사용자를 검증합니다. 

55 """ 

56 # UserManager.verify에서 이미 적절한 예외를 발생시키므로 

57 # 직접 전파하도록 수정 

58 user = await user_manager.verify(token, request) 

59 return UserResponse.model_validate(user, from_attributes=True) 

60 

61 return router