
    a=jt                        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ZddlZddlmZ  ee      j#                         j$                  d   Zd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, task-2547 corrected).

dashboard/helpers.py + report_parser.py 의 V2 + legacy dot-phase 호환 hardening 검증.

검증 대상:
- dashboard/helpers.py        : get_records_list 의 task-ID 접두사 제거 패턴 3개
- report_parser.py            : task_id 추출 + merge_branch 추출 패턴
    )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-2551-dev6/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    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)uZ   get_records_list 의 first_desc task-ID 접두사 제거 패턴이 V2 retry/_phase 인식.	dashboard
helpers.pyutf-8encodingz
(?:\+\d+)?in)z%(py1)s in %(py3)ssrc)py1py3u2   dashboard/helpers.py V2 retry suffix 패턴 누락z
>assert %(py5)spy5N)r   	read_text
@pytest_ar_call_reprcompare	_saferepr@py_builtinslocals_should_repr_global_name_format_assertmsgAssertionError_format_explanation)r"   @py_assert0@py_assert2@py_format4@py_format6s        r   /test_dashboard_helpers_v2_pattern_in_first_descr4   "   s    {"\1
<
<g
<
NCV>S VVV>SVVV>VVVVVVSVVVSVVVV"VVVVVVVr   c                 Z   t         dz  dz  j                  d      } g }d}|| v }|}|s1d}| j                  d      d   d	d
 j                  d      d   }||v}|}|sAt        j                  d|fd|| f      t        j
                  |      dt        j                         v st        j                  |       rt        j
                  |       nddz  }dd|iz  }	|j                  |	       |s_t        j                  dfdf      t        j
                  |      t        j
                  |      dz  }
dd|
iz  }|j                  |       t        j                  |d      i z  }t        j                  d      dz   d|iz  }t        t        j                  |            d	x}x}x}x}x}x}}y	)u>   task-2543 mtime fallback off 변경이 보존되어야 한다.r   r   r   r   z	task-2543mtimezdef get_records_list   Ni  r   r    )z%(py3)s in %(py5)sr"   )r$   r%   z%(py7)spy7)not in)z%(py10)s not in %(py13)s)py10py13z%(py15)spy15uL   task-2543 mtime fallback off 변경 흔적이 사라짐 — 회귀 가능성z
>assert %(py18)spy18)r   r&   splitr'   r(   r)   r*   r+   r,   append_format_boolopr-   r.   r/   )r"   @py_assert1r1   @py_assert4r0   @py_assert9@py_assert12@py_assert11r3   @py_format8@py_format14@py_format16@py_format17@py_format19s                 r   9test_dashboard_helpers_preserves_task_2543_mtime_fallbackrK   )   s   {"\1
<
<g
<
NC
; ;#  		:P0QRS0TUZVZ0[0a0abi0jkl0m 0m!m   ;#                   0m    ")    1n        	W      r   c                 ~   t        dd      } t        j                  dddd      5 }|j                  d       |j                  }d	d	d	       	 | j                        }|d
   }d}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j                  d|       dz   d|iz  }t        t        j                  |            d	x}x}}t        |      j                  d       y	# 1 sw Y   xY w# t              j                  d       w xY w)uV   report_parser.parse_report 가 # task-2487+1 헤더에서 V2 task_id 를 추출한다.rp_2487report_parser.pyw.mdFr   modesuffixdeleter   u5   # task-2487+1 — sample title

- **팀**: dev2-team
Ntask_idztask-2487+1==)z%(py1)s == %(py4)sr#   py4u   V2 retry suffix 추출 실패: z
>assert %(py6)spy6T
missing_ok)r   tempfileNamedTemporaryFilewritenameparse_reportr'   r(   r)   r-   r.   r/   r   unlink)	rptftmp_pathoutr0   @py_assert3r1   @py_format5@py_format7s	            r   1test_report_parser_v2_pattern_in_title_extractionrj   5   s    	i!3	4B		$	$#eET[	\ `b
KL77/ooh'9~WW~.WWW~WWW~WWWWWW2QRUQV0WWWWWWWWX.  	X.s   DB*D DD<c                    t        dd      } t        j                  dddd      5 }|j                  d       |j                  }d	d	d	       	 | j                        }|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
   }|j                  }d}	 ||	      }
