
    iP                       d Z ddlmZ ddlZddlmc 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 기반으로 동작하며 실제 네트워크 연결이 불필요합니다.
    )annotationsN)fields)	AsyncMock	MagicMockpatch)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                n   d}t         |u}|st        j                  d|fdt         |f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}}y)u7   browser_router 모듈 import 가 성공하는지 확인N)is not)z%(py0)s is not %(py3)sr
   py0py3assert %(py5)spy5)	r
   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationself@py_assert2@py_assert1@py_format4@py_format6s        6/home/jay/workspace/tools/tests/test_browser_router.pytest_import_succeedsz1TestModuleImportAndConstants.test_import_succeeds   s]     #'&{$&&&&{$&&&&&&{&&&{&&&$&&&&&&&    c                p   d}t         |k(  }|st        j                  d|fdt         |f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}}y)	u>   LIGHTPANDA_ENDPOINT 값이 'ws://127.0.0.1:9333' 인지 확인ws://127.0.0.1:9333==z%(py0)s == %(py3)sr	   r   r   r   N)	r	   r   r   r   r   r   r   r   r    r!   s        r'   test_lightpanda_endpoint_valuez;TestModuleImportAndConstants.test_lightpanda_endpoint_value#   sb    &;;"&;;;;;"&;;;;;;;";;;";;;&;;;;;;;;r)   c                p   d}t         |k(  }|st        j                  d|fdt         |f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}}y)	u:   CHROME_ENDPOINT 값이 'ws://127.0.0.1:9222' 인지 확인ws://127.0.0.1:9222r,   r.   r   r   r   r   N)	r   r   r   r   r   r   r   r   r    r!   s        r'   test_chrome_endpoint_valuez7TestModuleImportAndConstants.test_chrome_endpoint_value'   s^    "77"77777"7777777777777"77777777r)   c           	        h d}|j                   }t        j                  } |       } ||      }|s5t        j                  d|t        t        j                               z
         dz   dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |      dz  }t        t        j                  |            dx}x}x}}y)u;   PURPOSE_MAP 에 필수 키가 모두 포함되는지 확인>   pdfspabulktextcrawlloginstealth
screenshotu   누락 키: z}
>assert %(py9)s
{%(py9)s = %(py2)s
{%(py2)s = %(py0)s.issubset
}(%(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.keys
}()
})
}required_keysr
   )r   py2r   r   py7py9N)issubsetr
   keysr   _format_assertmsgsetr   r   r   r   r   r    )r"   r<   r$   @py_assert4@py_assert6@py_assert8@py_format10s          r'   test_purpose_map_required_keysz;TestModuleImportAndConstants.test_purpose_map_required_keys+   s    a%%sk&6&6s&6&8s%&89s9ss\-Z]^i^n^n^pZqJqIr;sssssss}sss}sss%ssssssksssksss&6sss&8sss9ssssssr)   c                &   t         d   }t        j                  }||k(  }|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  t              rt        j
                  t              ndt        j
                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}t         d	   }t        j                  }||k(  }|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  t              rt        j
                  t              ndt        j
                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}t         d
   }t        j                  }||k(  }|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  t              rt        j
                  t              ndt        j
                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)u<   PURPOSE_MAP 의 Lightpanda 매핑 키가 올바른지 확인r8   r,   )z2%(py1)s == %(py5)s
{%(py5)s = %(py3)s.LIGHTPANDA
}r   py1r   r   assert %(py7)sr>   Nr6   r7   )r
   r   
