
    j                     ~   d Z ddlZddlmc mZ ddlZddlm	Z	 ddl
Z
 e	e      j                         j                  d   Zedz  dz  dz  Zedz  d	z  Zg d
Zg dZd Zd Ze
j*                  j-                  de      d        Zd Zd Zd Zd Zd Zd Zd Ze
j*                  j-                  de      d        Zd Z y)uU  
regression: test_stash_origin_audit_metadata_format.py
task: task-2570 TODO-4
작성자: 하누만(테스터)

검증 목표:
1. spec 파일 존재 + 필수 키워드 검증
2. finish-task.sh의 stash_origin_metadata 필드 존재 검증 (BEFORE/AFTER 블록 각각)
3. 5개 표준 source 카테고리 중 5개 이상 spec에 명시 검증
    N)Path   memoryspecszstash-origin-audit.mdscriptszfinish-task.sh)task_idsourcereasoncaller_script	timestampz[task-z[source=)zfinish-taskzpre-task
quarantinewipzother-filesunknownc                  @   t         j                  }  |        }|st        j                  dt                dz   dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      dz  }t        t        j                  |            dx} }t         j                  }  |        }|st        j                  dt                dz   dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      dz  }t        t        j                  |            dx} }y)u:   spec 파일(stash-origin-audit.md)이 존재해야 한다.u   spec 파일이 없음: C
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}	SPEC_FILEpy0py2py4Nu!   spec 파일이 파일이 아님: zD
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.is_file
}()
})r   exists
@pytest_ar_format_assertmsg@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationis_file@py_assert1@py_assert3@py_format5s      O/home/jay/workspace/tests/regression/test_stash_origin_audit_metadata_format.pytest_spec_file_existsr&   .   s    DDDD!8DDDDDDD9DDD9DDDDDDDDDDDDOOOO"CI; OOOOOOO9OOO9OOOOOOOOOOOO    c            	         t         j                  d      } | j                  } |       }t        |      }d}||kD  }|s4t	        j
                  d|fd||f      dt        j                         v st	        j                  t              rt	        j                  t              nd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	      d
z   d|iz  }t        t	        j                  |            dx}x}x}x}}y)u-   spec 파일이 비어있지 않아야 한다.utf-8encodingr   )>)zb%(py7)s
{%(py7)s = %(py0)s(%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.strip
}()
})
} > %(py10)slencontent)r   py1py3py5py7py10u   spec 파일이 비어있음z
>assert %(py12)spy12N)r   	read_textstripr-   r   _call_reprcomparer   r   r   r   r   r   r   )r.   @py_assert2@py_assert4@py_assert6@py_assert9@py_assert8@py_format11@py_format13s           r%   test_spec_file_is_nonemptyr?   4   s    !!7!3G}}B}B3B!B!#BBB!BBBBBB3BBB3BBBBBBwBBBwBBB}BBBBBBBBB!BBB%BBBBBBBBr'   keywordc                    t         j                  d      }| |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  }t        j                  d|  d	t                d
z   d|iz  }t        t        j                  |            d}y)u7   spec 파일에 필수 키워드가 존재해야 한다.r)   r*   inz%(py0)s in %(py2)sr@   r.   r   r   u!   spec 파일에 필수 키워드 'u   '가 없음
파일: 
>assert %(py4)sr   Nr   r5   r   r7   r   r   r   r   r   r   r   )r@   r.   r"   @py_format3r$   s        r%   #test_spec_contains_required_keywordrI   :   s     !!7!3Gg  7g                        ,G9 5+	    r'   c                     t         j                  }  |        }|st        j                  dt                dz   dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      dz  }t        t        j                  |            dx} }t         j                  }  |        }|sddt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      dz  }t        t        j                  |            dx} }y)u-   finish-task.sh 파일이 존재해야 한다.u   finish-task.sh가 없음: r   FINISH_TASK_SHr   NzBassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.is_file
}()
})rK   r   r   r   r   r   r   r   r   r   r    r!   s      r%   test_finish_task_sh_existsrL   H   s      Q "Q"QQ&@@P$QQQQQQQ>QQQ>QQQ QQQ"QQQQQQ!!#!########>###>###!##########r'   c                     t         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}}| j                  d      }| j                  d      }g }d}| }	||	k7  }
|
}|
rd}| }||k7  }|}|sXt        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  }|j                  |       |
rt        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  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}
x}x}	x}x}}| || }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t                d	z   d
|iz  }t        t        j                  |            dx}}y)uy   
    finish-task.sh의 _STASH_AUDIT_BEFORE 관련 블록에
    stash_origin_metadata 필드가 존재해야 한다.
    r)   r*   _STASH_AUDIT_BEFORErB   z%(py1)s in %(py3)sr.   r/   r0   u6   finish-task.sh에 _STASH_AUDIT_BEFORE 변수가 없음