|
st        j                  d|       dz   t        j                  |      t        j                  |      t        j                  |	      t        j                  |
      dz  }t        t        j                  |            d	x}x}x}	}
t        |      j                  d       y	# 1 sw Y   ixY w# t              j                  d       w xY w)u]   report_parser.parse_report 가 legacy # task-1234.5 헤더에서도 task_id 를 추출한다.rp_2487_legacyrN   rO   rP   Fr   rQ   u5   # task-1234.5 — legacy title

- **팀**: dev2-team
NrU   )is not)z%(py1)s is not %(py4)srX   zassert %(py6)srZ   z	task-1234u   legacy task_id 추출 실패: zN
>assert %(py7)s
{%(py7)s = %(py3)s
{%(py3)s = %(py1)s.startswith
}(%(py5)s)
})r#   r$   r%   r8   Tr[   )r   r]   r^   r_   r`   ra   r'   r(   r)   r.   r/   
startswithr-   r   rb   )rc   rd   re   rf   r0   rg   r1   rh   ri   rB   @py_assert6rF   s               r   5test_report_parser_legacy_pattern_in_title_extractionrp   B   s]   	&(:	;B		$	$#eET[	\ `b
KL77	/ooh'
 9~)T)~T))))~T)))~)))T)))))))9~]~((]](5]5]]9WX[W\7]]]]~]]](]]]]]]5]]]]]]X.  	X.s   F+EF8 +F58Gc                    t        dd      } t        j                  dddd      5 }|j                  d       |j                  }d	d	d	       	 | j                        }|j                  }d
} ||      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }	t        j                  d|j                  d
             dz   d|	iz  }
t        t        j                  |
            d	x}x}x}x}}t!        |      j#                  d       y	# 1 sw Y   ^xY w# t!              j#                  d       w xY w)uP   report_parser.parse_report 가 V2 branch task/task-2487+1-dev2 를 추출한다.rp_2487_branchrN   rO   rP   Fr   rQ   uj   # task-2487+1 — merge sample

- **머지 브랜치**: task/task-2487+1-dev2
- **상태**: 머지 필요
Nmerge_branchztask/task-2487+1-dev2rV   zI%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
} == %(py9)srf   py0py2rY   rZ   py9u&   V2 retry suffix branch 추출 실패: 
>assert %(py11)spy11Tr[   r   r]   r^   r_   r`   ra   getr'   r(   r*   r+   r,   r)   r-   r.   r/   r   rb   rc   rd   re   rf   rA   rg   @py_assert5@py_assert8@py_assert7@py_format10@py_format12s              r   *test_report_parser_merge_branch_v2_patternr   T   s   	&(:	;B		$	$#eET[	\ `b
,	

 77/ooh'ww 	
~ 	
w~& 	
*A 	
&*AA 	
 	
&*A 	
 	
	6	
 	
   	
 	
 		  	
 	
 		  	
 	
 		 & 	
 	
 		 ' 	
 	
 		 +B 	
 	
  5SWW^5L4MN	
 	
 	
 	
 	
 	
 	X.  	X.   F D7F-  F*-G
c                    t        dd      } t        j                  dddd      5 }|j                  d       |j                  }d	d	d	       	 | j                        }|j                  }d
} ||      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }	t        j                  d|j                  d
             dz   d|	iz  }
t        t        j                  |
            d	x}x}x}x}}t!        |      j#                  d       y	# 1 sw Y   ^xY w# t!              j#                  d       w xY w)uT   report_parser.parse_report 가 legacy task/task-1234.5-dev1 branch 도 추출한다.rp_2487_branch_legacyrN   rO   rP   Fr   rQ   uN   # task-1234.5 — legacy merge

