
    i                        d Z ddlZddlmc mZ ddlZddlm	Z	 ddl
mZmZ  e	e      j                  j                  Zej                   j#                  d ee             ddlmZmZmZ d Zd Zd Zd	 Zd
 Zd Zd Zd Zy)up   
test_dispatch_auto_inject.py

_auto_inject_affected_files 및 _auto_generate_goal_assertions 단위 테스트.
    N)Path)	MagicMockpatch)ALLOWED_COMMANDS_auto_generate_goal_assertions_auto_inject_affected_filesc                  <   d} t               }d|_        t        d|      5 }t        | 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}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   exY w)uR   task_desc에 `FeatureGate` 포함 시 grep -rl로 파일 탐지 후 섹션 추가.uA   다음 클래스를 확인하세요: `FeatureGate` 관련 변경.z8src/hooks/use-feature-access.ts
src/components/gate.tsx
dispatch.subprocess.runreturn_value
/workspaceNu%   subprocess.run이 호출되어야 함z,
>assert %(py2)s
{%(py2)s = %(py0)s.called
}mock_runpy0py2!## affected_files (auto-detected)inz%(py1)s in %(py3)sresultpy1py3u?   ## affected_files (auto-detected) 섹션이 추가되어야 함
>assert %(py5)spy5)r   stdoutr   r   called
@pytest_ar_format_assertmsg@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation_call_reprcompare)
	task_descmock_resultr   r   @py_assert1@py_format3@py_assert0@py_assert2@py_format4@py_format6s
             6/home/jay/workspace/tests/test_dispatch_auto_inject.py)test_auto_inject_extracts_backtick_tokensr0      s8   SI+KUK	({	C Fx,YEF ??C?CCCCCCCCC8CCC8CCC?CCCCCC / .&8  .&    /      39    39    	J    F Fs   FFc                  t   d} t        d      5 }t        | 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x}}| k(  }|st        j                  d	|fd
|| f      dt        j                         v st        j                  |      rt        j                  |      nd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}y# 1 sw Y   xY w)u`   `data`, `config`, `error` 같은 COMMON_FILTER 토큰만 있으면 subprocess.run 호출 없음.uU   다음을 처리하세요: `data` 와 `config` 그리고 `error` 를 확인합니다.r
   r   NuI   COMMON_FILTER 토큰만 있을 때 subprocess.run이 호출되면 안 됨0
>assert not %(py2)s
{%(py2)s = %(py0)s.called
}r   r   ==z%(py0)s == %(py2)sr   r'   uM   COMMON_FILTER만 있을 때 원본 task_desc가 그대로 반환되어야 함
>assert %(py4)spy4r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r   r   r)   @py_assert3r-   r*   @py_format5s           r/   $test_auto_inject_common_filter_skipsr<   .   s	   gI	(	) FX,YEF kkkk kkkkkkkxkkkxkkkkkkkkk Yooo6Yoooooo6ooo6ooooooYoooYoooo oooooooF F   F--F7c                  t   d} t        d      5 }t        | 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x}}| k(  }|st        j                  d	|fd
|| f      dt        j                         v st        j                  |      rt        j                  |      nd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}y# 1 sw Y   xY w)uR   task_desc에 ## affected_files 섹션이 이미 있으면 원본 그대로 반환.uY   ## 작업 내용
파일 수정

## affected_files
- dispatch.py
- tests/test_dispatch.py
r
   r   NuP   이미 affected_files 섹션이 있으면 subprocess.run이 호출되면 안 됨r2   r   r   r3   r5   r   r'   uM   이미 섹션이 있을 때 원본 task_desc가 그대로 반환되어야 함r6   r7   r8   r9   s           r/   .test_auto_inject_skips_existing_affected_filesr?   <   s   	%  
(	) FX,YEF rrrr rrrrrrrxrrrxrrrrrrrrr Yooo6Yoooooo6ooo6ooooooYoooYoooo oooooooF Fr=   c                  
   dj                  d t        d      D              } d}t               }| dz   |_        t	        d|      5  t	        d      5 }t        |d      }d	d	d	       d	d	d	       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}}j                  }	|	j                   }
|
st        j                  d      dz   dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |
      dz  }t        t        j                  |            d	x}	}
