
    iO                         d Z ddlZddlZddlZddlmZmZ  G d dej                        Z G d dej                        Z	e
dk(  r ej                          yy)	u6   test_claude_runner.py - claude_runner 모듈 테스트    N)	MagicMockpatchc                      e Zd ZdZ ed      d        Z ed      d        Z ed      d        Z ed      d        Z ed      d        Z	 ed      d        Z
 ed      d	        Z ed      d
        Z ed      d        Zy)TestCallClaudeu   call_claude() 함수 테스트z)autoresearch.claude_runner.subprocess.runc                     t        ddd      |_        ddlm}  |d      }| j	                  |d       |j                          y)	u   기본 호출 성공r   zHello World
 
returncodestdoutstderrcall_claudez	Say hellozHello WorldN)r   return_valueautoresearch.claude_runnerr   assertEqualassert_called_onceselfmock_runr   results       ^/home/jay/workspace/.worktrees/task-2116-dev1/scripts/autoresearch/tests/test_claude_runner.pytest_basic_call_successz&TestCallClaude.test_basic_call_success   s?     !*QWY Z:[)/##%    c                    t        ddd      |_        ddlm}  |dd       |j                  d   d   }| j                  d	|       | j                  d
|       | j                  d|       | j                  d|       | j                  d|       | j                  d|       | j                  d|       | j                  d|       | j                  d|       y)u"   cmd에 필수 인자 포함 확인r   okr   r	   r   testzclaude-haiku-4-5-20251001)modelclaudez-pz--output-formattextz--modelz--max-turns1Nr   r   r   r   	call_argsassertInr   r   r   cmds       r   test_cmd_includes_required_argsz.TestCallClaude.test_cmd_includes_required_args   s     !*QtB O:F"=>  #A&h$dC fc"'-fc"i%137mS)c3r   c                     t        ddd      |_        ddlm}  |dd       |j                  d   d   }| j                  d	|       | j                  d|       y
)u5   system 파라미터 전달 시 --system-prompt 포함r   r   r   r	   r   inputzYou are a helper)system--system-promptNr!   r$   s       r   test_system_prompt_passedz(TestCallClaude.test_system_prompt_passed(   sV     !*QtB O:G$67  #A&'-(#.r   c                     t        ddd      |_        ddlm}  |d       |j                  d   d   }| j                  d|       y)	u+   system=None이면 --system-prompt 미포함r   r   r   r	   r   r(   r*   N)r   r   r   r   r"   assertNotInr$   s       r   test_no_system_prompt_when_nonez.TestCallClaude.test_no_system_prompt_when_none3   sF     !*QtB O:G  #A&*C0r   c                    t        ddd      |_        ddlm} t	        j
                  t        j                  ddi      5   |d       d	d	d	       |j                  d
   d   }| j                  d|       y	# 1 sw Y   .xY w)u1   CLAUDECODE 환경변수가 제거되는지 확인r   r   r   r	   r   
CLAUDECODEr    r   N   env)
r   r   r   r   r   dictosenvironr"   r-   )r   r   r   r2   s       r   test_claudecode_env_removedz*TestCallClaude.test_claudecode_env_removed=   sq     !*QtB O:ZZ

\3$78 	 	   #E*s+	  	 s    	A66A?c                     t        ddd      |_        ddlm} | j	                  t
              5 } |d       ddd       | j                  dt        j                               y# 1 sw Y   /xY w)	u$   비정상 exit code 시 RuntimeErrorr1   r   z	error msgr	   r   r   r   N)	r   r   r   r   assertRaisesRuntimeErrorr#   str	exception)r   r   r   ctxs       r   &test_nonzero_exit_raises_runtime_errorz5TestCallClaude.test_nonzero_exit_raises_runtime_errorH   s\     !*Qr+ V:|, 	 	 k3s}}#56	  	 s   	A&&A/c                     t        ddd      |_        ddlm}  |dd       | j	                  |j
                  d	   d
   d       y)u"   timeout 파라미터 전달 확인r   r   r   r	   r   r   <   )timeoutr1   r@   N)r   r   r   r   r   r"   r   r   r   s      r   test_timeout_passedz"TestCallClaude.test_timeout_passedR   sB     !*QtB O:FB'++A.y92>r   c                     t        j                  dd      |_        ddlm} | j                  t         j                        5   |d       ddd       y# 1 sw Y   yxY w)u   TimeoutExpired 예외 전파r   x   )r%   r@   r   r   r   N)
subprocessTimeoutExpiredside_effectr   r   r8   rA   s      r   test_timeout_expired_propagatedz.TestCallClaude.test_timeout_expired_propagated[   sM      *88XsS:z889 	 	  	  	 s   	AAc                 j    t        ddd      |_        ddlm}  |d      }| j	                  |d       y)	u"   출력 앞뒤 공백 제거 확인r   z  hello  

r   r	   r   r   helloN)r   r   r   r   r   r   s       r   test_output_strippedz#TestCallClaude.test_output_strippedd   s3     !*QWY Z:V$)r   N)__name__
__module____qualname____doc__r   r   r&   r+   r.   r6   r=   rB   rH   rK    r   r   r   r   	   s    (
67& 8& 67  8 " 67/ 8/ 671 81 67, 8, 677 87 67? 8? 67  8  67* 8*r   r   c                   (    e Zd ZdZd Zd Zd Zd Zy)TestEstimateTokensu"   estimate_tokens() 함수 테스트c                 @    ddl m} | j                   |d      d       y )Nr   estimate_tokensdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa   r   rU   r   r   rU   s     r   test_basic_estimationz(TestEstimateTokens.test_basic_estimationq   s    > 	3R8r   c                 @    ddl m} | j                   |d      d       y )Nr   rT   r   r1   rX   rY   s     r   test_empty_string_returns_onez0TestEstimateTokens.test_empty_string_returns_onew   s    > 	,a0r   c                 @    ddl m} | j                   |d      d       y )Nr   rT   abcr1   rX   rY   s     r   test_short_string_returns_onez0TestEstimateTokens.test_short_string_returns_one}   s    > 	/3r   c                 D    ddl m} d}| j                   ||      d       y )Nr   rT   u   안녕하세요테스트   rX   )r   rU   r   s      r   test_korean_textz#TestEstimateTokens.test_korean_text   s!    > *.2r   N)rL   rM   rN   rO   rZ   r\   r_   rb   rP   r   r   rR   rR   n   s    ,9143r   rR   __main__)rO   r4   rE   unittestunittest.mockr   r   TestCaser   rR   rL   mainrP   r   r   <module>rh      sU    < 	   *b*X&& b*J3** 3: zHMMO r   