
    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d      Z ee      e
j                  vr"e
j                  j!                  d ee             ddlmZ  ej(                  dedz        Zg ZdZeeuZeZerej4                  ZdZeeuZeZesB ej<                  defd	eef      d
 ej>                         v s ej@                  e      r ejB                  e      nd
 ejB                  e      dz  Z"dde"iz  Z#ejI                  e#       er ej<                  defdeef      d
 ej>                         v s ej@                  e      r ejB                  e      nd
 ejB                  e       ejB                  e      dz  Z%dde%iz  Z&ejI                  e&        ejN                  ed      i z  Z(dde(iz  Z) e* ejV                  e)            dxZxZxZxZxZxZZ ejX                  e      Z-ej4                  j]                  e-       e-j^                  Z/e-j`                  Z0d Z1d Z2d Z3ddZ4ddZ5ddZ6d Z7y)u   skill-quality-check.py 단위 테스트.

테스트 대상:
- parse_frontmatter(text) — YAML frontmatter 파싱
- check_skill(skill_name, skill_dir, registry, eval_axes) — 단일 스킬 검증
- main() --summary 모드 실행 (subprocess)
    )annotationsN)Pathz/home/jay/workspace/scriptsskill_quality_checkskill-quality-check.pyis not)z%(py2)s is not %(py5)s_spec)py2py5z%(py7)spy7)z5%(py11)s
{%(py11)s = %(py9)s.loader
} is not %(py14)s)py9py11py14z%(py16)spy16zassert %(py19)spy19c                    d} t        |       }d}||u}|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}}t        |t              }|sd	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dt        j                         v st        j
                  t              rt        j                  t              ndt        j                  |      dz  }t        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  }dd|iz  }t        t        j                  |            dx}}|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}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}}y)uZ   정상 frontmatter 파싱 시 description 필드가 포함된 dict를 반환해야 한다.uZ   ---
name: my-skill
description: 테스트용 스킬 설명
version: 1.0
---
본문 내용
Nr   z%(py0)s is not %(py3)sresultpy0py3assert %(py5)sr   5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstancedictr   py1r
   py4descriptioninz%(py1)s in %(py3)sr   r   u   테스트용 스킬 설명==z%(py1)s == %(py4)sr   r   assert %(py6)spy6namezmy-skillparse_frontmatter
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationr   r   
textr   @py_assert2@py_assert1@py_format4@py_format6@py_assert3@py_format5@py_assert0@py_format7s
             5/home/jay/workspace/tests/test_skill_quality_check.pytest_parse_frontmatter_validr@   (   s   D t$F6666fd########:###:######f###f######d###d##########"=F""""=F"""=""""""F"""F"""""""- @$@@ $@@@@@ $@@@@ @@@$@@@@@@@@&>'Z'>Z''''>Z'''>'''Z'''''''    c                    d} t        |       }d}||u}|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}}t        |t              }|sd	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dt        j                         v st        j
                  t              rt        j                  t              ndt        j                  |      dz  }t        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  }dd|iz  }t        t        j                  |            dx}}|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}}y)uY   description이 없는 frontmatter 파싱 시 dict에 description 키가 없어야 한다.u0   ---
name: no-desc-skill
version: 2.0
---
본문
Nr   r   r   r   r   r   r   r   r   r   r   )not in)z%(py1)s not in %(py3)sr#   r*   zno-desc-skillr$   r&   r'   r(   r)   r+   r5   s
             r?   %test_parse_frontmatter_no_descriptionrD   ?   s   D t$F6666fd########:###:######f###f######d###d##########&=&&&&=&&&=&&&&&&&&&&&&&&&&&>,_,>_,,,,>_,,,>,,,_,,,,,,,rA   c                 h   d} t        |       }d}||u }|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)	uN   frontmatter 구분자(---)가 없는 텍스트는 None을 반환해야 한다.u5   그냥 본문만 있는 마크다운 파일입니다.Nis)z%(py0)s is %(py3)sr   r   r   r   )	r,   r-   r.   r/   r0   r1   r2   r3   r4   )r6   r   r7   r8   r9   r:   s         r?   test_parse_frontmatter_nonerH   T   si    BDt$F6T>6T66TrA   c                   d}| |z  }|j                          |dz  }|j                  dd       |d|ii}i }t        ||||      }|j                  }d}||k(  }	|	st	        j
                  d|	fd	||f      d
t        j                         v st	        j                  |      rt	        j                  |      nd
t	        j                  |      t	        j                  |      dz  }
dd|
iz  }t        t	        j                  |            dx}x}	}|j                  }d}||u }	|	st	        j
                  d|	fd||f      d
t        j                         v st	        j                  |      rt	        j                  |      nd
t	        j                  |      t	        j                  |      dz  }
dd|
iz  }t        t	        j                  |            dx}x}	}|j                  }d}||u }	|	st	        j
                  d|	fd||f      d
t        j                         v st	        j                  |      rt	        j                  |      nd
t	        j                  |      t	        j                  |      dz  }
dd|
iz  }t        t	        j                  |            dx}x}	}|j                  }d}||u }	|	st	        j
                  d|	fd||f      d
t        j                         v st	        j                  |      rt	        j                  |      nd
t	        j                  |      t	        j                  |      dz  }
dd|
iz  }t        t	        j                  |            dx}x}	}y)uX   SKILL.md 존재 + 유효 frontmatter + registry 등록 시 verdict가 PASS여야 한다.zmy-test-skillSKILL.mduA   ---
name: my-test-skill
description: 테스트 설명
---
본문
utf-8encodingr*   PASSr$   z/%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py5)sr   r   r
   r   assert %(py7)sr   NTrF   z4%(py2)s
{%(py2)s = %(py0)s.has_skill_md
} is %(py5)sz9%(py2)s
{%(py2)s = %(py0)s.frontmatter_valid
} is %(py5)sz7%(py2)s
{%(py2)s = %(py0)s.registry_synced
} is %(py5)smkdir
write_textcheck_skillverdictr-   r.   r/   r0   r1   r2   r3   r4   has_skill_mdfrontmatter_validregistry_syncedtmp_path
skill_name	skill_dirskill_mdregistry	eval_axesr   r8   @py_assert4r;   r:   @py_format8s               r?   test_check_skill_passrf   `   s'    J:%IOO:%HP  
 VZ01HIY)DF>>#V#>V####>V######6###6###>###V#######&$&$&&&&$&&&&&&6&&&6&&&&&&$&&&&&&&##+t+#t++++#t++++++6+++6+++#+++t+++++++!!)T)!T))))!T))))))6)))6)))!)))T)))))))rA   c                |   d}| |z  }|j                          |d|ii}i }t        ||||      }|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }	dd	|	iz  }
