
    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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"                  j%                  d      d        Zej"                  j%                  d      d        Zej"                  j%                  d      d        Zej"                  j%                  d      d        Zej"                  j%                  d      d        Zej"                  j%                  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                 F   t        g dt        dt        t              i      } | j                  dk7  s!J d| j                   d| j
                          | j
                  | j                  z   }d|v s1d|j                         v sd	|v sd
|v sJ d| j
                          yyyy)u\   메인 워크스페이스(WORKSPACE_ROOT)에서 실행 시 exit 1 + 에러 메시지 확인.)--taskz	task-test--botdev9WORKSPACE_ROOTr   r   r   uK   메인 워크스페이스에서 실행 시 비정상 종료 기대
stdout: 	
stderr: u   워크스페이스worktreeu	   검증 #1u	   검증 #2u'   예상 에러 메시지 없음
stderr: N)r   r   r   
returncodestdoutstderrlower)r   combineds     r   #test_check_2_main_workspace_blockedr%   "   s    0s>23F
 ! 
VW]WdWdVeeopvp}p}o~! }}v}},H8+zX^^=M/MQ\`hQhlw  |D  mD 
26==/B  D  mDQh/M+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	   )r'   configz
user.emailztest@test.com)r   r)   r	   )r'   r*   z	user.nameTest	README.mdutf-8encoding)r'   addr,   )r'   commitz-mr(   )r   r   r   
write_text)tmp_paths    r   tmp_git_repor4   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                         sJ d       t        g d	| d
t        |       i      }|j                  dk7  s!J d|j                   d|j                          d|j                  v s#d|j                  v sJ d|j                          yy)u=  dirty working tree에서 실행 시 차단 확인.

    검증 #1/#3/#5가 worktree 설정 부재로 먼저 실패하는 구조이므로,
    dirty tree 상태에서 스크립트가 exit != 0 으로 종료하는 것을 검증.
    실제 검증 #6 로직은 git status --porcelain 이 비어있지 않은 경우.
    z	dirty.txtzdirty contentr-   r.   )r'   statusz--porcelainT)r   r	   r
   u*   전제 조건 실패: dirty tree가 아님)r   z
task-dirtyr   dev1r   r   r   u3   dirty tree에서 exit 0 발생 (비정상)
stdout: r   [GUARD ERROR]u   검증 #%   GUARD ERROR 메시지 없음
stderr: N)	r2   r   r   r   r!   stripr   r    r"   )r4   
git_statusr   s      r   test_check_6_dirty_tree_blockedr<   N   s     K++Og+N (	J ""$R&RR$1s<01F ! 
>v}}oZX^XeXeWfg! fmm+zV]]/J 
0@J/J+r   c                b   | dz  dz  }|j                  dd       |dz  }|j                          |j                         sJ t        g d| dt	        |       i      }|j
                  d	k7  s!J d
|j                   d|j                          d|j                  v sJ d|j                          y)u)  memory/events/<task>.cancelled 파일 존재 시 차단 확인.

    검증 #1~#8이 먼저 실패하는 구조이지만,
    직접 취소 마커 존재 여부를 확인하는 로직 단위를 검증한다.
    스크립트는 cancelled 파일이 있는 상태에서 항상 exit != 0 기대.
    memoryeventsTparentsexist_okztask-testcancel.cancelled)r   ztask-testcancelr   r7   r   r   r   u7   cancelled task에서 exit 0 발생 (비정상)
stdout: r   r8   r9   N)mkdirtouchexistsr   r   r    r!   r"   )r3   
events_dircancelled_filer   s       r   #test_check_9_cancelled_task_blockedrH   t   s     H$x/JTD1"==N  """6s8}-F
 ! 
B6==/Q[\b\i\i[jk!
 fmm+ 
0@+r   c                    d}| dz  dz  | dz  }|j                   j                  dd       |j                         rJ d       |j                         rJ |j                          |j                         sJ y)	u   cancelled 마커 감지 로직만 단위 테스트.

    실제 start_task_guard.py의 cancelled 경로 패턴:
      cwd / 'memory' / 'events' / f'{task_id}.cancelled'
    ztask-unit-cancelr>   r?   z
.cancelledTr@   u#   전제 조건: 파일 없어야 함N)parentrC   rE   rD   )r3   task_idcancelled_paths      r   #test_check_9_cancelled_marker_logicrM      s     !G(83	6LLNt<$$&M(MM& $$&&&   """r   uN   git worktree 환경 셋업 복잡 — 통합 환경에서 수동 검증 필요)reasonc                      y)u)   검증 #1: worktree 경로 형식 검증.N rP   r   r   "test_check_1_worktree_path_blockedrQ           	r   u!   git worktree 환경 셋업 복잡c                      y)u    검증 #3: branch 형식 검증.NrP   rP   r   r   "test_check_3_branch_format_blockedrT      rR   r   c                      y)u.   검증 #4: branch task-id와 --task 불일치.NrP   rP   r   r   #test_check_4_branch_taskid_mismatchrV      rR   r   c                      y)u$   검증 #5: git worktree list 검증.NrP   rP   r   r   test_check_5_worktree_listrX      rR   r   c                      y)u9   검증 #7: 메인 워크스페이스 main == origin/main.NrP   rP   r   r   test_check_7_main_branch_syncrZ      rR   r   c                      y)u)   검증 #8: HEAD가 올바른 task branch.NrP   rP   r   r   test_check_8_head_branch_matchr\      rR   r   )N)r   z	list[str]r   r   r   zdict | Nonereturnzsubprocess.CompletedProcess)r3   r   )r4   r   )__doc__
__future__r   r   r   pathlibr   pytestr   r   r   r%   fixturer4   r<   rH   rM   markskiprQ   rT   rV   rX   rZ   r\   rP   r   r   <module>re      sN   # 	   	Y	Z+,
",  *L:#. ij	 k	
 <=	 >	
 <=	 >	
 <=	 >	
 <=	 >	
 <=	 >	r   