
    Si                     d    d Z ddlZddlmZmZ ddlZ G d d      Z G d d      Z G d d	      Zy)
u   task-1068.1: call_llm() Claude CLI 전환 테스트

run_evals.py의 call_llm() 함수가 API Key → Claude CLI로 전환되었는지 검증합니다.
    N)	MagicMockpatchc                   @    e Zd ZdZd	dZd	dZd	dZd	dZd	dZd	dZ	y)
TestCallLlmCliIntegrationu'   call_llm() Claude CLI 통합 테스트.Nc                 8   ddl m} t        d      5 }t        ddd      |_         |d      }|j                          |j                  }|d   d   d   dk(  sJ |d   d   d	   d
k(  sJ |d   d   d   dk(  sJ d|d   d   v sJ 	 ddd       y# 1 sw Y   yxY w)u3   call_llm()이 subprocess를 사용하는지 확인.r   call_llmrun_evals.subprocess.runu
   LLM 응답 
returncodestdoutstderru   테스트 프롬프트claude   z-p   --modelN)	run_evalsr	   r   r   return_valueassert_called_once	call_args)selfr	   mock_runresultr   s        c/home/jay/workspace/.worktrees/task-2117-dev1/tools/eval-runner/test_task_1068_1_cli_integration.pytest_call_llm_uses_subprocessz7TestCallLlmCliIntegration.test_call_llm_uses_subprocess   s    &-. 	0($-#%H! 67F '') !**IQ<?1%111Q<?1%---Q<?1%)AAAA	!Q///#	0 	0 	0s   A4BBc                     ddl m} t        d      5 }t        ddd      |_         |d       |j
                  d   d   }|j                  d      d	z   }||   d
k(  sJ 	 ddd       y# 1 sw Y   yxY w)uI   call_llm()이 claude-haiku-4-5-20251001 모델을 사용하는지 확인.r   r   r
      응답r   r      프롬프트r   r   zclaude-haiku-4-5-20251001N)r   r	   r   r   r   r   index)r   r	   r   r   model_indexs        r    test_call_llm_uses_correct_modelz:TestCallLlmCliIntegration.test_call_llm_uses_correct_model&   s    &-. 	I($-%H! ^$ **1-a0I#//)4q8K[)-HHHH	I 	I 	Is   AA((A1c                    ddl m} t        d      5 }t        ddd      |_        t        j                  t              5 } |d       d	d	d	       d
t        j                        v sJ 	 d	d	d	       y	# 1 sw Y   ,xY w# 1 sw Y   y	xY w)u9   call_llm()이 에러를 적절히 처리하는지 확인.r   r   r
   r   r   zError: Claude CLI failedr   r   Nu   claude CLI 호출 실패)
r   r	   r   r   r   pytestraisesRuntimeErrorstrvalue)r   r	   r   exc_infos       r   test_call_llm_handles_errorz5TestCallLlmCliIntegration.test_call_llm_handles_error7   s    &-. 
	E($-1%H! |, )() .X^^1DDDD
	E 
	E) )
	E 
	Es"   -A?	A3!A?3A<	8A??Bc                     ddl m} t        d      5 }t        ddd      |_         |d      }|dk(  sJ 	 d	d	d	       y	# 1 sw Y   y	xY w)
u-   call_llm()이 출력을 trim하는지 확인.r   r   r
   u     응답 내용  
r   r   r   u   응답 내용N)r   r	   r   r   r   r   r	   r   r   s       r   test_call_llm_strips_outputz5TestCallLlmCliIntegration.test_call_llm_strips_outputG   sU    &-. 		-($-,%H! n-F_,,,		- 		- 		-s	   #?Ac                     ddl m} t        d      5 }t        ddd      |_         |d       |j
                  d   }d	|v sJ |d	   dkD  sJ 	 d
d
d
       y
