
    i                        d Z ddlZddlZddlmZ ddlZ ee      j                         j                  j                  j                  Z	 e
e	      ej                  vr"ej                  j                  d e
e	             ddlmZmZmZmZmZ h dZh dZd Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Ze dk(  r ejB                  edg       yy)uG  task-2503 회귀 테스트 — Phase 1 amendment audit jsonl format 검증.

회장 amendment 2026-05-08T11:32 Phase 1 추가 요건:
  - audit jsonl schema (회장 §5 9 필드) 준수
  - dry_run=true 필드 옵션 동작
  - dispatch.py 미경유 (classifier 직접 호출)
  - production 차단 동작 X (단순 기록만)
    N)Path)ALLOWBLOCKTopologyDecision	audit_log_dry_run_from_task_file>	   task_iddecision	timestampreason_codesoverlap_scoreoverride_usedconflicting_tasksopen_prs_snapshotactive_tasks_snapshot>   r   r   LIMITED_PARALLELREQUIRE_CHAIR_OVERRIDEc                 4    |dz  }| j                  d|       |S )uE   AUDIT_LOG_PATH를 tmp 경로로 우회 (실제 파일 오염 방지).zmerge-topology-gate.jsonlz(utils.merge_topology_gate.AUDIT_LOG_PATH)setattr)monkeypatchtmp_pathtargets      R/home/jay/workspace/tests/regression/test_merge_topology_gate_audit_format_2503.py_redirect_auditr   +   s'    33F2F M    c                 >   t        | |      }t        t        g       }t        d|       |j	                         sJ |j                  d      j                         }t        j                  |      }t        t        |j                               z
  }|r
J d|        y )Nr
   r   ztask-test-9fieldsr	   r
   utf-8encodingz%audit jsonl missing required fields: )r   r   r   r   exists	read_textstripjsonloadsREQUIRED_AUDIT_FIELDSsetkeys)r   r   r   r
   linerecordmissings          r   .test_audit_jsonl_records_all_9_required_fieldsr-   6   s    [(3FR@H)H===??W-335DZZF#c&++-&88GI?yII;wr   c                 ,   t        | |      }dD ]  }t        d| t        |              |j                  d      j	                         j                         }t        |      dk(  sJ |D ]$  }t        j                  |      }|d   t        v r$J  y )	N)r   r   r   r   z
task-enum-r
   r   r   r       r
   )
r   r   r   r#   r$   
splitlineslenr%   r&   VALID_DECISIONS)r   r   r   dlinesr*   r+   s          r   $test_audit_decision_value_is_in_enumr6   D   s    [(3FM SJqc*5Eq5QRS g.446AACEu:?? 5D!j!_4445r   c                     t        | |      }t        dt        t                     t	        j
                  |j                  d      j                               }|d   }d|v s
J d|        d	|v sJ y )
Nztask-tzr/   r   r   r    r   z+09:00z timestamp must be KST (+09:00): Tr   r   r   r   r%   r&   r#   r$   )r   r   r   r+   tss        r   $test_audit_timestamp_is_kst_iso_8601r;   R   sr    [(3Fi*:E*JKZZ(('(:@@BCF		Br>B=bTBB>"99r   c                    t        | |      }|j                  j                  dd       |j                  dd       t	        dt        t                     |j                  d      j                         j                         }t        |      d	k(  sJ t        j                  |d
         d   dk(  sJ t        j                  |d         d   dk(  sJ y )NT)parentsexist_okz-{"task_id": "existing", "decision": "ALLOW"}
