
    U{i                         d Z ddlZddlmc mZ ddlZddlZej                  j                  dd       ej                  j                  dd       ddlZddlZ G d d      Z G d d      Z G d	 d
      Zy)ut   
test_1921b_team_scope.py — task-1921_b 검증 테스트
V-4: g3 팀 범위 검증 + V-6: scope_check SKIP→WARN
    Nz/home/jay/workspace/scriptsz*/home/jay/workspace/teams/shared/verifiersc                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestCheckTeamScopeu;   g3_independent_verifier.check_team_scope() 유닛 테스트c                    ddiddig}t        j                  |d      \  }}d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}}g }||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}}y)u#   자기 팀 파일만 있으면 PASS	file_pathteams/dev4/qc/qc_verify.pyzteams/dev4/CLAUDE.md	dev4-teamPASS==z%(py0)s == %(py3)sstatuspy0py3assert %(py5)spy5Nwarnings
g3vcheck_team_scope
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationselfentriesr   r   @py_assert2@py_assert1@py_format4@py_format6s           2/home/jay/workspace/tests/test_1921b_team_scope.pytest_pass_own_team_filesz+TestCheckTeamScope.test_pass_own_team_files   s     6701
 //Evvvvx2~x2xx2    c                    ddiddiddiddiddig}t        j                  |d      \  }}d}||k(  }|st        j                  d	|fd
||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}}g }||k(  }|st        j                  d	|fd
||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}}y)uA   공용 파일(teams/shared, scripts, utils 등)만 있으면 PASSr   %teams/shared/verifiers/scope_check.py"scripts/g3_independent_verifier.pyzutils/helper.pyzmemory/reports/test.mdztests/test_example.pyr   r	   r
   r   r   r   r   r   Nr   r   r   s           r&   test_pass_shared_filesz)TestCheckTeamScope.test_pass_shared_files#   s    AB>?+,2312
 //Evvvvx2~x2xx2r(   c                    ddiddig}t        j                  |d      \  }}d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}}t        |      }d}||k(  }	|	st        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  }
dd|
iz  }t        t        j                  |            dx}x}	}d}|d   }||v }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }
t        t        j                  |
            dx}x}}y)u#   다른 팀 파일이 있으면 WARNr   teams/dev1/CLAUDE.mdr+   r   WARNr
   r   r   r   r   r   N   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenr   r   py1r   py6assert %(py8)spy8dev1r   in)z%(py1)s in %(py4)sr4   py4assert %(py6)sr5   r   r   r   r   r   r   r   r   r   r   r2   )r    r!   r   r   r"   r#   r$   r%   @py_assert5@py_assert4@py_format7@py_format9@py_assert0@py_assert3@py_format5s                  r&   test_warn_other_team_filesz-TestCheckTeamScope.test_warn_other_team_files0   si    01>?
 //Evvvv8}!!}!!!!}!!!!!!s!!!s!!!!!!8!!!8!!!}!!!!!!!!!!$!$v$$$$v$$$v$$$$$$$$$$r(   c                    ddiddiddig}t        j                  |d      \  }}d}||k(  }|st        j                  d|fd||f      d	t	        j
                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}}g }||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}}y)u*   자기 팀 + 공용 파일 혼합 → PASSr   zteams/dev2/qc/qc_verify.pyr*   r+   z	dev2-teamr	   r
   r   r   r   r   r   Nr   r   r   s           r&   test_pass_mixed_own_and_sharedz1TestCheckTeamScope.test_pass_mixed_own_and_shared;   s     67AB>?

 //Evvvvx2~x2xx2r(   c                    ddig}t        j                  |d      \  }}d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }d	d
|iz  }t        t        j                  |            dx}}t        |      }d}||k(  }	|	st        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  }
dd|
iz  }t        t        j                  |            dx}x}	}y)u7   파일경로:라인번호 형식도 올바르게 처리r   zteams/dev1/qc/qc_verify.py:42z	dev3-teamr/   r
   r   r   r   r   r   Nr0   r1   r2   r   r3   r6   r7   r>   )r    r!   r   r   r"   r#   r$   r%   r?   r@   rA   rB   s               r&   !test_warn_with_line_number_suffixz4TestCheckTeamScope.test_warn_with_line_number_suffixF   s    9:
 //Evvvv8}!!}!!!!}!!!!!!s!!!s!!!!!!8!!!8!!!}!!!!!!!!!!r(   N)	__name__
