
    i.                        d Z ddlZddlZddlZddlmZ ej                  j                  dd       ddlm	Z	m
Z
mZmZmZ  G d dej                        Z G d d	ej                        Z G d
 dej                        Z G d dej                        Z G d dej                        Zedk(  r ej*                  d       yy)un   
auth.py 인증 모듈 테스트
테스터: 아르고스
대상 파일: /home/jay/workspace/dashboard/auth.py
    N)patchz/home/jay/workspace/dashboard)check_cors_originget_allowed_originsget_auth_configis_auth_requiredverify_basic_authc                   @    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)TestGetAuthConfigu"   get_auth_config() 함수 테스트c                     i }t        j                  d|d      5  t               }ddd       | j                  d          | j	                  |d   d       | j	                  |d   d	       y# 1 sw Y   HxY w)
u+   환경변수 미설정 시 기본값 확인
os.environTclearNenableduseradminpasswordchangeme)r   dictr   assertFalseassertEqualselfenvconfigs      K/home/jay/workspace/.worktrees/task-2116-dev1/teams/dev1/tests/test_auth.pytest_defaults_when_no_env_varsz0TestGetAuthConfig.test_defaults_when_no_env_vars   sp    ZZc6 	'$&F	'	*+1
+Z8		' 	's   A--A6c                     t        j                  dddid      5  t               }ddd       | j                  d          y# 1 sw Y   xY w)u+   DASHBOARD_AUTH=true 설정 시 enabled=Truer   DASHBOARD_AUTHtrueTr   Nr   r   r   r   
assertTruer   r   s     r   *test_enabled_true_when_dashboard_auth_truez<TestGetAuthConfig.test_enabled_true_when_dashboard_auth_true#   sF    ZZ'7&@M 	'$&F	'y)*	' 	'   AAc                     t        j                  dddid      5  t               }ddd       | j                  d          y# 1 sw Y   xY w)u-   DASHBOARD_AUTH=false 설정 시 enabled=Falser   r   falseTr   Nr   )r   r   r   r   r"   s     r   ,test_enabled_false_when_dashboard_auth_falsez>TestGetAuthConfig.test_enabled_false_when_dashboard_auth_false)   sH    ZZ'7&AN 	'$&F	'	*+	' 	'r$   c                     t        j                  dddid      5  t               }ddd       | j                  d          y# 1 sw Y   xY w)uP   DASHBOARD_AUTH 값은 .lower() 처리로 대소문자 무관하게 'true' 비교r   r   TRUETr   Nr   r    r"   s     r   test_enabled_case_insensitivez/TestGetAuthConfig.test_enabled_case_insensitive/   sH     ZZ'7&@M 	'$&F	'y)*	' 	'r$   c                     ddd}t        j                  d|d      5  t               }ddd       | j                  d   d       y# 1 sw Y   xY w)	u0   DASHBOARD_PASSWORD > DASHBOARD_PASS 우선순위secret_passwordfallback_passDASHBOARD_PASSWORDDASHBOARD_PASSr   Tr   Nr   r   r   r   r   r   s      r   :test_dashboard_password_takes_priority_over_dashboard_passzLTestGetAuthConfig.test_dashboard_password_takes_priority_over_dashboard_pass7   sV     #4-
 ZZc6 	'$&F	'
+->?	' 	'   AAc                     t        j                  dddid      5  t               }ddd       | j                  d   d       y# 1 sw Y   xY w)u6   DASHBOARD_PASSWORD 미설정 시 DASHBOARD_PASS 사용r   r0   r-   Tr   Nr   r1   r"   s     r   .test_dashboard_pass_used_when_password_not_setz@TestGetAuthConfig.test_dashboard_pass_used_when_password_not_setA   sK    ZZ'7&IQUV 	'$&F	'
+_=	' 	'   AAc                     ddd}t        j                  d|d      5  t               }ddd       | j                  d   d       y# 1 sw Y   xY w)	uB   DASHBOARD_PASSWORD가 빈 문자열이면 DASHBOARD_PASS로 폴백 r-   r.   r   Tr   Nr   r1   r   s      r   Atest_dashboard_password_empty_string_falls_back_to_dashboard_passzSTestGetAuthConfig.test_dashboard_password_empty_string_falls_back_to_dashboard_passG   sW     #%-
 ZZc6 	'$&F	' 	
