
    i                        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d      Z ed      Zg dZdZd	Zd
dddZdddZd Zd Zd Zd Zy)u   tests/handoff/test_create.py
create_handoff.py 생성 테스트:
- test_create_basic: 필수 필드 확인
- test_create_4000_split: 4000자 초과 시 pending_work_path + 외부 파일 생성
- test_create_invalid_reason: 잘못된 reason → exit 1
    )annotationsN)PathzG/home/jay/workspace/.worktrees/task-2454-dev4/scripts/create_handoff.pyz-/home/jay/workspace/.worktrees/task-2454-dev4)task_idschema_versionprevious_botcurrent_branchbase_shahead_shachanged_pathsallowed_pathsforbidden_pathstest_resultshandoff_reason
created_atz	task-9001z	task-9002z	task-9003z	task-9004z	task-9005	interruptcompletetakeover_requestc                    t        t        j                        }|rt        |      |d<   nt        t              |d<   t        j                  dt        t              g| z   t        t              ddd|      S )u    create_handoff.py 실행 헬퍼.WORKSPACE_ROOTpython3T   )cwdcapture_outputtexttimeoutenv)dictosenvironstrWORKTREE
subprocessrunSCRIPT)argsworkspace_rootr   s      0/home/jay/workspace/tests/handoff/test_create.py_run_handoffr)   +   sg    
rzz
C #N 3 #H>>	CK 4'M     c            
        t         } t        dz  dz  |  dz  }|j                         r|j                          t	        d| ddddd	d
g      }	 |j
                  }d}||k(  }|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                  } |       }|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}}t#        j$                  |j'                  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#   }|| k(  }|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(   }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.   }d/}||k(  }|slt        j                  d|fd)||f      t        j                  |      t        j                  |      d*z  }d+d,|iz  }t        t        j                   |            dx}x}}|	d0   }t+        |t,              }|sd1d2t        j                         v st        j                  t*              rt        j                  t*              nd2t        j                  |      d3t        j                         v st        j                  t,              rt        j                  t,              nd3t        j                  |      d4z  }t        t        j                   |            dx}}|	d5   }t+        |t.              }|sd1d2t        j                         v st        j                  t*              rt        j                  t*              nd2t        j                  |      d6t        j                         v st        j                  t.              rt        j                  t.              nd6t        j                  |      d4z  }t        t        j                   |            dx}}d7}||	v }|st        j                  d|fd8||	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}}|	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}}d9}||	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}}|j                         r|j                          yy# |j                         r|j                          w w xY w)<uG   기본 실행: 필수 필드가 모두 존재하는 JSON 생성 확인.memoryhandoffs.json--task--reasonr   	--pendingu   테스트 잔여 작업--botdev4r   ==z2%(py2)s
{%(py2)s = %(py0)s.returncode
} == %(py5)sresultpy0py2py5!   create_handoff.py 실패
stdout: 	
stderr: 
>assert %(py7)spy7N   handoff JSON 미생성: C
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}handoff_pathr9   r:   py4utf-8encodingin)z%(py0)s in %(py2)sfielddatar9   r:   u   필수 필드 누락: 
>assert %(py4)srD   r   z%(py1)s == %(py3)spy1py3assert %(py5)sr;   r   )z%(py1)s == %(py4)s)rP   rD   zassert %(py6)spy6r   r   z1.0r   z5assert %(py5)s
{%(py5)s = %(py0)s(%(py2)s, %(py3)s)
}
isinstancelist)r9   r:   rQ   r;   r   r   pending_workz%(py1)s in %(py3)spending_work_pathnot inz%(py1)s not in %(py3)s)TEST_TASK_BASICr"   existsunlinkr)   
returncode
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgstdoutstderrAssertionError_format_explanationjsonloads	read_textREQUIRED_FIELDSrT   rU   r   )r   rB   r7   @py_assert1@py_assert4@py_assert3@py_format6@py_format8@py_format5rK   rJ   @py_format3@py_assert0@py_assert2@py_format4@py_format7s                   r(   test_create_basicrz   A   s   Gh&3	6GGL 'K.	 F"   	
A 	
 A% 	
 	
 A 	
 	
	6	
 	
   	
 	
 		  	
 	
 		 ! 	
 	
 		 %& 	
 	
  1z&--Y	
 	
 	
 	
 	
 ""O"$O$OO(@&OOOOOOO|OOO|OOO"OOO$OOOOOOzz,00'0BC % 	CED=BBB5DBBBBBB5BBB5BBBBBBDBBBDBBBB$:5'"BBBBBBB	C I)'))))')))))))))')))')))))))$%44%4444%444%4444444444N#-v-#v----#v---#---v-------$%..%....%...%........../6z/66666666z666z666/6666666666666666666~.5z.55555555z555z555.5555555555555555555 %~%%%%~%%%~%%%%%%%%%%%%%%%%N#@'@@#'@@@@@#'@@@@#@@@'@@@@@@@@"."$...."$..."......$...$.......  ! !< ! !s   b3d" "#ec            
        t         } t        dz  dz  |  dz  }t        dz  dz  |  dz  }||fD ]#  }|j                         s|j                          % ddz  }t	        d| dd	d
