
    iP                       d Z ddlmZ ddlmZ ddlmZmZmZ ddl	Z	ddl
mZmZmZmZmZmZmZmZ  G d d      Z G d	 d
      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Zy)u   브라우저 라우터 단위 테스트

모든 테스트는 mock 기반으로 동작하며 실제 네트워크 연결이 불필요합니다.
    )annotations)fields)	AsyncMock	MagicMockpatchN)CHROME_ENDPOINTLIGHTPANDA_ENDPOINTPURPOSE_MAPBrowserChoiceBrowserEnginecheck_lightpanda_healthcreate_browser_contextget_browserc                  <    e Zd ZddZddZddZddZddZddZy)	TestModuleImportAndConstantsc                    t         J y)u7   browser_router 모듈 import 가 성공하는지 확인N)r
   selfs    P/home/jay/workspace/.worktrees/task-2116-dev1/tools/tests/test_browser_router.pytest_import_succeedsz1TestModuleImportAndConstants.test_import_succeeds   s     &&&    c                    t         dk(  sJ y)u>   LIGHTPANDA_ENDPOINT 값이 'ws://127.0.0.1:9333' 인지 확인ws://127.0.0.1:9333N)r	   r   s    r   test_lightpanda_endpoint_valuez;TestModuleImportAndConstants.test_lightpanda_endpoint_value#   s    "&;;;;r   c                    t         dk(  sJ y)u:   CHROME_ENDPOINT 값이 'ws://127.0.0.1:9222' 인지 확인ws://127.0.0.1:9222N)r   r   s    r   test_chrome_endpoint_valuez7TestModuleImportAndConstants.test_chrome_endpoint_value'   s    "7777r   c                    h d}|j                  t        j                               s(J d|t        t        j                               z
          y)u;   PURPOSE_MAP 에 필수 키가 모두 포함되는지 확인>   pdfspabulktextcrawlloginstealth
