
    i,                         d Z ddlZddlZddlmZmZ ddlZej                  j                  dd       ddl	m
Z
 dedee   ddfd	Zdefd
Zdee   defdZdee   fdZd Zd Zd Zd Zy)u   
test_file_touch_ratio_check.py - file_touch_ratio_check verifier 테스트

총 4개 케이스:
1. ratio 1.0 → PASS (보고서 파일 = 실제 변경 파일)
2. ratio 0.5 → WARN
3. ratio 0 → FAIL
4. 보고서에 수정 파일 섹션 없음 → SKIP
    N)patch	MagicMockz /home/jay/workspace/teams/shared)verifytask_id
file_linesreturnc                     | dz  dz  }|j                  dd       g d}|j                  |       || dz  }|j                  dj                  |      d	       y
)u   보고서 파일 생성 헬퍼.memoryreportsTparentsexist_ok)u   # 작업 보고서

u   ## 수정 파일
r   .md utf-8encodingN)mkdirextend
write_textjoin)tmp_pathr   r   reports_dircontent_linesreport_files         R/home/jay/workspace/.worktrees/task-2116-dev1/tests/test_file_touch_ratio_check.py_make_reportr      sc    X%	1KdT2NM$7)3/K277=1GD    c                  D    t               } d| _        d| _        d| _        | S )u+   git rev-parse --git-dir 성공 응답 mock.r   z.git
r   )r   
returncodestdoutstderr)mocks    r   _git_rev_parse_okr%       s#    ;DDODKDKKr   filesc                 p    t               }d|_        dj                  |       | rdndz   |_        d|_        |S )u(   git diff --name-only HEAD~5 응답 mock.r   r   r   )r   r!   r   r"   r#   )r&   r$   s     r   _git_diff_resultr(   )   s5    ;DDO))E"ed<DKDKKr   
diff_filesc                       fd}|S )uO   subprocess.run을 git 명령어에 맞게 mock하는 side_effect 함수 반환.c                 Z    d| v r
t               S d| v rt              S t        d|        )Nz	rev-parsediffz Unexpected subprocess.run call: )r%   r(   
ValueError)cmdkwargsr)   s     r   _side_effectz*_make_subprocess_run.<locals>._side_effect4   s9    #$&&s]#J//;C5ABBr    )r)   r0   s   ` r   _make_subprocess_runr2   2   s    C r   c                 &   d}t        |       }t        | |d| dd| dg       ddg}t        dt        |            5  t	        ||	      }d
d
d
       d   dk(  s
J d|        t        d |d   D              s
J |d          y
# 1 sw Y   ;xY w)uB   보고서 파일 2개 모두 실제 변경 → ratio 1.0 → PASS.ztask-test-pass| u   /src/foo.py | 수정 |
u   /src/bar.py | 추가 |

src/foo.pyz
src/bar.pysubprocess.runside_effectworkspace_rootNstatusPASSzExpected PASS, got c              3   L   K   | ]  }d |v xs d|j                         v   yw)z1.00ratioN)lower.0ds     r   	<genexpr>z&test_ratio_1_0_pass.<locals>.<genexpr>Q   s'     Nqv{2g22Ns   "$detailsstrr   r   r2   r   anyr   r   r:   r)   results        r   test_ratio_1_0_passrJ   ?   s    G]N 7
^45
^45%  -J	-A*-M	N @?@ (v%E)<VH'EE%NF9<MNNaPVW`PaaN	@ @s   BBc           	      .   d}t        |       }t        | |d| dd| dd| dg       dg}t        dt        |            5  t	        ||	      }d
d
d
       d   dk(  s
J d|        t        d |d   D              s
J |d          y
# 1 sw Y   ;xY w)uP   보고서 파일 3개 중 1개만 실제 변경 → ratio 0.33 (< 0.5) → WARN.ztask-test-warnz- z/src/foo.py
z/src/bar.py
z/src/baz.py
r5   r6   r7   r9   Nr;   WARNzExpected WARN, got c              3   $   K   | ]  }d |v  
 yw)z0.33Nr1   r@   s     r   rC   z,test_ratio_below_0_5_warn.<locals>.<genexpr>g   s     6qv{6   rD   rE   rH   s        r   test_ratio_below_0_5_warnrO   T   s    G]N 7
^M*
^M*
^M*%  J	-A*-M	N @?@ (v%E)<VH'EE%6F9$566Iy8II6	@ @s   BBc                 "   d}t        |       }t        | |d| dd| dg       g }t        dt        |            5  t	        ||      }ddd       d	   d
k(  s
J d|        t        d |d   D              s
J |d          y# 1 sw Y   ;xY w)uI   보고서 파일 2개 모두 실제 변경 없음 → ratio 0.0 → FAIL.ztask-test-failr4   u   /src/alpha.py | 수정 |
u   /src/beta.py | 수정 |
r6   r7   r9   Nr;   FAILzExpected FAIL, got c              3   $   K   | ]  }d |v  
 yw)u   명시된 파일 변경 없음Nr1   r@   s     r   rC   z$test_ratio_0_fail.<locals>.<genexpr>{   s     P/14PrN   rD   rE   rH   s        r   test_ratio_0_failrS   j   s    G]N7
^67
^56%  J	-A*-M	N @?@ (v%E)<VH'EE%PfY>OPPcRXYbRccP	@ @s   BBc                 f   d}t        |       }| dz  dz  }|j                  dd       || dz  }|j                  dd	       t        d
      5 }t	        ||      }|j                          ddd       d   dk(  s
J d|        t        d |d   D              s
J |d          y# 1 sw Y   ;xY w)u2   보고서에 수정 파일 섹션 없음 → SKIP.ztask-test-skipr
   r   Tr   r   u8   # 작업 보고서

## 개요

특별한 내용 없음.
r   r   r6   r9   Nr;   SKIPzExpected SKIP, got c              3   $   K   | ]  }d |v  
 yw)u   수정 파일 섹션 없음Nr1   r@   s     r   rC   z6test_no_modified_files_section_skip.<locals>.<genexpr>   s     Ma,1MrN   rD   )rF   r   r   r   r   assert_not_calledrG   )r   r   r:   r   r   mock_runrI   s          r   #test_no_modified_files_section_skiprY   ~   s    G]N X%	1KdT27)3/KG   
	  %H?""$% (v%E)<VH'EE%M6);LMM`vV_O``M% %s   B''B0)__doc__sysosunittest.mockr   r   
subprocesspathinsert verifiers.file_touch_ratio_checkr   rF   listr   r%   r(   r2   rJ   rO   rS   rY   r1   r   r   <module>rc      s     	 *  5 6 3
EC ET#Y E4 E9 DI ) T#Y b*J,d(ar   