
    i                    X   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mZ ddlZ ed      Z ed      ZdddZd Zej$                  dd	       Zdd
ZddZddZej.                  j1                  d      d        Zej.                  j1                  d      d        Zej.                  j1                  d      d        Zej.                  j1                  d      d        Zej.                  j1                  d      d        Zej.                  j1                  d      d        Zy)u   tests/start_guard/test_validations.py
검증 #2, #6, #9 항목에 대한 pytest 케이스.
git worktree 환경 셋업이 필요한 #1, #3~#5, #7, #8 은 skip 처리.
    )annotationsN)PathzI/home/jay/workspace/.worktrees/task-2454-dev4/scripts/start_task_guard.pyz/home/jay/workspacec           
         t        j                  dt        t              g| z   t        |      dddi t        j
                  |xs i       }|S )u   스크립트 실행 헬퍼.python3T   )cwdcapture_outputtexttimeoutenv)
subprocessrunstrSCRIPTosenviron)argsr   r   results       9/home/jay/workspace/tests/start_guard/test_validations.py_runr      sM    ^^	CK 4'H)rzz)ciR)F M    c                    t        g dt        dt        t              i      } | j                  }d}||k7  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |       rt	        j                  |       ndt	        j                  |      t	        j                  |      dz  }t	        j                  d	| j                   d
| j                         dz   d|iz  }t        t	        j                  |            dx}x}}| j                  | j                  z   }g }d}||v }|}|s/d}	|j                  }
 |
       }|	|v }|}|sd}||v }|}|s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  }|j!                  |       |st	        j
                  dfd	f      t	        j                  |	      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  
      t	        j                  |      dz  }dd|iz  }|j!                  |       |st	        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  }|j!                  |       |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  }|j!                  |       t	        j"                  |d#      i z  }t	        j                  d$| j                         d%z   d&|iz  }t        t	        j                  |            dx}x}x}x}x}	x}x}
x}x}x}x}}y)'u\   메인 워크스페이스(WORKSPACE_ROOT)에서 실행 시 exit 1 + 에러 메시지 확인.)--taskz	task-test--botdev9WORKSPACE_ROOTr   r   r   !=z2%(py2)s
{%(py2)s = %(py0)s.returncode
} != %(py5)sr   py0py2py5uK   메인 워크스페이스에서 실행 시 비정상 종료 기대
stdout: 	
stderr: 
>assert %(py7)spy7Nu   워크스페이스worktreeu	   검증 #1u	   검증 #2in)z%(py3)s in %(py5)scombined)py3r$   z%(py7)s)zJ%(py10)s in %(py16)s
{%(py16)s = %(py14)s
{%(py14)s = %(py12)s.lower
}()
})py10py12py14py16%(py18)spy18)z%(py21)s in %(py23)s)py21py23z%(py25)spy25)z%(py28)s in %(py30)s)py28py30z%(py32)spy32   u'   예상 에러 메시지 없음
stderr: z
>assert %(py35)spy35)r   r   r   
returncode
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgstdoutstderrAssertionError_format_explanationlowerappend_format_boolop)r   @py_assert1@py_assert4@py_assert3@py_format6@py_format8r+   @py_assert2@py_assert0@py_assert9@py_assert13@py_assert15@py_assert11@py_assert20@py_assert22@py_assert27@py_assert29@py_format17@py_format19@py_format24@py_format26@py_format31@py_format33@py_format34@py_format36s                            r   #test_check_2_main_workspace_blockedra   "   s   0s>23F
   !                    !"    WW]WdWdVeeopvp}p}o~     }}v}},H 8+ z X^^ ^=M z=M/M Q\ Q\`hQh lw lw  |D  mD   8           $,    $,     z=M    0:      >F    >F    >L    >N     Q\`h    R]      ai    ai     lw  |D    mx      |D    |D        36==/B       r   c                   t        j                  ddt        |       gdd       t        j                  g dt        |       dd       t        j                  g dt        |       dd       | dz  j                  dd	
       t        j                  g dt        |       dd       t        j                  g dt        |       dd       | S )u+   임시 git 저장소 생성 (clean 상태).gitinitT)checkr	   )rc   configz
