
    (<i                     `   d Z ddlZddlZddlmZ ddlZej                  j                  d e ee	      j                  j                  j                               ddlmZmZmZmZmZ  ed      Zdededed	efd
Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Zy)u)   utils/skill_loader.py 테스트 스위트    N)Path)SkillDetailSkillSummarylist_skills
load_skill
view_skillz/home/jay/workspace/skillstmp_pathnamecontentreturnc                 `    | |z  }|j                  d       |dz  j                  |d       |S )u.   테스트용 스킬 디렉토리 생성 헬퍼T)parentsSKILL.mdzutf-8)encoding)mkdir
write_text)r	   r
   r   	skill_dirs       N/home/jay/workspace/.worktrees/task-2057-dev2/utils/tests/test_skill_loader.pymake_skill_dirr      s7    4IOODO!''''B    c                       e Zd ZdZddZy)TestSkillSummaryu'   SkillSummary dataclass 구조 테스트Nc                     t        ddd      }|j                  dk(  sJ |j                  dk(  sJ |j                  dk(  sJ y)   필수 필드 존재 확인test   설명general)r
   descriptioncategoryN)r   r
   r   r   )selfss     r   test_fields_existz"TestSkillSummary.test_fields_exist"   sF    f(YOvv}}(((zzY&&&r   r   N__name__
__module____qualname____doc__r"    r   r   r   r      s
    1'r   r   c                       e Zd ZdZddZy)TestSkillDetailu&   SkillDetail dataclass 구조 테스트Nc                     t        dddgg d      }|j                  dk(  sJ |j                  dgk(  sJ |j                  g k(  sJ |j                  dk(  sJ y)r   r   r   trigger1z/path/to/SKILL.md)r
   r   triggersrequires	full_pathN)r   r
   r.   r/   r0   )r    ds     r   r"   z!TestSkillDetail.test_fields_exist-   sj      \)
 vvzzj\)))zzR{{1111r   r#   r$   r)   r   r   r+   r+   *   s
    02r   r+   c                       e Zd ZdZdeddfdZdeddfdZdeddfdZdeddfdZdeddfd	Z	dd
Z
ddZdeddfdZy)TestListSkillsu   list_skills() 테스트r	   r   Nc                 X    t        |dd       t        |      }t        |t              sJ y)u   반환 타입은 listskill-au5   ---
name: skill-a
description: 설명A
---
# skill-a
N)r   r   
isinstancelistr    r	   results      r   test_returns_listz TestListSkills.test_returns_list?   s)    x,hiX&&$'''r   c                     t        |dd       t        |dd       |dz  j                          t        |      }|D cg c]  }|j                   }}d|v sJ d|v sJ d|vsJ yc c}w )u&   SKILL.md 있는 디렉토리만 포함r5   u+   ---
name: skill-a
description: 설명A
---
zskill-bu+   ---
name: skill-b
description: 설명B
---
zno-skillN)r   r   r   r
   )r    r	   r9   r!   namess        r   test_finds_skills_with_skill_mdz.TestListSkills.test_finds_skills_with_skill_mdE   s}    x,]^x,]^	J	%%'X&!'(A((E!!!E!!!&&& )s   A%c                     t        |dd       t        |      }t        |      dk\  sJ t        d |D              }|j                  dk(  sJ y)u%   name, description 올바르게 파싱my-skillu?   ---
name: my-skill
description: 내 스킬 설명
---
# 제목
   c              3   @   K   | ]  }|j                   d k(  s|  yw)r?   Nr
   .0r!   s     r   	<genexpr>zGTestListSkills.test_summary_has_name_and_description.<locals>.<genexpr>Y   s     ?1!&&J*>Q?   u   내 스킬 설명N)r   r   lennextr   r    r	   r9   skills       r   %test_summary_has_name_and_descriptionz4TestListSkills.test_summary_has_name_and_descriptionQ   sU    jR	
 X&6{a???  $7777r   c                     t        |dd       t        |      }t        d |D        d      }|J d|j                  v sJ y)u8   YAML frontmatter 없을 때 # 헤딩에서 설명 추출plain-skillu)   # 플레인 스킬 설명

