
    [ji                     .   d Z ddlZddlmc mZ ddlZddlZddl	Z
ej                  j                  dd       ej                  j                  dd       ddlmZ dddd	d
gZ ej                   g ddd      Z G d d      Z G d d      Z G d d      Zy)uW  
test_worktree_auto_fix_1993.py — _auto_fix_high_comments 수정사항 검증 (task-1993)

수정사항:
1. _auto_fix_high_comments(): ["claude", "--print", "-p", ...] →
   ["claude", "-p", ..., "--dangerously-skip-permissions"] 으로 변경
2. cmd_finish(): 타임아웃 시 60초 추가 대기 후 Gemini 리뷰 재확인 로직 추가
    Nz/home/jay/workspacez/home/jay/workspace/scripts)_auto_fix_high_commentshighzsrc/main.py10zSQL injection vulnerability)severitypathlinebody )args
returncodestdoutstderrc                   "    e Zd ZdZd Zd Zd Zy)TestAutoFixClaudeCommanduS   TC-1: _auto_fix_high_comments가 올바른 claude 인자로 호출되는지 검증.c                    t         j                  j                  dt              5 }t	        t
        dd       ddd       j                  }|st        j                  d      dz   d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
z  }t        t        j                  |            d}g }|j                  D ]J  }|j                   r|j                   d   n|j"                  j%                  dg       }|j'                  |       L d}||v}|st        j(                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }	t        j                  d|       dz   d|	iz  }
t        t        j                  |
            dx}}y# 1 sw Y   xY w)uF   --print 플래그가 subprocess.run 호출 인자에 없어야 한다.worktree_manager.subprocess.runreturn_value/tmp/wtFcollect_modeN/   subprocess.run이 호출되지 않았습니다.,
>assert %(py2)s
{%(py2)s = %(py0)s.called
}mock_runpy0py2r   r   z--print)not in)z%(py1)s not in %(py3)sall_argspy1py3uH   --print 플래그가 subprocess.run 인자에서 발견되었습니다: 
>assert %(py5)spy5)unittestmockpatchFAKE_COMPLETEDr   SAMPLE_COMMENTScalled
@pytest_ar_format_assertmsg@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationcall_args_listr   kwargsgetextend_call_reprcompare)selfr   @py_assert1@py_format3r   callcmd@py_assert0@py_assert2@py_format4@py_format6s              8/home/jay/workspace/tests/test_worktree_auto_fix_1993.py%test_no_print_flag_in_subprocess_callz>TestAutoFixClaudeCommand.test_no_print_flag_in_subprocess_call.   s   ]]  -N ! 
 	T#OYUS	T QQQ QQQQQQQxQQQxQQQQQQQQQ !++ 	!D"&))$))A,1LCOOC 	!  	