+_=	' 	'r3   c                     t        j                  dddid      5  t               }ddd       | j                  d   d       y# 1 sw Y   xY w)u&   DASHBOARD_USER 커스텀 설정 확인r   DASHBOARD_USERmyuserTr   Nr   r1   r"   s     r   test_custom_userz"TestGetAuthConfig.test_custom_userR   sI    ZZ'7&B$O 	'$&F	'2	' 	'r6   N)__name__
__module____qualname____doc__r   r#   r'   r*   r2   r5   r9   r=        r   r
   r
      s.    ,9+,+@>	>3rC   r
   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestIsAuthRequiredu'   is_auth_required(path) 함수 테스트c                     t        j                  di d      5  | j                  t        d             | j                  t        d             | j                  t        d             ddd       y# 1 sw Y   yxY w)u/   AUTH 비활성화 시 모든 경로에서 Falser   Tr   
/dashboard/api/status/Nr   r   r   r   r   s    r   %test_returns_false_when_auth_disabledz8TestIsAuthRequired.test_returns_false_when_auth_disabled\   sc    ZZb5 	4-l;<-m<=-c23	4 	4 	4s   AA11A:c                     t        j                  dddid      5  | j                  t        d             | j                  t        d             | j                  t        d             d	d	d	       y	# 1 sw Y   y	xY w)
u(   AUTH 활성화 시 일반 경로는 Truer   r   r   Tr   rG   rI   z	/api/dataNr   r   r!   r   rK   s    r   3test_returns_true_for_normal_path_when_auth_enabledzFTestIsAuthRequired.test_returns_true_for_normal_path_when_auth_enabledc   sc    ZZ'7&@M 	;OO,\:;OO,S12OO,[9:	; 	; 	;s   AA33A<c                     t        j                  dddid      5  | j                  t        d             ddd       y# 1 sw Y   yxY w)u<   면제 경로 /api/status → AUTH 활성화 시에도 Falser   r   r   Tr   rH   NrJ   rK   s    r   )test_exempt_path_api_status_returns_falsez<TestIsAuthRequired.test_exempt_path_api_status_returns_falsej   A    ZZ'7&@M 	>-m<=	> 	> 	>	   ?Ac                     t        j                  dddid      5  | j                  t        d             ddd       y# 1 sw Y   yxY w)u<   면제 경로 /api/stream → AUTH 활성화 시에도 Falser   r   r   Tr   z/api/streamNrJ   rK   s    r   )test_exempt_path_api_stream_returns_falsez<TestIsAuthRequired.test_exempt_path_api_stream_returns_falseo   rR   rS   c                     t        j                  dddid      5  | j                  t        d             | j                  t        d             ddd       y# 1 sw Y   yxY w)	u6   면제 목록에 없는 /api/* 경로는 인증 필요r   r   r   Tr   z/api/metricsz	/api/logsNrN   rK   s    r   &test_non_exempt_api_path_requires_authz9TestIsAuthRequired.test_non_exempt_api_path_requires_autht   sQ    ZZ'7&@M 	;OO,^<=OO,[9:	; 	; 	;s   5AA"N)	r>   r?   r@   rA   rL   rO   rQ   rU   rW   rB   rC   r   rE   rE   Y   s    14;>
>
;rC   rE   c                   T    e Zd ZdZdededefdZd Zd Zd Zd	 Z	d
 Z
d Zd Zd Zy)TestVerifyBasicAuthu/   verify_basic_auth(auth_header) 함수 테스트r   r   returnc                 x    t        j                  | d| j                               j                         }d| S )u,   테스트용 Basic Auth 헤더 생성 헬퍼:Basic )base64	b64encodeencodedecode)r   r   r   credentialss       r   _make_basic_headerz&TestVerifyBasicAuth._make_basic_header~   s<    &&$q
';'B'B'DELLN}%%rC   c                     ddd}t        j                  d|d      5  | j                  dd      }t        |      \  }}ddd       | j	                         | j                  d       y# 1 sw Y   -xY w)u)   올바른 Basic auth → (True, username)r   r   r;   r/   r   Tr   Nr   r   rc   r   r!   r   r   r   headersuccessusernames        r   0test_valid_credentials_returns_true_and_usernamezDTestVerifyBasicAuth.test_valid_credentials_returns_true_and_username   sw     &",
 ZZc6 	:,,WjAF 1& 9GX	: 	 7+		: 	:   !A++A4c                     ddd}t        j                  d|d      5  | j                  dd      }t        |      \  }}ddd       | j	                         | j                         y# 1 sw Y   ,xY w)	u$   잘못된 password → (False, None)r   r   re   r   Tr   wrongpasswordNr   r   rc   r   r   assertIsNonerg   s        r   &test_wrong_password_returns_false_nonez:TestVerifyBasicAuth.test_wrong_password_returns_false_none   sw     &",
 ZZc6 	:,,WoFF 1& 9GX	: 	!(#		: 	:   !A**A3c                     ddd}t        j                  d|d      5  | j                  dd      }t        |      \  }}ddd       | j	                         | j                         y# 1 sw Y   ,xY w)	u$   잘못된 username → (False, None)r   r   re   r   Tr   	wronguserNro   rg   s        r   "test_wrong_user_returns_false_nonez6TestVerifyBasicAuth.test_wrong_user_returns_false_none   sw     &",
 ZZc6 	:,,[*EF 1& 9GX	: 	!(#		: 	:rr   c                     t        j                  di d      5  t        d      \  }}ddd       | j                         | j	                         y# 1 sw Y   ,xY w)u   빈 헤더 → (False, None)r   Tr   r8   Nr   r   r   r   rp   r   ri   rj   s      r   $test_empty_header_returns_false_nonez8TestVerifyBasicAuth.test_empty_header_returns_false_none   sR    ZZb5 	6 1" 5GX	6!(#	6 	6   AAc                     t        j                  di d      5  t        d      \  }}ddd       | j                         | j	                         y# 1 sw Y   ,xY w)u%   "Bearer xxx" 형식 → (False, None)r   Tr   zBearer sometoken123Nrw   rx   s      r   $test_bearer_token_returns_false_nonez8TestVerifyBasicAuth.test_bearer_token_returns_false_none   sW    ZZb5 	I 12G HGX	I!(#	I 	Irz   c                     t        j                  di d      5  t        d      \  }}ddd       | j                         | j	                         y# 1 sw Y   ,xY w)u"   잘못된 base64 → (False, None)r   Tr   zBasic !!!invalid_base64!!!Nrw   rx   s      r   &test_invalid_base64_returns_false_nonez:TestVerifyBasicAuth.test_invalid_base64_returns_false_none   sW    ZZb5 	P 12N OGX	P!(#	P 	Prz   c                 
   t        j                  di d      5  t        j                  d      j	                         }t        d|       \  }}ddd       | j                         | j                         y# 1 sw Y   ,xY w)u0   콜론 없는 base64 디코딩 → (False, None)r   Tr   s   nocolonr]   N)r   r   r^   r_   ra   r   r   rp   )r   no_colonri   rj   s       r   +test_no_colon_in_decoded_returns_false_nonez?TestVerifyBasicAuth.test_no_colon_in_decoded_returns_false_none   sx    ZZb5 	G''
