
    i&                    R   d Z ddlmZ ddl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 ed	d
      Z ej                   dej"                        Z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!d Z"d Z#d Z$y) u>  tests/regression/test_dashboard_report_hardening_2487.py — task-2487 회귀 테스트 (Group C).

dashboard/helpers.py의 prefix 제거 정규식과 report_parser.py의 task_id 추출이
V2 패턴(retry/phase suffix)을 올바르게 처리하는지 검증한다.

헤임달(개발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        f/home/jay/workspace/.worktrees/task-2487-dev2/tests/regression/test_dashboard_report_hardening_2487.py_load_moduler      s    H$I>>11(C	NKD|t{{*1)=>>^^,,T2F"CKKKKF#M    helpers_2487_dashzdashboard/helpers.pyreport_parser_2487report_parser.pyuO   ^(?:task-\d+(?:_\d+\.\d+)?(?:_[a-z])?(?:\+\d+)?|Task\s+\d+[\.\d]*)\s*[:：]?\s*c                J    t         j                  d|       j                         S )N )_DASH_PREFIX_REsubstrip)titles    r   _strip_prefixr#   0   s    r5)//11r   c                 8    t        d      } | dk(  s
J d|        y)u9   'task-1234+1: 제목' → '제목' (retry suffix 제거).u   task-1234+1: 제목   제목   expected '제목', got Nr#   results    r   !test_dashboard_prefix_strip_retryr*   9   s(    01FXC!8
CCr   c                 8    t        d      } | dk(  s
J d|        y)u;   'task-1234_1.2: 제목' → '제목' (phase suffix 제거).u   task-1234_1.2: 제목r%   r&   Nr'   r(   s    r   !test_dashboard_prefix_strip_phaser,   ?   s(    23FXC!8
CCr   c                 8    t        d      } | dk(  s
J d|        y)u_   'task-1234_1.2_a+3: 긴 제목 텍스트' → '긴 제목 텍스트' (전체 V2 suffix 제거).u'   task-1234_1.2_a+3: 긴 제목 텍스트u   긴 제목 텍스트got Nr'   r(   s    r   0test_dashboard_prefix_strip_phase_parallel_retryr/   E   s(    DEF++>tF:->>+r   c                 8    t        d      } | dk(  s
J d|        y)uQ   'task-1234: 기본 제목' → '기본 제목' (base ID만 있을 때도 제거).u   task-1234: 기본 제목u   기본 제목r.   Nr'   r(   s    r   %test_dashboard_prefix_strip_base_onlyr1   K   s'    56F_$7VJ&77$r   c                 8    t        d      } | dk(  s
J d|        y)uL   콜론 없는 'task-1234_1.2 제목' → '제목' (공백 구분도 처리).u   task-1234_1.2 제목r%   r.   Nr'   r(   s    r   $test_dashboard_prefix_strip_no_colonr3   Q   s'    12FX0fZ00r   c                 8    t        d      } | dk(  s
J d|        y)u7   task ID 없는 순수 제목은 변경되지 않는다.u   순수한 제목 텍스트r.   Nr'   r(   s    r   'test_dashboard_prefix_strip_plain_titler5   W   s(    78F11DT&3DD1r   c                 R    t         dz  dz  j                  d      } d| v sJ d       y)uJ   dashboard/helpers.py 소스에 V2 phase(_\d+\.\d+) 패턴이 존재한다.	dashboard
helpers.pyutf-8encoding	_\d+\.\d+uV   dashboard/helpers.py prefix 제거 정규식에 V2 언더스코어 phase 토큰 없음Nr   	read_textsrcs    r   ,test_dashboard_helpers_source_has_v2_patternrA   b   s7    {"\1
<
<g
<
NC3 `r   c                 R    t         dz  dz  j                  d      } d| v sJ d       y)uE   dashboard/helpers.py 소스에 V2 retry(+\d+) 패턴이 존재한다.r7   r8   r9   r:   \+\d+uL   dashboard/helpers.py prefix 제거 정규식에 V2 retry(+\d+) 토큰 없음Nr=   r?   s    r   /test_dashboard_helpers_source_has_retry_patternrD   j   s5    {"\1
<
<g
<
NCs? W?r   c                 L   ddl } ddl}d}| j                  dddd      5 }|j                  |       |j                  }ddd       	 t
        j                        }|d	   d
k(  sJ d|d	          	 |j                  |       y# 1 sw Y   GxY w# |j                         w xY w)uD   보고서 H1 '# task-1234 완료 보고서' 에서 task-1234 추출.r   Nu$   # task-1234 완료 보고서

내용w.mdFr9   modesuffixdeleter;   task_idz	task-1234r.   tempfileosNamedTemporaryFilewritenamerpparse_reportunlinkrN   rO   contentftmpr)   s         r   *test_report_parser_task_id_from_title_baserZ   w   s    6G		$	$#eET[	$	\ `a	ff%i K/M4y8I7L1MM/
		#  			#   B*B BB#c                 L   ddl } ddl}d}| j                  dddd      5 }|j                  |       |j                  }ddd       	 t
        j                        }|d	   d
k(  sJ d|d	          	 |j                  |       y# 1 sw Y   GxY w# |j                         w xY w)uL   보고서 H1 '# task-1234_1.2 완료 보고서' 에서 task-1234_1.2 추출.r   Nu(   # task-1234_1.2 완료 보고서

내용rF   rG   Fr9   rH   rL   task-1234_1.2r.   rM   rV   s         r   +test_report_parser_task_id_from_title_phaser^      s    :G		$	$#eET[	$	\ `a	ff%i O3QtF9<M;P5QQ3
		#  			#r[   c                 L   ddl } ddl}d}| j                  dddd      5 }|j                  |       |j                  }ddd       	 t
        j                        }|d	   d