LIGHTPANDAr   r   r   r   r   r   r   r    r"   @py_assert0rD   r#   r&   @py_format8s         r'    test_purpose_map_lightpanda_keysz=TestModuleImportAndConstants.test_purpose_map_lightpanda_keys0   sp   7#?}'?'??#'?????#'????#??????}???}???'????????6">m&>&>>"&>>>>>"&>>>>">>>>>>m>>>m>>>&>>>>>>>>6">m&>&>>"&>>>>>"&>>>>">>>>>>m>>>m>>>&>>>>>>>>r)   c                   t         d   }t        j                  }||k(  }|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  t              rt        j
                  t              ndt        j
                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}t         d	   }t        j                  }||k(  }|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  t              rt        j
                  t              ndt        j
                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}t         d
   }t        j                  }||k(  }|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  t              rt        j
                  t              ndt        j
                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}t         d   }t        j                  }||k(  }|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  t              rt        j
                  t              ndt        j
                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}t         d   }t        j                  }||k(  }|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  t              rt        j
                  t              ndt        j
                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)u8   PURPOSE_MAP 의 Chrome 매핑 키가 올바른지 확인r9   r,   )z.%(py1)s == %(py5)s
{%(py5)s = %(py3)s.CHROME
}r   rJ   rL   r>   Nr;   r4   r5   r:   )r
   r   CHROMEr   r   r   r   r   r   r   r    rN   s         r'   test_purpose_map_chrome_keysz9TestModuleImportAndConstants.test_purpose_map_chrome_keys6   sd   7#;}';';;#';;;;;#';;;;#;;;;;;};;;};;;';;;;;;;;<(@M,@,@@(,@@@@@(,@@@@(@@@@@@M@@@M@@@,@@@@@@@@5!9]%9%99!%99999!%9999!999999]999]999%999999995!9]%9%99!%99999!%9999!999999]999]999%999999999%=)=)==%)=====%)====%============)========r)   NreturnNone)	__name__
__module____qualname__r(   r/   r2   rH   rQ   rT    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(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
t        j                         v st        j                  t              rt        j                  t              nd
t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y7 -# 1 sw Y   -xY ww)uS   get_browser('crawl') 이 healthy 상태에서 LIGHTPANDA 를 반환하는지 확인,tools.browser_router.check_lightpanda_healthTreturn_valuenewr8   Nr,   zN%(py2)s
{%(py2)s = %(py0)s.engine
} == %(py6)s
{%(py6)s = %(py4)s.LIGHTPANDA
}choicer   r   r=   py4py6assert %(py8)spy8r   r   r   enginer   rM   r   r   r   r   r   r   r   r    r"   re   r$   @py_assert5@py_assert3@py_format7@py_format9s          r'   test_crawl_returns_lightpandaz=TestGetBrowserLightpandaHealthy.test_crawl_returns_lightpandaE   s      Ay^bGcd 	0&w//F	0}}8 8 88} 88888} 8888888v888v888}888888888888 88888888 0	0 	0,   E&EEED(E&EE#E&c                  K   t        dt        d            5  t        d       d{   }ddd       j                  }t        j
                  }||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
t        j                         v st        j                  t              rt        j                  t              nd
t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y7 -# 1 sw Y   -xY ww)uR   get_browser('bulk') 이 healthy 상태에서 LIGHTPANDA 를 반환하는지 확인r_   Tr`   rb   r6   Nr,   rd   re   r   rf   ri   rj   rk   rm   s          r'   test_bulk_returns_lightpandaz<TestGetBrowserLightpandaHealthy.test_bulk_returns_lightpandaM         Ay^bGcd 	/&v..F	/}}8 8 88} 88888} 8888888v888v888}888888888888 88888888 /	/ 	/rs   c                  K   t        dt        d            5  t        d       d{   }ddd       j                  }t        j
                  }||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
