
    ܨj                        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
  e
e      j                         j                  d   Z ee      ej                   vr"ej                   j#                  d ee             edz  dz  Zedz  dz  Zedz  d	z  d
z  dz  Zg dZh dZh dZh dZde
fdZd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#y)u  Watcher contract schema validation — task-2643 Track D.

schemas/watcher_contract_v1.json + schemas/watcher_dead_letter_v1.json
+ tests/fixtures/watcher_contract/delegated_watcher_allow/ 정합 검증.

- 9 필수 필드 모두 존재
- owner 가 ANU 본체 식별자면 fail
- collector_role 이 "ANU" 가 아니면 fail
- callback_target.owner_key == "c119085addb0f8b7"
- dead-letter state enum 4종
    N)Path   schemaszwatcher_contract_v1.jsonzwatcher_dead_letter_v1.jsontestsfixtureswatcher_contractdelegated_watcher_allow)
schematask_id	pr_numberhead_shaterminal_statesttl_secondscallback_targetduplicate_policyownercollector_role>   ANUanuANU_MAINanu_mainANU_SESSIONanu_session>   MERGE_READYLOOP_BOUNDARYCHAIR_REQUIREDCI_FAILED_NON_REMEDIABLEGEMINI_EXTERNAL_TRIGGER_STALE>   DUPLICATE_WATCHERWATCHER_STALE_HEADWATCHER_TIMEOUT_HOLDWATCHER_CALLBACK_MISSINGpc                 L    t        j                  | j                  d            S )Nutf-8encoding)jsonloads	read_text)r#   s    b/home/jay/workspace/.worktrees/task-2643-dev6/tests/regression/test_watcher_contract_validation.py_load_schemar,   8   s    ::akk7k344    c            	      n   t        t              } | 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   }t        |      }t        t              }||k(  }|swt        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
dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }	t        j                  d| d          dz   d|	iz  }
t        t        j                  |
            d x}x}x}}y )Nz$idzanu.watcher_contract.v1==z%(py1)s == %(py4)spy1py4assert %(py6)spy6required)zN%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py9)s
{%(py9)s = %(py6)s(%(py7)s)
}setREQUIRED_FIELDSpy0py2r4   r6   py7py9zrequired fields mismatch: got=z
>assert %(py11)spy11)r,   CONTRACT_SCHEMA_PATH
@pytest_ar_call_reprcompare	_safereprAssertionError_format_explanationr8   r9   @py_builtinslocals_should_repr_global_name_format_assertmsg)r
   @py_assert0@py_assert3@py_assert2@py_format5@py_format7@py_assert1@py_assert8@py_assert5@py_format10@py_format12s              r+   $test_contract_schema_required_fieldsrT   <   s   ./F%=555=55555=5555=55555555555j! 3!" c/&: "&::   "&:              "    #      '*    '*      +:    +:    ';    )
);(<=     r-   c                     t        t              } t        | d   d   d   d         }|t        k(  }|st	        j
                  d|fd|t        f      dt        j                         v st	        j                  |      rt	        j                  |      nddt        j                         v st	        j                  t              rt	        j                  t              nddz  }d	d
|iz  }t        t	        j                  |            d }y )N
propertiesr   itemsenumr/   z%(py0)s == %(py2)sTERMINAL_STATES_5r;   r<   assert %(py4)sr4   )r,   r@   r8   rZ   rA   rB   rF   rG   rH   rC   rD   rE   r
   rX   rO   @py_format3rM   s        r+   .test_contract_schema_terminal_states_enum_is_5r_   D   s    ./Fvl#$56w?GHD$$$$$4$$$$$$$4$$$4$$$$$$$$$$$$$$$$$$r-   c                     t        t              } | d   d   d   d   }dd l}|j                  |      }t        D ]  }|j
                  } ||      }|st        j                  d|      dz   dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