|ddg      }	 |j
                  }d}||k(  }|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                  } |       }|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}}t#        j$                  |j'                  d            }d}||v }|st        j                  d|fd||f      t        j                  |      d t        j                         v st        j                  |      rt        j                  |      nd d!z  }t        j                  d"t)        |j+                                      d#z   d$|iz  }	t        t        j                   |	            d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  }t        j                  d(      d#z   d$|iz  }	t        t        j                   |	            dx}}t-        |d         }|j/                         s	t        |z  }|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      }||k(  }|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/t1        |       d0t1        |       d1      d2z   d3|iz  }t        t        j                   |            d}||fD ]#  }|j                         s|j                          % 	 |j                         r%t#        j$                  |j'                  d            ni }d|v rIt-        |d         }|j/                         s	t        |z  }|j                         r|j                          yyy# t2        $ r Y yw xY w# ||fD ]#  }|j                         s|j                          % 	 |j                         r%t#        j$                  |j'                  d            ni }d|v rIt-        |d         }|j/                         s	t        |z  }|j                         r|j                          w w w # t2        $ r Y w w xY wxY w)4uN   5000자 pending 텍스트 → pending_work_path + 외부 파일 생성 확인.r,   r-   r.   z-pending.txtxi  r/   r0   r   r1   r2   r3   r   r4   r6   r7   r8   r<   r=   r>   r?   Nr@   rA   rB   rC   rE   rF   rX   rH   rW   rK   rO   uW   pending_work_path 필드 없음 (4000자 초과인데 인라인 저장됨?)
data keys: z
>assert %(py5)sr;   rV   rY   r[   uO   pending_work 필드가 남아있음 (4000자 초과인데 인라인 저장됨?)u   외부 파일 미생성: external_path)z%(py0)s == %(py2)scontentlong_pendingrL   u(   외부 파일 내용 불일치 (길이: u    vs 기대: )rM   rD   )TEST_TASK_LARGEr"   r]   r^   r)   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rU   keysr   is_absolutelen	Exception)r   rB   txt_pathpr   r7   ro   rp   rq   rr   rs   rt   rK   rv   rw   rx   r}   r~   ru   exts                       r(   test_create_4000_splitr   u   s4   Gh&3	6GGL("Z/WI\2JJH H% 88:HHJ :L'K\	 F,   	
A 	
 A% 	
 	
 A 	
 	
	6	
 	
   	
 	
 		  	
 	
 		 ! 	
 	
 		 %& 	
 	
  1z&--Y	
 	
 	
 	
 	
 ""O"$O$OO(@&OOOOOOO|OOO|OOO"OOO$OOOOOOzz,00'0BC # 	
"d* 	
 	