>assert %(py5)sr1   N_STASH_AUDIT_AFTER   )!=)z%(py2)s != -%(py5)s
before_idx)r   r1   z%(py8)spy8)z%(py10)s != -%(py13)s	after_idx)r3   py13z%(py16)spy16r   zassert %(py19)spy19stash_origin_metadatabefore_sectionu@   BEFORE 블록에 stash_origin_metadata 필드가 없음
파일: )rK   r5   r   r7   r   r   r   r   r   r   r   findappend_format_boolop)r.   @py_assert0r8   @py_format4@py_format6rU   rW   r"   r9   r:   r#   @py_assert12@py_assert14@py_assert11@py_format7@py_format9@py_format15@py_format17@py_format18@py_format20r\   s                        r%   9test_finish_task_sh_stash_audit_before_block_has_metadatarl   N   sU   
 &&&8G   G+   G    !      %,    %,    	A    
 34J12I/!/!/:/a/aR/	R////://////:///:///!///////	R//////	///	///a//////////////Z	2N" "n4  "n    #      '5    '5   	!"	$    r'   c                  V   t         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}}| j                  d      }| |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t                d	z   d
|iz  }t        t        j                  |            dx}}y)ux   
    finish-task.sh의 _STASH_AUDIT_AFTER 관련 블록에
    stash_origin_metadata 필드가 존재해야 한다.
    r)   r*   rR   rB   rO   r.   rP   u5   finish-task.sh에 _STASH_AUDIT_AFTER 변수가 없음rQ   r1   Nr[   after_sectionu?   AFTER 블록에 stash_origin_metadata 필드가 없음
파일: )rK   r5   r   r7   r   r   r   r   r   r   r   rfind)r.   r`   r8   ra   rb   rW   rn   s          r%   8test_finish_task_sh_stash_audit_after_block_has_metadatarp   d   st   
 &&&8G 7*  7           $+    $+    	@    
 23IIJ'M" "m3  "m    #      '4    '4   	!"	$    r'   c                     t         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}}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)uJ   _STASH_AUDIT_BEFORE 와 _STASH_AUDIT_AFTER 가 모두 존재해야 한다.r)   r*   rN   rB   rO   r.   rP   u   _STASH_AUDIT_BEFORE 없음rQ   r1   NrR   u   _STASH_AUDIT_AFTER 없음)rK   r5   r   r7   r   r   r   r   r   r   r   )r.   r`   r8   ra   rb   s        r%   -test_finish_task_sh_both_audit_blocks_presentrr   w   s    &&&8G I G+III GIII IIIIIIGIIIGIIII-IIIIIIIG7*GGG7GGGGGGGGG7GGG7GGGG,GGGGGGGr'   c                     t         j                  d      } | j                  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  }t        j                  d	| d
      dz   d|iz  }t        t        j                  |            dx}}y)u   
    finish-task.sh에 stash_origin_metadata 필드가 최소 2번 등장해야 한다
    (BEFORE 블록 + AFTER 블록 각각).
    r)   r*   r[   r   >=)z%(py0)s >= %(py3)soccurrences)r   r0   u   stash_origin_metadata 가 u"   회만 등장 (최소 2회 필요)rQ   r1   N)rK   r5   countr   r7   r   r   r   r   r   r   r   )r.   rv   r8   r"   ra   rb   s         r%   5test_finish_task_sh_stash_origin_metadata_field_countrx   ~   s    
 &&&8G-- 78K ;!  ;!                  %[M1ST    r'   c                  V   t         j                  d      } t        j                  d      }|j                  } ||       }|st        j                  d      dz   dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      dz  }t        t        j                  |            d	x}}y	)
uH   stash_origin_metadata에 source 필드가 포함되어 있어야 한다.r)   r*   z"source"\s*:\s*"finish-task"uA   stash_origin_metadata에 "source": "finish-task" 패턴이 없음J
>assert %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.search
}(%(py3)s)
}patternr.   r   r   r0   r1   N)rK   r5   recompilesearchr   r   r   r   r   r   r   r   )r.   r{   r"   r9   rb   s        r%   )test_finish_task_sh_metadata_source_fieldr      s    &&&8Gjj89G>> >'" "   	L                   "    "    #     r'   c                     t         j                  d      } t        D cg c]	  }|| v s| }}t        |      }d}||k\  }|s"t	        j
                  d|fd||f      dt        j                         v st	        j                  t              rt	        j                  t              nddt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      dz  }t	        j                  d	t        |       d