y( 	
 	
y 	
 	
 		  	
 	
	6	
 	
  !) 	
 	
 		 !) 	
 	
  WW_V`a	
 	
 	
 	
 	
	T 	Ts   G::Hc                    t         j                  j                  dt              5 }t	        t
        dd       ddd       j                  }|st        j                  d      dz   d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
z  }t        t        j                  |            d}g }|j                  D ]H  }|j                   r|j                   d   n|j"                  j%                  dg       }|s=|d   dk(  sF|} n |s{t        j                  d      dz   ddt        j                         v st        j                  |      rt        j                  |      ndiz  }t        t        j                  |            d}||v }	|	st        j&                  d|	fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }
t        j                  d|       dz   d|
iz  }t        t        j                  |            dx}}	y# 1 sw Y   >xY w)uU   --dangerously-skip-permissions 플래그가 claude 호출 인자에 있어야 한다.r   r   r   Fr   Nr   r   r   r   r   r   claudeH   claude를 실행하는 subprocess.run 호출을 찾을 수 없습니다.
>assert %(py0)sr   claude_argsz--dangerously-skip-permissionsinz%(py1)s in %(py3)sr    uH   --dangerously-skip-permissions가 claude 호출 인자에 없습니다: r#   r$   r%   r&   r'   r(   r   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r   r4   r5   r7   r8   r   r9   r:   rG   r;   r<   @py_format1r=   r>   r?   r@   s               rA   0test_dangerously_skip_permissions_in_claude_callzITestAutoFixClaudeCommand.test_dangerously_skip_permissions_in_claude_callB   s   ]]  -N ! 
 	T#OYUS	T
 QQQ QQQQQQQxQQQxQQQQQQQQQ "$++ 	D"&))$))A,1LCs1v)!		 fffffffff{fff{fffff/ 	
/;> 	
 	
/; 	
 	
 		 0 	
 	
	6	
 	
  4? 	
 	
 		 4? 	
 	
  WWbVcd	
 	
 	
 	
 	
!	T 	T   I55I?c                    t         j                  j                  dt              5 }t	        t
        dd       ddd       j                  }|st        j                  d      dz   d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
z  }t        t        j                  |            d}g }|j                  D ]H  }|j                   r|j                   d   n|j"                  j%                  dg       }|s=|d   dk(  sF|} n |s{t        j                  d      dz   ddt        j                         v st        j                  |      rt        j                  |      ndiz  }t        t        j                  |            d}||v }	|	st        j&                  d|	fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }
t        j                  d|       dz   d|
iz  }t        t        j                  |            dx}}	y# 1 sw Y   >xY w)u9   -p 플래그가 claude 호출 인자에 있어야 한다.r   r   r   Fr   Nr   r   r   r   r   r   rD   rE   rF   r   rG   z-prH   rJ   r    u6   -p 플래그가 claude 호출 인자에 없습니다: r#   r$   rK   rL   s               rA   test_p_flag_in_claude_callz3TestAutoFixClaudeCommand.test_p_flag_in_claude_callX   s   ]]  -N ! 
 	T#OYUS	T
 QQQ QQQQQQQxQQQxQQQQQQQQQ!#++ 	D"&))$))A,1LCs1v)!		 fffffffff{fff{fffff 	
t{" 	
 	
t{ 	
 	
 		  	
 	
	6	
 	
  # 	
 	
 		 # 	
 	
  E[MR	
 	
 	
 	
 	
	T 	TrO   N)__name__
__module____qualname____doc__rB   rN   rQ        rA   r   r   +   s    ]
(
,
rW   r   c                       e Zd ZdZd Zd Zy)TestAutoFixCollectModeuA   TC-2: collect_mode=True 일 때 실행을 건너뛰는지 검증.c                    t         j                  j                  dt              5 }t	        t
        dd       ddd       j                  D cg c]B  }|j                  r|j                  d   n|j                  j                  dg       dd	 d
gk(  r|D }}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                  |      rt        j                   |      ndt        j                   |      t        j                   |      dz  }t        j"                  d|       dz   d|iz  }t%        t        j&                  |            dx}x}}y# 1 sw Y   xY wc c}w )uQ   collect_mode=True 이면 subprocess.run(claude)이 호출되지 않아야 한다.r   r   r   Tr   Nr   r      rD   )==)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenclaude_calls)r   r!   r"   py6uH   collect_mode=True 임에도 claude subprocess가 호출되었습니다: z
>assert %(py8)spy8)r%   r&   r'   r(   r   r)   r3   r   r4   r5   r]   r+   r7   r-   r.   r/   r0   r,   r1   r2   )	r8   r   r;   r^   r>   @py_assert5@py_assert4@py_format7@py_format9s	            rA   *test_subprocess_not_called_in_collect_modezATestAutoFixCollectMode.test_subprocess_not_called_in_collect_modev   s   ]]  -N ! 
 	S#OYTR	S !//
 $				!t{{vr/JAaPU]T^^ 
 

 <  	
A 	
 A% 	
 	
 	
 A 	
 	
	6	
 	
   	
 	
 		  	
 	
	6	
 	
    	
 	
 		   	
 	
 		 ! 	
 	
 		 %& 	
 	
  WWcVde	
 	
 	
 	
 	
 	
	S 	S
s   GAGGc                    t         j                  j                  dt              5  t	        t
        dd      }ddd       d   }d}||u }|st        j                  d	|fd
||f      t        j                  |      t        j                  |      dz  }t        j                  d|d    d      dz   d|iz  }t        t        j                  |            dx}x}}y# 1 sw Y   xY w)uI   collect_mode=True 이면 반환값의 executed가 False 이어야 한다.r   r   r   Tr   NexecutedF)is)z%(py1)s is %(py4)s)r!   py4u"   collect_mode=True 에서 executed=u    — False여야 합니다.z
>assert %(py6)sr_   )r%   r&   r'   r(   r   r)   r+   r7   r0   r,   r1   r2   )r8   resultr=   @py_assert3r>   @py_format5rc   s          rA   #test_executed_false_in_collect_modez:TestAutoFixCollectMode.test_executed_false_in_collect_mode   s    ]]  -N ! 
 	 -F	 j! 	
U 	
!U* 	
 	
!U 	
 	
 		 " 	
 	
 		 &+ 	
 	
  1
1C0DD_`	
 	
 	
 	
 	
 	
	 	s   CC'N)rR   rS   rT   rU   re   rm   rV   rW   rA   rY   rY   s   s    K
