
    mmj                         d Z ddlZddl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d Zd Zd	efd
Zd	efdZd Zy)u@  
test_cleanup_workspace_protection_2569.py
MT-T4: RC-2 + AD-5 검증
  - cleanup-workspace.py --report 실행 성공 (dry-run 기본)
  - is_protected() task md → True, tmp/old.txt → False
  - _audit_log() 호출 후 cleanup-audit.jsonl에 JSONL 형식 기록
  - protection-list.json valid JSON + 필수 키 존재
    N)Path   scriptszcleanup-workspace.pyc                      t         j                  j                  dt              } t         j                  j	                  |       }| j
                  j                  |       |S )uL   importlib으로 cleanup-workspace.py 동적 로드 (파일명에 하이픈).cleanup_workspace)	importlibutilspec_from_file_locationCLEANUP_WS_PYmodule_from_specloaderexec_module)specmods     :tests/regression/test_cleanup_workspace_protection_2569.py_load_cleanup_workspacer      sD    >>112E}UD
..
)
)$
/CKKC J    c            	          t        j                  dt        t              dgddt        t                    } | j
                  dk(  s4J d| j
                   d| j                  dd	  d
| j                  dd	         y)uO   cleanup-workspace.py --report 실행이 returncode 0으로 성공해야 한다.python3z--reportT)capture_outputtextcwdr   u1   cleanup-workspace.py --report 실패 (returncode=z).
stdout: Ni  z	
stderr: )
subprocessrunstrr   	WORKSPACE
returncodestdoutstderr)results    r   &test_cleanup_workspace_dry_run_defaultr!   !   s    ^^	C&
3	N	F ! 
;F<M<M;N O==#&' (==#&'	)!r   tmp_pathc                     t               }d|_        | dz  dz  dz  }| dz  dz  }|j                  ||       }|du sJ d| d	|  d
       |j                  ||       }|du sJ d| d	|  d       y)uQ   is_protected()가 task md → True, tmp/old.txt → False를 반환해야 한다.Nmemorytasksztask-9999.mdtmpzold.txtTzis_protected(z, u[   )가 False를 반환했습니다. memory/tasks/ 경로가 보호 대상이어야 합니다.FuX   )가 True를 반환했습니다. tmp/old.txt는 보호 대상이 아니어야 합니다.)r   _PROTECTION_CACHEis_protected)r"   cwtask_mdold_txtresult_task
result_tmps         r   .test_cleanup_workspace_protected_paths_skippedr.   2   s    	 	"BB !G+n<G*G
 //'84K$ 
y8* -D 	D (3J 
y8* -B 	Br   c                    t               }d}d}d}|j                  | |||       | dz  dz  dz  }|j                         s
J d|        |j                  d	      j	                         D cg c]#  }|j                         s|j                         % }}t        |      d
k\  sJ d       t        j                  |d         }h d}	|	|j                         z
  }
|
rJ d|
 d|        |d   |k(  sJ |d   |k(  sJ |d   |k(  sJ yc c}w )ug   _audit_log() 호출 후 cleanup-audit.jsonl에 필수 키가 포함된 JSONL이 기록되어야 한다.zfake/path/to/file.txtskipped_protectedu    test reason — 회귀 테스트r$   logszcleanup-audit.jsonlu<   cleanup-audit.jsonl 파일이 생성되지 않았습니다: utf-8encoding   u5   cleanup-audit.jsonl에 기록된 줄이 없습니다.>   tsactionreason	candidateu4   cleanup-audit.jsonl 레코드에 필수 키 누락: u   . 실제 레코드: r:   r8   r9   N)
r   
_audit_logexists	read_text
splitlinesstriplenjsonloadskeys)r"   r)   fake_candidatefake_actionfake_reasonlog_pathlinelinesrecordrequired_keysmissings              r   "test_audit_log_writes_jsonl_formatrM   N   sA   	 	"B,N%K4KMM(NKE("V+.CCH??g \]e\fgg&.&8&8'&8&J&U&U&Whd[_[e[e[gTZZ\hEhu:?SSS? ZZb	"F;Mfkkm+G 
>wi H#H	&; +.000({***({*** is   ,DDc                  X   t         dz  dz  dz  } | j                         s
J d|         	 t        j                  | j	                  d            }h d	}|j                         z
  }|r$J d
| dt        |j                                       t        |d   t              sJ d       t        |d   t              sJ d       t        |d   t              sJ d       t        |d         dkD  sJ d       y# t        j
                  $ r"}t        j                  d|        Y d}~d}~ww xY w)ul   memory/specs/protection-list.json이 valid JSON으로 파싱되고 필수 키가 모두 존재해야 한다.r$   specszprotection-list.jsonu   protection-list.json 없음: r2   r3   u)   protection-list.json JSON 파싱 실패: N>   protected_filesprotected_pathspreserved_lifecycle_pathsu+   protection-list.json에 필수 키 누락: u   . 실제 키: rQ   u(   protected_paths가 list가 아닙니다.rP   u(   protected_files가 list가 아닙니다.rR   u2   preserved_lifecycle_paths가 list가 아닙니다.r   u'   protected_paths가 비어 있습니다.)r   r<   rA   rB   r=   JSONDecodeErrorpytestfailrC   list
isinstancer@   )
plist_pathdataerK   rL   s        r   "test_protection_list_json_loads_okr[   o   sM   X%/2HHJL"?
| LLEzz*...@A XMdiik)G 
5gY ?DIIK()	+; d,-t4`6``4d,-t4`6``4d67> <> t%&'!+V-VV+!  E?sCDDEs   %C4 4D)D$$D))__doc__importlib.utilr   rA   r   syspathlibr   rT   __file__resolveparentsr   r   r   r!   r.   rM   r[    r   r   <module>rd      st       
  N""$,,Q/	I%(>>
"T 8+ +BWr   