
    (<iB                        d Z ddlZddlZddlZddlmZmZmZ ddlmZ ddl	m
Z
 ej                  j                  dd       ddlmZmZmZmZ ded	efd
Zdeded	efdZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z y)u  
통합 테스트: 3-Layer Graduated Auto-Gate
task-1837_5.2 - 벨레스(테스터) 작성

대상 클래스:
  - BatchWatchdog (L1): .done 파일 스캔 → batch_id 전팀 완료 감지 → TTL 경고
  - PreFlightCheck (L2): git merge --no-commit 시뮬레이션 → 충돌 검증
  - IntegrationTestRunner (L3): pytest tests/integration/ 실행
  - GraduatedAutoGate: L1→L2→L3 오케스트레이터
    N)datetime	timedeltatimezone)Path)patchz/home/jay/workspace)BatchWatchdogGraduatedAutoGateIntegrationTestRunnerPreFlightChecktmp_pathreturnc                 <    | dz  dz  }|j                  dd       |S )u+   tmp_path/memory/events 디렉터리 생성.memoryeventsTparentsexist_ok)mkdir)r   ds     [/home/jay/workspace/.worktrees/task-2057-dev2/tests/integration/test_graduated_auto_gate.py_make_events_dirr   !   s&    8h&AGGD4G(H    tasksc                     | dz  }|j                  dd       |dz  }|j                  t        j                  d|i      d       |S )u(   tmp_path/memory/task-timers.json 생성.r   Tr   ztask-timers.jsonr   utf-8encoding)r   
write_textjsondumps)r   r   r   
timer_files       r   _make_timersr"   (   sN     F
LLL-,,J$**gu%56Ir   c                 P   t        |       }|dz  j                  t        j                  dddd      d       |dz  j                  t        j                  d	ddd      d       |d
z  j                  t        j                  ddd      d       |dz  j                  t        j                  dddd      d       |dz  j	                          t        t        |             }|j                         }t        |      dk(  sJ |D ch c]  }|d   	 }}|dd	hk(  sJ yc c}w )u7   batch_id가 있는 .done 파일만 수집해야 한다.task-1.donetask-1batch-Adonetask_idbatch_idstatusr   r   task-2.donetask-2task-3.donetask-3)r)   r+   ztask-4.doneztask-4ztask-4.done.clearworkspace_path   r)   N)	r   r   r   r    touchr   strscan_done_fileslen)r   r   watchdogresultrtask_idss         r   #test_batch_watchdog_scan_done_filesr;   6   s=   h'F m''

xY&QR (  m''

xY&QR (  m''

x6:; (  m''

xY&QR (  !!((*CM:H%%'F v;!&,-)-H-(++++ .s   D#c                     t        | dddddddddd       t        t        |             }|j                  d      }|d   du sJ |d   d	k(  sJ |d   d	k(  sJ |d
   g k(  sJ y)u4   batch_id의 모든 task가 done이면 complete=True.r&   r'   r*   r+   r%   r-   r/   r0   completeTtotal   pendingNr"   r   r4   check_batch_completionr   r7   r8   s      r   3test_batch_watchdog_check_batch_completion_all_donerF   Z   s    #,?#,?#,?	
 CM:H,,Y7F*%%%'?a&>Q)"""r   c                     t        | dddddddddd       t        t        |             }|j                  d      }|d   du sJ |d	   d
k(  sJ |d   dk(  sJ d|d   v sJ y)u7   일부 running이면 complete=False, pending에 포함.r&   r'   r=   runningr>   r0   r?   Fr@   rA   r2   r/   rB   NrC   rE   s      r   2test_batch_watchdog_check_batch_completion_partialrI   n   s    #,?#,?#,	B	
 CM:H,,Y7F*&&&'?a&>Qvi((((r   c                 H   t        j                  t        j                        t	        d      z
  j                         }t        | ddd|di       t        t        |             }|j                  dd	      }t        |      d
k(  sJ |d   d   dk(  sJ |d   d   dkD  sJ y)uD   start_time이 2시간 이상인 running task를 감지해야 한다.rA   )hoursztask-oldr&   rH   )r*   r+   
start_timer0   g       @)	ttl_hours   r   r)   elapsed_hoursN)r   nowr   utcr   	isoformatr"   r   r4   	check_ttlr6   )r   three_hours_agor7   stales       r   %test_batch_watchdog_check_ttl_expiredrV      s      ||HLL1IA4FFQQSO%#-	
	 CM:HyC8Eu:??8I*,,,8O$s***r   c           	         t        |       }|dz  j                  t        j                  dddd      d       |dz  j                  t        j                  d	ddd      d       |d
