
    kis,                     z   d Z ddlZddlmZ ddlZ ee      j                         j                  j                  j                  Zedz  dz  Z	ddl
Z ee      Zeej                  v rej                  j                  e       ej                  j!                  de       dej"                  v r3 eej"                  d   dd      j'                  e      sej"                  d=  ej(                  d	      d
efd       Z ej(                  d	      d        Z G d d      Z G d d      Z G d d      Z G d d      Zy)u  회귀 테스트: dispatch cron cmd에 --session unique SID 포함 검증 (task-2453).

헤임달(QA/테스터, dev2팀) 작성.

Case 1: _generate_session_id 단위 테스트
Case 2: 소스 정적 검증 — dispatch/__init__.py에 --session + _generate_session_id 포함 여부
Case 3: 소스 정적 검증 — 연속 2곳 이상 호출로 SID 유니크 보장 구조 확인
Case 4: 소스 정적 검증 — --once 인자 보존 여부
    N)Pathdispatchz__init__.py__file__ module)scopereturnc                  .    t         j                  d      S )uE   dispatch/__init__.py 전체 소스를 한 번만 읽어 공유한다.zutf-8)encoding)_DISPATCH_SRC	read_text     V/home/jay/workspace/.worktrees/task-2453-dev2/tests/dispatch/test_session_isolation.pydispatch_sourcer   #   s     ""G"44r   c                     ddl } ddl}t        t              }|j                  d   |k7  rE||j                  v r|j                  j                  |       |j                  j                  d|       |j                  j                  d      }|1t        |dd      xs d}t        t              |vr|j                  d= d}|| j                  d       |j                  d   }t        |d      sJ d|j                   d       |j                  S )	u[   실제 _generate_session_id 함수를 worktree dispatch에서 임포트하여 반환한다.r   Nr   r   r   _generate_session_idu   dispatch 모듈(u    )에 _generate_session_id 없음)	importlibsysstr	_WORKTREEpathremoveinsertmodulesgetgetattrr   import_modulehasattrr   r   )r   r   wtexistingexisting_filedispatch_mods         r   generate_session_idr$   *   s      
YB
xx{b>HHOOB2 {{z*H*b9?R}]2J'H
+;;z*L<!78 
<0011QR8 ,,,r   c                   "    e Zd ZdZd Zd Zd Zy)TestGenerateSessionIdu7   _generate_session_id 함수 자체의 단위 테스트.c                 \    d} ||      }|j                  | d      sJ d| d| d       y)u9   task_id가 반환값의 prefix로 포함되어야 한다.	task-2453-SID 'u   '이 task_id='u   ' prefix로 시작하지 않음N)
startswith)selfr$   task_idresults       r   test_prefix_contains_task_idz2TestGenerateSessionId.test_prefix_contains_task_idR   sE    $W-  G9A/ 	
F8>'2QR	
/r   c                 N    d} ||      } ||      }||k7  sJ d| d| d       y)uS   연속 2회 호출 결과가 서로 달라야 한다 (entropy: epoch + urandom(2)).r(   u)   연속 2회 호출 결과가 동일함: 'z' == 'u   ' — uniqueness 보장 실패Nr   )r,   r$   r-   sid1sid2s        r   $test_uniqueness_on_consecutive_callsz:TestGenerateSessionId.test_uniqueness_on_consecutive_callsZ   sA    "7+"7+t| 	
7vVD6Igh	
|r   c                 d    d} ||      }d}t        j                  ||      sJ d| d| d       y)uD   형식이 '{task_id}-{digits}-{4hex}' 패턴과 일치해야 한다.r(   z^task-\d+-\d+-[0-9a-f]{4}$r*   u   '이 패턴 'u   '과 일치하지 않음N)rematch)r,   r$   r-   r.   patterns        r   test_format_matches_regexz/TestGenerateSessionId.test_format_matches_regexd   sD    $W-/xx( 	
F8=	1IJ	
(r   N)__name__
__module____qualname____doc__r/   r3   r8   r   r   r   r&   r&   O   s    A


r   r&   c                   "    e Zd ZdZd Zd Zd Zy)TestSessionInCronCmduS   dispatch/__init__.py 소스에서 --session 및 _generate_session_id 호출 검증.c                 t    t        j                  d|      }t        |      dk\  sJ dt        |       d       y)u   cron cmd 구성 영역에 '--session' 문자열이 2건 이상 있어야 한다.

        normal dispatch + composite dispatch 각각 1건씩 = 최소 2건.
        z"--session"   u   '"--session"' 출현 횟수=u>    — 최소 2건 필요 (normal dispatch + composite dispatch)Nr5   findalllenr,   r   occurrencess      r   (test_session_flag_present_at_least_twicez=TestSessionInCronCmd.test_session_flag_present_at_least_twicev   sE    
 jjA;1$ 	
,S-=,> ?5 6	
$r   c                 t    t        j                  d|      }t        |      dk\  sJ dt        |       d       y)u[   _generate_session_id() 호출이 정의 1 + 실제 호출 2 = 3건 이상 있어야 한다.z_generate_session_id\(   u&   '_generate_session_id(' 출현 횟수=u3    — 정의 1 + 호출 2 이상(최소 3건) 필요NrA   rD   s      r   .test_generate_session_id_called_in_cron_blockszCTestSessionInCronCmd.test_generate_session_id_called_in_cron_blocks   sE    jj!:OL;1$ 	
4S5E4F G= >	
$r   c                 x    d}t        j                  ||      }t        |      dk\  sJ dt        |       d       y)uW   --session 바로 다음에 _cokacdir_session_id 변수가 오는 패턴이 2건 이상.z("--session",\s*\n\s*_cokacdir_session_idr@   uG   '--session' 뒤에 _cokacdir_session_id가 오는 패턴 발견 횟수=u    — 최소 2건 필요NrA   r,   r   r7   matchess       r   'test_session_value_follows_session_flagz<TestSessionInCronCmd.test_session_value_follows_session_flag   sL     >**Wo67|q  	
UVYZaVbUc d! "	
 r   N)r9   r:   r;   r<   rF   rI   rM   r   r   r   r>   r>   s   s    ]	