z  }t        t        j                  |            d x}} y )NrV   r   notpatternr   zowner pattern fails to block zI
>assert %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.match
}(%(py3)s)
}patident)r;   r<   py3py5)r,   r@   recompileANU_SELF_IDENTIFIERSmatchrA   rI   rF   rG   rH   rC   rD   rE   )r
   	owner_notrg   rc   rd   rO   @py_assert4@py_format6s           r+   1test_contract_schema_owner_blocks_anu_identifiersrn   J   s    ./F|$W-e4Y?I
**Y
C% KyyJyJJJ#@	!JJJJJJJsJJJsJJJyJJJJJJJJJJJJJJJJJJKr-   c                  0   t        t              } | d   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 )
NrV   r   rX   r   r/   r1   r2   r5   r6   r,   r@   rA   rB   rC   rD   rE   r
   rJ   rK   rL   rM   rN   s         r+   /test_contract_schema_collector_role_is_ANU_onlyrr   T   sl    ./F, 01&9DeWD9WDDDD9WDDD9DDDWDDDDDDDr-   c                  :   t        t              } | d   d   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 )NrV   r   	owner_keyconstc119085addb0f8b7r/   r1   r2   r5   r6   rp   rq   s         r+   +test_contract_schema_owner_key_anu_constantrw   Y   s    ./F|./=kJ7SS	 S   	T         r-   c                     t        t              } t        | d   d   d         }|t        k(  }|st	        j
                  d|fd|t        f      dt        j                         v st	        j                  |      rt	        j                  |      nddt        j                         v st	        j                  t              rt	        j                  t              nddz  }dd	|iz  }t        t	        j                  |            d }y )
NrV   dead_letter_staterX   r/   rY   DEAD_LETTER_STATES_4r[   r\   r4   )r,   DEAD_LETTER_SCHEMA_PATHr8   rz   rA   rB   rF   rG   rH   rC   rD   rE   r]   s        r+    test_dead_letter_schema_4_statesr|   a   s    12Fvl#$78@AD'''''4'''''''4'''4''''''''''''''''''r-   c                  6   t        t              } | 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
   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 )NrV   fail_closedru   Tisz%(py1)s is %(py4)sr2   r5   r6   chair_report_required)r,   r{   rA   rB   rC   rD   rE   rq   s         r+   /test_dead_letter_schema_fail_closed_always_truer   g   s    12F,.w7?4?74????74???7???4???????, 78AITIATIIIIATIIIAIIITIIIIIIIr-   c            	         t        j                  t        dz  j                  d            } t        j                  t        dz  j                  d            }| d   }t        D ]  }||v }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  |      rt        j                  |      ndd	z  }t        j                  d