__module____qualname____doc__r'   r,   rF   rH   rJ    r(   r&   r   r      s    E	%	"r(   r   c                   "    e Zd ZdZd Zd Zd Zy)TestScopeCheckAuditTrailAbsenceuD   scope_check.verify()에서 audit-trail 부재 시 WARN 반환 확인c                    t        |dz  dz        }t        j                  dgd|      }|d   }d}||k(  }|st        j                  d|fd	||f      t        j
                  |      t        j
                  |      d
z  }t        j                  d|d          dz   d|iz  }t        t        j                  |            dx}x}}d |d   D        }	t        |	      }|sd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)u1   audit-trail.jsonl이 없으면 WARN (SKIP 아님)nonexistentzaudit-trail.jsonlsrc/main.py	test-taskexpected_filestask_idaudit_trail_pathr   r/   r
   z%(py1)s == %(py4)sr;   zExpected WARN, got z
>assert %(py6)sr5   Nc              3   0   K   | ]  }d |v xs d|v   yw)u   부재u   범위 검증 불가NrO   ).0ds     r&   	<genexpr>zWTestScopeCheckAuditTrailAbsence.test_warn_when_audit_trail_not_found.<locals>.<genexpr>`   s"     [A8q=?$:a$??[s   detailsz,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}any)r   py2r<   )strscverifyr   r   r   _format_assertmsgr   r   r`   r   r   r   )
r    tmp_pathrS   resultrC   rD   r"   rE   rA   r#   s
             r&   $test_warn_when_audit_trail_not_foundzDTestScopeCheckAuditTrailAbsence.test_warn_when_audit_trail_not_foundW   s   (]25HHI)?(

 hS6S6)SSS6SSSSSS6SSS-@AQ@R+SSSSSSSS[PYIZ[[s[[[[[[[[[s[[[s[[[[[[[[[[[[[[r(   c                    t        |dz        }t        j                  dgd|      }|d   }d}||k(  }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}}d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  }
dd|
iz  }t        t        j                  |            dx}}y)u.   WARN 메시지에 audit-trail 경로가 포함zno-file.jsonlrT   rU   rV   r   r/   r
   rZ   r;   r=   r5   N r_   r9   )z%(py1)s in %(py3)sdetails_text)r4   r   r   r   )rb   rc   rd   r   r   r   r   r   joinr   r   r   )r    rf   rS   rg   rC   rD   r"   rE   rA   rk   r$   r%   s               r&   test_warn_message_contains_pathz?TestScopeCheckAuditTrailAbsence.test_warn_message_contains_pathb   s    (_45)?(

 h)6)6))))6))))))6)))))))xxy 12.,....,.........,...,.......r(   c                 4   t        j                  g dd      }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }d	d
