
    i                         d 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                  sJ d       dv sJ d	       y# 1 sw Y   (x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이 호출되어야 함!## affected_files (auto-detected)u?   ## affected_files (auto-detected) 섹션이 추가되어야 함)r   stdoutr   r   called)	task_descmock_resultmock_runresults       6/home/jay/workspace/tests/test_dispatch_auto_inject.py)test_auto_inject_extracts_backtick_tokensr      sv    SI+KUK	({	C Fx,YEF ??CCC? /&8 I8F Fs   AAc                      d} t        d      5 }t        | d      }ddd       j                  rJ d       | k(  s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이 호출되면 안 됨uM   COMMON_FILTER만 있을 때 원본 task_desc가 그대로 반환되어야 함r   r   r   r   r   r   s      r   $test_auto_inject_common_filter_skipsr   .   sb    gI	(	) FX,YEF k kk Yo ooF F   AAc                      d} t        d      5 }t        | d      }ddd       j                  rJ d       | k(  s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이 호출되면 안 됨uM   이미 섹션이 있을 때 원본 task_desc가 그대로 반환되어야 함r   r   s      r   .test_auto_inject_skips_existing_affected_filesr   <   si    	%  
(	) FX,YEF r rr Y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sJ d       j                  j                  sJ d       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   u9   21개 이상 파일일 때 섹션이 추가되면 안 됨uD   21개 이상 파일 감지 시 logger.warning이 호출되어야 함)joinranger   r   r   r   warningr   )
many_filesr   r   mock_loggerr   s        r   (test_auto_inject_over_20_files_no_injectr+   P   s     L%)LLJ>I+K#d*K	({	C F	 	!F%0,YEF F
 /f< C<
 %%m'mm%F F F Fs$   B#BB#B 	B##B,c                  L    d} t        | d      }d|v sJ d       d|v sJ d       y)u[   task_desc에 grep 명령이 백틱으로 감싸여 있으면 goal_assertions 섹션 추가.ut   ## 검증 시나리오
다음 명령으로 확인하세요:
`grep -c "FeatureGate" src/hooks/use-feature-access.ts`
r   ### goal_assertions (auto-generated)uA   ## goal_assertions (auto-generated) 섹션이 추가되어야 함z5grep -c "FeatureGate" src/hooks/use-feature-access.tsu5   grep 명령이 goal_assertions에 포함되어야 함Nr   r   r   s     r   0test_auto_generate_goal_assertions_from_commandsr0   k   sP    	F  ,I|DF 1F: K:
 CfL ?L    c                  6    d} t        | d      }d|vsJ d       y)uX   `rm -rf /tmp/test` 같이 ALLOWED_COMMANDS에 없는 명령은 섹션에 추가 안 함.uO   ## 검증 시나리오
다음 명령으로 정리하세요:
`rm -rf /tmp/test`
r   r-   uW   허용되지 않은 명령만 있을 때 goal_assertions 섹션이 추가되면 안 됨Nr.   r/   s     r   ,test_auto_generate_skips_disallowed_commandsr3      s4    	  ,I|DF 1> a>r1   c                  n    d} t        | d      }|| k(  sJ d       |j                  d      dk(  sJ d       y)uS   task_desc에 ## goal_assertions 섹션이 이미 있으면 원본 그대로 반환.ue   ## 검증 시나리오
`grep -c FeatureGate src/hooks.ts`

## goal_assertions
- 기존 검증 항목
r   u]   이미 goal_assertions 섹션이 있을 때 원본 task_desc가 그대로 반환되어야 함z## goal_assertions   u5   goal_assertions 섹션이 중복 추가되면 안 됨N)r   countr/   s     r   ,test_auto_generate_skips_existing_assertionsr7      sT    	#  ,I|DF Y  <<,-2 ?2r1   c                  @    h d} | D ]  }|t         v rJ d| d        y)uS   ALLOWED_COMMANDS에 최소한의 기대 커맨드가 포함되어 있어야 한다.>   curlgreppytestpython3'u,   '이 ALLOWED_COMMANDS에 포함되어야 함N)r   )expectedcmds     r   .test_allowed_commands_contains_expected_valuesr@      s6    4H ^&&]!C50\(]]&^r1   )__doc__syspathlibr   unittest.mockr   r   __file__parent
_WORKSPACEpathinsertstrdispatchr   r   r   r   r   r   r+   r0   r3   r7   r@   r!   r1   r   <module>rL      sx      * (^""))
 3z? # &pp(n6* 2^r1   