
    jr                    B   d Z ddlmZ ddlZddlZddlmZ ddlZ ee	      j                         j                  d   Z ee      ej                  vr"ej                  j                  d ee             edz  Zd Zd Zd	 Zd
 ZddlZddlZd ZddZd Zd Zd Zd Zy)u  test_owner_trigger_2553_plus1_high_fix.py — task-2553+1 F1-solo regression.

F1 = `/gemini review` comment trigger 의 endpoint/args allowlist 강화. token transport 무관 (task-2553+1 §2). clean replacement PR 의 6-file effective diff #2 (회장 §5 single authority).
    )annotationsN)Path   zanu_v2/owner_trigger_pat.pyc                     t         j                  j                  dt              } t         j                  j	                  |       }|t
        j                  | j                  <   | j                  j                  |       |S )N'anu_v2_owner_trigger_pat_2553p1_highfix)
	importlibutilspec_from_file_location_OTPmodule_from_specsysmodulesnameloaderexec_modulespecmods     N/home/jay/workspace/tests/regression/test_owner_trigger_2553_plus1_high_fix.py	_load_otpr      sZ    >>1114D ..
)
)$
/C CKK		KKC J    c                 :    t               } | j                  dk(  sJ y)uA   F1 invariant: 허용 comment body 는 정확히 `/gemini review`.z/gemini reviewN)r   ALLOWED_COMMENT_BODY)otps    r   2test_allowed_comment_body_is_exactly_gemini_reviewr      s    
+C##'7777r   c                     t               } t        j                  t              5 }| j	                  g dddd       ddd       | j
                  t        j                        v sJ y# 1 sw Y   -xY w)uE   F1 invariant: 다른 endpoint → ENDPOINT_NOT_ALLOWED 정적 차단.)api-XPOSTz/repos/o/r/issues/1/labels-fzbody=/gemini reviewor   N)r   pytestraises	Exception_assert_args_allowlistERR_ENDPOINT_NOT_ALLOWEDstrvaluer   eis     r   ,test_args_allowlist_rejects_foreign_endpointr-   %   sd    
+C	y	! 
R""*a	

 ''3rxx=888
 
   A''A0c                     t               } t        j                  t              5 }| j	                  g dddd       ddd       | j
                  t        j                        v sJ y# 1 sw Y   -xY w)u=   F1 invariant: 다른 body → BODY_NOT_ALLOWED 정적 차단.)r   r   r   z/repos/o/r/issues/1/commentsr    zbody=please merger!   r"   r#   N)r   r$   r%   r&   r'   ERR_BODY_NOT_ALLOWEDr)   r*   r+   s     r   (test_args_allowlist_rejects_foreign_bodyr1   1   sd    
+C	y	! 
R""(a	

 ##s288}444
 
r.   c                    t         j                  j                  dt              } | | j                  J t         j                  j                  |       }|t        j                  | j                  <   | j                  j                  |       |S )u  sys.modules 등록형 로더 — Python 3.12 frozen dataclass 문자열 어노 해소.

    기존 `_load_otp` 는 sys.modules 미등록이라 3.12 에서 @dataclass(line 77)
    문자열 어노 해소가 깨진다(본 task 무관·사전존재). 본 helper 는 동일 모듈을
    sys.modules 선등록 후 로드하여 is_duplicate_trigger 동치 검증을 가능케 한다.
    *anu_v2_owner_trigger_pat_2553p10_streaming)
r   r	   r
   r   r   r   r   r   r   r   r   s     r   _load_otp_streamingr4   F   sq     >>114dD  777
..
)
)$
/C CKK		KKC Jr   c                2    | dz  }|j                  |       |S )Nzaudit.jsonl)write_bytes)tmp_pathcontent_bytesps      r   _writer:   W   s    = AMM- Hr   c                   t               }d}t        j                  ||j                  d      }t        j                  ||j                  d      }|j                  t        | |dz   j                               |      du sJ |j                  t        | |dz   j                               |      du sJ t        j                  d|j                  d      }|j                  t        | |dz   j                               |      du sJ |j                  t        | d|dz   j                         z         |      du sJ |j                  | dz  |      du sJ |j                  | |      du sJ y	)
u]   매칭/미매칭/깨진라인-skip/dedupe 마커우선 — 스트리밍 전후 동일 결과.128#6c443d87
dedupe_keyoutcome
Tz999#xFs
   {not json
zabsent.jsonlNr4   jsondumps
OUTCOME_OKOUTCOME_PENDINGis_duplicate_triggerr:   encode)r7   r   keyokpendothers         r   ,test_is_duplicate_streaming_equivalence_corerL   ]   sW   

