
     j\                        d Z ddlmZ ddlZddlmc mZ ddl	Z
ddlZddlZddlmZ ddlZ ee      j#                         j$                  d   ZddZ edd      Zd	 Zd
 Zd Zd Zy)uJ  tests/regression/test_review_thread_guard.py — Group 1 (4건).

task-2472 regression: Gemini review thread 임의 resolve 차단 검증.

1. test_resolve_low_severity_no_evidence_ok
2. test_resolve_medium_severity_without_evidence_rejected
3. test_resolve_with_evidence_allowed_and_audited
4. test_resolve_audit_missing_rejects
    )annotationsN)Path   c                p   t         |z  }t        j                  j                  | t	        |            }g }d }||u}|}|r|j
                  }d }	||	u}
|
}|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  }|j                  |       |rt        j                  d
fd	f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |	      dz  }d	d
|iz  }|j                  |       t        j                  |d      i z  }t        j                  d|       dz   d|iz  }t        t        j                   |            d x}x}x}x}x}x}
}	t        j                  j#                  |      }|t$        j&                  | <   |j
                  j)                  |       |S )N)is not)z%(py2)s is not %(py5)sspec)py2py5z%(py7)spy7)z5%(py11)s
{%(py11)s = %(py9)s.loader
} is not %(py14)s)py9py11py14z%(py16)spy16r   u   spec load 실패: z
>assert %(py19)spy19)WORKTREE	importlibutilspec_from_file_locationstrloader
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprappend_format_boolop_format_assertmsgAssertionError_format_explanationmodule_from_specsysmodulesexec_module)mod_namerelpathr   @py_assert1@py_assert4@py_assert3@py_assert0@py_assert10@py_assert13@py_assert12@py_format6@py_format8@py_format15@py_format17@py_format18@py_format20mods                     @/home/jay/workspace/tests/regression/test_review_thread_guard.py_loadr8      sM   c>D>>11(CIFDTtT4tTT4T4 7TTTT4tTTTTTT4TTT4TTTtTTTTTTT4TTTTTTTTTTTTTTT4TTTTTTTTTT;MdV9TTTTTTTTT
..
)
)$
/CCKKKKC J    review_thread_guardzutils/review_thread_guard.pyc                 <   t         j                  dddd      } | d   }d}||u }|slt        j                  d|fd	||f      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}}| 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   d   }d}||u }|slt        j                  d|fd	||f      t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}y)u/   low severity는 evidence 없이 resolve 허용.z
thread-001lowtest-botNactorapproval_evidenceokTisz%(py1)s is %(py4)spy1py4assert %(py6)spy6u   허용reasonin)z%(py1)s in %(py4)sdetailseverity==z%(py1)s == %(py4)sr@   )rtgcan_resolve_threadr   r   r   r    r!   )resultr,   r+   @py_assert2@py_format5@py_format7s         r7   (test_resolve_low_severity_no_evidence_okrX   '   st   ##	 $ F $<4<4<4<4'vh''8'''''8''''8'''''''''''(J'050'50000'5000'00050000000(/08D80D88880D8880888D8888888r9   c                    t         j                  dddd      } | d   }d}||u }|slt        j                  d|fd	||f      t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}g }d}| d   }||v }|}|s d}	| d   }
|
j                  } |       }|	|v }|}|s&t        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }|j                  |       |st        j                  dfd	f      t        j                  |	      t        j                  
      t        j                        t        j                  |      dz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}x}x}x}	x}x}
x}}| 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   d   }d}||u }|slt        j                  d|fd	||f      t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}y) uM   medium thread는 chairman approval evidence 없이 resolve 시도 → reject.zthread-medium-001mediumzodin-botNr>   rA   FrB   rD   rE   rH   rI   rJ   evidencerK   )z%(py3)s in %(py6)s)py3rI   z%(py8)spy8)zJ%(py11)s in %(py18)s
{%(py18)s = %(py16)s
{%(py16)s = %(py14)s.lower
}()
})r   r   r   py18z%(py20)spy20   zassert %(py23)spy23rM   rN   rO   rQ   r@   )
rR   rS   r   r   r   r    r!   lowerr   r   )rT   r,   r+   rU   rV   rW   r)   @py_assert5r*   r-   r.   @py_assert15@py_assert17r/   @py_format9@py_format19@py_format21@py_format22@py_format24s                      r7   6test_resolve_medium_severity_without_evidence_rejectedrk   9   s	   ##	 $ F $< 5 <5    <5   <   5       Q8Qvh'Q8''Q:Q9IQ9I9O9OQ9O9QQ:9Q+QQQQQ8'QQQ8QQQ'QQQQQQQ:9QQQQ:QQQ9IQQQ9OQQQ9QQQQQQQQQQQQQQQQ(J'383'83333'8333'33383333333(/08D80D88880D8880888D8888888r9   c                "   dddd}t         j                  ddd|      }|d	   }d
}||u }|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}}t         j                  ddddd|dd| 	      }|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}	}|j                  d      j                         j                         }
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}}t#        j$                  |
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+   }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,   }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-   }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.}||v }|st        j                  d/|fd0||f      t        j                  |      d1t        j                         v st        j                  |      rt        j                  |      nd1d2z  }d3d4|iz  }t        t        j                  |            dx}}|d5   }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)6uK   유효한 evidence와 함께 high resolve → ok=True + audit jsonl 기록.chairmanz/tmp/evidence.jsonz2026-05-07T00:00:00Zapproved_byevidence_pathtszthread-high-001highr=   r>   rA   TrB   rD   rE   zcan_resolve failed: rJ   z
>assert %(py6)srI   N	task-2472c   allowedzchairman approved	task_id	pr_number	thread_idrN   r?   r@   rT   rJ   	workspaceu,   audit jsonl 파일이 생성되지 않았음zC
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}
audit_path)py0r	   rG   zutf-8)encodingr`   )>=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)slenlines)r|   rF   r\   rI   zassert %(py8)sr]   rw   rO   rQ   rH   ry   rN   rT   evidence_hashrK   )z%(py1)s in %(py3)srecord)rF   r\   zassert %(py5)sr
   r?   )rR   rS   r   r   r   r   r    r!   record_resolution_auditexistsr   r   r   	read_textstrip
splitlinesr   jsonloads)tmp_pathr[   gater,   r+   rU   rV   rW   r{   r)   r   rc   r*   rf   r   @py_format4r0   s                    r7   .test_resolve_with_evidence_allowed_and_auditedr   K   s    "-$H !!"	 " D :FF:FFF:FFF:FFFFFF!5d8n5EFFFFFFFF ,,#"" - 
J NNNN NNNNNNN:NNN:NNNNNNNNNNNN  ' 288:EEGEu::?:33uu:ZZb	"F)++++++++++++++++++++3"33"33333"3333333"33333333*'''''''''''''''''''((y(y((((y((((((y((((((($?f$$$$?f$$$?$$$$$$f$$$f$$$$$$$'?(j(?j((((?j(((?(((j(((((((r9   c                r   dddd}t         j                  j                  }d }|j                  t         j                  d|       t	        j
                  t        t        f      5  t         j                  ddd	d
d|dd| 	       ddd       |j                  t         j                  d|       y# 1 sw Y   +xY w)uK   audit write 차단 시 record_resolution_audit 실패 → exception 발생.rm   z/tmp/ev.jsonz2026-05-07T01:00:00Zrn   c                     ~ ~t        d      )Nu   디렉토리 read-only (mock))OSError)argskwargss     r7   _blocked_writez:test_resolve_audit_missing_rejects.<locals>._blocked_write   s    &566r9   writers   rt   zthread-audit-blockrr   r=   ru   zaudit blocked testrv   N)	rR   osr   setattrpytestraisesr   	Exceptionr   )r   monkeypatchr[   original_os_writer   s        r7   "test_resolve_audit_missing_rejectsr   z   s     "'$H 7 8	+	, 
##*&' 	$ 
	

 ):;
 
s   $B--B6)r&   r   r'   r   )__doc__
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   importlib.utilr   r   r#   pathlibr   r   __file__resolveparentsr   r8   rR   rX   rk   r   r    r9   r7   <module>r      sj    #      
  >!!#++A. !#AB9$9$()^<r9   