t        j                         v st        j                  t              rt        j                  t              nd
t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y7 -# 1 sw Y   -xY ww)uR   get_browser('text') 이 healthy 상태에서 LIGHTPANDA 를 반환하는지 확인r_   Tr`   rb   r7   Nr,   rd   re   r   rf   ri   rj   rk   rm   s          r'   test_text_returns_lightpandaz<TestGetBrowserLightpandaHealthy.test_text_returns_lightpandaU   rv   rs   c                  K   t        dt        d            5  t        d       d{   }ddd       j                  }|t        k(  }|st        j                  d|fd|t        f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
t        j                         v st        j                  t              rt        j                  t              nd
dz  }dd|iz  }t        t        j                  |            dx}}y7 # 1 sw Y   xY ww)uQ   Lightpanda 선택 시 endpoint 가 LIGHTPANDA_ENDPOINT 와 일치하는지 확인r_   Tr`   rb   r8   Nr,   z0%(py2)s
{%(py2)s = %(py0)s.endpoint
} == %(py4)sre   r	   r   r=   rg   assert %(py6)srh   )r   r   r   endpointr	   r   r   r   r   r   r   r   r    r"   re   r$   ro   @py_format5rp   s         r'   test_lightpanda_choice_endpointz?TestGetBrowserLightpandaHealthy.test_lightpanda_choice_endpoint]   s      Ay^bGcd 	0&w//F	05"55555"5555555v555v555555555"5555"55555555 0	0 	0,   ED;D8D;D
E8D;;E Ec                  K   t        dt        d            5  t        d       d{   }ddd       j                  }|syddt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      d	z  }t        t        j                  |            d}y7 # 1 sw Y   xY ww)
uD   Lightpanda 선택 시 reason 필드가 비어있지 않은지 확인r_   Tr`   rb   r8   N*assert %(py2)s
{%(py2)s = %(py0)s.reason
}re   r   r=   )r   r   r   reasonr   r   r   r   r   r   r    r"   re   r$   @py_format3s       r'   !test_lightpanda_choice_has_reasonzATestGetBrowserLightpandaHealthy.test_lightpanda_choice_has_reasone   s      Ay^bGcd 	0&w//F	0}}}vv} 0	0 	0s,   CCC CBC CCCNrU   )rX   rY   rZ   pytestmarkasynciorr   ru   rx   r   r   r[   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                v  K   t        d       d{   }|j                  }t        j                  }||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      dz  }dd	|iz  }t        t	        j                  |            dx}x}}y7 %w)
u:   get_browser('login') 이 CHROME 을 반환하는지 확인r9   Nr,   zJ%(py2)s
{%(py2)s = %(py0)s.engine
} == %(py6)s
{%(py6)s = %(py4)s.CHROME
}re   r   rf   ri   rj   r   rl   r   rS   r   r   r   r   r   r   r   r    rm   s          r'   test_login_returns_chromez.TestGetBrowserChrome.test_login_returns_chromet   s      #7++}}4 4 44} 44444} 4444444v444v444}444444444444 44444444 ,   D9D6D%D9c                v  K   t        d       d{   }|j                  }t        j                  }||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      dz  }dd	|iz  }t        t	        j                  |            dx}x}}y7 %w)
u?   get_browser('screenshot') 이 CHROME 을 반환하는지 확인r;   Nr,   r   re   r   rf   ri   rj   r   rm   s          r'   test_screenshot_returns_chromez3TestGetBrowserChrome.test_screenshot_returns_chrome{   s      #<00}}4 4 44} 44444} 4444444v444v444}444444444444 44444444 1r   c                v  K   t        d       d{   }|j                  }t        j                  }||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      dz  }dd	|iz  }t        t	        j                  |            dx}x}}y7 %w)
u8   get_browser('pdf') 이 CHROME 을 반환하는지 확인r4   Nr,   r   re   r   rf   ri   rj   r   rm   s          r'   test_pdf_returns_chromez,TestGetBrowserChrome.test_pdf_returns_chrome         #5))}}4 4 44} 44444} 4444444v444v444}444444444444 44444444 *r   c                v  K   t        d       d{   }|j                  }t        j                  }||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      dz  }dd	|iz  }t        t	        j                  |            dx}x}}y7 %w)
u8   get_browser('spa') 이 CHROME 을 반환하는지 확인r5   Nr,   r   re   r   rf   ri   rj   r   rm   s          r'   test_spa_returns_chromez,TestGetBrowserChrome.test_spa_returns_chrome   r   r   c                v  K   t        d       d{   }|j                  }t        j                  }||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      dz  }dd	|iz  }t        t	        j                  |            dx}x}}y7 %w)
u<   get_browser('stealth') 이 CHROME 을 반환하는지 확인r:   Nr,   r   re   r   rf   ri   rj   r   rm   s          r'   test_stealth_returns_chromez0TestGetBrowserChrome.test_stealth_returns_chrome   s      #9--}}4 4 44} 44444} 4444444v444v444}444444444444 44444444 .r   c                :  K   t        d       d{   }|j                  }|t        k(  }|st        j                  d|fd|t        f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddz  }dd	|iz  }t        t        j                  |            dx}}y7 w)
uI   Chrome 선택 시 endpoint 가 CHROME_ENDPOINT 와 일치하는지 확인r9   Nr,   rz   re   r   r{   r|   rh   r   r}   r   r   r   r   r   r   r   r   r    r~   s         r'   test_chrome_choice_endpointz0TestGetBrowserChrome.test_chrome_choice_endpoint   s      #7++1/1111/111111v111v111111111/111/1111111 ,   DDDDc                H  K   t        d       d{   }|j                  }|syddt        j                         v st	        j
                  |      rt	        j                  |      ndt	        j                  |      dz  }t        t	        j                  |            d}y7 w)u@   Chrome 선택 시 reason 필드가 비어있지 않은지 확인r9   Nr   re   r   )	r   r   r   r   r   r   r   r   r    r   s       r'   test_chrome_choice_has_reasonz2TestGetBrowserChrome.test_chrome_choice_has_reason   s_      #7++}}}vv} ,s   B"B BB"NrU   )rX   rY   rZ   r   r   r   r   r   r   r   r   r   r   r[   r)   r'   r   r   s   s    [[5 5 [[5 5 [[5 5 [[5 5 [[5 5 [[2 2 [[ 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) TestGetBrowserLightpandaFallbackc                  K   t        dt        d            5  t        d       d{   }ddd       j                  }t        j
                  }||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
t        j                         v st        j                  t              rt        j                  t              nd
t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y7 -# 1 sw Y   -xY ww)uV   Lightpanda 불가 시 get_browser('crawl') 이 CHROME 으로 fallback 하는지 확인r_   Fr`   rb   r8   Nr,   r   re   r   rf   ri   rj   r   r   r   rl   r   rS   r   r   r   r   r   r   r   r    rm   s          r'   ,test_crawl_fallback_to_chrome_when_unhealthyzMTestGetBrowserLightpandaFallback.test_crawl_fallback_to_chrome_when_unhealthy   s      Ay^cGde 	0&w//F	0}}4 4 44} 44444} 4444444v444v444}444444444444 44444444 0	0 	0rs   c                  K   t        dt        d            5  t        d       d{   }ddd       d}j                  }|j                  } |       }||v }|st        j                  d|fd	||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}x}x}}y7 # 1 sw Y   xY ww)uC   fallback 시 reason 에 'fallback' 단어가 포함되는지 확인r_   Fr`   rb   r8   Nfallback)in)z`%(py1)s in %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.reason
}.lower
}()
}re   )rK   r   r   r>   r?   zassert %(py11)spy11)r   r   r   r   lowerr   r   r   r   r   r   r   r    )	r"   re   rO   rD   rE   rF   r#   rG   @py_format12s	            r'   &test_fallback_reason_contains_fallbackzGTestGetBrowserLightpandaFallback.test_fallback_reason_contains_fallback   s      Ay^cGde 	0&w//F	02V]]2]002022z22222z2222z222222V222V222]2220222222222222 0	0 	0s,   EE D=E DE=E  E
Ec                  K   t        dt        d            5  t        d       d{   }ddd       j                  }|t        k(  }|st        j                  d|fd|t        f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
t        j                         v st        j                  t              rt        j                  t              nd
dz  }dd|iz  }t        t        j                  |            dx}}y7 # 1 sw Y   xY ww)u7   fallback 시 endpoint 가 CHROME_ENDPOINT 인지 확인r_   Fr`   rb   r8   Nr,   rz   re   r   r{   r|   rh   )r   r   r   r}   r   r   r   r   r   r   r   r   r    r~   s         r'    test_fallback_endpoint_is_chromezATestGetBrowserLightpandaFallback.test_fallback_endpoint_is_chrome   s      Ay^cGde 	0&w//F	01/1111/111111v111v111111111/111/1111111 0	0 	0r   c                  K   t        dt        d            5  t        d       d{   }ddd       j                  }t        j
                  }||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
