
    Ki                     .   d Z ddlZddlmc mZ ddlZddlZddl	m
Z
 ddlmZmZ ddlZej                  j!                  d e e
e      j&                  j&                  j&                               ddlmZmZ  G d d      Z G d d	      Z G d
 d      Zy)u*   utils/robots_policy.py 테스트 스위트    N)Path)	MagicMockpatch)_robots_cachecheck_robots_txtc                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
TestCheckRobotsTxtu*   check_robots_txt() 기본 동작 테스트c                 ,    t        j                          y)u"   각 테스트 전 캐시 초기화Nr   clearselfs    5/home/jay/workspace/utils/tests/test_robots_policy.pysetup_methodzTestCheckRobotsTxt.setup_method   s        c                    t               }d|j                  _        t        d|      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# 1 sw Y   xY w)u   허용된 경로는 True 반환T(utils.robots_policy._fetch_robots_parserreturn_valuehttps://example.com/pageNisz%(py0)s is %(py3)sresultpy0py3assert %(py5)spy5r   	can_fetchr   r   r   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationr   mock_parserr   @py_assert2@py_assert1@py_format4@py_format6s          r   test_allowed_url_returns_truez0TestCheckRobotsTxt.test_allowed_url_returns_true   s    k-1*=KX 	B%&@AF	B v~vvv	B 	B   C##C,c                    t               }d|j                  _        t        d|      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# 1 sw Y   xY w)u    차단된 경로는 False 반환Fr   r   zhttps://example.com/privateNr   r   r   r   r   r   r    r*   s          r   !test_disallowed_url_returns_falsez4TestCheckRobotsTxt.test_disallowed_url_returns_false!   s    k-2*=KX 	E%&CDF	E vvvv	E 	Er1   c                     t               }d|j                  _        t        d|      5  t	        dd       ddd       |j                  j                  dd       y# 1 sw Y   &xY w)u1   user_agent 파라미터가 can_fetch에 전달됨Tr   r   r   MyBot)
user_agentNr   r!   r   r   r   assert_called_once_withr   r+   s     r   'test_custom_user_agent_passed_to_parserz:TestCheckRobotsTxt.test_custom_user_agent_passed_to_parser+   s_    k-1*=KX 	M7GL	M 	55g?YZ	M 	Ms   AA%c                     t               }d|j                  _        t        d|      5  t	        d       ddd       |j                  j                  dd       y# 1 sw Y   &xY w)u   기본 user_agent는 '*'Tr   r   r   N*r7   r9   s     r   #test_default_user_agent_is_wildcardz6TestCheckRobotsTxt.test_default_user_agent_is_wildcard5   sY    k-1*=KX 	978	9 	55c;UV	9 	9s   AA#c                    t        dt        d            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# 1 sw Y   xY w)u2   네트워크 에러 시 기본 허용(True) 반환r   timeoutside_effectzhttps://broken.example.com/pageNTr   r   r   r   r   r   )r   OSErrorr   r"   r#   r$   r%   r&   r'   r(   r)   r   r   r,   r-   r.   r/   s         r   test_network_error_returns_truez2TestCheckRobotsTxt.test_network_error_returns_true?   s    =7S\K]^ 	I%&GHF	I v~vvv	I 	I   CCc                    t        dt        d            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# 1 sw Y   xY w)u,   예외 발생 시 기본 허용(True) 반환r   
unexpectedr@   r   NTr   r   r   r   r   r   )r   	Exceptionr   r"   r#   r$   r%   r&   r'   r(   r)   rC   s         r   test_exception_returns_truez.TestCheckRobotsTxt.test_exception_returns_trueF   s    =9UaKbc 	B%&@AF	B v~vvv	B 	BrE   N)__name__
__module____qualname____doc__r   r0   r3   r:   r=   rD   rI    r   r   r	   r	      s*    4[Wr   r	   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestRobotsCacheu   캐시 동작 테스트c                 ,    t        j                          y Nr   r   s    r   r   zTestRobotsCache.setup_methodQ       r   c                 :   t               }d|j                  _        t        d|      5 }t	        d       t	        d       ddd       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# 1 sw Y   xY w)u-   첫 번째 호출 후 캐시에 항목 존재Tr   r   r   zhttps://example.com/otherN   ==z2%(py2)s
{%(py2)s = %(py0)s.call_count
} == %(py5)s
mock_fetchr   py2r   assert %(py7)spy7r   r!   r   r   r   
call_countr"   r#   r$   r%   r&   r'   r(   r)   r   r+   rY   r-   @py_assert4@py_assert3r/   @py_format8s           r   %test_cache_populated_after_first_callz5TestRobotsCache.test_cache_populated_after_first_callT   s    k-1*=KX 	:\f7889	:
 $$))$))))$))))))z)))z)))$))))))))))	: 	:   DDc                 :   t               }d|j                  _        t        d|      5 }t	        d       t	        d       ddd       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# 1 sw Y   xY w)u#   다른 도메인은 별도로 fetchTr   r   r   zhttps://other.com/pageN   rV   rX   rY   rZ   r\   r]   r^   r`   s           r   'test_different_domains_fetch_separatelyz7TestRobotsCache.test_different_domains_fetch_separately`   s    k-1*=KX 	7\f7856	7 $$))$))))$))))))z)))z)))$))))))))))		7 	7re   c                    t               }d|j                  _        t        d|      5 }t	        d       d}t
        |   \  }}|t        j                         dz
  ft
        |<   t	        d       ddd       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# 1 sw Y   xY w)u   TTL 만료 후 재fetch 발생Tr   r   r   https://example.comit  Nrg   rV   rX   rY   rZ   r\   r]   )r   r!   r   r   r   r   time	monotonicr_   r"   r#   r$   r%   r&   r'   r(   r)   )r   r+   rY   keyparser_tsr-   ra   rb   r/   rc   s              r   test_cache_respects_ttlz'TestRobotsCache.test_cache_respects_ttlk   s    k-1*=KX 	9\f78'C',KFC"($..*:T*A!BM#78	9 $$))$))))$))))))z)))z)))$))))))))))	9 	9s   AD??Ec                    t               }d|j                  _        t        d|      5  t	        d       ddd       d}|t
        v }|st        j                  d|fd|t
        f      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# 1 sw Y   xY w)u$   캐시 키는 scheme://netloc 형식Tr   r   zhttps://example.com/a/b/cNrj   )in)z%(py1)s in %(py3)sr   )py1r   r   r   )r   r!   r   r   r   r   r"   r#   r'   r$   r%   r&   r(   r)   )r   r+   @py_assert0r,   r.   r/   s         r   $test_cache_key_is_scheme_plus_netlocz4TestRobotsCache.test_cache_key_is_scheme_plus_netlocz   s    k-1*=KX 	:89	: %5$5555$555$5555555555555555	: 	:s   C33C<N)	rJ   rK   rL   rM   r   rd   rh   rp   ru   rN   r   r   rP   rP   N   s    !