# 1 sw Y   y
xY w)u0   call_llm()이 timeout을 설정하는지 확인.r   r   r
   r   r   r   r   r   timeoutN)r   r	   r   r   r   r   )r   r	   r   call_kwargss       r   test_call_llm_has_timeoutz3TestCallLlmCliIntegration.test_call_llm_has_timeoutV   sv    &-. 	.($-%H! ^$",,Q/K+++y)A---	. 	. 	.s   ;AA c                     ddl }ddlm} t        d      5 }t        d      5 }t	        ddd      |_         |d	       |j                  d
       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)u6   call_llm()이 rate limit delay를 가지는지 확인.r   Nr   r
   zrun_evals.time.sleepr   r   r   r   r   )timer   r	   r   r   r   assert_called_once_with)r   r3   r	   r   
mock_sleeps        r   test_call_llm_rate_limit_delayz8TestCallLlmCliIntegration.test_call_llm_rate_limit_delayg   s}    &-. 	6(-. 
6*(1 #)% ( 2215
6	6 	6
6 
6	6 	6s"   A,-A A, A)	%A,,A5returnN)
__name__
__module____qualname____doc__r   r"   r*   r-   r1   r6        r   r   r      s%    10.I"E -."6r>   r   c                        e Zd ZdZddZddZy)TestNoAnthropicImportu"   anthropic SDK 미사용 테스트.Nc                 `    ddl }dt        |      vsJ ddl}|j                  |      }d|vsJ y)u5   run_evals.py에 anthropic import가 없는지 확인.r   N	anthropiczimport anthropic)r   dirinspect	getsource)r   r   rD   sources       r   "test_no_anthropic_import_in_modulez8TestNoAnthropicImport.test_no_anthropic_import_in_module~   s<     #i.000 	""9-!///r>   c                     ddl }ddlm} |j                  |      }d|vsJ d|j	                         vsd|j	                         v sJ yy)u:   call_llm()에서 API Key를 사용하지 않는지 확인.r   Nr   ANTHROPIC_API_KEYapi_keyz
no api key)rD   r   r	   rE   lower)r   rD   r	   rF   s       r   test_no_api_key_usagez+TestNoAnthropicImport.test_no_api_key_usage   sM    &""8,"&000.,&,,.2PPP2P.r>   r7   )r9   r:   r;   r<   rG   rL   r=   r>   r   r@   r@   {   s    ,0Qr>   r@   c                   (    e Zd ZdZddZddZddZy)TestBackwardCompatibilityu   후방 호환성 테스트.Nc                     ddl m} t        d      5 }t        ddd      |_         |d      }t        |t              sJ 	 ddd       y# 1 sw Y   yxY w)	uK   call_llm()이 문자열을 반환하는지 확인 (인터페이스 유지).r   r   r
   u   테스트 응답r   r   r   N)r   r	   r   r   r   
isinstancer'   r,   s       r   test_call_llm_returns_stringz6TestBackwardCompatibility.test_call_llm_returns_string   sW    &-. 		+($-)%H! n-Ffc***		+ 		+ 		+s   .A

Ac                     ddl }ddlm} |j                  |      }t	        |j
                  j                               }|dgk(  sJ y)uC   call_llm() 함수 시그니처가 변경되지 않았는지 확인.r   Nr   prompt)rD   r   r	   	signaturelist
parameterskeys)r   rD   r	   sigparamss        r   !test_call_llm_signature_unchangedz;TestBackwardCompatibility.test_call_llm_signature_unchanged   sA    &)cnn))+, (###r>   c                      y)u5   기존 테스트가 여전히 통과하는지 확인.Nr=   )r   s    r   test_existing_tests_still_passz8TestBackwardCompatibility.test_existing_tests_still_pass   s     	r>   r7   )r9   r:   r;   r<   rQ   rZ   r\   r=   r>   r   rN   rN      s    %+
$r>   rN   )	r<   
subprocessunittest.mockr   r   r$   r   r@   rN   r=   r>   r   <module>r_      s8   
  * l6 l6^Q Q6" "r>   