
    j                    T   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
mZ ddlmZmZ ddlZddlmZmZ ddlmZmZmZ  ee      j1                         j2                  j2                  dz  d	z  Zg d
ZddZej:                  j=                  de      dd       ZddZ ddZ!ddZ"ddZ#y)u  tests.regression.test_snapshot_crossref_validator — task-2639.

7 fixture parametrized 검증 + snapshot crossref 결과 분류 단언.

Spec: memory/specs/system_real_merge_hooks_snapshot_crossref_spec_260523.md §6
sha256: 12b8af006913833596562c55ab9a0acca935830be90c5f17f2af4b7e1e632621

회장 verbatim (spec §6 fixture 7 시나리오 × 3 = 21 files):
    fixture_in_snapshot_pass_candidate              → allow_reason 기록
    fixture_in_snapshot_mismatch_no_op              → unauthorized_forbidden_hits
    fixture_wrong_head_sha                          → sha_match=False
    sanctioned_lock_separated                       → sanctioned_artifacts 분리
    production_in_snapshot_chair_required           → production_in_snapshot
    blocking_secret_in_snapshot_chair_required      → blocking_secret_in_snapshot
    admin_override_required_chair_required          → crossref snapshot side PASS
    )annotationsN)Path)AnyDict)FORBIDDEN_DIR_PREFIXESFORBIDDEN_PATHS)ALLOW_REASON_SNAPSHOT_CROSSREFSNAPSHOT_CROSSREF_SCHEMAvalidate_snapshot_crossreffixturessnapshot_crossref)"fixture_in_snapshot_pass_candidate"fixture_in_snapshot_mismatch_no_opfixture_wrong_head_shasanctioned_lock_separated%production_in_snapshot_chair_required*blocking_secret_in_snapshot_chair_required&admin_override_required_chair_requiredscenarioc                    t         | z  }t        j                  |dz  j                  d            }t        j                  |dz  j                  d            }||dS )Nzevidence.jsonzutf-8)encodingzexpected.json)evidenceexpected)FIXTURE_ROOTjsonloads	read_text)r   baser   r   s       H/home/jay/workspace/tests/regression/test_snapshot_crossref_validator.py_loadr    0   sY    ("Dzz4/1<<g<NOHzz4/1<<g<NOH h77    c           	        t        |       }|d   }|d   d   }t        |d   |d   |j                  d      t        t              t        t
                    }|d   }|t        k(  }|st        j                  d	|fd