y	# 1 sw Y   xY w# 1 sw Y   xY w)uU   grep이 21개 이상 파일 반환 시 섹션 추가 안 함 + logger.warning 호출.
c              3   (   K   | ]
  }d | d  yw)z/workspace/src/file_z.pyN ).0is     r/   	<genexpr>z;test_auto_inject_over_20_files_no_inject.<locals>.<genexpr>S   s     LQ1!C8Ls      u,   클래스 `FeatureGate` 를 수정하세요.r
   r   zdispatch.loggerr   Nr   not inz%(py1)s not in %(py3)sr   r   u9   21개 이상 파일일 때 섹션이 추가되면 안 됨r   r   uD   21개 이상 파일 감지 시 logger.warning이 호출되어야 함zI
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.warning
}.called
}mock_logger)r   r   r7   )joinranger   r   r   r   r   r&   r#   r    r!   r"   r   r$   r%   warningr   )
many_filesr'   r(   rK   r   r+   r,   r-   r.   r)   r:   r;   s               r/   (test_auto_inject_over_20_files_no_injectrP   P   s    L%)LLJ>I+K#d*K	({	C F	 	!F%0,YEF F
 / .f<  .f    /      7=    7=    	D    
 m%%m%mm'mmmmmmm;mmm;mmmmmm%mmmmmmF F F Fs$   G8G+G8+G5	0G88Hc                     d} t        | d      }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}}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[   task_desc에 grep 명령이 백틱으로 감싸여 있으면 goal_assertions 섹션 추가.ut   ## 검증 시나리오
다음 명령으로 확인하세요:
`grep -c "FeatureGate" src/hooks/use-feature-access.ts`
r   ### goal_assertions (auto-generated)r   r   r   r   uA   ## goal_assertions (auto-generated) 섹션이 추가되어야 함r   r   Nz5grep -c "FeatureGate" src/hooks/use-feature-access.tsu5   grep 명령이 goal_assertions에 포함되어야 함
r   r   r&   r#   r    r!   r"   r   r$   r%   r'   r   r+   r,   r-   r.   s         r/   0test_auto_generate_goal_assertions_from_commandsrU   k   s[   	F  ,I|DF 1 0F:  0F    1      5;    5;    	L    
 C BfL  Bf    C      GM    GM    	@        c                     d} t        | d      }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)uX   `rm -rf /tmp/test` 같이 ALLOWED_COMMANDS에 없는 명령은 섹션에 추가 안 함.uO   ## 검증 시나리오
다음 명령으로 정리하세요:
`rm -rf /tmp/test`
r   rR   rH   rJ   r   r   uW   허용되지 않은 명령만 있을 때 goal_assertions 섹션이 추가되면 안 됨r   r   NrS   rT   s         r/   ,test_auto_generate_skips_disallowed_commandsrX      s    	  ,I|DF 1 0>  0    1      9?    9?    	b    rV   c                     d} t        | d      }|| k(  }|st        j                  d|fd|| f      dt        j                         v st        j
                  |      rt        j                  |      nd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}|j                  }d} ||      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }	t        j                  d      dz   d|	iz  }
t        t        j                  |
            dx}x}x}x}}y)uS   task_desc에 ## goal_assertions 섹션이 이미 있으면 원본 그대로 반환.ue   ## 검증 시나리오
`grep -c FeatureGate src/hooks.ts`

## goal_assertions
- 기존 검증 항목
r   r3   r5   r   r'   r   u]   이미 goal_assertions 섹션이 있을 때 원본 task_desc가 그대로 반환되어야 함r6   r7   Nz## goal_assertions   )zK%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.count
}(%(py4)s)
} == %(py9)s)r   r   r7   py6py9u5   goal_assertions 섹션이 중복 추가되면 안 됨z
>assert %(py11)spy11)r   r   r&   r    r!   r"   r#   r   r$   r%   count)r'   r   r)   r*   r;   r:   @py_assert5@py_assert8@py_assert7@py_format10@py_format12s              r/   ,test_auto_generate_skips_existing_assertionsrd      s   	#  ,I|DF Y6Y66YY  << , <,-  -2  -                  -    .    23    	@     rV   c                  
   h d} | D ]  }|t         v }|st        j                  d|fd|t         f      dt        j                         v st        j
                  |      rt        j                  |      nddt        j                         v st        j
                  t               rt        j                  t               nddz  }t        j                  d| d      d	z   d
|iz  }t        t        j                  |            d} y)uS   ALLOWED_COMMANDS에 최소한의 기대 커맨드가 포함되어 있어야 한다.>   curlgreppytestpython3r   )z%(py0)s in %(py2)scmdr   r   'u,   '이 ALLOWED_COMMANDS에 포함되어야 함r6   r7   N)
r   r   r&   r    r!   r"   r#   r   r$   r%   )expectedrj   r)   r*   r;   s        r/   .test_allowed_commands_contains_expected_valuesrm      s    4H ^&&]]]s&]]]]]]s]]]s]]]]]]&]]]&]]]]!C50\(]]]]]]]^rV   )__doc__builtinsr    _pytest.assertion.rewrite	assertionrewriter   syspathlibr   unittest.mockr   r   __file__parent
_WORKSPACEpathinsertstrdispatchr   r   r   r0   r<   r?   rP   rU   rX   rd   rm   rC   rV   r/   <module>r}      s|     
  * (^""))
 3z? # &pp(n6* 2^rV   