t        j                         v st        j                  t              rt        j                  t              nd
t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y7 -# 1 sw Y   -xY ww)uU   Lightpanda 불가 시 get_browser('bulk') 이 CHROME 으로 fallback 하는지 확인r_   Fr`   rb   r6   Nr,   r   re   r   rf   ri   rj   r   rm   s          r'   +test_bulk_fallback_to_chrome_when_unhealthyzLTestGetBrowserLightpandaFallback.test_bulk_fallback_to_chrome_when_unhealthy         Ay^cGde 	/&v..F	/}}4 4 44} 44444} 4444444v444v444}444444444444 44444444 /	/ 	/rs   c                  K   t        dt        d            5  t        d       d{   }ddd       j                  }t        j
                  }||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
t        j                         v st        j                  t              rt        j                  t              nd
t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y7 -# 1 sw Y   -xY ww)uU   Lightpanda 불가 시 get_browser('text') 이 CHROME 으로 fallback 하는지 확인r_   Fr`   rb   r7   Nr,   r   re   r   rf   ri   rj   r   rm   s          r'   +test_text_fallback_to_chrome_when_unhealthyzLTestGetBrowserLightpandaFallback.test_text_fallback_to_chrome_when_unhealthy   r   rs   NrU   )rX   rY   rZ   r   r   r   r   r   r   r   r   r[   r)   r'   r   r      s    [[5 5 [[3 3 [[2 2 [[5 5 [[5 5r)   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	y)TestGetBrowserUnknownPurposec                v  K   t        d       d{   }|j                  }t        j                  }||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      dz  }dd	|iz  }t        t	        j                  |            dx}x}}y7 %w)
uF   알 수 없는 purpose 는 CHROME 으로 기본 선택되는지 확인unknown_purposeNr,   r   re   r   rf   ri   rj   r   rm   s          r'   #test_unknown_purpose_returns_chromez@TestGetBrowserUnknownPurpose.test_unknown_purpose_returns_chrome   s      ##455}}4 4 44} 44444} 4444444v444v444}444444444444 44444444 6r   c                :  K   t        d       d{   }|j                  }|t        k(  }|st        j                  d|fd|t        f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddz  }dd	|iz  }t        t        j                  |            dx}}y7 w)
uL   알 수 없는 purpose 선택 시 endpoint 가 CHROME_ENDPOINT 인지 확인r   Nr,   rz   re   r   r{   r|   rh   r   r~   s         r'   'test_unknown_purpose_endpoint_is_chromezDTestGetBrowserUnknownPurpose.test_unknown_purpose_endpoint_is_chrome   s      ##4551/1111/111111v111v111111111/111/1111111 6r   c                v  K   t        d       d{   }|j                  }t        j                  }||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      dz  }dd	|iz  }t        t	        j                  |            dx}x}}y7 %w)
uE   빈 문자열 purpose 도 CHROME 으로 기본 선택되는지 확인 Nr,   r   re   r   rf   ri   rj   r   rm   s          r'   !test_empty_purpose_returns_chromez>TestGetBrowserUnknownPurpose.test_empty_purpose_returns_chrome   s      #2&}}4 4 44} 44444} 4444444v444v444}444444444444 444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`   rb   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NrU   )
rX   rY   rZ   r   r   r   r   r   r   r   r[   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 }|st        j                  d|fd	||f      d
t        j                         v st        j                  |      rt        j                   |      nd
t        j                   |      dz  }dd|iz  }t#        t        j$                  |            dx}}y7 # 1 sw Y   xY ww)uB   HTTP 200 응답 시 True 를 반환하는지 확인 (aiohttp mock)   r`   Fsys.modulesaiohttpNTisz%(py0)s is %(py3)sresultr   r   r   r   status
__aenter__	__aexit__r   getClientSessionClientTimeoutr   dictr   r   r   r   r   r   r   r   r    	r"   	mock_respmock_sessionmock_aiohttpr   r#   r$   r%   r&   s	            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 v~vvv 5	5 	51   B=F?FF FB.F FFF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 }|st        j                  d|fd	||f      d
t        j                         v st        j                  |      rt        j                   |      nd
t        j                   |      dz  }dd|iz  }t#        t        j$                  |            dx}}y7 # 1 sw Y   xY ww)u>   HTTP 요청 예외 발생 시 False 를 반환하는지 확인Connection refusedside_effectr`   Fr   r   Nr   r   r   r   r   r   r   r   	Exceptionr   r   r   r   r   r   r   r   r   r   r   r   r   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 vvvv 5	5 	51   BE$E#E$E(B.E$EE!E$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 }|st        j                  d|fd	||f      d
t        j                         v st        j                  |      rt        j                   |      nd
t        j                   |      dz  }dd|iz  }t#        t        j$                  |            dx}}y7 # 1 sw Y   xY ww)u7   예외가 호출자에게 전파되지 않는지 확인zUnexpected errorr   r`   Fr   r   Nr   r   r   r   r   r   )r   r   RuntimeErrorr   r   r   r   r   r   r   r   r   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 vvvv 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 }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                   |      nd	t        j                   |      d
z  }dd|iz  }t#        t        j$                  |            dx}}y7 # 1 sw Y   xY ww)u?   HTTP 200 이 아닌 응답 시 False 를 반환하는지 확인i  r`   Fr   r   Nr   r   r   r   r   r   r   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 vvvv 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 }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                   |      ndt        j                   |      dz  }dd|iz  }t#        t        j$                  |            d
x}}y
7 # 1 sw Y   xY ww)uP   커스텀 endpoint 파라미터를 수용하는지 확인 (예외 없이 실행)r   r   r`   Fr   r   zws://custom:9333g      ?)r}   timeoutNr   r   r   r   r   r   r   r   s           r'   test_accepts_custom_endpointz6TestCheckLightpandaHealth.test_accepts_custom_endpointR  s      !{$;O1PQ"+"F!*!> {%.L%I"%.IK%H"ZZ	<'@A 	]2<NX[\\F	] vvvv ]	] 	]s1   BE'E&E'E+B.E'EE$ E'NrU   )rX   rY   rZ   r   r   r   r   r   r   r   r   r[   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                j   t        t              D ch c]  }|j                   }}h d}|j                  } ||      }|st	        j
                  d||z
         dz   dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dz  }t        t	        j                  |            dx}}yc c}w )uZ   BrowserChoice 에 필수 필드(engine, endpoint, reason)가 모두 존재하는지 확인>   rl   r   r}   u   누락 필드: zL