|iz  }t        t        j                  |            dx}x}}y)u0   expected_files가 비어있으면 여전히 SKIPrU   z/nonexistent/pathrV   r   SKIPr
   rZ   r;   r=   r5   N)rc   rd   r   r   r   r   r   )r    rg   rC   rD   r"   rE   rA   s          r&    test_skip_when_no_expected_filesz@TestScopeCheckAuditTrailAbsence.test_skip_when_no_expected_filesn   sm    0

 h)6)6))))6))))))6)))))))r(   N)rK   rL   rM   rN   rh   rm   rp   rO   r(   r&   rQ   rQ   T   s    N	\
/*r(   rQ   c                   8    e Zd ZdZd	dZd Zd
dZd Zd Zd Z	y)TestG3TeamScopeIntegrationuF   g3_independent_verifier main()에서 --team-id 동작 통합 테스트Nc                 ~   |j                  t        dt        |             dd|g}|r|j                  d|g       |j                  t        d|       t        j                  t              5 }t        j                          d d d        |j                  j                  S # 1 sw Y   j                  j                  S xY w)NWORKSPACE_ROOTzg3_independent_verifier.pyz	--task-idz	--team-idargv)setattrr   rb   extendsyspytestraises
SystemExitmainvaluecode)r    monkeypatchrf   rX   team_idru   exc_infos          r&   	_run_mainz$TestG3TeamScopeIntegration._run_main   s    C!13x=A,k7CKKg./C.]]:& 	(HHJ	~~"""	~~"""s   +BB<c                 l    |dz  dz  }|j                  dd       || dz  j                  |d       y )NmemoryreportsTparentsexist_okz.mdutf-8encoding)mkdir
write_text)r    rf   rX   contentreports_dirs        r&   _make_reportz'TestG3TeamScopeIntegration._make_report   sB    )I5$6	'#	&227W2Mr(   c                 n    ||z  }|j                   j                  dd       |j                  |d       y )NTr   r   r   )parentr   r   )r    rf   rel_pathr   targets        r&   
_make_filez%TestG3TeamScopeIntegration._make_file   s6    H$D48'G4r(   c                    d}d}| j                  |||       | j                  |dd       | j                  |d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                  |      dz  }dd|iz  }	t        t        j                  |	            dx}}y)u?   --team-id dev4-team + dev4 파일만 verified → PASS (exit 0)ztask-v4-001u1  # task-v4-001 보고서

## 수정 파일별 검증 상태

| 파일 | 변경 내용 | grep 검증 | 상태 |
|------|-----------|-----------|------|
| teams/dev4/qc/qc_verify.py | 수정 | grep "VERIFY_OK" OK | verified |
| scripts/g3_independent_verifier.py | 수정 | grep "team_scope" OK | verified |
r   zVERIFY_OK = True
r+   zteam_scope = True
r   r   r
   r   	exit_coder   r   r   Nr   r   r   r   r   r   r   r   r   r   r   
r    rf   r   rX   reportr   r"   r#   r$   r%   s
             r&   !test_pass_own_team_verified_filesz<TestG3TeamScopeIntegration.test_pass_own_team_verified_files   s    	 	(GV4">@TU"FH]^NN;';O	yA~yAyyAr(   c                    d}d}| j                  |||       | j                  |d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                  |      d
z  }dd|iz  }	t        t        j                  |	            dx}}y)uQ   --team-id dev4-team + dev1 파일 verified → WARN이지만 exit 0 (FAIL 아님)ztask-v4-002u   # task-v4-002 보고서

## 수정 파일별 검증 상태

| 파일 | 변경 내용 | grep 검증 | 상태 |
|------|-----------|-----------|------|
| teams/dev1/CLAUDE.md | 수정 | grep "MODIFIED" OK | verified |
r.   zMODIFIED = True
r   r   r
   r   r   r   r   r   Nr   r   s
             r&   'test_warn_other_team_files_still_passeszBTestG3TeamScopeIntegration.test_warn_other_team_files_still_passes   s     	(GV4"8:MNNN;';O	yA~yAyyAr(   c                    d}d}| j                  |||       | j                  |dd       | j                  |||      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d	z  }d
d|iz  }	t        t        j                  |	            dx}}y)u*   --team-id 없으면 team_scope 검증 SKIPztask-v4-003u   # task-v4-003 보고서

## 수정 파일별 검증 상태

| 파일 | 변경 내용 | grep 검증 | 상태 |
|------|-----------|-----------|------|
| scripts/g3_independent_verifier.py | 수정 | grep "OK_KEY" OK | verified |
r+   zOK_KEY = True
r   r
   r   r   r   r   r   Nr   r   s
             r&   !test_no_team_id_skips_scope_checkz<TestG3TeamScopeIntegration.test_no_team_id_skips_scope_check   s     	(GV4"FHYZNN;'B	yA~yAyyAr(   )N)z# placeholder)
rK   rL   rM   rN   r   r   r   r   r   r   rO   r(   r&   rr   rr   |   s$    P#N
5
($r(   rr   )rN   builtinsr   _pytest.assertion.rewrite	assertionrewriter   rx   ry   pathinsertg3_independent_verifierr   scope_checkrc   r   rQ   rr   rO   r(   r&   <module>r      sf   
  
  0 1 ? @ % 7" 7"|!* !*PM Mr(   