
    i,                         d Z ddlZddlmc m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         8/home/jay/workspace/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(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j                  d|       dz   d|iz  }	t        t        j                  |	            d
x}x}}d |d   D        }
t        |
      }|st        j                  |d         dz   dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |
      t        j                  |      dz  }t        t        j                  |            d
x}
}y
# 1 sw Y   ox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PASS==z%(py1)s == %(py4)spy1py4zExpected PASS, got 
>assert %(py6)spy6c              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.
>assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}anypy0py2rB   strr   r   r2   r   
@pytest_ar_call_reprcompare	_saferepr_format_assertmsgAssertionError_format_explanationrN   @py_builtinslocals_should_repr_global_namer   r   r:   r)   result@py_assert0@py_assert3@py_assert2@py_format5@py_format7@py_assert1s              r   test_ratio_1_0_passre   ?   s^   G]N 7
^45
^45%  -J	-A*-M	N @?@ (EvEv%EEEvEEEEEEvEEE)<VH'EEEEEEEENF9<MNa3NNaNaaPVW`Paaaaaaa3aaa3aaaNaaaNaaaaaa	@ @s   F::Gc           	         d}t        |       }t        | |d| dd| dd| dg       dg}t        dt        |            5  t	        ||	      }d
d
d
       d   }d}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j                  d|       dz   d|iz  }	t        t        j                  |	            d
x}x}}d |d   D        }
t        |
      }|st        j                  |d         dz   dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |
      t        j                  |      dz  }t        t        j                  |            d
x}
}y
# 1 sw Y   ox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;   WARNr=   r?   r@   zExpected WARN, got rC   rD   c              3   $   K   | ]  }d |v  
 yw)z0.33Nr1   rH   s     r   rK   z,test_ratio_below_0_5_warn.<locals>.<genexpr>g   s     6qv{6   rL   rM   rN   rO   rR   r]   s              r   test_ratio_below_0_5_warnrj   T   sd   G]N 7
^M*
^M*
^M*%  J	-A*-M	N @?@ (EvEv%EEEvEEEEEEvEEE)<VH'EEEEEEEE6F9$56I366I6IIy8IIIIIII3III3III6III6IIIIII	@ @s   F>>Gc                    d}t        |       }t        | |d| dd| dg       g }t        dt        |            5  t	        ||      }ddd       d	   }d
}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j                  d|       dz   d|iz  }	t        t        j                  |	            dx}x}}d |d   D        }
t        |
      }|st        j                  |d         dz   dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |
      t        j                  |      dz  }t        t        j                  |            dx}
}y# 1 sw Y   oxY w)uI   보고서 파일 2개 모두 실제 변경 없음 → ratio 0.0 → FAIL.ztask-test-failr4   u   /src/alpha.py | 수정 |
u   /src/beta.py | 수정 |
r6   r7   r9   Nr;   FAILr=   r?   r@   zExpected FAIL, got rC   rD   c              3   $   K   | ]  }d |v  
 yw)u   명시된 파일 변경 없음Nr1   rH   s     r   rK   z$test_ratio_0_fail.<locals>.<genexpr>{   s     P/14Pri   rL   rM   rN   rO   rR   r]   s              r   test_ratio_0_failrn   j   sW   G]N7
^67
^56%  J	-A*-M	N @?@ (EvEv%EEEvEEEEEEvEEE)<VH'EEEEEEEEPfY>OPc3PPcPccRXYbRccccccc3ccc3cccPcccPcccccc	@ @s   F88Gc                    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(  }	|	st        j                  d|	fd||f      t        j                  |      t        j                  |      dz  }
t        j                  d|       dz   d|
iz  }t        t        j                  |            dx}x}	}d |d   D        }t        |      }|st        j                  |d         dz   dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }
t        t        j                  |
            dx}}y# 1 sw Y   oxY w)u2   보고서에 수정 파일 섹션 없음 → SKIP.ztask-test-skipr
   r   Tr   r   u8   # 작업 보고서

## 개요

특별한 내용 없음.
r   r   r6   r9   Nr;   SKIPr=   r?   r@   zExpected SKIP, got rC   rD   c              3   $   K   | ]  }d |v  
 yw)u   수정 파일 섹션 없음Nr1   rH   s     r   rK   z6test_no_modified_files_section_skip.<locals>.<genexpr>   s     Ma,1Mri   rL   rM   rN   rO   )rS   r   r   r   r   assert_not_calledrT   rU   rV   rW   rX   rY   rN   rZ   r[   r\   )r   r   r:   r   r   mock_runr^   r_   r`   ra   rb   rc   rd   s                r   #test_no_modified_files_section_skiprt   ~   ss   G]N X%	1KdT27)3/KG   
	  %H?""$% (EvEv%EEEvEEEEEEvEEE)<VH'EEEEEEEEM6);LM`3MM`M``vV_O```````3```3```M```M``````% %s   GG$)__doc__builtinsrZ   _pytest.assertion.rewrite	assertionrewriterT   sysosunittest.mockr   r   
subprocesspathinsert verifiers.file_touch_ratio_checkr   rS   listr   r%   r(   r2   re   rj   rn   rt   r1   r   r   <module>r      s     
 	 *  5 6 3
EC ET#Y E4 E9 DI ) T#Y b*J,d(ar   