>assert %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.issubset
}(%(py3)s)
}requiredfield_names)r   r=   r   r   N)r   r   namer@   r   rB   r   r   r   r   r   r    )r"   fr   r   r$   rD   r&   s          r'   test_required_fields_existz5TestBrowserChoiceDataclass.test_required_fields_existk  s     (.m'<=!qvv==3  Y -Y-YYKAW@X/YYYYYYYxYYYxYYY YYYYYYYYYYYY-YYYYYY >s   D0c                   t        t        j                  dd      }|j                  }t        j                  }||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      dz  }d	d
|iz  }t        t	        j                  |            dx}x}}|j                  }d}||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      dz  }dd|iz  }	t        t	        j                  |	            dx}x}}|j                  }d}||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      dz  }dd|iz  }	t        t	        j                  |	            dx}x}}y)uL   BrowserChoice 인스턴스를 정상적으로 생성할 수 있는지 확인r+   ztest reasonrl   r}   r   r,   rd   re   r   rf   ri   rj   N)z0%(py2)s
{%(py2)s = %(py0)s.endpoint
} == %(py5)sr   r=   r   rL   r>   )z.%(py2)s
{%(py2)s = %(py0)s.reason
} == %(py5)s)r   r   rM   rl   r   r   r   r   r   r   r   r    r}   r   )
r"   re   r$   rn   ro   rp   rq   rD   r&   rP   s
             r'   test_instantiationz-TestBrowserChoiceDataclass.test_instantiationr  s     ++* 

 }}8 8 88} 88888} 8888888v888v888}888888888888 888888887"77"77777"7777777v777v777777"77777777}}--}----}------v---v---}----------r)   c                   t        t        j                  dd      }|j                  }t	        |t              }|sddt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d	x}}y	)