z  j                  t        j                  dddd      d       t	        | ddddddddddddd       t        t        |             }t        j                  |d      5  |j                         }ddd       dv sJ d|vsJ y# 1 sw Y   xY w)u.   전팀 완료 batch_id만 반환해야 한다.ztask-a1.donetask-a1r&   r'   r(   r   r   ztask-a2.donetask-a2ztask-b1.donetask-b1batch-Br=   rH   )rX   rY   rZ   ztask-b2r0   send_ttl_warningN)
r   r   r   r    r"   r   r4   r   objectrun)r   r   r7   	completeds       r   1test_batch_watchdog_run_returns_completed_batchesr`      s+   h'F n((

yi6RS )  n((

yi6RS )  n((

yi6RS ) 
 $-@$-@$-@$-C		
 CM:H	h 2	3 #LLN	# 	!!!I%%%# #s   DD
c           
         t        |       }|dz  j                  t        j                  dddddd      d	       |d
z  j                  t        j                  dddddd      d	       |dz  j                  t        j                  ddddd      d	       t	        t        |             }|j                  d      }t        |      dk(  sJ |D ch c]  }|d   	 }}|ddhk(  sJ yc c}w )uE   batch_id에 해당하는 task의 merge_branch를 수집해야 한다.r$   r%   r&   r'   ztask/task-1-dev1z/some/project)r)   r*   r+   merge_branchproject_pathr   r   r,   r-   ztask/task-2-dev2r.   r/   r[   ztask/task-3-dev3)r)   r*   r+   rb   r0   r2   branchN)r   r   r   r    r   r4   find_merge_branchesr6   )r   r   	preflightbranchesbbranch_namess         r   "test_preflight_find_merge_branchesrj      s'   h'Fm''

#%  2 /	
  (  m''

#%  2 /	
  (  m''

#%  2		
  ( 
 c(m<I,,Y7Hx=A)12AAhK2L2.0BCCCC 3s   C*c                    | dz  }|j                          t        j                  ddgt        |      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       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       t        j                  g dt        |      d       t        j                  g dt        |      d       t        t        |             }|j                  t        |      dg      }|d   du sJ |d   g k(  sJ y)u8   충돌 없는 경우 passed=True를 반환해야 한다.repogitinitTcwdcapture_outputcheckrm   configz
user.emailztest@test.comrm   rt   z	user.nameTestz
file_a.txtzline1
r   r   rm   add.rm   commit-mrn   )rm   checkout-b	feature-1z
file_b.txtzfeature1 content
)rm   r{   r|   r   )rm   r}   master)rp   rq   )rm   r}   mainr0   r   passed	conflictsN)r   
subprocessr^   r4   r   r   simulate_merge)r   rl   rf   r8   s       r   )test_preflight_simulate_merge_no_conflictr      s   fDJJL NNE6?D	$dSNN8I	 NN.I	 
L$$Y$ANN&CIdRVWNN'I	 NN.I	 
L$$%9G$LNN&CIdRVWNN,I	 NN%I
 NN#I c(m<I%%c$i+?F(t###+"$$$r   c                 "   | dz  }|j                          t        j                  ddgt        |      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       t        j                  g dt        |      dd      }|j
                  j                         }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       t        j                  dd|gt        |      dd       |dz  j	                  dd
       t        j                  g dt        |      dd       t        j                  g dt        |      dd       t        t        |             }|j                  t        |      dg      }|d   du sJ t        |d         dk\  sJ |d   D cg c]  }|d   	 }}d|v sJ yc c}w )uH   충돌 시 passed=False + conflict 파일 목록을 반환해야 한다.rl   rm   rn   Tro   rs   ru   zconflict.txtzbase content
