
    Si                        d 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    O/home/jay/workspace/.worktrees/task-2117-dev1/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 sJ y# 1 sw Y   xY w)u   허용된 경로는 True 반환T(utils.robots_policy._fetch_robots_parserreturn_valuehttps://example.com/pageNr   	can_fetchr   r   r   r   mock_parserresults      r   test_allowed_url_returns_truez0TestCheckRobotsTxt.test_allowed_url_returns_true   sT    k-1*=KX 	B%&@AF	B ~~	B 	B   AAc                     t               }d|j                  _        t        d|      5  t	        d      }ddd       du sJ y# 1 sw Y   xY w)u    차단된 경로는 False 반환Fr   r   zhttps://example.com/privateNr   r   s      r   !test_disallowed_url_returns_falsez4TestCheckRobotsTxt.test_disallowed_url_returns_false!   sT    k-2*=KX 	E%&CDF	E 	E 	Er   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*r#   r%   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 sJ y# 1 sw Y   xY w)u2   네트워크 에러 시 기본 허용(True) 반환r   timeoutside_effectzhttps://broken.example.com/pageNT)r   OSErrorr   r   r   s     r   test_network_error_returns_truez2TestCheckRobotsTxt.test_network_error_returns_true?   sE    =7S\K]^ 	I%&GHF	I ~~	I 	I   2;c                 |    t        dt        d            5  t        d      }ddd       du sJ y# 1 sw Y   xY w)u,   예외 발생 시 기본 허용(True) 반환r   
unexpectedr,   r   NT)r   	Exceptionr   r/   s     r   test_exception_returns_truez.TestCheckRobotsTxt.test_exception_returns_trueF   sE    =9UaKbc 	B%&@AF	B ~~	B 	Br1   N)__name__
__module____qualname____doc__r   r   r   r&   r)   r0   r5    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(  sJ y# 1 sw Y   xY w)u-   첫 번째 호출 후 캐시에 항목 존재Tr   r   r   zhttps://example.com/otherN   r   r   r   r   r   
call_countr   r   
mock_fetchs      r   %test_cache_populated_after_first_callz5TestRobotsCache.test_cache_populated_after_first_callT   sb    k-1*=KX 	:\f7889	:
 $$)))	: 	:   AA#c                     t               }d|j                  _        t        d|      5 }t	        d       t	        d       ddd       j
                  dk(  sJ y# 1 sw Y   xY w)u#   다른 도메인은 별도로 fetchTr   r   r   zhttps://other.com/pageN   rB   rD   s      r   'test_different_domains_fetch_separatelyz7TestRobotsCache.test_different_domains_fetch_separately`   sb    k-1*=KX 	7\f7856	7 $$)))		7 	7rG   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(  sJ y# 1 sw Y   xY w)	u   TTL 만료 후 재fetch 발생Tr   r   r   https://example.comit  NrI   )	r   r   r   r   r   r   time	monotonicrC   )r   r   rE   keyparser_tss         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 $$)))	9 	9s   ABBc                     t               }d|j                  _        t        d|      5  t	        d       ddd       dt
        v sJ y# 1 sw Y   xY w)u$   캐시 키는 scheme://netloc 형식Tr   r   zhttps://example.com/a/b/cNrL   )r   r   r   r   r   r   r%   s     r   $test_cache_key_is_scheme_plus_netlocz4TestRobotsCache.test_cache_key_is_scheme_plus_netlocz   sP    k-1*=KX 	:89	: %555	: 	:s   AAN)	r6   r7   r8   r9   r   rF   rJ   rR   rT   r:   r   r   r<   r<   N   s    !
*	**6r   r<   c                   "    e Zd ZdZd Zd Zd Zy)TestInvalidUrlsu   비정상 URL 처리 테스트c                 ,    t        j                          y r>   r   r   s    r   r   zTestInvalidUrls.setup_method   r?   r   c                 &    t        d      }|du sJ y)u   빈 URL은 허용(True) 반환 TNr   r/   s     r   test_empty_url_returns_truez+TestInvalidUrls.test_empty_url_returns_true   s    !"%~~r   c                 &    t        d      }|du sJ y)u(   스킴 없는 URL은 허용(True) 반환zexample.com/pageTNrZ   r/   s     r   $test_url_without_scheme_returns_truez4TestInvalidUrls.test_url_without_scheme_returns_true   s    !"45~~r   N)r6   r7   r8   r9   r   r[   r]   r:   r   r   rV   rV      s    (
r   rV   )r9   sysrM   pathlibr   unittest.mockr   r   pytestpathinsertstr__file__parentutils.robots_policyr   r   r	   r<   rV   r:   r   r   <module>rh      sg    0 
   *  3tH~,,33::; < ?; ;|46 46n r   