u8   engine 필드가 BrowserEngine 인스턴스인지 확인r1   zchrome purposer   Qassert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.engine
}, %(py4)s)
}
isinstancere   r   r   rK   r   rg   rh   N)r   r   rS   rl   r   r   r   r   r   r   r   r    )r"   re   r#   rn   rp   s        r'   ,test_engine_field_is_browser_engine_instancezGTestBrowserChoiceDataclass.test_engine_field_is_browser_engine_instance~  s      ''*#

 !--7z-77777777z777z777777&777&777-7777777777777777777r)   c                *   t         j                  }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}t         j                  }t        |      }d	}||k(  }|st        j                  d|fd
||f      dt	        j
                         v st        j                  t              rt        j                  t              nddt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            dx}x}x}}y)u:   BrowserEngine.LIGHTPANDA 값이 'lightpanda' 인지 확인
lightpandar,   )z2%(py2)s
{%(py2)s = %(py0)s.LIGHTPANDA
} == %(py5)sr   r   rL   r>   NzBrowserEngine.LIGHTPANDA)zP%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.LIGHTPANDA
})
} == %(py8)sstrr   rK   r   r   rj   assert %(py10)spy10)r   rM   r   r   r   r   r   r   r   r    r   r"   r$   rD   ro   r&   rP   r#   @py_assert7rE   rq   @py_format11s              r'   test_engine_lightpanda_valuez7TestBrowserChoiceDataclass.test_engine_lightpanda_value  s    ''7<7'<7777'<777777}777}777'777<7777777 ++Js+,J0JJ,0JJJJJ,0JJJJJJJsJJJsJJJJJJ=JJJ=JJJ+JJJ,JJJ0JJJJJJJJr)   c                *   t         j                  }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}t         j                  }t        |      }d	}||k(  }|st        j                  d|fd
||f      dt	        j
                         v st        j                  t              rt        j                  t              nddt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            dx}x}x}}y)u2   BrowserEngine.CHROME 값이 'chrome' 인지 확인chromer,   )z.%(py2)s
{%(py2)s = %(py0)s.CHROME
} == %(py5)sr   r   rL   r>   NzBrowserEngine.CHROME)zL%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.CHROME
})
} == %(py8)sr   r   r  r  )r   rS   r   r   r   r   r   r   r   r    r   r  s              r'   test_engine_chrome_valuez3TestBrowserChoiceDataclass.test_engine_chrome_value  s    ##/x/#x////#x//////}///}///#///x/////// ''Bs'(B,BB(,BBBBB(,BBBBBBBsBBBsBBBBBB=BBB=BBB'BBB(BBB,BBBBBBBBr)   c                   t        t        j                  t        d      }|j                  }t        |t              }|sddt        j                         v st        j                  t
              rt        j                  t
              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            dx}}|j                  }t        j                  }||k(  }|st        j                  d	|fd