user.emailztest@test.com)r   re   r	   )rc   rf   z	user.nameTest	README.mdutf-8encoding)rc   addrh   )rc   commitz-mrd   )r   r   r   
write_text)tmp_paths    r   tmp_git_reporp   8   s     NNE63x=1dSNN8Md NN.Md
 '''ANN.CM^bcNN'Md Or   c                   | dz  j                  dd       t        j                  g dt        |       dd      }|j                  }|j
                  } |       }|st        j                  d      d	z   d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      t        j                  |      dz  }t        t        j                  |            dx}x}}t        g d| dt        |       i      }|j                  }d}||k7  }|st        j                   d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        j                  d|j                   d|j"                         dz   d|iz  }	t        t        j                  |	            dx}x}}g }d}
|j"                  }|
|v }|}|sd}|j"                  }||v }|}|st        j                   d|fd|
|f      t        j                  |
      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }	dd|	iz  }|j%                  |       |st        j                   dfd f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d!z  }d"d#|iz  }|j%                  |       t        j&                  |d$      i z  }t        j                  d%|j"                         d&z   d'|iz  }t        t        j                  |            dx}x}x}
x}x}x}x}}y)(u=  dirty working tree에서 실행 시 차단 확인.

    검증 #1/#3/#5가 worktree 설정 부재로 먼저 실패하는 구조이므로,
    dirty tree 상태에서 스크립트가 exit != 0 으로 종료하는 것을 검증.
    실제 검증 #6 로직은 git status --porcelain 이 비어있지 않은 경우.
    z	dirty.txtzdirty contentri   rj   )rc   statusz--porcelainT)r   r	   r
   u*   전제 조건 실패: dirty tree가 아님z^
>assert %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.stdout
}.strip
}()
}
git_status)r"   r#   py4py6N)r   z
task-dirtyr   dev1r   r   r   r   r    r   r!   u3   dirty tree에서 exit 0 발생 (비정상)
stdout: r%   r&   r'   [GUARD ERROR]u   검증 #r)   )z.%(py3)s in %(py7)s
{%(py7)s = %(py5)s.stderr
})r,   r$   r'   z%(py9)spy9)z2%(py12)s in %(py16)s
{%(py16)s = %(py14)s.stderr
})r.   r/   r0   r1   r2   r9   %   GUARD ERROR 메시지 없음
stderr: z
>assert %(py21)sr3   )rn   r   r   r   rC   stripr<   rB   r>   r?   r@   rA   rE   rF   r   r;   r=   rD   rH   rI   )rp   rs   rJ   rL   @py_assert5@py_format7r   rK   rM   rN   rO   @py_assert6rP   rT   rS   rR   @py_format10rY   rZ   @py_format20@py_format22s                        r   test_check_6_dirty_tree_blockedr   N   sQ    K++Og+N (	J R""R"$R$RR&RRRRRRR:RRR:RRRRRR"RRR$RRRRRR1s<01F   !                    !"    ?v}}oZX^XeXeWfg    ? fmm ?m+ z V]] z]/J   ?m          %    %    ,     z]    0:      >D    >D    >K        1@      r   c                   | dz  dz  }|j                  dd       |dz  }|j                          |j                  } |       }|sddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d	x}}t        g d
| dt        |       i      }|j                  }d}||k7  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        j                  d|j                   d|j                          dz   d|iz  }	t        t        j                  |	            d	x}x}}d}
|j                   }|
|v }|st        j                  d|fd|
|f      t        j                  |
      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        j                  d|j                          dz   d|iz  }	t        t        j                  |	            d	x}
x}}y	)u)  memory/events/<task>.cancelled 파일 존재 시 차단 확인.

    검증 #1~#8이 먼저 실패하는 구조이지만,
    직접 취소 마커 존재 여부를 확인하는 로직 단위를 검증한다.
    스크립트는 cancelled 파일이 있는 상태에서 항상 exit != 0 기대.
    memoryeventsTparentsexist_okztask-testcancel.cancelledAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}cancelled_filer"   r#   rt   N)r   ztask-testcancelr   rv   r   r   r   r   r    r   r!   u7   cancelled task에서 exit 0 발생 (비정상)
stdout: r%   r&   r'   rw   r)   )z.%(py1)s in %(py5)s
{%(py5)s = %(py3)s.stderr
})py1r,   r$   ry   )mkdirtouchexistsr>   r?   r<   r@   rA   rE   rF   r   r   r;   r=   rB   rC   rD   )ro   
events_dirr   rJ   rL   @py_format5r   rK   rM   rN   rP   rO   s               r   #test_check_9_cancelled_task_blockedr   t   sV    H$x/JTD1"==N  " """""""">""">""" """"""""""6s8}-F
   !                    !"    C6==/Q[\b\i\i[jk    
  fmm ?m+  ?m          %    %    ,    1@     r   c                   d}| dz  dz  | dz  }|j                   j                  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}x}}|j                  } |       }| }|sdd	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      d
z  }t        t        j                  |            dx}x}}|j                          |j                  } |       }|sdd	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      d
z  }t        t        j                  |            dx}}y)u   cancelled 마커 감지 로직만 단위 테스트.

    실제 start_task_guard.py의 cancelled 경로 패턴:
      cwd / 'memory' / 'events' / f'{task_id}.cancelled'
    ztask-unit-cancelr   r   z
.cancelledTr   u#   전제 조건: 파일 없어야 함zG
>assert not %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}cancelled_pathr   NzEassert not %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}r   )parentr   r   r<   rB   r>   r?   r@   rA   rE   rF   r   )ro   task_idr   rJ   rL   r{   rM   r   s           r   #test_check_9_cancelled_marker_logicr      s    !G(83	6LLNt<$$M$&M&&M&MM(MMMMMMM~MMM~MMM$MMM&MMMMMM $$&$&&&&&&&&&&&~&&&~&&&$&&&&&&&&&&   " """""""">""">""" """"""""""r   uN   git worktree 환경 셋업 복잡 — 통합 환경에서 수동 검증 필요)reasonc                      y)u)   검증 #1: worktree 경로 형식 검증.N r   r   r   "test_check_1_worktree_path_blockedr           	r   u!   git worktree 환경 셋업 복잡c                      y)u    검증 #3: branch 형식 검증.Nr   r   r   r   "test_check_3_branch_format_blockedr      r   r   c                      y)u.   검증 #4: branch task-id와 --task 불일치.Nr   r   r   r   #test_check_4_branch_taskid_mismatchr      r   r   c                      y)u$   검증 #5: git worktree list 검증.Nr   r   r   r   test_check_5_worktree_listr      r   r   c                      y)u9   검증 #7: 메인 워크스페이스 main == origin/main.Nr   r   r   r   test_check_7_main_branch_syncr      r   r   c                      y)u)   검증 #8: HEAD가 올바른 task branch.Nr   r   r   r   test_check_8_head_branch_matchr      r   r   )N)r   z	list[str]r   r   r   zdict | Nonereturnzsubprocess.CompletedProcess)ro   r   )rp   r   )__doc__
__future__r   builtinsr>   _pytest.assertion.rewrite	assertionrewriter<   r   r   pathlibr   pytestr   r   r   ra   fixturerp   r   r   r   markskipr   r   r   r   r   r   r   r   r   <module>r      sR   #   	   	Y	Z+,
",  *L:#. ij	 k	
 <=	 >	
 <=	 >	
 <=	 >	
 <=	 >	
 <=	 >	r   