r   r>   c                   "    e Zd ZdZd Zd Zd Zy)%TestSessionUniquenessAcrossDispatchesu8   SID 유니크성이 구조적으로 보장됨을 검증.c                 z    t        j                  d|      }|J d       |j                  d      }d|v sJ d       y)uX   _generate_session_id 구현에 os.urandom이 포함되어 SID 고유성을 보장한다.z9def _generate_session_id\(.*?\n((?:.*\n)*?.*?return.*?\n)Nu7   _generate_session_id 함수 정의를 찾을 수 없음r   z
os.urandomuL   _generate_session_id 구현에 os.urandom이 없음 — uniqueness 미보장)r5   searchgroup)r,   r   fn_matchfn_bodys       r   'test_session_id_generation_uses_urandomzMTestSessionUniquenessAcrossDispatches.test_session_id_generation_uses_urandom   sR     99H
 #^%^^#..#w& 	
Z	
&r   c                 z    d}t        d      D cg c]
  } ||       }}|d   |d   k7  sJ d| d       yc c}w )uJ   런타임: 같은 task_id로 연속 생성된 두 SID는 달라야 한다.r(   r@   r      u    연속 dispatch 시 SID 동일: u'    — stale session 회피 실패 가능N)range)r,   r$   r-   _sidss        r   'test_two_consecutive_sids_are_differentzMTestSessionUniquenessAcrossDispatches.test_two_consecutive_sids_are_different   sT    6;Ah?#G,??Aw$q'! 	
.tf4[\	
! @s   8c                 x    d}t        j                  ||      }t        |      dk\  sJ dt        |       d       y)u   각 cron 블록이 독립적으로 _generate_session_id를 호출하는지 확인.

        두 블록 모두 _cokacdir_session_id = _generate_session_id(...) 패턴을 가져야 함.
        z1_cokacdir_session_id\s*=\s*_generate_session_id\(r@   uL   각 cron 블록이 독립적으로 SID를 생성하는 패턴 발견 횟수=u,    — 최소 2건 필요 (normal + composite)NrA   rK   s       r   &test_each_cron_block_generates_own_sidzLTestSessionUniquenessAcrossDispatches.test_each_cron_block_generates_own_sid   sM    
 G**Wo67|q  	
Z[^_f[gZh i6 7	
 r   N)r9   r:   r;   r<   rU   r[   r]   r   r   r   rO   rO      s    B



r   rO   c                       e Zd ZdZd Zd Zy)TestOnceArgPreserveduJ   --session 추가 후에도 기존 --once 인자가 보존되는지 검증.c                 t    t        j                  d|      }t        |      dk\  sJ dt        |       d       y)uB   cron cmd에 '--once' 플래그가 2건 이상 존재해야 한다.z"--once"r@   u   '"--once"' 출현 횟수=u5    — 최소 2건 필요 (기존 동작 보존 실패)NrA   rD   s      r   %test_once_flag_present_at_least_twicez:TestOnceArgPreserved.test_once_flag_present_at_least_twice   sC    jjo>;1$ 	
)#k*:); <, -	
$r   c                 x    d}t        j                  ||      }t        |      dk\  sJ dt        |       d       y)uI   --once가 --session보다 앞에 오는 패턴이 유지되어야 한다.z"--once",\s*\n\s*"--session"r@   u8   '--once' 다음 '--session' 순서 패턴 발견 횟수=u2    — 최소 2건 필요 (cmd 구성 순서 보존)NrA   rK   s       r   'test_once_appears_before_session_in_cmdz<TestOnceArgPreserved.test_once_appears_before_session_in_cmd   sH     2**Wo67|q  	
Fs7|n U< =	
 r   N)r9   r:   r;   r<   ra   rc   r   r   r   r_   r_      s    T

r   r_   )r<   r5   pathlibr   pytestr   resolveparentr   r   r   _sysr   _wt_strr   r   r   r   r   r+   fixturer   r$   r&   r>   rO   r_   r   r   r   <module>rk      s4   
   N""$++2299	J&6
 
i.
diiIIW 		  G gdll:.F
TV&W&b&bcj&kZ  h5 5  5 h-  -H
 
H
 
J"
 "
R
 
r   