|       dz   d|iz  }t        t        j                  |            d } |d   }|t        v}|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}||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}||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#   }||k  }d$}||k  }|r|st        j                  d%||fd&|||f      t        j                  |      t        j                  |      t        j                  |      d'z  }d(d)|iz  }t        t        j                  |            d x}x}x}x}}|d*   }t        |      }d+}||k(  }|st        j                  d|fd,||f      d-t        j                         v st        j                  t              rt        j                  t              nd-t        j                  |      t        j                  |      t        j                  |      d.z  }d(d)|iz  }t        t        j                  |            d x}x}x}}|d/   }t!        |      }|j"                  } |t$              }|sd0d1t        j                         v st        j                  t               rt        j                  t               nd1t        j                  |      t        j                  |      t        j                  |      d2t        j                         v st        j                  t$              rt        j                  t$              nd2t        j                  |      d3z  }t        t        j                  |            d x}x}x}}|d4   }d5}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|d6   d7   }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 )8Nzevidence.jsonr%   r&   zexpected.jsoncontractinz%(py0)s in %(py2)sfieldr[   zmissing required field 
>assert %(py4)sr4   r   not inz%(py1)s not in %(py3)sri   r3   re   assert %(py5)srf   r   r   r/   r1   r2   r5   r6   r   rt   rv   callback_only_reportingTr   r   r   r   i   )<<=)z%(py1)s < %(py5)sz%(py5)s <= %(py7)s)r3   rf   r=   zassert %(py9)sr>   r   (   )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)slen)r;   r<   r4   r=   r   zhassert %(py9)s
{%(py9)s = %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}.issubset
}(%(py7)s)
}r8   rZ   r:   validation_resultvalidanti_impersonation_assertionscallback_owner_key_anu)r(   r)   ALLOW_FIXTURE_DIRr*   r9   rA   rB   rF   rG   rH   rC   rI   rD   rE   ri   r   r8   issubsetrZ   )evidenceexpectedr   r   rO   r^   rM   rJ   rL   @py_format4rm   rK   rN   rl   @py_assert6@py_format8rR   rQ   rP   s                      r+   -test_allow_fixture_passes_contract_assertionsr   m   s   zz,>IISZI[\Hzz,>IISZI[\H
#H  D CCCuCCCCCCuCCCuCCCCCCCCCCCCC$;E7"CCCCCCCD G8$88888$8888888888$8888$88888888$%..%....%...%..........%&{3I7II37IIIII37IIII3III7IIIIIIII-.6$6.$6666.$666.666$6666666.x&.1&..$.&$.....1&$...1...&...$.......
#*3#$**$****$******3***3***#***$**********)*G3*+G+44G45FGGGGGGGG3GGG3GGG*GGG+GGG4GGGGGG5FGGG5FGGGGGGGGGG '(3G3(G3333(G333(333G3333333345MN N  N   O    	      r-   c            	         t        t              } | j                  dg       D ]-  }t        D ]  }||v }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      nddt        j                         v st	        j                  |      rt	        j                  |      nddz  }t	        j                  d|       dz   d	|iz  }t        t	        j                  |            d } |d
   }|t        v}|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}
||
k(  }|slt	        j
                  d|fd||
f      t	        j                  |      t	        j                  |
      dz  }dd|iz  }t        t	        j                  |            d x}x}}
0 y )Nexamplesr   r   r   exr[   zschema example missing r   r4   r   r   r   ri   r   r   rf   r   r   r/   r1   r2   r5   r6   )r,   r@   getr9   rA   rB   rF   rG   rH   rC   rI   rD   rE   ri   )r
   r   r   rO   r^   rM   rJ   rL   r   rm   rK   rN   s               r+   4test_contract_schema_example_self_validates_requiredr      sf   ./FjjR( -$ 	BEB;AAA5BAAAAAA5AAA5AAAAAABAAABAAAA"9% AAAAAAA	B'{6{"66666{"6666{666666"6666"66666666"#,u,#u,,,,#u,,,#,,,u,,,,,,,	-r-   c                     t        t              } | j                  dg       D ]  }|d   }|t        v }|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 }|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 )Nr   ry   r   )z%(py1)s in %(py3)srz   r   r   rf   r~   Tr   r   r2   r5   r6   r   )r,   r{   r   rz   rA   rB   rC   rF   rG   rH   rD   rE   )	r
   r   rJ   rL   r   rm   rK   rM   rN   s	            r+   .test_dead_letter_schema_example_self_validatesr      s2   12FjjR( 3%&>&*>>>>>&*>>>>&>>>>>>*>>>>*>>>>>>>>- (D( D(((( D((( (((D((((((()*2d2*d2222*d222*222d22222223r-   )$__doc__builtinsrF   _pytest.assertion.rewrite	assertionrewriterA   r(   syspathlibr   __file__resolveparents_WTstrpathinsertr@   r{   r   r9   ri   rZ   rz   r,   rT   r_   rn   rr   rw   r|   r   r   r   r    r-   r+   <module>r      s   
   
 
8n&&q)s8388HHOOAs3x Y)CC 	/,II 'MJ.1CCF__  \   5D 5%KE
(J.-3r-   