r   r    ztask-newr/   r      r   r	   existing   )r   parentmkdir
write_textr   r   r   r#   r$   r1   r2   r%   r&   )r   r   r   r5   s       r   test_audit_jsonl_is_append_onlyrE   ^   s    [(3F
MMt4
NY`aj+;U+KLg.446AACEu:??::eAh	*j888::eAh	*j888r   c                     t        | |      }t        dt        t              d       t	        j
                  |j                  d      j                               }|j                  d      du sJ y )Nztask-dryrunr/   T)r	   r
   dry_runr   r    rG   )	r   r   r   r   r%   r&   r#   r$   getr   r   r   r+   s       r   *test_audit_dry_run_field_recorded_when_setrJ   m   sb    [(3F!51
 ZZ(('(:@@BCF::i D(((r   c                     t        | |      }t        dt        t                     t	        j
                  |j                  d      j                               }d|vsJ y )Nz	task-prodr/   r   r   r    rG   r9   rI   s       r   $test_audit_dry_run_absent_by_defaultrL   z   sQ    [(3Fk,<e,LMZZ(('(:@@BCFF"""r   c                     t        | |      }t        dt        d      d       t        j                  |j                  d      j                               }|d   du sJ y )	Nztask-overrider   r/   T)r	   r
   r   r   r    r   )r   r   r   r%   r&   r#   r$   rI   s       r   test_audit_override_used_fieldrN      s_    [(3F!+CD
 ZZ(('(:@@BCF/"d***r   c                     t         dz  dz  } | j                  d      }|j                         D cg c]A  }|j                         r/|j                         j	                  d      s|j                         C }}|D cg c]&  }|j	                  d      s|j	                  d      r|( }}|r
J d|        y	c c}w c c}w )
uT   Phase 1 핵심 보장: classifier/CLI는 dispatch 모듈을 import 하지 않는다.utilszmerge_topology_gate.pyr   r    #zimport dispatchzfrom dispatchu2   Phase 1 위반: classifier가 dispatch import — N)	WORKSPACEr#   r1   r$   
startswith)src_pathsrcln
code_linesbads        r   ,test_dry_run_helper_does_not_import_dispatchrY      s    7"%==H


g

.C !^^-88:bhhj33C8 	
J 
  ==*+r}}_/M 	C  NHNN7ss   AB7=+B<c                 8   t        | |      }|dz  }|j                  dd       t        ||dz  d      \  }}|d   du sJ t        j                  |j                  d      j                         j                         d	         }|j                  d      du sJ y )
Nztask-test-dryrun-2503.mdz# task-test-dryrun-2503

```yaml
expected_files:
  - utils/example.py
risk_area: "governance"
dependency: ["none"]
parallel_policy: "serial_only"
merge_queue_position: 1
stale_recheck_required: false
cherry_pick_allowed: false
```
r   r    zno-such-timers.jsonT)	task_file
timer_pathwrite_auditrG   )	r   rD   r   r%   r&   r#   r$   r1   rH   )r   r   r   spec	_decisionsummaryr+   s          r   1test_dry_run_from_task_file_records_dry_run_fieldrb      s    [(3F00DOO
	    133Iw
 9%%%ZZ(('(:@@BMMOPRSTF::i D(((r   c                 P   t        | |      }t        t              t        t        dg      t        ddg      g}t	        |      D ]  \  }}t        d| |        |j                  d	      j                         j                         D ]  }t        j                  |        y )
Nr/   DUPLICATE_FILEr   r   DUPLICATE_LIFECYCLEz
task-json-r   r   r    )r   r   r   r   	enumerater   r#   r$   r1   r%   r&   )r   r   r   	decisionsidecr*   s          r   %test_audit_jsonl_lines_are_valid_jsonrj      s    [(3F%(%7G6HI"4DYCZ[I
 I& :3Jqc*S9:   ' 288:EEG 

4r   __main__z-v)"__doc__r%   syspathlibr   pytest__file__resolverB   rR   strpathinsertutils.merge_topology_gater   r   r   r   r   r'   r3   r   r-   r6   r;   rE   rJ   rL   rN   rY   rb   rj   __name__main r   r   <module>ry      s     
  N""$++2299	y>!HHOOAs9~& 
  S	J	5
9)#+O$)< zFKK4 ! r   