
    i                        d Z ddlmZ ddlZddlmc 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                    t         j                  } d} | |      }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x} x}x}x}}y	)
u?   단순 base ID task-1234가 V2 패턴으로 valid 인식된다.	task-1234TiszV%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.is_valid_task_id
}(%(py4)s)
} is %(py9)stippy0py2py4py6py9assert %(py11)spy11N
r    is_valid_task_id
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation@py_assert1@py_assert3@py_assert5@py_assert8@py_assert7@py_format10@py_format12s          r   test_dispatch_valid_baser;   &   s    44,44,4444,44444434443444444444,44444444444r   c                    t         j                  } d} | |      }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x} x}x}x}}y	)
u?   retry suffix task-1234+1이 V2 패턴으로 valid 인식된다.task-1234+1Tr   r   r    r!   r'   r(   Nr)   r3   s          r   test_dispatch_valid_retryr>   +   s    66.6$6.$6666.$66666636663666666666.666$66666666r   c                    t         j                  } d} | |      }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x} x}x}x}}y	)
uA   phase suffix task-1234_1.2가 V2 패턴으로 valid 인식된다.task-1234_1.2Tr   r   r    r!   r'   r(   Nr)   r3   s          r   test_dispatch_valid_phaserA   0   s    8808D80D88880D888888388838888888880888D88888888r   c                    t         j                  } d} | |      }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x} x}x}x}}y	)
uQ   phase+parallel+retry 전체 조합 task-1234_1.2_a+3이 V2로 valid 인식된다.task-1234_1.2_a+3Tr   r   r    r!   r'   r(   Nr)   r3   s          r   "test_dispatch_valid_parallel_retryrD   5   s    < 3< 34<<4<<<<4<<<<<<3<<<3<<<<<< 3<<<4<<<<<<<<<<<r   c                    t         j                  } d} | |      }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x} x}x}x}}y	)
u<   task- 접두사 없는 문자열은 invalid로 거부된다.1234Fr   r   r    r!   r'   r(   Nr)   r3   s          r   test_dispatch_invalid_no_prefixrG   ?   s    00'050'50000'500000030003000000000'000500000000r   c                    t         j                  } d} | |      }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x} x}x}x}}y	)
u9   잘못된 접두사 문자열은 invalid로 거부된다.z
not-a-taskFr   r   r    r!   r'   r(   Nr)   r3   s          r   "test_dispatch_invalid_wrong_prefixrI   D   s    66-66-6666-66666636663666666666-66666666666r   c                    t         j                  } d} | |      }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x} x}x}x}}y	)
u<   task-abc 처럼 숫자 아닌 ID는 invalid로 거부된다.ztask-abcFr   r   r    r!   r'   r(   Nr)   r3   s          r   test_dispatch_invalid_alpha_numrK   I   s    4
4
+4u4+u4444+u44444434443444444
444+444u44444444r   c                    t         j                  } d} | |      }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x} x}x}x}}y	)
u)   빈 문자열은 invalid로 거부된다. Fr   r   r    r!   r'   r(   Nr)   r3   s          r   test_dispatch_invalid_emptyrN   N   s    ,,#,u,#u,,,,#u,,,,,,3,,,3,,,,,,,,,#,,,u,,,,,,,,r   c                    t         dz  dz  j                  d      } d}|| v }|st        j                  d|fd|| f      t        j                  |      dt        j                         v st        j                  |       rt        j                  |       ndd	z  }t        j                  d
      dz   d|iz  }t        t        j                  |            dx}}y)uN   dispatch/__init__.py 소스에 is_valid_task_id 호출이 존재해야 한다.dispatch__init__.pyutf-8encodingr*   inz%(py1)s in %(py3)ssrcpy1py3u[   dispatch/__init__.py에 is_valid_task_id 호출이 없음 — V2 검증 미적용 가능성
>assert %(py5)spy5Nr   	read_textr+   r,   r0   r-   r.   r/   _format_assertmsgr1   r2   rX   @py_assert0@py_assert2@py_format4@py_format6s        r   +test_dispatch_source_calls_is_valid_task_idrf   X   s    z!M1
<
<g
<
NC $            "%    "%    	f    r   c                    t         dz  dz  j                  d      } d}|| v }|st        j                  d|fd|| f      t        j                  |      dt        j                         v st        j                  |       rt        j                  |       ndd	z  }t        j                  d
      dz   d|iz  }t        t        j                  |            dx}}y)u=   dispatch/__init__.py가 utils.task_id_parser를 import한다.rP   rQ   rR   rS   task_id_parserrU   rW   rX   rY   u=   dispatch/__init__.py에 utils.task_id_parser import가 없음r\   r]   Nr^   ra   s        r   +test_dispatch_source_imports_task_id_parserri   `   s    z!M1
<
<g
<
NC s"  s           #     #    	H    r   c                 (   t         j                  d      } | d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}| d	   }d}||u }|slt        j                  d
|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}| d   }d}||u }|slt        j                  d
|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}| d   }d}||u }|slt        j                  d
|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)uB   task-1234 파싱 시 base만 채워지고 나머지는 None이다.r   base==)z%(py1)s == %(py4)s)rZ   r$   zassert %(py6)sr%   Nphaser   )z%(py1)s is %(py4)sparallelretry)r    parse_task_id_v2r+   r,   r0   r1   r2   )outrb   r5   rc   @py_format5@py_format7s         r   test_dispatch_parse_base_onlyru   m   sJ   


{
+Cv;%+%;+%%%%;+%%%;%%%+%%%%%%%w<4<4<4<4z?"d"?d""""?d"""?"""d"""""""w<4<4<4<4r   c                    t         j                  d      } ddddd}| |k(  }|st        j                  d|fd| |f      dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}}y)u:   task-1234+1 파싱 시 retry 필드가 +1로 채워진다.r=   r   Nz+1rk   rn   ro   rp   rl   z%(py0)s == %(py3)srr   r"   r[   assert %(py5)sr]   
r    rq   r+   r,   r-   r.   r/   r0   r1   r2   rr   rc   r4   rd   re   s        r    test_dispatch_parse_retry_suffixr}   v   sx    


}
-C&4RVWW3WWWWW3WWWWWWW3WWW3WWWWWWWWWWWr   c                    t         j                  d      } ddddd}| |k(  }|st        j                  d|fd| |f      dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}}y)u>   task-1234_1.2 파싱 시 phase 필드가 _1.2로 채워진다.r@   r   _1.2Nrw   rl   rx   rr   ry   rz   r]   r{   r|   s        r    test_dispatch_parse_phase_suffixr   |   sx    



/C&TTXYY3YYYYY3YYYYYYY3YYY3YYYYYYYYYYYr   c                    t         j                  d      } ddddd}| |k(  }|st        j                  d|fd| |f      d	t	        j
                         v st        j                  |       rt        j                  |       nd	t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}}y)u=   task-1234_1.2_a+3 파싱 시 4개 필드 모두 채워진다.rC   r   r   _az+3rw   rl   rx   rr   ry   rz   r]   Nr{   r|   s        r   test_dispatch_parse_full_combor      s    


2
3C	 3   
 3   
  
    
    
     
  r   )r   r   r   r   )"__doc__
__future__r   builtinsr-   _pytest.assertion.rewrite	assertionrewriter+   importlib.utilr   r   pathlibr   __file__resolveparentsr   r   r    r;   r>   rA   rD   rG   rI   rK   rN   rf   ri   ru   r}   r   r    r   r   <module>r      s    #     
 N""$,,Q/	 &(AB5
7
9
=1
7
5
- XZr   