| dt               dz   d|iz  }t        t	        j                  |            dx}x}}yc c}w )u   
    spec 파일에 표준 source 카테고리가 최소 5개 이상 명시되어 있어야 한다.
    (finish-task / pre-task / quarantine / wip / other-files / unknown 중 5개+)
    r)   r*      rt   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)sr-   found)r   r/   r0   py6u   spec에 source 카테고리가 u;   개만 존재 (최소 5개 필요)
발견된 카테고리: u   
전체 카테고리: z
>assert %(py8)srV   N)r   r5   STANDARD_SOURCE_CATEGORIESr-   r   r7   r   r   r   r   r   r   r   )r.   catr   r8   @py_assert5r9   rf   rg   s           r%   2test_spec_contains_at_least_five_source_categoriesr      sK   
 !!7!3G6IS#.SIEIu:  :?   	:   	  	    	    	  	    	    	    	     *#e* 6##(' *  :;	=   	   Js
   	E-E-categoryc                     t         j                  d      }| |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  }t        j                  d|  d	      d
z   d|iz  }t        t        j                  |            d}y)uH   각 표준 source 카테고리가 spec에 명시되어 있어야 한다.r)   r*   rB   rD   r   r.   rE   u$   spec 파일에 source 카테고리 'u   '가 없음rF   r   NrG   )r   r.   r"   rH   r$   s        r%   "test_spec_contains_source_categoryr      s     !!7!3Gw  8w                        /xjD    r'   c                  J   t         j                  d      } d}| j                  } |       }||v }|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |       rt        j
                  |       ndt        j
                  |      t        j
                  |      dz  }t        j                  d      d	z   d
|iz  }t        t        j                  |            dx}x}x}}t        j                  d      }|j                  } ||       }|st        j                  d      dz   dt        j                         v st        j                  |      rt        j
                  |      ndt        j
                  |      dt        j                         v st        j                  |       rt        j
                  |       ndt        j
                  |      dz  }	t        t        j                  |	            dx}}y)uN   spec에 source 분류 테이블 헤더(| source 값 |)가 존재해야 한다.r)   r*   r	   rB   )zD%(py1)s in %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.lower
}()
}r.   )r/   r0   r1   r2   u$   spec에 'source' 키워드가 없음z
>assert %(py9)spy9Nz
\|.+\|.+\|u+   spec에 Markdown 테이블 구조가 없음rz   table_row_patternr|   )r   r5   lowerr   r7   r   r   r   r   r   r   r   r}   r~   r   )
r.   r`   r9   r:   r8   @py_format8@py_format10r   r"   rb   s
             r%    test_spec_source_table_structurer      s<   !!7!3GNw}}N}N8&NNN8NNN8NNNNNNwNNNwNNN}NNNNNN(NNNNNNNN

=1##[#G,[,[[.[[[[[[[[[[[[[#[[[[[[G[[[G[[[,[[[[[[r'   )!__doc__builtinsr   _pytest.assertion.rewrite	assertionrewriter   r}   pathlibr   pytest__file__resolveparentsWORKTREE_ROOTr   rK   REQUIRED_KEYWORDSr   r&   r?   markparametrizerI   rL   rl   rp   rr   rx   r   r   r   r    r'   r%   <module>r      s   	  	   X&&(003H$w.1HH	*-==  PC $56 7$,&H	 %?@ A\r'   