k(  sJ d|d	          	 |j                  |       y# 1 sw Y   GxY w# |j                         w xY w)uH   보고서 H1 '# task-1234+1 완료 보고서' 에서 task-1234+1 추출.r   Nu&   # task-1234+1 완료 보고서

내용rF   rG   Fr9   rH   rL   task-1234+1r.   rM   rV   s         r   +test_report_parser_task_id_from_title_retryra      s    8G		$	$#eET[	$	\ `a	ff%i M1OT&:K9N3OO1
		#  			#r[   c                 L   ddl } ddl}d}| j                  dddd      5 }|j                  |       |j                  }ddd       	 t
        j                        }|d	   d
k(  sJ d|d	          	 |j                  |       y# 1 sw Y   GxY w# |j                         w xY w)uC   보고서 H1 '# task-1234_1.2_a+3' 에서 task-1234_1.2_a+3 추출.r   Nu   # task-1234_1.2_a+3

내용rF   rG   Fr9   rH   rL   ztask-1234_1.2_a+3r.   rM   rV   s         r   -test_report_parser_task_id_from_title_full_v2rc      s    -G		$	$#eET[	$	\ `a	ff%i $77U4y@Q?T9UU7
		#  			#r[   c                 L   ddl } ddl}d}| j                  dddd      5 }|j                  |       |j                  }ddd       	 t
        j                        }|d	   d
k(  sJ d|d	          	 |j                  |       y# 1 sw Y   GxY w# |j                         w xY w)u@   '**작업 ID**: task-1234_1.2' 메타 필드에서 V2 ID 추출.r   Nu:   # 완료 보고서

- **작업 ID**: task-1234_1.2

내용rF   rG   Fr9   rH   rL   r]   r.   rM   rV   s         r   *test_report_parser_task_id_from_meta_fieldre      s    NG		$	$#eET[	$	\ `a	ff%i O3QtF9<M;P5QQ3
		#  			#r[   c                    ddl } ddl}d}| j                         }|j                  j	                  |d      }t        |dd      5 }|j                  |       ddd       	 t        j                  |      }|d   d	k(  sJ d
|d          	 |j                  |       |j                  |       y# 1 sw Y   XxY w# |j                  |       |j                  |       w xY w)u>   파일명 'task-1234+1.md' 에서 basename으로 V2 ID 추출.r   Nu   # 완료 보고서

내용ztask-1234+1.mdrF   r9   r:   rL   r`   r.   )rN   rO   mkdtemppathjoinopenrQ   rS   rT   rU   rmdir)rN   rO   rW   tmp_dirrY   rX   r)   s          r   +test_report_parser_task_id_from_basename_v2rm      s    ,G G
'',,w 0
1C	c3	) Q	%i M1OT&:K9N3OO1
		#
  			#
s   B. *B: .B7:$Cc                 T   ddl } ddl}d}| j                  dddd      5 }|j                  |       |j                  }ddd       	 t
        j                        }|d	   rd
|d	   v sJ d|d	   d       |j                  |       y# 1 sw Y   KxY w# |j                         w xY w)uH   'task/task-1234_1.2-dev2' 형식 merge_branch를 보고서에서 추출.r   NuD   # 보고서

머지 판단: 필요

branch: task/task-1234_1.2-dev2
rF   rG   Fr9   rH   merge_branchz_1.2merge_branch u   에 phase suffix 없음rM   rV   s         r   (test_report_parser_merge_branch_v2_phaserq      s    YG		$	$#eET[	$	\ `a	ff%.!VN33 ~ 699PQ3 			#  			#   B/B BB'c                 T   ddl } ddl}d}| j                  dddd      5 }|j                  |       |j                  }ddd       	 t
        j                        }|d	   rd
|d	   v sJ d|d	   d       |j                  |       y# 1 sw Y   KxY w# |j                         w xY w)uF   'task/task-1234+1-dev3' 형식 merge_branch를 보고서에서 추출.r   NuB   # 보고서

머지 판단: 필요

branch: task/task-1234+1-dev3
rF   rG   Fr9   rH   ro   z+1rp   u   에 retry suffix 없음rM   rV   s         r   (test_report_parser_merge_branch_v2_retryrt      s    WG		$	$#eET[	$	\ `a	ff%.!6.11 ~ 699PQ1 			#  			#rr   c                 b    t         dz  j                  d      } d| v sJ d       d| v sJ d       y)	uL   report_parser.py 소스의 H1 추출 정규식이 V2 suffix를 포함한다.r   r9   r:   r<   u7   report_parser.py H1 정규식에 V2 phase 패턴 없음rC   u7   report_parser.py H1 정규식에 V2 retry 패턴 없음Nr=   r?   s    r   .test_report_parser_source_has_v2_title_patternrv      sA    ))
4
4g
4
FC3Y YYs?UUU?r   )r   r   r   r   )r"   r   returnr   )%__doc__
__future__r   importlib.utilr   rer   pathlibr   __file__resolveparentsr   r   helpersrS   compile
IGNORECASEr   r#   r*   r,   r/   r1   r3   r5   rA   rD   rZ   r^   ra   rc   re   rm   rq   rt   rv    r   r   <module>r      s    #  	 
 N""$,,Q/	 *,B
C &(:; "**VMM2DD?81E.$$Vr   