|t        f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddz  }dd|iz  }t        t        j                  |            dx}}|d   }|d   }	||	u }|st        j                  d|fd||	f      t        j                  |      t        j                  |	      dz  }
t        j                  |       dz   d|
iz  }t        t        j                  |            dx}x}}	|d   }|d   }	||	u }|st        j                  d|fd||	f      t        j                  |      t        j                  |	      dz  }
t        j                  |       dz   d|
iz  }t        t        j                  |            dx}x}}	|d   }|d   }	||	u }|st        j                  d|fd||	f      t        j                  |      t        j                  |	      dz  }
t        j                  |       dz   d|
iz  }t        t        j                  |            dx}x}}	|d   }|d   }	||	k(  }|st        j                  d	|fd||	f      t        j                  |      t        j                  |	      dz  }
t        j                  |       dz   d|
iz  }t        t        j                  |            dx}x}}	|d   }|d   }|d   }t!        |      }	|d   }t!        |      }|	|k(  }|s<t        j                  d	|fd|	|f      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      t        j                  |	      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      t        j                  |      dz  }t        j                  |       dz   d |iz  }t        t        j                  |            dx}x}	x}x}}|d!   }t!        |      }	|d!   }t!        |      }|	|k(  }|s<t        j                  d	|fd|	|f      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      t        j                  |	      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      t        j                  |      dz  }t        j                  |       dz   d |iz  }t        t        j                  |            dx}x}	x}x}}|d"   }t!        |      }	|d"   }t!        |      }|	|k(  }|s<t        j                  d	|fd|	|f      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      t        j                  |	      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      t        j                  |      dz  }t        j                  |       dz   d |iz  }t        t        j                  |            dx}x}	x}x}}|d#   }t!        |      }	|d#   }t!        |      }|	|k(  }|s<t        j                  d	|fd|	|f      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      t        j                  |	      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      t        j                  |      dz  }t        j                  |       dz   d |iz  }t        t        j                  |            dx}x}	x}x}}|d$   }|d$   }	||	k(  }|st        j                  d	|fd||	f      t        j                  |      t        j                  |	      dz  }
t        j                  |       dz   d|
iz  }t        t        j                  |            dx}x}}	|d$   |d$   }|t"        k(  }|st        j                  d	|fd
|t"        f      t        j                  |      d%t        j                         v st        j                  t"              rt        j                  t"              nd%dz  }t        j                  |       d&z   d|iz  }t        t        j                  |            dx}}|d'   }t%        |      }	|d'   }t%        |      }|	|k(  }|s<t        j                  d	|fd|	|f      d(t        j                         v st        j                  t$              rt        j                  t$              nd(t        j                  |      t        j                  |	      d(t        j                         v st        j                  t$              rt        j                  t$              nd(t        j                  |      t        j                  |      dz  }t        j                  |       dz   d |iz  }t        t        j                  |            dx}x}	x}x}}|d)   }t%        |      }	|d)   }t%        |      }|	|k(  }|s<t        j                  d	|fd|	|f      d(t        j                         v st        j                  t$              rt        j                  t$              nd(t        j                  |      t        j                  |	      d(t        j                         v st        j                  t$              rt        j                  t$              nd(t        j                  |      t        j                  |      dz  }t        j                  |       dz   d |iz  }t        t        j                  |            dx}x}	x}x}}y)*uT   각 fixture 의 expected.crossref 필드와 validator 반환값을 정확히 비교.r   r   crossrefpr_identitychair_authorizationchanged_filesforbidden_pathsforbidden_dir_prefixesschema==)z%(py1)s == %(py3)sr
   )py1py3zassert %(py5)spy5Npr_matchisz%(py1)s is %(py4)sr-   py4z
>assert %(py6)spy6	sha_matchsnapshot_presentsnapshot_keysz%(py1)s == %(py4)sclassificationtask_outputs)zP%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py10)s
{%(py10)s = %(py6)s(%(py8)s)
}set)py0py2r5   r6   py8py10z
>assert %(py12)spy12sanctioned_artifactsunauthorized_forbidden_hitsauthorized_forbidden_hitsallow_reasonr	   z
>assert %(py5)sproduction_in_snapshotsortedblocking_secret_in_snapshot)r    r   getlistr   r   r
   
@pytest_ar_call_reprcompare	_saferepr@py_builtinslocals_should_repr_global_nameAssertionError_format_explanation_format_assertmsgr=   r	   rH   )r   payloadr   expected_crossrefout@py_assert0@py_assert2@py_format4@py_format6@py_assert3@py_format5@py_format7exp_clfgot_clf@py_assert1@py_assert7@py_assert9@py_assert5@py_format11@py_format13s                       r   (test_validator_crossref_matches_expectedrg   7   s
    HoGz"H
+J7
$&'_%_-#$:;C x=4=44444=4444=444444444444444444 z?E/
;E?;;EEE?;EEE?EEE;EEEXEEEEEEE{G0=G==GGG=GGGGGG=GGGxGGGGGGG !"U&78J&KU"&KKUUU"&KUUU"UUU&KUUUXUUUUUUUO#4_#EO#EEOOO#EOOOOOO#EOOOxOOOOOOO   01G"#G~&Q3&'Qw~/FQ3/F+GQ'+GGQQQ'+GQQQQQQ3QQQ3QQQ&QQQ'QQQQQQ3QQQ3QQQ/FQQQ+GQQQQQQQQQQ-. 3./ &'3'4 / 4    / 4  	     i   i /  i 0  	   47  i 47  i 	( i4   x      45 356 -.#.; 6 ;    6 ;  	     i   i 6  i 7  	   ;>  i ;>  i 	/ i;   x      23 334 +,,9 4 9    4 9  	     i   i 4  i 5  	   9<  i 9<  i 	- i9   x     
 ~M"3N"CM"CCMMM"CMMMMMM"CMMMXMMMMMMM(4n-	-1OO		-1O	 	
) .	 	V	 	  2P	 	
) 2P	 	8	 	 	  	 	
 ./ 6/0 23F35 0 5    0 5  	     i   i 0  i 1  	   5;  i 5;  i 	4 i5   x      34 645 788: 5 :    5 :  	     i   i 5  i 6  	   :@  i :@  i 	9 i:   x     r!   c            	     b   t        dddddt        t              t        t                    } | d   d   }dg}||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}||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}||u }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}x}}y)uR   changed_files=None → fail-closed sentinel 1건 forbidden hit (spec §3 Step 0a).r    prhead_shaNr'   r;   rD   __INPUT_NONE_FAIL_CLOSED__r+   r:   r4   assert %(py6)sr6   rF   r1   r3   r8   F	r   rK   r   r   rL   rM   rN   rR   rS   rW   rX   r\   rY   r]   r^   s         r   -test_validator_none_changed_files_fail_closedrq   o   se   
