
    i                        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dz  dz  Z ej                  d	      d
        Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)u}  tests/state_machine/test_recoverable.py — task-2471 회귀 테스트.

토르가 commit 4795c5e2 에서 추가한 RECOVERABLE_BLOCKED 상태 + 전이 규칙을
영구 차단한다.

- ``RECOVERABLE_BLOCKED`` 가 ``STATES`` tuple 에 포함
- ``ALLOWED_TRANSITIONS["MERGING"]`` 에 ``"RECOVERABLE_BLOCKED"`` 포함
- ``ALLOWED_TRANSITIONS["RECOVERABLE_BLOCKED"]`` 가
  MERGING/FAILED/ESCALATED/PR_OPEN 모두 포함
- subprocess taskctl CLI 호출 없이 import + 정적 검증만 수행

worktree 경로 hardcode 절대 금지 — ``importlib.util.spec_from_file_location``
로 동적 로드.

헤임달(개발2팀 테스터) 작성.
    )annotationsN)Path   scriptsz
taskctl.pymodule)scopec                    t         j                         sJ dt                 t        t        dz        } d}| t        j
                  vr"t        j
                  j                  d|        d}	 t        j                  j                  dt        t                     }||j                  J t        j                  j                  |      }|t        j                  |j                  <   |j                  j                  |       |r"	 t        j
                  j                  |        |S |S # t         $ r Y |S w xY w# |r0	 t        j
                  j                  |        w # t         $ r Y w w xY ww xY w)u   worktree 의 ``scripts/taskctl.py`` 를 절대 경로로 로드.

    sys.path 조작 없이 importlib 로 직접 로드하여 다른 워크트리의 동명 파일과
    충돌하지 않게 한다.
    ztaskctl.py not found: r   Fr   Ttaskctl_recoverable_test_alias)TASKCTL_PATHexistsstr	WORKSPACEsyspathinsert	importlibutilspec_from_file_locationloadermodule_from_specmodulesnameexec_moduleremove
ValueError)scripts_diraddedspecmods       ;/home/jay/workspace/tests/state_machine/test_recoverable.pytaskctl_modr!      s<     I$:<."II  i)+,KE#((";'~~55,c,.?
 DKK$;;;nn--d3!$DII$, J3J  J ,  sC   ,BD6 D& &	D32D36E*:EE*	E&#E*%E&&E*c                H    d| j                   v sJ d| j                           y)u4   ``RECOVERABLE_BLOCKED`` 가 STATES tuple 에 존재.RECOVERABLE_BLOCKEDu&   RECOVERABLE_BLOCKED 미정의: STATES=N)STATESr!   s    r    "test_recoverable_blocked_in_statesr&   C   s.     K$6$66 
01C1C0DE6    c                $    d| j                   vsJ y)uL   ``RECOVERABLE_BLOCKED`` 는 terminal 이 아니어야 함 (transient block).r#   N)TERMINAL_STATESr%   s    r    %test_recoverable_blocked_not_terminalr*   J   s     (C(CCCCr'   c                z    | j                   j                  dt                     }d|v sJ dt        |              y)u8   MERGING 의 허용 전이에 RECOVERABLE_BLOCKED 포함.MERGINGr#   u2   MERGING -> RECOVERABLE_BLOCKED 미허용: targets=NALLOWED_TRANSITIONSgetsetsorted)r!   merging_targetss     r    2test_merging_can_transition_to_recoverable_blockedr3   T   sA    !5599)SUKO O3 
<VO=T<UV3r'   c                v    | j                   j                  dt                     }h d}||z
  }|r
J d|        y)uN   MERGING 의 허용 전이는 {MERGED, FAILED, RECOVERABLE_BLOCKED} 를 포함.r,   >   FAILEDMERGEDr#   u   MERGING 의 누락된 전이: Nr.   r/   r0   )r!   r2   expectedmissings       r    !test_merging_targets_set_completer:   \   sB    !5599)SUKO:H(GB8	BB;wr'   c                    | j                   j                  dt                     }h d}||z
  }|rJ d| dt        |       d       y)uL   RECOVERABLE_BLOCKED 는 {MERGING, FAILED, ESCALATED, PR_OPEN} 모두 포함.r#   >   r5   r,   PR_OPEN	ESCALATEDu*   RECOVERABLE_BLOCKED 의 누락된 전이: u
    (실제: )Nr-   )r!   
rb_targetsr8   r9   s       r     test_recoverable_blocked_targetsr@   d   sV    00445JCERJ<H#G 
4WIZzHZG[[\];wr'   c                X    | j                   j                  dt                     }d|v sJ y)uI   RECOVERABLE_BLOCKED -> MERGING 전이 허용 (cmd_recover 자동 복귀).r#   r,   Nr7   r!   r?   s     r    .test_recoverable_blocked_can_return_to_mergingrC   n   s+    00445JCERJ
"""r'   c                X    | j                   j                  dt                     }d|v sJ y)u/   RECOVERABLE_BLOCKED -> ESCALATED 전이 허용.r#   r=   Nr7   rB   s     r    %test_recoverable_blocked_can_escalaterE   t   s+    00445JCERJ*$$$r'   c                $    d| j                   v sJ y)uX   ALLOWED_TRANSITIONS dict 에 키로 존재 (entry 자체가 등록되어 있어야 함).r#   N)r.   r%   s    r    2test_recoverable_blocked_key_exists_in_transitionsrG   z   s     K$C$CCCCr'   c                X    t        | d      sJ d       t        | j                        sJ y)u?   ``cmd_recover`` 함수가 모듈에 정의되어 있어야 함.cmd_recoveruC   cmd_recover 함수 미정의 (토르 commit 4795c5e2 누락 의심)N)hasattrcallablerI   r%   s    r     test_cmd_recover_function_existsrL      s2    ;. M. K++,,,r'   )__doc__
__future__r   importlib.utilr   r   pathlibr   pytest__file__resolveparentsr   r   fixturer!   r&   r*   r3   r:   r@   rC   rE   rG   rL    r'   r    <module>rW      s     #  
   N""$,,Q/	9$|3 h  HDC#%D-r'   