- **머지 브랜치**: task/task-1234.5-dev1
Nrs   ztask/task-1234.5-dev1rV   rt   rf   ru   u   legacy branch 추출 실패: ry   rz   Tr[   r{   r}   s              r   .test_report_parser_merge_branch_legacy_patternr   g   s   	-/A	BB		$	$#eET[	\ `b
>	
 77/ooh'ww 	
~ 	
w~& 	
*A 	
&*AA 	
 	
&*A 	
 	
	6	
 	
   	
 	
 		  	
 	
 		  	
 	
 		 & 	
 	
 		 ' 	
 	
 		 +B 	
 	
  ,CGGN,C+DE	
 	
 	
 	
 	
 	
 	X.  	X.r   c                 
   t         dz  dz  j                  d      } d}d}g }|| v }|}|s|| v }|}|st        j                  d|fd|| f      d	t	        j
                         v st        j                  |      rt        j                  |      nd	d
t	        j
                         v st        j                  |       rt        j                  |       nd
dz  }dd|iz  }|j                  |       |st        j                  dfd|| f      dt	        j
                         v st        j                  |      rt        j                  |      ndd
t	        j
                         v st        j                  |       rt        j                  |       nd
dz  }	dd|	iz  }
|j                  |
       t        j                  |d      i z  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}x}x}}d}t        j                  }d}d} ||||      }|j                  } |       }d}||k(  }|sZt        j                  d|fd||f      dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      d 	z  }d!d"|iz  }t        t        j                  |            dx}x}x}x}x}x}x}}t        j                  }d}d#} ||||      }|j                  } |       }d$}||k(  }|sZt        j                  d|fd||f      dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      d 	z  }d!d"|iz  }t        t        j                  |            dx}x}x}x}x}x}x}}y)%u_   dashboard/helpers.py 의 prefix-strip regex 가 task-2487+1: 를 제거하는지 직접 검증.r   r   r   r   z5task-\d+(?:\.\d+)?(?:_\d+\.\d+)?(?:_[a-z])?(?:\+\d+)?z5task-\d+(?:\.\d+)*(?:_\d+\.\d+)?(?:_[a-z])?(?:\+\d+)?r    )z%(py2)s in %(py4)spat_marker_qr"   )rw   rY   z%(py6)srZ   )z%(py8)s in %(py10)spat_marker_star)py8r:   z%(py12)spy12r7   u4   dashboard/helpers.py V2 task-ID strip pattern 누락z
>assert %(py15)sr<   NuY   ^(?:task-\d+(?:\.\d+)?(?:_\d+\.\d+)?(?:_[a-z])?(?:\+\d+)?|Task\s+\d+[\.\d]*)\s*[:：]?\s* ztask-2487+1: sample titlezsample titlerV   )z%(py13)s
{%(py13)s = %(py11)s
{%(py11)s = %(py9)s
{%(py9)s = %(py2)s
{%(py2)s = %(py0)s.sub
}(%(py3)s, %(py5)s, %(py7)s)
}.strip
}()
} == %(py16)srepattern)	rv   rw   r$   r%   r8   rx   rz   r;   py16zassert %(py18)sr=   ztask-1234.5: legacy titlezlegacy title)r   r&   r'   r(   r*   r+   r,   r)   r?   r@   r-   r.   r/   r   substrip)r"   r   r   rA   rg   r0   rC   rh   ri   @py_format11@py_format13rG   rH   r   rB   ro   r   @py_assert10rD   @py_assert15@py_assert14rI   rJ   s                          r   )test_dashboard_helpers_retry_suffix_stripr   y   s   {"\1
<
<g
<
NCRLUO<3 /S"8   <3                         /S      #2    #2      69    69        	?     
 kG66U2U:U6'2:;U;AAUACU~UC~UUUUC~UUUUUU2UUU2UUU6UUUUUU'UUU'UUU2UUU:UUU;UUUAUUUCUUU~UUUUUUUU66U2U:U6'2:;U;AAUACU~UC~UUUUC~UUUUUU2UUU2UUU6UUUUUU'UUU'UUU2UUU:UUU;UUUAUUUCUUU~UUUUUUUUr   )r   r   r   r   )__doc__
__future__r   builtinsr*   _pytest.assertion.rewrite	assertionrewriter'   importlib.utilr   r   r   r]   pathlibr   __file__resolveparentsr   r   r4   rK   rj   rp   r   r   r    r   r   <module>r      sj    #     	 
  N""$,,Q/	W	
//$/&/$Vr   