screenshotu   누락 키: N)issubsetr
   keysset)r   required_keyss     r   test_purpose_map_required_keysz;TestModuleImportAndConstants.test_purpose_map_required_keys+   sF    a%%k&6&6&89s\-Z]^i^n^n^pZqJqIr;ss9r   c                    t         d   t        j                  k(  sJ t         d   t        j                  k(  sJ t         d   t        j                  k(  sJ y)u<   PURPOSE_MAP 의 Lightpanda 매핑 키가 올바른지 확인r#   r!   r"   N)r
   r   
LIGHTPANDAr   s    r    test_purpose_map_lightpanda_keysz=TestModuleImportAndConstants.test_purpose_map_lightpanda_keys0   sM    7#}'?'????6"m&>&>>>>6"m&>&>>>>r   c                   t         d   t        j                  k(  sJ t         d   t        j                  k(  sJ t         d   t        j                  k(  sJ t         d   t        j                  k(  sJ t         d   t        j                  k(  sJ y)u8   PURPOSE_MAP 의 Chrome 매핑 키가 올바른지 확인r$   r&   r   r    r%   N)r
   r   CHROMEr   s    r   test_purpose_map_chrome_keysz9TestModuleImportAndConstants.test_purpose_map_chrome_keys6   s    7#}';';;;;<(M,@,@@@@5!]%9%99995!]%9%99999%)=)====r   NreturnNone)	__name__
__module____qualname__r   r   r   r+   r.   r1    r   r   r   r      s!    '
<8t
?>r   r   c                  .   e Zd Zej                  j
                  dd       Zej                  j
                  dd       Zej                  j
                  dd       Zej                  j
                  dd       Z	ej                  j
                  dd       Z
y)TestGetBrowserLightpandaHealthyc                   K   t        dt        d            5  t        d       d{   }ddd       j                  t        j
                  k(  sJ y7 ,# 1 sw Y   +xY ww)uS   get_browser('crawl') 이 healthy 상태에서 LIGHTPANDA 를 반환하는지 확인,tools.browser_router.check_lightpanda_healthTreturn_valuenewr#   Nr   r   r   enginer   r-   r   choices     r   test_crawl_returns_lightpandaz=TestGetBrowserLightpandaHealthy.test_crawl_returns_lightpandaE   sX      Ay^bGcd 	0&w//F	0}} 8 8888 0	0 	0+   A$AAA(A$AA!A$c                   K   t        dt        d            5  t        d       d{   }ddd       j                  t        j
                  k(  sJ y7 ,# 1 sw Y   +xY ww)uR   get_browser('bulk') 이 healthy 상태에서 LIGHTPANDA 를 반환하는지 확인r<   Tr=   r?   r!   NrA   rC   s     r   test_bulk_returns_lightpandaz<TestGetBrowserLightpandaHealthy.test_bulk_returns_lightpandaM   X      Ay^bGcd 	/&v..F	/}} 8 8888 /	/ 	/rF   c                   K   t        dt        d            5  t        d       d{   }ddd       j                  t        j
                  k(  sJ y7 ,# 1 sw Y   +xY ww)uR   get_browser('text') 이 healthy 상태에서 LIGHTPANDA 를 반환하는지 확인r<   Tr=   r?   r"   NrA   rC   s     r   test_text_returns_lightpandaz<TestGetBrowserLightpandaHealthy.test_text_returns_lightpandaU   rI   rF   c                   K   t        dt        d            5  t        d       d{   }ddd       j                  t        k(  sJ y7 "# 1 sw Y   !xY ww)uQ   Lightpanda 선택 시 endpoint 가 LIGHTPANDA_ENDPOINT 와 일치하는지 확인r<   Tr=   r?   r#   N)r   r   r   endpointr	   rC   s     r   test_lightpanda_choice_endpointz?TestGetBrowserLightpandaHealthy.test_lightpanda_choice_endpoint]   sS      Ay^bGcd 	0&w//F	0"5555 0	0 	0+   AAAAAAAAc                   K   t        dt        d            5  t        d       d{   }ddd       j                  sJ y7 # 1 sw Y   xY ww)uD   Lightpanda 선택 시 reason 필드가 비어있지 않은지 확인r<   Tr=   r?   r#   N)r   r   r   reasonrC   s     r   !test_lightpanda_choice_has_reasonzATestGetBrowserLightpandaHealthy.test_lightpanda_choice_has_reasone   sL      Ay^bGcd 	0&w//F	0}}} 0	0 	0s+   AAAAAAAANr2   )r5   r6   r7   pytestmarkasynciorE   rH   rK   rN   rR   r8   r   r   r:   r:   D   s    [[9 9 [[9 9 [[9 9 [[6 6 [[ r   r:   c                     e Zd Zej                  j
                  d	d       Zej                  j
                  d	d       Zej                  j
                  d	d       Zej                  j
                  d	d       Z	ej                  j
                  d	d       Z
ej                  j
                  d	d       Zej                  j
                  d	d       Zy)
TestGetBrowserChromec                t   K   t        d       d{   }|j                  t        j                  k(  sJ y7 $w)u:   get_browser('login') 이 CHROME 을 반환하는지 확인r$   Nr   rB   r   r0   rC   s     r   test_login_returns_chromez.TestGetBrowserChrome.test_login_returns_chromet   s2      #7++}} 4 4444 ,   86%8c                t   K   t        d       d{   }|j                  t        j                  k(  sJ y7 $w)u?   get_browser('screenshot') 이 CHROME 을 반환하는지 확인r&   NrY   rC   s     r   test_screenshot_returns_chromez3TestGetBrowserChrome.test_screenshot_returns_chrome{   s2      #<00}} 4 4444 1r[   c                t   K   t        d       d{   }|j                  t        j                  k(  sJ y7 $w)u8   get_browser('pdf') 이 CHROME 을 반환하는지 확인r   NrY   rC   s     r   test_pdf_returns_chromez,TestGetBrowserChrome.test_pdf_returns_chrome   2      #5))}} 4 4444 *r[   c                t   K   t        d       d{   }|j                  t        j                  k(  sJ y7 $w)u8   get_browser('spa') 이 CHROME 을 반환하는지 확인r    NrY   rC   s     r   test_spa_returns_chromez,TestGetBrowserChrome.test_spa_returns_chrome   r`   r[   c                t   K   t        d       d{   }|j                  t        j                  k(  sJ y7 $w)u<   get_browser('stealth') 이 CHROME 을 반환하는지 확인r%   NrY   rC   s     r   test_stealth_returns_chromez0TestGetBrowserChrome.test_stealth_returns_chrome   s2      #9--}} 4 4444 .r[   c                `   K   t        d       d{   }|j                  t        k(  sJ y7 w)uI   Chrome 선택 시 endpoint 가 CHROME_ENDPOINT 와 일치하는지 확인r$   Nr   rM   r   rC   s     r   test_chrome_choice_endpointz0TestGetBrowserChrome.test_chrome_choice_endpoint   s,      #7++/111 ,   .,.c                R   K   t        d       d{   }|j                  sJ y7 w)u@   Chrome 선택 시 reason 필드가 비어있지 않은지 확인r$   N)r   rQ   rC   s     r   test_chrome_choice_has_reasonz2TestGetBrowserChrome.test_chrome_choice_has_reason   s&      #7++}}} ,s   '%'Nr2   )r5   r6   r7   rS   rT   rU   rZ   r]   r_   rb   rd   rg   rj   r8   r   r   rW   rW   s   s    [[5 5 [[5 5 [[5 5 [[5 5 [[5 5 [[2 2 [[ r   rW   c                  .   e Zd Zej                  j
                  dd       Zej                  j
                  dd       Zej                  j
                  dd       Zej                  j
                  dd       Z	ej                  j
                  dd       Z
y) TestGetBrowserLightpandaFallbackc                   K   t        dt        d            5  t        d       d{   }ddd       j                  t        j
                  k(  sJ y7 ,# 1 sw Y   +xY ww)uV   Lightpanda 불가 시 get_browser('crawl') 이 CHROME 으로 fallback 하는지 확인r<   Fr=   r?   r#   Nr   r   r   rB   r   r0   rC   s     r   ,test_crawl_fallback_to_chrome_when_unhealthyzMTestGetBrowserLightpandaFallback.test_crawl_fallback_to_chrome_when_unhealthy   sX      Ay^cGde 	0&w//F	0}} 4 4444 0	0 	0rF   c                   K   t        dt        d            5  t        d       d{   }ddd       dj                  j	                         v sJ y7 +# 1 sw Y   *xY ww)uC   fallback 시 reason 에 'fallback' 단어가 포함되는지 확인r<   Fr=   r?   r#   Nfallback)r   r   r   rQ   lowerrC   s     r   &test_fallback_reason_contains_fallbackzGTestGetBrowserLightpandaFallback.test_fallback_reason_contains_fallback   s[      Ay^cGde 	0&w//F	0V]]002222 0	0 	0s+   A#AAA'A#AA A#c                   K   t        dt        d            5  t        d       d{   }ddd       j                  t        k(  sJ y7 "# 1 sw Y   !xY ww)u7   fallback 시 endpoint 가 CHROME_ENDPOINT 인지 확인r<   Fr=   r?   r#   N)r   r   r   rM   r   rC   s     r    test_fallback_endpoint_is_chromezATestGetBrowserLightpandaFallback.test_fallback_endpoint_is_chrome   sR      Ay^cGde 	0&w//F	0/111 0	0 	0rO   c                   K   t        dt        d            5  t        d       d{   }ddd       j                  t        j
                  k(  sJ y7 ,# 1 sw Y   +xY ww)uU   Lightpanda 불가 시 get_browser('bulk') 이 CHROME 으로 fallback 하는지 확인r<   Fr=   r?   r!   Nrn   rC   s     r   +test_bulk_fallback_to_chrome_when_unhealthyzLTestGetBrowserLightpandaFallback.test_bulk_fallback_to_chrome_when_unhealthy   X      Ay^cGde 	/&v..F	/}} 4 4444 /	/ 	/rF   c                   K   t        dt        d            5  t        d       d{   }ddd       j                  t        j
                  k(  sJ y7 ,# 1 sw Y   +xY ww)uU   Lightpanda 불가 시 get_browser('text') 이 CHROME 으로 fallback 하는지 확인r<   Fr=   r?   r"   Nrn   rC   s     r   +test_text_fallback_to_chrome_when_unhealthyzLTestGetBrowserLightpandaFallback.test_text_fallback_to_chrome_when_unhealthy   rx   rF   Nr2   )r5   r6   r7   rS   rT   rU   ro   rs   ru   rw   rz   r8   r   r   rl   rl      s    [[5 5 [[3 3 [[2 2 [[5 5 [[5 5r   rl   c                      e Zd Zej                  j
                  dd       Zej                  j
                  dd       Zej                  j
                  dd       Zej                  j
                  dd       Z	y)TestGetBrowserUnknownPurposec                t   K   t        d       d{   }|j                  t        j                  k(  sJ y7 $w)uF   알 수 없는 purpose 는 CHROME 으로 기본 선택되는지 확인unknown_purposeNrY   rC   s     r   #test_unknown_purpose_returns_chromez@TestGetBrowserUnknownPurpose.test_unknown_purpose_returns_chrome   s3      ##455}} 4 4444 6r[   c                `   K   t        d       d{   }|j                  t        k(  sJ y7 w)uL   알 수 없는 purpose 선택 시 endpoint 가 CHROME_ENDPOINT 인지 확인r~   Nrf   rC   s     r   'test_unknown_purpose_endpoint_is_chromezDTestGetBrowserUnknownPurpose.test_unknown_purpose_endpoint_is_chrome   s-      ##455/111 6rh   c                t   K   t        d       d{   }|j                  t        j                  k(  sJ y7 $w)uE   빈 문자열 purpose 도 CHROME 으로 기본 선택되는지 확인 NrY   rC   s     r   !test_empty_purpose_returns_chromez>TestGetBrowserUnknownPurpose.test_empty_purpose_returns_chrome   s1      #2&}} 4 4444 'r[   c                   K   t        dt        d            5 }t        d       d{    ddd       j                          y7 # 1 sw Y   xY ww)uI   알 수 없는 purpose 는 health check 를 호출하지 않는지 확인r<   Tr=   r?   r~   N)r   r   r   assert_not_called)r   mock_healths     r   /test_unknown_purpose_does_not_call_health_checkzLTestGetBrowserUnknownPurpose.test_unknown_purpose_does_not_call_health_check   sQ      Ay^bGcd 	1hs/000	1%%' 1	1 	1s+   AA	AA	AA		AANr2   )
r5   r6   r7   rS   rT   rU   r   r   r   r   r8   r   r   r|   r|      sx    [[5 5 [[2 2 [[5 5 [[( (r   r|   c                  .   e Zd Zej                  j
                  dd       Zej                  j
                  dd       Zej                  j
                  dd       Zej                  j
                  dd       Z	ej                  j
                  dd       Z
y)TestCheckLightpandaHealthc                  K   t               }d|_        t        |      |_        t        d      |_        t               }t	        |      |_        t        |      |_        t        d      |_        t	               }t	        |      |_        t	        t	                     |_        t        j                  dd|i      5  t                d{   }ddd       du sJ y7 # 1 sw Y   xY ww)uB   HTTP 200 응답 시 True 를 반환하는지 확인 (aiohttp mock)   r=   Fsys.modulesaiohttpNTr   status
__aenter__	__aexit__r   getClientSessionClientTimeoutr   dictr   r   	mock_respmock_sessionmock_aiohttpresults        r   test_returns_true_on_http_200z7TestCheckLightpandaHealth.test_returns_true_on_http_200   s      K		(i@	'U;	 {$)<"+"F!*!> {%.L%I"%.IK%H"ZZ	<'@A 	5244F	5 ~~ 5	5 	50   B=C/?C#C!C#C/!C##C,(C/c                  K   t               }t        t        d            |_        t        |      |_        t        d      |_        t               }t        |      |_        t        t                     |_        t        j                  dd|i      5  t                d{   }ddd       du sJ y7 # 1 sw Y   xY ww)u>   HTTP 요청 예외 발생 시 False 를 반환하는지 확인Connection refusedside_effectr=   Fr   r   Nr   r   	Exceptionr   r   r   r   r   r   r   r   r   r   r   r   s       r    test_returns_false_on_http_errorz:TestCheckLightpandaHealth.test_returns_false_on_http_error  s      !{$;O1PQ"+"F!*!> {%.L%I"%.IK%H"ZZ	<'@A 	5244F	5  5	5 	50   BCB9#B7$B9(C7B99C>Cc                  K   t               }t        t        d            |_        t        |      |_        t        d      |_        t               }t        |      |_        t        t                     |_        t        j                  dd|i      5  t                d{   }ddd       du sJ y7 # 1 sw Y   xY ww)u7   예외가 호출자에게 전파되지 않는지 확인zUnexpected errorr   r=   Fr   r   N)r   r   RuntimeErrorr   r   r   r   r   r   r   r   r   s       r   !test_exception_does_not_propagatez;TestCheckLightpandaHealth.test_exception_does_not_propagate(  s      !{$>P1QR"+"F!*!> {%.L%I"%.IK%H"ZZ	<'@A 	5244F	5  5	5 	5r   c                  K   t               }d|_        t        |      |_        t        d      |_        t               }t	        |      |_        t        |      |_        t        d      |_        t	               }t	        |      |_        t	        t	                     |_        t        j                  dd|i      5  t                d{   }ddd       du sJ y7 # 1 sw Y   xY ww)u?   HTTP 200 이 아닌 응답 시 False 를 반환하는지 확인i  r=   Fr   r   Nr   r   s        r   $test_returns_false_on_non_200_statusz>TestCheckLightpandaHealth.test_returns_false_on_non_200_status;  s      K		(i@	'U;	 {$)<"+"F!*!> {%.L%I"%.IK%H"ZZ	<'@A 	5244F	5  5	5 	5r   c                  K   t               }t        t        d            |_        t        |      |_        t        d      |_        t               }t        |      |_        t        t                     |_        t        j                  dd|i      5  t        dd	       d
{   }d
d
d
       du sJ y
7 # 1 sw Y   xY ww)uP   커스텀 endpoint 파라미터를 수용하는지 확인 (예외 없이 실행)r   r   r=   Fr   r   zws://custom:9333g      ?)rM   timeoutNr   r   s       r   test_accepts_custom_endpointz6TestCheckLightpandaHealth.test_accepts_custom_endpointR  s      !{$;O1PQ"+"F!*!> {%.L%I"%.IK%H"ZZ	<'@A 	]2<NX[\\F	]  ]	] 	]s0   BCB<&B:'B<+C:B<<CCNr2   )r5   r6   r7   rS   rT   rU   r   r   r   r   r   r8   r   r   r   r      s    [[ , [[ " [[ $ [[ , [[ r   r   c                  <    e Zd ZddZddZddZddZddZddZy)	TestBrowserChoiceDataclassc                    t        t              D ch c]  }|j                   }}h d}|j                  |      sJ d||z
          yc c}w )uZ   BrowserChoice 에 필수 필드(engine, endpoint, reason)가 모두 존재하는지 확인>   rB   rQ   rM   u   누락 필드: N)r   r   namer'   )r   ffield_namesrequireds       r   test_required_fields_existz5TestBrowserChoiceDataclass.test_required_fields_existk  sP     (.m'<=!qvv==3  -YKAW@X/YY- >s   A
c                    t        t        j                  dd      }|j                  t        j                  k(  sJ |j                  dk(  sJ |j
                  dk(  sJ y)uL   BrowserChoice 인스턴스를 정상적으로 생성할 수 있는지 확인r   ztest reasonrB   rM   rQ   N)r   r   r-   rB   rM   rQ   rC   s     r   test_instantiationz-TestBrowserChoiceDataclass.test_instantiationr  s\      ++* 

 }} 8 8888"7777}}---r   c                t    t        t        j                  dd      }t        |j                  t              sJ y)u8   engine 필드가 BrowserEngine 인스턴스인지 확인r   zchrome purposer   N)r   r   r0   
isinstancerB   rC   s     r   ,test_engine_field_is_browser_engine_instancezGTestBrowserChoiceDataclass.test_engine_field_is_browser_engine_instance~  s3      ''*#

 &--777r   c                j    t         j                  dk(  sJ t        t         j                        dk(  sJ y)u:   BrowserEngine.LIGHTPANDA 값이 'lightpanda' 인지 확인
lightpandazBrowserEngine.LIGHTPANDAN)r   r-   strr   s    r   test_engine_lightpanda_valuez7TestBrowserChoiceDataclass.test_engine_lightpanda_value  s0    ''<777=++,0JJJJr   c                j    t         j                  dk(  sJ t        t         j                        dk(  sJ y)u2   BrowserEngine.CHROME 값이 'chrome' 인지 확인chromezBrowserEngine.CHROMEN)r   r0   r   r   s    r   test_engine_chrome_valuez3TestBrowserChoiceDataclass.test_engine_chrome_value  s0    ##x///=''(,BBBBr   c                    t        t        j                  t        d      }t	        |j
                  t              sJ |j
                  t        j                  k(  sJ y)u<   CHROME 엔진으로 BrowserChoice 생성 가능한지 확인zrendering requiredr   N)r   r   r0   r   r   rB   rC   s     r   &test_browser_choice_with_chrome_enginezATestBrowserChoiceDataclass.test_browser_choice_with_chrome_engine  sK      ''$'

 &--777}} 4 4444r   Nr2   )	r5   r6   r7   r   r   r   r   r   r   r8   r   r   r   r   j  s#    Z
.8K
C
	5r   r   c                  6   e Zd ZddZej
                  j                  d	d       Zej
                  j                  d	d       Zej
                  j                  d	d       Z	ej
                  j                  d	d       Z
ej
                  j                  d	d       Zy)
TestCreateBrowserContextc                   t               }t               }|g|_        t               |_        t               }t        |      |_        t               }||_        t               }t        |      |_        t        d      |_        |||fS )u0   (mock_pw_cm, mock_chromium, mock_browser) 헬퍼r=   F)r   contextsr   closeconnect_over_cdpchromiumr   r   )r   mock_contextmock_browsermock_chromiummock_pw_instance
mock_pw_cms         r   _make_mock_pwz&TestCreateBrowserContext._make_mock_pw  sx     { {!-&[!)2)M&$;$1![
 )7G H
(e<
=,66r   c           	       K   | j                         \  }}}t        dt        d            5  t        d|      5  t        d      4 d{   \  }}	 ddd      d{    ddd       ddd       |j                  j                  t               y7 H7 6# 1 d{  7  sw Y   FxY w# 1 sw Y   JxY w# 1 sw Y   NxY ww)uZ   Lightpanda healthy 시 connect_over_cdp 가 Lightpanda endpoint 로 호출되는지 확인r<   Tr=   r?   %playwright.async_api.async_playwrightr#   N)r   r   r   r   r   assert_called_once_withr	   r   r   r   __browser_contexts         r   1test_connects_to_lightpanda_endpoint_when_healthyzJTestCreateBrowserContext.test_connects_to_lightpanda_endpoint_when_healthy  s      (,'9'9';$
M1 @i]aFbc	9
S	 .g6  :N8X 		 	 	&&>>?RS    		 	 	 	{   ,CB:B.B
B.BB. B!B.%B:-(CB.B.B+B" B+'B..B7	3B::C?Cc                8  K   | j                         \  }}}t        d|      5  t        d      4 d{   \  }}	 ddd      d{    ddd       |j                  j	                  t
               y7 @7 .# 1 d{  7  sw Y   >xY w# 1 sw Y   BxY ww)uR   Chrome purpose 시 connect_over_cdp 가 Chrome endpoint 로 호출되는지 확인r   r=   r&   N)r   r   r   r   r   r   r   s         r   3test_connects_to_chrome_endpoint_for_chrome_purposezLTestCreateBrowserContext.test_connects_to_chrome_endpoint_for_chrome_purpose  s      (,'9'9';$
M1:T 	-l;  ?S( 	 	&&>>O    	 	s`   "BBA5BA9BA7	B(B5B7B9B	?B B	BBBc                6  K   | j                         \  }}}t        d|      5  t        d      4 d{   }t        |t              sJ t        |      dk(  sJ ddd      d{    ddd       y7 ?7 # 1 d{  7  sw Y   xY w# 1 sw Y   yxY ww)uN   create_browser_context 가 (browser, context) 튜플을 yield 하는지 확인r   r=   r$   N   )r   r   r   r   tuplelen)r   r   r   r   s       r   %test_yields_browser_and_context_tuplez>TestCreateBrowserContext.test_yields_browser_and_context_tuple  s       --/
Aq:T 	(-g6 ( (&!&%0006{a'''( (	( 	(( ( ( ( (	( 	(sa   "BBA4B#A8B&A6'B+	B4B6B8B
	>B?B
	BBBc                (  K   | j                         \  }}}t        d|      5  t        d      4 d{    	 ddd      d{    ddd       |j                  j	                          y7 87 )# 1 d{  7  sw Y   9xY w# 1 sw Y   =xY ww)uL   컨텍스트 매니저 종료 시 browser.close() 가 호출되는지 확인r   r=   r$   N)r   r   r   r   assert_called_once)r   r   r   r   s       r   !test_browser_close_called_on_exitz:TestCreateBrowserContext.test_browser_close_called_on_exit  s      '+&8&8&:#
A|:T 	-g6   	 	--/    	 	s`   "BBA-BA1BA/B
#B-B/B1B	7A:8B	?BBBc           	       K   | j                         \  }}}t        dt        d            5  t        d|      5  t        d      4 d{   \  }}	 ddd      d{    ddd       ddd       |j                  j                  t               y7 H7 6# 1 d{  7  sw Y   FxY w# 1 sw Y   JxY w# 1 sw Y   NxY ww)uL   Lightpanda unhealthy 시 Chrome endpoint 로 fallback 연결하는지 확인r<   Fr=   r?   r   r#   N)r   r   r   r   r   r   r   r   s         r   5test_fallback_endpoint_used_when_lightpanda_unhealthyzNTestCreateBrowserContext.test_fallback_endpoint_used_when_lightpanda_unhealthy  s      (,'9'9';$
M1 @i]bFcd	9
S	 .g6  :N8X 		 	 	&&>>O    		 	 	 	r   N)r3   z&tuple[MagicMock, MagicMock, MagicMock]r2   )r5   r6   r7   r   rS   rT   rU   r   r   r   r   r   r8   r   r   r   r     s    7& [[T T [[	P 	P [[( ( [[	0 	0 [[P Pr   r   )__doc__
__future__r   dataclassesr   unittest.mockr   r   r   rS   tools.browser_routerr   r	   r
   r   r   r   r   r   r   r:   rW   rl   r|   r   r   r   r8   r   r   <module>r      s   
 #  5 5 	 	 	 > >N' '^0 0p'5 '5^( (Hd dX15 15rSP SPr   