
    ;j$                        d Z ddlZddlZddlZddlZddlZddlZddlmZmZ ddl	m
Z
 ddlZ e
e      j                         j                  d   Zedz  dz  Zdefd	Zdefd
ZdedededdfdZdedefdZdedededededz  dedz  defdZdee   dededefdZg dZ ej8                         d        Zd Zd Zd Z d Z!d Z"d  Z#d! Z$y)"u  
test_stash_lifecycle_legacy.py
task: task-2571 TODO-7 T-4

검증 목표:
- spec §9 legacy stash 호환성 검증
- legacy 포맷 (표준 메타데이터 없는 stash) 은 source=unknown 으로 분류
- unknown 분기 적용 시 모두 preserve

작성자: 하누만 (개발4팀 QA)
    N)datetimetimezone)Path   scriptszstash_audit.pyreturnc                     t        j                  d      } t               }t        j                  g d| d|       t        j                  g d| d|       t        j                  g d| d|       t        |       dz  j                  d	       t        j                  g d
| d|       t        j                  g d| d|       | S )u$   격리된 임시 git repo 초기화.zstash-lifecycle-test-)prefix)gitinit-qz-bmainTcwdcheckenv)r   configz
user.emailtest@example.com)r   r   z	user.nametesta.txthello)r   addr   )r   commitr   -mr   )tempfilemkdtemp_git_env
subprocessrunr   
write_text)dr   s     /tests/regression/test_stash_lifecycle_legacy.py_init_temp_repor#   !   s     78A
*CNN6ATsSNNFAUY_bcNN9qRUV	!Ww""7+NN*3GNN8atQTUH    c                  j    t         j                  j                         } d| d<   d| d<   d| d<   d| d<   | S )u"   git 명령 실행용 환경변수.r   GIT_AUTHOR_NAMEr   GIT_AUTHOR_EMAILGIT_COMMITTER_NAMEGIT_COMMITTER_EMAIL)osenvironcopy)r   s    r"   r   r   .   sC    
**//
C#C0C &C!3CJr$   repo_dirmessagefilenamec                     t               }t        |       |z  }|j                  d| d       t        j                  dd|g| d|       t        j                  dddd	|g| d|       y
)u3   파일 하나 dirty 상태로 만들고 stash push.zdirty: 
r   r   Tr   stashpushr   N)r   r   r    r   r   )r-   r.   r/   r   fpaths        r"   _stash_pushr5   8   sf    
*CNX%E	wwir*+NNE5(+3ONNE7FD':PTZ]^r$   c                    t        j                  t        j                  t	        t
              dd| gdd      }|j                  dk(  s!J d|j                   d|j                          t        j                  |j                        S )u7   stash_audit.py --json 실행 후 파싱된 dict 반환.z--jsonz--workspaceT)capture_outputtextr   u#   stash_audit.py 실행 실패 (exit=z
)
stderr: )r   r   sys
executablestrSTASH_AUDIT_PY
returncodestderrjsonloadsstdout)r-   results     r"   _run_audit_jsonrC   A   s    ^^	^,hxPF
 ! 
-f.?.?-@ A==/	#! ::fmm$$r$   sourceapprovepr_verifiedidx_in_drop_listetidtask_idc                 `    | dk(  r|rdS dS | dk(  r|r|r||k(  ry|syy| dk(  r|r|ryy| d	v ryy
)u0   spec §2 결정 흐름 reference implementation.zpre-taskpoppedzdry-run-popzfinish-task	preservedzother-filesdroppedzdry-run-drop)wip
quarantineunknownskipped rD   rE   rF   rG   rH   rI   s         r"   decide_actionrT   S   s[     "x55{ '11r$   entriesc           	      :   g }d}| D ]N  }|d   }|j                  d      }|d   }t        ||dd||      }	|dk(  r|dz  }|j                  ||||	d	       P t        j                  t
        j                        j                         ||rd
ndt        |       ||dS )u-   spec §2/§3 기반 dispatch 시뮬레이션.r   rD   rI   indexFrS   rP      )rW   rD   rI   actionapprovedzdry-run)timestamp_utcrI   approval_modestash_count_before	decisionsskipped_unknown_count)	getrT   appendr   nowr   utc	isoformatlen)
rU   rE   rI   r^   r_   erD   rH   idxrY   s
             r"   simulate_dispatchrh   q   s    I 8uuYj"
 Y!Q&!	
 	#2 "hll3==?'.I!'l!6 r$   )zsome old stash from 2025zMy work before vacationztemp changes backup 20240301c               #      K   t               } t        t              D ]  \  }}t        | |d| d        |  t	        j
                  | d       yw)u/   legacy 포맷 stash 3건 시드된 임시 repo.legacy_z.txtT)ignore_errorsN)r#   	enumerateLEGACY_STASH_MESSAGESr5   shutilrmtree)r-   imsgs      r"   legacy_reporr      sS       H12 63HcWQCt#456 N
