
    i                        d Z ddlmZ ddlZddlZddlmZ  ee      j                         j                  d   ZddZ ed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d Zd Zy)u  tests/regression/test_dispatch_hardening_2487.py — task-2487 회귀 테스트 (Group A).

dispatch 영역에서 V2 task ID 패턴이 정상 인식되는지 검증한다.
dispatch.__init__ 는 대형 모듈(73k 토큰)이므로 직접 import 하지 않고:
  1. utils.task_id_parser.is_valid_task_id V2 인식 검증
  2. dispatch/__init__.py 소스에 is_valid_task_id 호출이 존재하는지 메타 테스트

헤임달(개발2팀 테스터) 작성 / task-2487.
    )annotationsN)Path   c                <   t         |z  }t        j                  j                  | t	        |            }||j
                  t        d|       t        j                  j                  |      }|t        j                  | <   |j
                  j                  |       |S )Nzcannot load spec for )	WORKSPACE	importlibutilspec_from_file_locationstrloaderImportErrormodule_from_specsysmodulesexec_module)mod_namefile_rel	file_pathspecmodules        ^/home/jay/workspace/.worktrees/task-2487-dev2/tests/regression/test_dispatch_hardening_2487.py_load_moduler      s    H$I>>11(C	NKD|t{{*1)=>>^^,,T2F"CKKKKF#M    tip_2487_dispatchzutils/task_id_parser.pyc                 6    t         j                  d      du sJ y)u?   단순 base ID task-1234가 V2 패턴으로 valid 인식된다.	task-1234TNtipis_valid_task_id r   r   test_dispatch_valid_baser!   &   s    ,444r   c                 6    t         j                  d      du sJ y)u?   retry suffix task-1234+1이 V2 패턴으로 valid 인식된다.task-1234+1TNr   r    r   r   test_dispatch_valid_retryr$   +   s    .$666r   c                 6    t         j                  d      du sJ y)uA   phase suffix task-1234_1.2가 V2 패턴으로 valid 인식된다.task-1234_1.2TNr   r    r   r   test_dispatch_valid_phaser'   0   s    0D888r   c                 6    t         j                  d      du sJ y)uQ   phase+parallel+retry 전체 조합 task-1234_1.2_a+3이 V2로 valid 인식된다.task-1234_1.2_a+3TNr   r    r   r   "test_dispatch_valid_parallel_retryr*   5   s     34<<<r   c                 6    t         j                  d      du sJ y)u<   task- 접두사 없는 문자열은 invalid로 거부된다.1234FNr   r    r   r   test_dispatch_invalid_no_prefixr-   ?   s    '5000r   c                 6    t         j                  d      du sJ y)u9   잘못된 접두사 문자열은 invalid로 거부된다.z
not-a-taskFNr   r    r   r   "test_dispatch_invalid_wrong_prefixr/   D   s    -666r   c                 6    t         j                  d      du sJ y)u<   task-abc 처럼 숫자 아닌 ID는 invalid로 거부된다.ztask-abcFNr   r    r   r   test_dispatch_invalid_alpha_numr1   I   s    
+u444r   c                 6    t         j                  d      du sJ y)u)   빈 문자열은 invalid로 거부된다. FNr   r    r   r   test_dispatch_invalid_emptyr4   N   s    #u,,,r   c                 R    t         dz  dz  j                  d      } d| v sJ d       y)uN   dispatch/__init__.py 소스에 is_valid_task_id 호출이 존재해야 한다.dispatch__init__.pyutf-8encodingr   u[   dispatch/__init__.py에 is_valid_task_id 호출이 없음 — V2 검증 미적용 가능성Nr   	read_textsrcs    r   +test_dispatch_source_calls_is_valid_task_idr?   X   s7    z!M1
<
<g
<
NC$ e$r   c                 R    t         dz  dz  j                  d      } d| v sJ d       y)u=   dispatch/__init__.py가 utils.task_id_parser를 import한다.r6   r7   r8   r9   task_id_parseru=   dispatch/__init__.py에 utils.task_id_parser import가 없음Nr;   r=   s    r   +test_dispatch_source_imports_task_id_parserrB   `   s7    z!M1
<
<g
<
NCs" G"r   c                 l    t         j                  d      } | d   dk(  sJ | d   J | d   J | d   J y)uB   task-1234 파싱 시 base만 채워지고 나머지는 None이다.r   basephaseNparallelretryr   parse_task_id_v2outs    r   test_dispatch_parse_base_onlyrL   m   sT    


{
+Cv;+%%%w<z?"""w<r   c                 F    t         j                  d      } | dddddk(  sJ y)u:   task-1234+1 파싱 시 retry 필드가 +1로 채워진다.r#   r   Nz+1rD   rE   rF   rG   rH   rJ   s    r    test_dispatch_parse_retry_suffixrO   v   s*    


}
-C;4RVWWWWr   c                 F    t         j                  d      } | dddddk(  sJ y)u>   task-1234_1.2 파싱 시 phase 필드가 _1.2로 채워진다.r&   r   _1.2NrN   rH   rJ   s    r    test_dispatch_parse_phase_suffixrR   |   s*    



/C;TTXYYYYr   c                 F    t         j                  d      } | dddddk(  sJ y)u=   task-1234_1.2_a+3 파싱 시 4개 필드 모두 채워진다.r)   r   rQ   _az+3rN   NrH   rJ   s    r   test_dispatch_parse_full_comborU      s6    


2
3C	   r   )r   r   r   r   )__doc__
__future__r   importlib.utilr   r   pathlibr   __file__resolveparentsr   r   r   r!   r$   r'   r*   r-   r/   r1   r4   r?   rB   rL   rO   rR   rU   r    r   r   <module>r]      s    #  
 N""$,,Q/	 &(AB5
7
9
=1
7
5
- XZr   