
     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  ee      j!                         j"                  d   ZddZ edd      Zd	 Zd
 Zd Zy)u&  tests/state_machine/test_recoverable_classifier.py — Group 3 (3건).

task-2472 regression: recoverable merge block 분류기 검증.

9.  test_branch_protection_block_classified_recoverable
10. test_recoverable_blocked_retry_allowed_after_clear
11. test_non_recoverable_classified_as_failed
    )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                     F/home/jay/workspace/tests/state_machine/test_recoverable_classifier.py_loadr9      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    recoverable_block_classifierz%utils/recoverable_block_classifier.pyc                    d} t         j                  |       }|d   }d}||u }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j
                  d|       dz   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
}||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   }|j                  } |       }||v }|st        j                  d|fd||f      t        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            d
x}x}x}x}}y
)uJ   branch protection 에러 → recoverable=True, category=BRANCH_PROTECTION.z5GraphQL error: base branch policy prohibits the mergerecoverableTisz%(py1)s is %(py4)spy1py4u0   BRANCH_PROTECTION은 recoverable 이어야 함: 
>assert %(py6)spy6NcategoryBRANCH_PROTECTION==z%(py1)s == %(py4)sassert %(py6)smatched_patternr   )z%(py1)s is not %(py4)szbase branch policyin)zD%(py1)s in %(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py4)s.lower
}()
})rB   rC   rE   py8zassert %(py10)spy10)	rbcclassify_merge_blockr   r   r   r    r!   r"   lower)	error_msgresultr-   r,   @py_assert2@py_format5@py_format7@py_assert5@py_assert7@py_format9@py_format11s              r8   3test_branch_protection_block_classified_recoverabler]   $   s   GI%%i0F- eDe D(eee Deee eeeDeee,\]c\d*eeeeeeee*4!44!44444!4444444!44444444#$0D0$D0000$D000$000D0000000D6*;#<D#<#B#BD#B#DD#DDDDD#DDDDDDD#<DDD#BDDD#DDDDDDDDDr:   c           
     	   d}t         j                  |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}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }d	d
|iz  }t        t        j                  |            dx}x}}t         j                  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!        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}||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}}d&}t         j                  |d'g (       |d   }d}||u }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j                  d)      d*z   d
|iz  }t        t        j                  |            dx}x}}y)+ud   RECOVERABLE_BLOCKED 분류 + audit 기록 후 조건 해소 시 retry 허용 (state machine 검증).z2mergeStateStatus: BLOCKED - required check pendingBLOCKED)merge_state_statusr=   Tr>   r@   rA   rK   rE   NrF   MERGE_STATE_BLOCKEDrH   rJ   ztask-2472-retry-test*   ztaskctl-botMERGINGRECOVERABLE_BLOCKED)task_id	pr_numberclassificationactorinput_stateoutput_stateerror_message	workspaceu   audit jsonl 생성 실패zC
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}
audit_path)py0r
   rC   zutf-8)encodingre   rj   evidence_hashrM   )z%(py1)s in %(py3)srecord)rB   py3zassert %(py5)sr   zmerge attempt succeeded	MERGEABLE)r`   unresolved_threadsu2   초기 BLOCKED 분류는 recoverable 이어야 함rD   )rQ   rR   r   r   r   r!   r"   record_block_auditexistsr    r   r   r   	read_textstrip
splitlinesjsonloads)tmp_pathrT   rg   r-   r,   rV   rW   rX   rm   r*   linesrr   @py_format4r1   cleared_msgs                  r8   2test_recoverable_blocked_retry_allowed_after_clearr   4   s)    EI--$ . N -(0D0(D0000(D000(000D0000000*%>)>>%)>>>>>%)>>>>%>>>)>>>>>>>> ''&%* ( 	J ;;;; ;;;;;;;:;;;:;;;;;;;;;;;;  ' 288:EEGEZZb	"F)6 66 66666 6666666 66666666.!:%::!%:::::!%::::!:::%::::::::$?f$$$$?f$$$?$$$$$$f$$$f$$$$$$$ ,K&   -(fDf(D0fff(Dfff(fffDfff2ffffffffr:   c                 |   g d} | D ]  }t         j                  |      }|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}}|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}} y)u2   알 수 없는 merge 실패 → recoverable=False.)zpermission denied: cannot mergezauthentication failedzrepository not foundzfatal: unknown errorr=   Fr>   r@   rA   'uA   '는 non-recoverable이어야 하는데 recoverable=True 반환: rD   rE   NrF   UNKNOWNrH   rJ   rK   rL   )rQ   rR   r   r   r   r    r!   r"   )non_recoverable_msgsmsgrU   r-   r,   rV   rW   rX   s           r8   )test_non_recoverable_classified_as_failedr   b   si    $ 1))#.m$ 	
 	
$- 	
 	
$ 	
 	
 		 % 	
 	
 		 ). 	
 	
  uUV\U]^	
 	
 	
 	
 	
 j!.Y.!Y....!Y...!...Y.......'(0D0(D0000(D000(000D00000001r:   )r'   r   r(   r   )__doc__
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   importlib.utilr   r{   r$   pathlibr   __file__resolveparentsr   r9   rQ   r]   r   r    r:   r8   <module>r      sd    #      
 >!!#++A. *,ST	E 'g\1r:   