C
C	33>>B	CB::SS5H5HIJD##F8b4i5G5G5I$JCPTXXXX##F8dTk5I5I5K$LcRVZZZZJJg#..IJE##F8edl5J5J5L$MsSW\\\\##F8nT	GYGYG[6[$]_bcgkkkk##H~$=sCuLLL##Hc2e;;;r   c                8   t               }d}t        j                  ||j                  d      }t        j                  ||j                  d      }|j                  t        | |j                               |      du sJ |j                  t        | d|dz   j                         z         |      du sJ dt        j                  dd	d      dz   j                         z   d
z   |dz   j                         z   dz   }|j                  t        | |      |      du sJ |j                  t        | d      |      du sJ |j                  t        | |dz   j                               |      du sJ |j                  t        | |dz   j                               |      du sJ y)u]   9-R.5 적대적 동치: trailing-newline無 / BOM첫라인 / 다수+빈줄혼재 / 빈파일.r<   r=   Ts   ﻿r@   Fs   

arI   s      
   
r   z
NrA   )r7   r   rH   rI   rJ   blobs         r   .test_is_duplicate_streaming_adversarial_parityrR   r   s   

C
C	33>>B	CB::SS5H5HIJD##F8RYY[$A3G4OOO##F8_T	GYGYG[5[$\^abfkkkktzz"FG$NVVXX+--/0278D##F8T$:C@DHHH##F8S$93?5HHH##F8b6k5I5I5K$LcRVZZZZ##F8b4i5G5G5I$JCPTXXXXr   c                    t               }t        | d      }t        j                  t              5  |j                  |d       ddd       y# 1 sw Y   yxY w)uW   9-R.3 decode-error parity: invalid utf-8 → UnicodeDecodeError 전파(False 변환 0).s    invalid utf8 r<   N)r4   r:   r$   r%   UnicodeDecodeErrorrF   )r7   r   r9   s      r   3test_is_duplicate_decode_error_propagates_not_falserU      sI    

Cx67A	)	* 4  N34 4 4s   AAc                   	 ddl 	ddl} t               }| j                  t	        j
                  |j                              }	j                  |      }|j                  d   }t        |	j                        sJ 	j                  |      D ch c]N  }t        |	j                        r6t        |j                  	j                        r|j                  j                  P }}d|vsJ d       d|vsJ d       d|v sJ d       t!        	fd		j                  |      D              }|sJ d
       t#               }	j                  |      D ]_  }t        |	j$                        st        |j&                  	j(                        s;|j+                  |j&                  j,                         a d|v sJ |j/                  h d      s
J d|        yc c}w )u+  §12.5 정적 증명(AST): is_duplicate_trigger 가 read_text/splitlines 호출 부재 +

    파일객체 스트리밍(open + iter) 사용 + except 핸들러는 OSError 만(9-R.3 미확대).
    AST 기반 — 설명 주석/docstring 의 'read_text' 문자열 언급에 오탐되지 않는다.
    r   N	read_textu3   is_duplicate_trigger 가 여전히 read_text 호출
splitlinesu(   splitlines() 전량 분할 호출 잔존openu&   스트리밍 path.open() 호출 부재c              3     K   | ]^  }t        |j                        xrB t        |j                  j                        xr  t        |j                  j                         ` y w)N)
isinstanceForiterNametarget).0nasts     r   	<genexpr>zBtest_is_duplicate_no_read_text_streaming_static.<locals>.<genexpr>   sY        	1cgg 	+qvvsxx(	+qxx*	+s   A$A'u0   파일객체 for-line 스트리밍 순회 부재OSError>   r&   
ValueErrorBaseExceptionrT   u    except 핸들러 부당 확대: )rb   textwrapr4   dedentinspect	getsourcerF   parsebodyr[   FunctionDefwalkCallfunc	AttributeattranysetExceptHandlertyper^   addid
isdisjoint)
rg   r   srctreefnra   called_attrshas_file_iterhandler_typesrb   s
            @r   /test_is_duplicate_no_read_text_streaming_staticr      s    

C
//'++C,D,DE
FC99S>D	1Bb#//*** "a"z!&&#--'H 	
L  l*a,aa*|+W-WW+\!K#KK!  "	 M LLL=EMXXb\ )a**+
1663880Laffii() %%%##J :	)-9: 1s   AG)r8   bytes)__doc__
__future__r   importlib.utilr   r   pathlibr   r$   __file__resolveparents_WSr)   pathinsertr   r   r   r-   r1   ri   rB   r4   r:   rL   rR   rU   r    r   r   <module>r      s   
 #  
  
8n&&q)s8388HHOOAs3x 
**8	9	5"  "<*Y*4):r   