r   r   rw   rz   )rm   z	rev-parsez--abbrev-refHEAD)rp   rq   text)rm   r}   r~   feature-conflictzfeature branch content
)rm   r{   r|   zfeature-conflict-changer}   zmain branch content
)rm   r{   r|   zmain-changer0   r   r   Fr   rN   rd   N)
r   r   r^   r4   r   stdoutstripr   r   r6   )r   rl   r9   default_branchrf   r8   cconflict_branchess           r   +test_preflight_simulate_merge_with_conflictr   9  sT   fDJJL NNE6?D	$dSNN8I	 NN.I	 
N&&'7'&JNN&CIdRVWNN'I	 	4I		A XX^^%N NN5I	 
N&&'AG&TNN&CIdRVWNN:I	 NN	
N+I	 
N&&'>&QNN&CIdRVWNN.I	 c(m<I%%c$i2D1EFF(u$$$vk"#q(((.4[.AB8BB!2222 Cs   7Jc                     | dz  dz  }|j                  dd       |dz  j                  dd       t        t        |       	      }|j	                  t        |      
      }|d   du sJ d|d   v s|d   dk\  sJ yy)u:   pytest가 성공하면 passed=True를 반환해야 한다.testsintegrationTr   ztest_simple_pass.pyz(def test_always_pass():
    assert True
r   r   r0   test_dirr   output
test_countrN   Nr   r   r
   r4   	run_testsr   r   runnerr8   s       r   !test_integration_test_runner_passr     s     '!M1HNN4$N/%%114 2 
 ##h-@Fs8}5F(t###vh''6,+?1+DDD+D'r   c                     | dz  dz  }|j                  dd       |dz  j                  dd       t        t        |       	      }|j	                  t        |      
      }|d   du sJ y)u;   pytest가 실패하면 passed=False를 반환해야 한다.r   r   Tr   ztest_simple_fail.pyz@def test_always_fail():
    assert False, 'intentional failure'
r   r   r0   r   r   FNr   r   s       r   !test_integration_test_runner_failr     sz    '!M1HNN4$N/%%11L 2 
 ##h-@Fs8}5F(u$$$r   c                 V   | dz  dz  }|j                  dd       |dz  j                  dd       t        t        |       	      }|j	                  t        |      
      }|j                  d|      }|j                         sJ |j                  d      }d|v sJ d|v sJ d|v sJ y)uH   테스트 결과 리포트가 memory/reports/에 생성되어야 한다.r   r   Tr   ztest_report_gen.pyz'def test_for_report():
    assert True
r   r   r0   r   z
batch-TESTz# Integration Test Reportr+   N)r   r   r
   r4   r   generate_reportexists	read_text)r   r   r   test_resultreport_pathcontents         r   ,test_integration_test_runner_generate_reportr     s    '!M1HNN4$N/$$003 1 
 ##h-@F""CM":K(({CK  ##W#5G7"""&'111wr   c                    t        |       }g d}t        |d      D ]:  \  }}|d| dz  j                  t        j                  d| dd|d      d	       < t        | ddd
ddd
ddd
d       | dz  dz  }|j                  dd       |dz  j                  dd	       t        t        |             }t        j                  |j                  d      5  t        j                  |j                  d      5  t        j                  |j                  d      5  t        j                  |j                  dg       5  t        j                  |j                  dddddd      5  |j                         }ddd       ddd       ddd       ddd       ddd       d   dk\  sJ |d   dk\  sJ y# 1 sw Y   >xY w# 1 sw Y   BxY w# 1 sw Y   FxY w# 1 sw Y   JxY w# 1 sw Y   NxY w)u~   3팀 완료 → L1 감지 → L2 충돌 없음 → L3 PASS 검증.
    이것이 task 지시서의 핵심 검증 시나리오.)dev1dev2dev3rN   ztask-z.donez
batch-piper'   )r)   r*   r+   team_idr   r   r=   r>   r   r   Tr   ztest_pipeline_pass.pyz(def test_pipeline_ok():
    assert True
r0   r\   send_conflict_alertsend_resultre   )return_valuer   z1 passedg?)r   r   durationr   Nbatches_checkedr   )r   	enumerater   r   r    r"   r   r	   r4   r   r]   r7   rf   test_runnerr^   )r   r   teamsiteamint_test_dirgater8   s           r   &test_graduated_auto_gate_full_pipeliner     s   
 h'F$EUA& 
4	E!E"	"..JJ!&qc{ ,$#	  	/ 
	

 #/6B#/6B#/6B	
 g%5Ltd3++774 8 
 CM:D 	T]]$67T^^%:; 	T%%}5
 	NN!	
 	$			
, -    0 #$)))(q   3         sl   !G#9!G#G=(F?	%F36F?	>GGG#3F<8F?	?GGGGG 	G##G,)!__doc__r   r   sysr   r   r   pathlibr   unittest.mockr   pathinsertscripts.auto_merger   r	   r
   r   r   dictr"   r;   rF   rI   rV   r`   rj   r   r   r   r   r   r    r   r   <module>r      s   	   
 2 2   ( ) t  4   !,H#()(+0%&Z.Db>%BN3lE"%8B!r   