||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)u<   CHROME 엔진으로 BrowserChoice 생성 가능한지 확인zrendering requiredr   r   r   re   r   r   Nr,   r   rf   ri   rj   )r   r   rS   r   rl   r   r   r   r   r   r   r   r    r   )r"   re   r#   rn   rp   r$   ro   rq   s           r'   &test_browser_choice_with_chrome_enginezATestBrowserChoiceDataclass.test_browser_choice_with_chrome_engine  sP     ''$'

 !--7z-77777777z777z777777&777&777-7777777777777777777}}4 4 44} 44444} 4444444v444v444}444444444444 44444444r)   NrU   )	rX   rY   rZ   r   r   r   r  r	  r  r[   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`   rb   %playwright.async_api.async_playwrightr8   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           	     T  K   | j                         \  }}}t        d|      5  t        d      4 d{   }t        |t              }|sddt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      d	z  }t        t        j                  |            d}t        |      }d
}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            dx}x}}ddd      d{    ddd       y7 N7 # 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`   r9   Nz5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}r   r   tuple)r   rK   r=   rg      r,   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slen)r   rK   r   rh   ri   rj   )r  r   r   r   r%  r   r   r   r   r   r   r    r'  r   )r"   r  r  r   ro   r   r#   rn   rD   rp   rq   s              r'   %test_yields_browser_and_context_tuplez>TestCreateBrowserContext.test_yields_browser_and_context_tuple  s      --/
Aq:T 	(-g6 ( (&!&%00000000z000z000000&000&000000%000%00000000006{'a'{a''''{a''''''s'''s''''''6'''6'''{'''a'''''''( (	( 	(( ( ( ( (	( 	(sb   "J(JJJH1J)J4J5J9	J(JJJ	JJ	JJ%!J(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`   r9   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`   rb   r  r8   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)rV   z&tuple[MagicMock, MagicMock, MagicMock]rU   )rX   rY   rZ   r  r   r   r   r   r#  r(  r+  r-  r[   r)   r'   r  r    s    7& [[T T [[	P 	P [[( ( [[	0 	0 [[P Pr)   r  )!__doc__
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   dataclassesr   unittest.mockr   r   r   r   tools.browser_routerr   r	   r
   r   r   r   r   r   r   r]   r   r   r   r   r   r  r[   r)   r'   <module>r7     s   
 #     5 5 	 	 	 > >N' '^0 0p'5 '5^( (Hd dX15 15rSP SPr)   