3::<H 1F8*2E FGX	G 	!(#		G 	Gs   5A99Bc                     ddd}t        j                  d|d      5  | j                  dd      }t        |      \  }}ddd       | j	                         | j                  d       y# 1 sw Y   -xY w)u5   패스워드에 콜론 포함 시 올바르게 처리r   zpass:with:colonsre   r   Tr   Nrf   rg   s        r   test_password_with_colonz,TestVerifyBasicAuth.test_password_with_colon   sx     &"4
 ZZc6 	:,,W6HIF 1& 9GX	: 	 7+		: 	:rl   N)r>   r?   r@   rA   strrc   rk   rq   ru   ry   r|   r~   r   r   rB   rC   r   rY   rY   {   sG    9&s &c &c &

,
$
$$$$$
,rC   rY   c                   (    e Zd ZdZd Zd Zd Zd Zy)TestGetAllowedOriginsu&   get_allowed_origins() 함수 테스트c                     t        j                  di d      5  t               }ddd       | j                  d       | j                  d|       | j	                  t        |      d       y# 1 sw Y   IxY w)u   기본값 확인r   Tr   Nhttp://100.76.130.39:8000http://localhost:8000   )r   r   r   assertInr   lenr   originss     r   test_default_originsz*TestGetAllowedOrigins.test_default_origins   sa    ZZb5 	,)+G	,17;-w7Wq)		, 	,s   A,,A5c                     t        j                  dddid      5  t               }ddd       | j                  dg       y# 1 sw Y   xY w)u$   CORS_ORIGINS 단일 커스텀 설정r   CORS_ORIGINShttp://example.comTr   N)r   r   r   r   r   s     r   test_custom_cors_origins_singlez5TestGetAllowedOrigins.test_custom_cors_origins_single   sJ    ZZ~7K&LTXY 	,)+G	,#7"89	, 	,s   AAc                    d}t        j                  dd|id      5  t               }ddd       | j                  t	              d       | j                  d|       | j                  d	|       | j                  d
|       y# 1 sw Y   [xY w)u4   CORS_ORIGINS 다중 커스텀 설정 (콤마 구분)z6http://example.com,http://another.com,http://third.comr   r   Tr   N   r   zhttp://another.comzhttp://third.com)r   r   r   r   r   r   )r   customr   s      r   !test_custom_cors_origins_multiplez7TestGetAllowedOrigins.test_custom_cors_origins_multiple   sz    IZZ~v&>dK 	,)+G	,Wq)*G4*G4('2	, 	,s   BBc                     t        j                  di d      5  t               }ddd       | j                  t               y# 1 sw Y    xY w)u%   반환값이 list 타입인지 확인r   Tr   N)r   r   r   assertIsInstancelistr   s     r   test_returns_list_typez,TestGetAllowedOrigins.test_returns_list_type   s?    ZZb5 	,)+G	,gt,	, 	,s   AAN)r>   r?   r@   rA   r   r   r   r   rB   rC   r   r   r      s    0*:3-rC   r   c                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	TestCheckCorsOriginu*   check_cors_origin(origin) 함수 테스트c                     t        j                  di d      5  t        d      }ddd       | j                  d       y# 1 sw Y   xY w)u)   허용된 origin → 해당 origin 반환r   Tr   r   Nr   r   r   r   r   results     r   "test_allowed_origin_returns_originz6TestCheckCorsOrigin.test_allowed_origin_returns_origin   sG    ZZb5 	@&'>?F	@!89	@ 	@   A  A	c                     t        j                  di d      5  t        d      }ddd       | j                  d       y# 1 sw Y   xY w)u<   다른 허용된 origin (기본값) → 해당 origin 반환r   Tr   r   Nr   r   s     r   *test_another_allowed_origin_returns_originz>TestCheckCorsOrigin.test_another_allowed_origin_returns_origin   sG    ZZb5 	D&'BCF	D!<=	D 	Dr   c                     t        j                  di d      5  t        d      }ddd       | j                         y# 1 sw Y   xY w)u#   허용되지 않은 origin → Noner   Tr   zhttp://evil.comNr   r   r   rp   r   s     r   #test_disallowed_origin_returns_nonez7TestCheckCorsOrigin.test_disallowed_origin_returns_none  s@    ZZb5 	:&'89F	:&!	: 	:	   ?Ac                     t        j                  dddid      5  t        d      }ddd       | j                  d       y# 1 sw Y   xY w)u7   커스텀 CORS_ORIGINS 환경변수로 허용된 originr   r   http://myapp.comTr   Nr   r   s     r   test_custom_allowed_originz.TestCheckCorsOrigin.test_custom_allowed_origin  sJ    ZZ~7I&JRVW 	;&'9:F	;!34	; 	;s   AAc                     t        j                  dddid      5  t        d      }ddd       | j                         y# 1 sw Y   xY w)u=   커스텀 CORS_ORIGINS 환경변수에 없는 origin → Noner   r   r   Tr   r   Nr   r   s     r   test_custom_disallowed_originz1TestCheckCorsOrigin.test_custom_disallowed_origin  sK    ZZ~7I&JRVW 	@&'>?F	@&!	@ 	@s   AA
c                     t        j                  di d      5  t        d      }ddd       | j                         y# 1 sw Y   xY w)u   빈 origin 문자열 → Noner   Tr   r8   Nr   r   s     r   test_empty_origin_returns_nonez2TestCheckCorsOrigin.test_empty_origin_returns_none  s?    ZZb5 	+&r*F	+&!	+ 	+r   N)
r>   r?   r@   rA   r   r   r   r   r   r   rB   rC   r   r   r      s#    4:>"5""rC   r   __main__r   )	verbosity)rA   r^   sysunittestunittest.mockr   pathinsertauthr   r   r   r   r   TestCaser
   rE   rY   r   r   r>   mainrB   rC   r   <module>r      s     
   2 3 ?3)) ?3D;** ;DS,(++ S,l-H-- -D%"(++ %"P zHMMA rC   