MM($/s   AAc                     t        |       }|j                  dg       }t        |      dk(  sJ dt        |       d       y)u3   legacy stash 3건이 모두 감지되어야 한다.rU      u   3건 시드 후 u   건 감지됨N)rC   r`   re   )rr   datarU   s      r"    test_legacy_all_stashes_detectedrv      sE    ;'Dhhy"%Gw<1 
3w<.6r$   c           	          t        |       }|j                  dg       }|D ]*  }|d   dk(  rJ d|d    d|j                  dd               y)	u   
    legacy 포맷 stash 3건 모두 source=unknown 으로 분류되어야 한다.
    spec §2.2: 패턴 매칭 실패 → source=unknown → quarantine.
    rU   rD   rP   u%   legacy stash 가 unknown 이 아닌 'u   ' 로 분류됨
raw_message: raw_message NrC   r`   rr   ru   rU   entrys       r"   %test_legacy_all_classified_as_unknownr}      sn    
 ;'Dhhy"%G 
X)+ 	
3E(O3D E!IImR89;	
+
r$   c                     t        |       }|j                  dg       }t        |dd      }|d   D ]  }|d   dk(  rJ d|d            t        |d	d      }|d   D ]  }|d   dk(  rJ d
|d            y)uQ   dispatch 정책 적용 시 legacy stash 전부 action=preserved 이어야 한다.rU   F	task-2571rE   rI   r^   rY   rL   u3   legacy (dry-run) action 기대: preserved, 실제: Tu4   legacy (approved) action 기대: preserved, 실제: NrC   r`   rh   )rr   ru   rU   log_dryr!   log_approveds         r"   "test_legacy_dispatch_all_preservedr      s    ;'Dhhy"%G  LG[! 
{k) 	
A!H+O	
)
 %WdKPL+& 
{k) 	
B1X;-P	
)
r$   c                     t        |       }|j                  dg       }t        |dd      }|d   dk(  sJ d|d           y)	u,   skipped_unknown_count 가 3이어야 한다.rU   Fr   r   r_   rt   u)   skipped_unknown_count 기대: 3, 실제: Nr   )rr   ru   rU   logs       r"   &test_legacy_skipped_unknown_count_is_3r      sV    ;'Dhhy"%G
GUK
HC&'1, 
3C8O4P3QR,r$   c           	          t        |       }|j                  dg       }|D ]?  }|j                  d      J d|j                  d       d|j                  dd               y)u?   legacy stash 메시지에서 task_id 가 None 이어야 한다.rU   rI   Nu8   legacy stash 에서 예상치 못한 task_id 추출됨: z
raw_message: rx   ry   rz   r{   s       r"    test_legacy_no_task_id_extractedr      su    ;'Dhhy"%G 
yy#+ 	
FuyyQZG[F\ ]!IImR89;	
+
r$   c                     t        |       }|j                  dg       }|D ]  }d|v s
J d|        |d   rJ d        y)u:   legacy entries 에 raw_message 필드가 있어야 한다.rU   rx   u   entry 에 raw_message 없음: u    raw_message 가 빈 문자열임Nrz   r{   s       r"   $test_legacy_entries_have_raw_messager      sb    ;'Dhhy"%G H% 	
,UG4	
% ]#G%GG#	Hr$   c                     t        |       }|j                  di       }|j                  di       }d|v s
J d|        |d   dk(  sJ d|d           y)uC   summary.count_by_source 에 unknown 카운트가 3이어야 한다.summarycount_by_sourcerP   u(   count_by_source 에 unknown 키 없음: rt   u!   unknown count 기대: 3, 실제: Nrz   )rr   ru   r   r   s       r"   0test_legacy_audit_json_summary_has_unknown_countr     sy    ;'Dhhy"%Gkk"3R8O' 
2?2CD' 9%* 
+OI,F+GH*r$   )%__doc__r?   r*   rn   r   r9   r   r   r   pathlibr   pytest__file__resolveparentsWORKTREE_ROOTr<   r;   r#   dictr   r5   rC   boolrT   listrh   rm   fixturerr   rv   r}   r   r   r   r   r   rR   r$   r"   <module>r      sc  
  	   
  '  X&&(003*-==
 
$ _# _ _s _t _%c %d %$  	
 * 4Z 	<$tDz $D $3 $4 $X  	0 	0 

(	
	Hr$   