"d 	
 	
 		 # 	
 	
	6	
 	
  '+ 	
 	
 		 '+ 	
 	
  ggklplululwgxfyz	
 	
 	
 	
 	
  	
~T) 	
 	
~T 	
 	
 		  	
 	
	6	
 	
  &* 	
 	
 		 &* 	
 	
  ^	
 	
 	
 	
 	

 T"567((*$}4M##R#%R%RR)B=/'RRRRRRR}RRR}RRR#RRR%RRRRRR  ))7);,& 	
 	
w, 	
 	
	6	
 	
   	
 	
 		  	
 	
	6	
 	
  ' 	
 	
 		 ' 	
 	
  7s7|nLQTUaQbPccde	
 	
 	
 	
 	
 ) 	Axxz
			KWK^K^K`4::l44g4FGfhD"d*4 345("S.C::<JJL  	 +  		 ) 	Axxz
			KWK^K^K`4::l44g4FGfhD"d*4 345("S.C::<JJL  	 +  		sK   .U"Z ;BZ   	ZZ](];B] =] 	]	]]]c            
        d} t        d| ddddddg      }|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*|j                         d+z   d,|iz  }t        t        j                  |            dx}	x}x}x}x}
x}x}x}x}x}x}}y)-u4   잘못된 reason 값으로 실행 시 exit 1 확인.z	task-9006r/   r0   invalid_reason_xyzr1   u	   테스트r2   r3   r   )!=)z2%(py2)s
{%(py2)s = %(py0)s.returncode
} != %(py5)sr7   r8   u2   잘못된 reason에서 exit 0 (비정상)
stdout: r=   r>   r?   Nzinvalid choiceerrorinvalid_reasonu   검증 실패rH   )z%(py3)s in %(py5)scombined)rQ   r;   z%(py7)s)zJ%(py10)s in %(py16)s
{%(py16)s = %(py14)s
{%(py14)s = %(py12)s.lower
}()
})py10py12py14py16z%(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	
stdout: z
>assert %(py35)spy35)r)   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   lowerappend_format_boolop)r   r7   ro   rp   rq   rr   rs   r   rw   rv   @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_create_invalid_reasonr      s   G'([	 F   !                    !"    >fmm_JW]WdWdVef     }}v}},H ( G x~~ ~7G G7G,G (,;,;x,G            !)    !)     G7G    -4      8@    8@    8F    8H             !)   !)    ,;x   -<     @H   @H       ,FMM?*V]]OT       r*   c            	        g d} | D ];  }t         |   }t        dz  dz  | dz  }|j                         r|j                          t	        d|d|ddg      }	 |j
                  }d	}||k(  }|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| d|j                   d|j                         dz   d|iz  }	t        t        j                   |	            dx}x}}t#        j$                  |j'                  d            }
|
d   }||k(  }|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}}|j                         s,|j                          > y# |j                         r|j                          w w xY w)u   유효한 reason 값들 확인.r   r,   r-   r.   r/   r0   r2   r3   r   r4   r6   r7   r8   u   유효한 reason 'u   ' 실패
stdout: r=   r>   r?   NrE   rF   r   rN   reasonrO   rR   r;   )TEST_TASK_REASONSr"   r]   r^   r)   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   )valid_reasonsr   r   rB   r7   ro   rp   rq   rr   rs   rK   rv   rw   rx   s                 r(   test_create_valid_reasonsr      s   AM &#F+(*Z7WIU:KK !gV
 	&$$  $)  $  v     I   I %  I )*    %VH,>v}}oZX^XeXeWfg     ::l44g4FGD()3)V3333)V333)333333V333V3333333""$##%)&& ""$##% %s   G	I#I*)N)r&   z	list[str]r'   zPath | Nonereturnzsubprocess.CompletedProcess)__doc__
__future__r   builtinsrb   _pytest.assertion.rewrite	assertionrewriter`   rk   r   r#   pathlibr   r%   r"   rn   r\   r   r   r)   rz   r   r   r    r*   r(   <module>r      su    #    	  	W	X?@" # ,-"h@N,&r*   