t        t        j                  |
            d
x}x}}|j                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }	dd	|	iz  }
t        t        j                  |
            d
x}x}}y
)uC   SKILL.md가 없는 디렉토리는 verdict가 FAIL이어야 한다.zmissing-skillmdr*   FAILr$   rO   r   rP   rQ   r   NFrF   rR   )rV   rX   rY   r-   r.   r/   r0   r1   r2   r3   r4   rZ   )r^   r_   r`   rb   rc   r   r8   rd   r;   r:   re   s              r?    test_check_skill_fail_no_skillmdri   |   s    "J:%IOO VZ01HIY)DF>>#V#>V####>V######6###6###>###V#######'%'%''''%''''''6'''6''''''%'''''''rA   c                   d}| |z  }|j                          |dz  }|j                  dd       i }i }t        ||||      }|j                  }d}||k(  }	|	st	        j
                  d|	fd||f      d	t        j                         v st	        j                  |      rt	        j                  |      nd	t	        j                  |      t	        j                  |      d
z  }
dd|
iz  }t        t	        j                  |            dx}x}	}|j                  }d}||u }	|	st	        j
                  d|	fd||f      d	t        j                         v st	        j                  |      rt	        j                  |      nd	t	        j                  |      t	        j                  |      d
z  }
dd|
iz  }t        t	        j                  |            dx}x}	}|j                  }d}||u }	|	st	        j
                  d|	fd||f      d	t        j                         v st	        j                  |      rt	        j                  |      nd	t	        j                  |      t	        j                  |      d
z  }
dd|
iz  }t        t	        j                  |            dx}x}	}|j                  }d}||u }	|	st	        j
                  d|	fd||f      d	t        j                         v st	        j                  |      rt	        j                  |      nd	t	        j                  |      t	        j                  |      d
z  }
dd|
iz  }t        t	        j                  |            dx}x}	}y)uV   SKILL.md는 존재하지만 registry에 미등록 시 verdict가 WARN이어야 한다.zunregistered-skillrJ   uC   ---
name: unregistered-skill
description: 설명 있음
---
본문
rK   rL   WARNr$   rO   r   rP   rQ   r   NTrF   rR   rS   FrT   rU   r]   s               r?   !test_check_skill_warn_no_registryrl      s   %J:%IOO:%HR   HIY)DF>>#V#>V####>V######6###6###>###V#######&$&$&&&&$&&&&&&6&&&6&&&&&&$&&&&&&&##+t+#t++++#t++++++6+++6+++#+++t+++++++!!*U*!U****!U******6***6***!***U*******rA   c                 `   t        t        dz        } t        j                  t        j
                  | dgddd      }|j                  }d}||v }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      d