본문 내용
c              3   @   K   | ]  }|j                   d k(  s|  yw)rM   NrB   rC   s     r   rE   zFTestListSkills.test_description_fallback_to_heading.<locals>.<genexpr>`   s     CA166]+BaCrF   Nu   플레인 스킬 설명)r   r   rH   r   rI   s       r   $test_description_fallback_to_headingz3TestListSkills.test_description_fallback_to_heading\   sK    x0^_X&CCTJ   (E,=,====r   c                 (    t        |      }|g k(  sJ y)u!   빈 디렉토리는 빈 리스트Nr   r8   s      r   !test_empty_dir_returns_empty_listz0TestListSkills.test_empty_dir_returns_empty_listd   s    X&||r   c                 (    t        d      }|g k(  sJ y)u1   존재하지 않는 디렉토리는 빈 리스트z/nonexistent/skills/dirNrQ   )r    r9   s     r   'test_nonexistent_dir_returns_empty_listz6TestListSkills.test_nonexistent_dir_returns_empty_listi   s    67||r   c                    t         j                         st        j                  d       t	        t               }t        |      dkD  sJ |D ]8  }t        |j                  t              sJ t        |j                        dkD  r8J  y)u.   실제 스킬 디렉토리에서 로드 성공u   스킬 디렉토리 없음r   N)		SKILL_DIRexistspytestskipr   rG   r6   r
   str)r    r9   r!   s      r   test_real_skills_dirz#TestListSkills.test_real_skills_dirn   sl    !KK45Y'6{Q 	#Aaffc***qvv;?"?	#r   c                 f    t        |dd       t        |      }|D ]  }t        |t              rJ  y)u*   반환 항목이 SkillSummary 인스턴스s1z#---
name: s1
description: desc
---
N)r   r   r6   r   )r    r	   r9   items       r   $test_returns_skill_summary_instancesz3TestListSkills.test_returns_skill_summary_instancesx   s8    x'PQX& 	2DdL111	2r   r#   )r%   r&   r'   r(   r   r:   r=   rK   rO   rR   rT   r[   r_   r)   r   r   r3   r3   <   s    !($ (4 (
' 
' 
'	8d 	8t 	8>T >d >$ 4 

#2T 2d 2r   r3   c                   h    e Zd ZdZdeddfdZdeddfdZdeddfdZdeddfdZdeddfd	Z	dd
Z
y)TestViewSkillu   view_skill() 테스트r	   r   Nc                 ^    d}t        |d|       t        |d      }t        |t              sJ y)u   SkillDetail 반환uZ   ---
name: my-skill
description: 설명
triggers:
  - trigger1
  - trigger2
---
# my-skill
r?   N)r   r   r6   r   r    r	   r   details       r   test_returns_skill_detailz'TestViewSkill.test_returns_skill_detail   s7    G 	 	xW5Hj1&+...r   c                 z    d}t        |d|       t        |d      }d|j                  v sJ d|j                  v sJ y)u#   YAML frontmatter의 triggers 파싱uH   ---
name: t-skill
description: 설명
triggers:
  - ship
  - deploy
---
zt-skillshipdeployN)r   r   r.   rc   s       r   %test_parses_triggers_from_frontmatterz3TestViewSkill.test_parses_triggers_from_frontmatter   sJ    5 	 	xG4Hi0(((6??***r   c                     t        |dd       t        |d      }t        |j                        j	                         sJ y)u   full_path가 절대 경로z	abs-skillz'---
name: abs-skill
description: d
---
N)r   r   r   r0   is_absolute)r    r	   rd   s      r   test_full_path_is_absolutez(TestViewSkill.test_full_path_is_absolute   s8    x.[\Hk2F$$%11333r   c                 x    t        j                  t              5  t        |d       ddd       y# 1 sw Y   yxY w)/   존재하지 않는 스킬은 FileNotFoundErrorznonexistent-skillN)rX   raisesFileNotFoundErrorr   r    r	   s     r   !test_raises_for_nonexistent_skillz/TestViewSkill.test_raises_for_nonexistent_skill   s/    ]],- 	6x!45	6 	6 	6   09c                 \    d}t        |d|       t        |d      }|j                  dk(  sJ y)u   description 필드 추출u;   ---
name: d-skill
description: 상세 설명 텍스트
---
zd-skillu   상세 설명 텍스트N)r   r   r   rc   s       r   test_description_extractedz(TestViewSkill.test_description_extracted   s4    SxG4Hi0!!%>>>>r   c                    t         dz  j                         st        j                  d       t	        t         d      }|j
                  dk(  sJ t        |j                        dkD  sJ |j                  j                  d      sJ y)u   실제 retro 스킬 상세 뷰retrou   retro 스킬 없음r   r   N)
rV   rW   rX   rY   r   r
   rG   r.   r0   endswith)r    rd   s     r   test_real_retro_skillz#TestViewSkill.test_real_retro_skill   so    G#++-KK-.Iw/{{g%%%6??#a'''((444r   r#   )r%   r&   r'   r(   r   re   ri   rl   rr   ru   ry   r)   r   r   ra   ra      si     /$ /4 /	+d 	+t 	+44 4D 46$ 64 6
?4 ?D ?5r   ra   c                   H    e Zd ZdZdeddfdZdeddfdZdeddfdZd	dZy)
TestLoadSkillu   load_skill() 테스트r	   r   Nc                 ^    d}t        |d|       t        |d      }t        |t              sJ y)u
   str 반환u   # 스킬 내용

본문.
z
full-skillN)r   r   r6   rZ   r    r	   r   r9   s       r   test_returns_stringz!TestLoadSkill.test_returns_string   s/    0xw7Hl3&#&&&r   c                 F    d}t        |d|       t        |d      }d|v sJ y)u   SKILL.md 전체 내용 반환uB   ---
name: full
description: d
---
# 제목

본문 전체 내용.
fullu   본문 전체 내용N)r   r   r}   s       r   test_returns_full_contentz'TestLoadSkill.test_returns_full_content   s-    ]x1Hf-%///r   c                 x    t        j                  t              5  t        |d       ddd       y# 1 sw Y   yxY w)rn   zno-such-skillN)rX   ro   rp   r   rq   s     r   rr   z/TestLoadSkill.test_raises_for_nonexistent_skill   s.    ]],- 	2x1	2 	2 	2rs   c                     t         dz  j                         st        j                  d       t	        t         d      }t        |      dkD  sJ d|v sJ y)u   실제 pdf 스킬 전체 로드pdfu   pdf 스킬 없음d   PDFN)rV   rW   rX   rY   r   rG   )r    r   s     r   test_real_pdf_skillz!TestLoadSkill.test_real_pdf_skill   sL    E!))+KK+,Y.7|c!!!r   r#   )	r%   r&   r'   r(   r   r~   r   rr   r   r)   r   r   r{   r{      sC     'D 'T '0$ 04 02$ 24 2
 r   r{   )r(   systempfilepathlibr   rX   pathinsertrZ   __file__parentutils.skill_loaderr   r   r   r   r   rV   r   r   r+   r3   ra   r{   r)   r   r   <module>r      s    / 
    3tH~,,33::; <  -.	T  s t ' '2 2$A2 A2H15 15h   r   