*	**6r   rP   c                   "    e Zd ZdZd Zd Zd Zy)TestInvalidUrlsu   비정상 URL 처리 테스트c                 ,    t        j                          y rR   r   r   s    r   r   zTestInvalidUrls.setup_method   rS   r   c                 d   t        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	)
u   빈 URL은 허용(True) 반환 Tr   r   r   r   r   r   N	r   r"   r#   r$   r%   r&   r'   r(   r)   rC   s         r   test_empty_url_returns_truez+TestInvalidUrls.test_empty_url_returns_true   sd    !"%v~vvvr   c                 d   t        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	)
u(   스킴 없는 URL은 허용(True) 반환zexample.com/pageTr   r   r   r   r   r   Nr{   rC   s         r   $test_url_without_scheme_returns_truez4TestInvalidUrls.test_url_without_scheme_returns_true   se    !"45v~vvvr   N)rJ   rK   rL   rM   r   r|   r~   rN   r   r   rw   rw      s    (
r   rw   )rM   builtinsr$   _pytest.assertion.rewrite	assertionrewriter"   sysrk   pathlibr   unittest.mockr   r   pytestpathinsertstr__file__parentutils.robots_policyr   r   r	   rP   rw   rN   r   r   <module>r      sk    0   
   *  3tH~,,33::; < ?; ;|46 46n r   