z  }t        j                  d|j                   d|j                   d|j                         dz   d|iz  }t!        t        j"                  |            dx}x}}|j                  |j                  z   }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|j                   d|j                         dz   d|
iz  }t!        t        j"                  |            dx}}	y)uk   --summary 옵션으로 스크립트를 실행했을 때 정상 출력(exit 0 또는 1)이 나와야 한다.r   z	--summaryT   )capture_outputr6   timeout)r      r    )z2%(py2)s
{%(py2)s = %(py0)s.returncode
} in %(py5)sprocrP   u   예상치 못한 exit code: z	
stdout: z	
stderr: z
>assert %(py7)sr   Nu   스킬 품질 검증 요약r"   combinedr#   u+   요약 헤더가 출력에 없음.
stdout: z
>assert %(py5)sr   )str_SCRIPTS_DIR
subprocessrunsys
executable
returncoder-   r.   r/   r0   r1   r2   _format_assertmsgstdoutstderrr3   r4   )script_pathrr   r8   rd   r;   r:   re   rs   r=   r7   r9   s              r?   test_summary_runsr      s   l%==>K>>	k2	D ?? f ?f$  ?f                  %    't&7 8;;-z$++	8     {{T[[(H( (H4  (H    )      -5    -5    7t{{m:dkk][    rA   )r^   r   )8__doc__
__future__r   builtinsr/   _pytest.assertion.rewrite	assertionrewriter-   rv   rx   pathlibr   ru   rt   pathinsertimportlib.utilutil_iluspec_from_file_locationr	   r8   rd   r;   r=   loader@py_assert10@py_assert13@py_assert12r.   r0   r1   r2   r:   re   append@py_format15@py_format17_format_boolop@py_format18@py_format20r3   r4   module_from_spec_modexec_moduler,   rX   r@   rD   rH   rf   ri   rl   r    rA   r?   <module>r      s   #     
  12|CHH$HHOOAs<() $$$++	 6D 5uD 5U\\ 5 5\5 5 5 5uD 5 5 5 5 5u 5 5 5u 5 5 5D 5 5 5 5 5 5 5\ 5 5 5 5 5U 5 5 5U 5 5 5\ 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5tU#    ** (.-**8(*+:rA   