$b!_-#$:;C  !>? $D ? D   ? D    @   D       ~&$&$&&&&$&&&&&&$&&&&&&&!"+e+"e++++"e+++"+++e+++++++r!   c            	     b   t        dddddgt        t              t        t                    } | 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}||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}||u }|slt	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}x}}| d   }g }||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g}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}x}}y)uG   chair_authorization=None → 모든 match False, snapshot 비어있음.i  (fffffffffffffffffffffffffffffffffffff999rj   Nzmemory/reports/x.mdr'   r0   Fr1   r3   r4   rn   r6   r7   r8   r9   r+   r:   r;   r<   ro   rp   s         r   :test_validator_no_chair_authorization_returns_safe_defaultrt      s   
$ JK	_-#$:;C z?#e#?e####?e###?###e#######{$u$u$$$$u$$$$$$u$$$$$$$!"+e+"e++++"e+++"+++e+++++++%2%2%%%%2%%%%%%2%%%%%%% 0K5J4KK04KKKKK04KKKK0KKK4KKKKKKKKr!   c                 6   t        ddddgdgdgddgg g       } | 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}||u }|slt        j                  d	|fd
||f      t        j                  |      t        j                  |      dz  }dd|iz  }t	        t        j
                  |            dx}x}}y)uD   pr 이 str(숫자) 형태로 들어와도 정상 매칭 (defensive).300abcrj   x
pr_numbers	head_shasexpected_files_snapshotr'   r0   Tr1   r3   r4   rn   r6   Nr7   r   rL   rM   rN   rR   rS   rp   s         r   #test_validator_pr_str_normalizationr~      s    
$%( '(+u	

 
!
C z?"d"?d""""?d"""?"""d"""""""{#t#t####t######t#######r!   c                 H   t        ddddgdgdgddgg dg      } | d	   d
   }dg}||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   }g }||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}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t	        t        j
                  |            dx}x}}y)uL   snapshot exact match 만 허용. 동일 prefix 다른 path 는 unauthorized.i  deadbeefrj   ztests/fixtures/AAA.mdry   ztests/fixtures/BBB.mdztests/fixtures/r'   r;   rD   r+   r:   r4   rn   r6   NrE   rF   r1   r3   r}   rp   s         r   -test_validator_broad_allowlist_doctrine_holdsr      sz   
$
+%$(?'@	
 
!! 12C  !>? D ? D   ? D    @   D        !<=CC=CCCC=CCC=CCCCCCCCCC~&$&$&&&&$&&&&&&$&&&&&&&r!   )r   strreturnzDict[str, Any])r   r   r   None)r   r   )$__doc__
__future__r   builtinsrO   _pytest.assertion.rewrite	assertionrewriterL   r   pathlibr   typingr   r   pytestutils.real_merge_hooksr   r   !utils.snapshot_crossref_validatorr	   r
   r   __file__resolveparentr   	SCENARIOSr    markparametrizerg   rq   rt   r~   r    r!   r   <module>r      s     #       J  	N##**Z7:MM 	8 Y/4 04n, L $"'r!   