"
rW   rY   c                   ,    e Zd ZdZdZdefdZd Zd Zy)TestGeminiRetryCodePresenceuV   TC-3: worktree_manager.py 에 gemini-retry 재시도 로직이 존재하는지 검증.z//home/jay/workspace/scripts/worktree_manager.pyreturnc                 |    t        | j                  d      5 }|j                         cd d d        S # 1 sw Y   y xY w)Nzutf-8)encoding)openSOURCE_PATHread)r8   fs     rA   _read_sourcez(TestGeminiRetryCodePresence._read_source   s2    $""W5 	668	 	 	s   2;c                    | j                         }d}||v }|st        j                  d|fd||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }t        j                  d      dz   d|iz  }t        t        j                  |            d	x}}y	)
u@   소스코드에 'gemini-retry' 문자열이 존재해야 한다.zgemini-retryrH   rJ   sourcer    u   worktree_manager.py 에 'gemini-retry' 키워드가 없습니다. 타임아웃 재시도 로직이 추가되지 않은 것 같습니다.r#   r$   N
rw   r+   r7   r0   r-   r.   r/   r,   r1   r2   r8   ry   r=   r>   r?   r@   s         rA    test_gemini_retry_keyword_existsz<TestGeminiRetryCodePresence.test_gemini_retry_keyword_exists   s    ""$ 	
~' 	
 	
~ 	
 	
 
	  	
 	
 
6	
 	
  "( 	
 	
 
	 "( 	
 	
 U	
 	
 	
 	
 	
rW   c                    | j                         }d}||v }|st        j                  d|fd||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }t        j                  d      dz   d|iz  }t        t        j                  |            d	x}}y	)
uV   소스코드에 'not gemini_found and pr_number' 조건 패턴이 존재해야 한다.znot gemini_found and pr_numberrH   rJ   ry   r    u   worktree_manager.py 에 'not gemini_found and pr_number' 조건 패턴이 없습니다. 타임아웃 후 재확인 분기 로직이 없는 것 같습니다.r#   r$   Nrz   r{   s         rA   4test_not_gemini_found_and_pr_number_condition_existszPTestGeminiRetryCodePresence.test_not_gemini_found_and_pr_number_condition_exists   s    ""$/ 	
/69 	
 	
/6 	
 	
 
	 0 	
 	
 
6	
 	
  4: 	
 	
 
	 4: 	
 	
 S	
 	
 	
 	
 	
rW   N)	rR   rS   rT   rU   rt   strrw   r|   r~   rV   rW   rA   ro   ro      s     `CKc 

rW   ro   )rU   builtinsr-   _pytest.assertion.rewrite	assertionrewriter+   
subprocesssysunittest.mockr%   r   insertworktree_managerr   r)   CompletedProcessr(   r   rY   ro   rV   rW   rA   <module>r      s       
  ( ) 0 1 4 -	 -,,	"R@
 @
P
 
N
 
rW   