
    Si'                        d Z ddlZddlZddlZddlmZ ddlZddlZdedej                  fdZ	 eej                  j                  dd            Zed	z  d
z  dz  Zg dZ ej                         d        Z G d d      Zy)u1   dispatch.py _create_task_docs() 단위 테스트.    N)Pathtmp_pathreturnc                    t        t        j                  j                  dd            }t	        |      t
        j                  vr)t
        j                  j                  dt	        |             ddl}t        t
        j                  j                               D ]  }|dk(  s	t
        j                  |=  ddl}| |_        |S )uF   dispatch 모듈을 tmp_path를 WORKSPACE로 설정하여 로드한다.WORKSPACE_ROOT/home/jay/workspacer   Ndispatch)r   osenvirongetstrsyspathinsertprompts.team_promptslistmoduleskeysr	   	WORKSPACE)r   	workspacepromptsmod_name	_dispatchs        N/home/jay/workspace/.worktrees/task-2117-dev1/tests/test_dispatch_task_docs.py_load_dispatch_with_workspacer      s    RZZ^^$46KLMI
9~SXX%3y>*   ))+, &z!H%& ! #I    r   r   r   	templates	task-docs)zplan.template.mdzcontext-notes.template.mdzchecklist.template.mdc                 L   | dz  j                  dd       | dz  dz  j                  dd       | dz  dz  dz  }|j                  dd       t        D ]B  }t        |z  }|j                         s||z  j	                  |j                  d	      d	       D t        |       }|S )
uU   격리된 WORKSPACE를 사용하는 dispatch 모듈 반환 + 템플릿 파일 복사.memoryT)parentsexist_oktasksr   r   r   utf-8encoding)mkdirTEMPLATE_FILESREAL_TEMPLATE_DIRexists
write_text	read_textr   )r   tmpl_dirfnamesrcmods        r   dispatch_modr1   3   s     t<7"))$)F )#k1K?HNN4$N/ ]%'::<))#---*IT[)\]
 (
1CJr   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestCreateTaskDocsu"   _create_task_docs 함수 테스트c                 ,   d}|j                  |d      }|J d       t        |t              sJ |dz  dz  dz  |z  }|j                         s
J d	|        |j	                         sJ g d
}|D ]!  }||z  }|j                         rJ d|         y)u>   Lv.3(critical)에서 3문서 디렉토리 + 파일 3개 생성z	task-1872   levelNu&   _create_task_docs가 None을 반환함r    plansr#   u%   디렉토리가 생성되지 않음: plan.mdzcontext-notes.mdzchecklist.mdu   파일이 생성되지 않음: )_create_task_docs
isinstancer   r*   is_dir)	selfr1   r   task_idresultexpected_direxpected_filesr.   fpaths	            r   #test_create_docs_for_critical_levelz6TestCreateTaskDocs.test_create_docs_for_critical_levelQ   s    //q/A !K#KK!&$'''  (*W4w>H""$\(Ml^&\\$""$$$ I# 	ME 5(E<<>L%DUG#LL>	Mr   c                 J   d}|j                  |d       |dz  dz  dz  |z  }g d}|D ]  }||z  }|j                         s
J d|        |j                  d	
      }|j                  d      s
J | d       |j	                  dd      }	|d|	 j                         }
t        j                  |
      }d|v s
J | d       d|v s
J | d       d|v s
J | d       d|v s
J | d       |d   |k(  sJ | d| d|d    d       d|vs
J | d       d|vrJ | d        y)uR   생성된 파일의 YAML frontmatter에 task_id, type, scope, status 필드 존재ztask-1872.1r5   r6   r    r8   r#   r9   u   파일 없음: r$   r%   z---u   : YAML frontmatter 없음r?   u   : task_id 필드 없음typeu   : type 필드 없음scopeu   : scope 필드 없음statusu   : status 필드 없음u!   : task_id 치환 실패 (기대: u
   , 실제: )z{date}u   : {date} 치환 미완료z	{task_id}u   : {task_id} 치환 미완료N)r;   r*   r,   
startswithindexstripyaml	safe_load)r>   r1   r   r?   rA   rB   r.   rC   contentend_idx	yaml_textdatas               r   test_yaml_frontmatter_validz.TestCreateTaskDocs.test_yaml_frontmatter_validh   s   &&wa&8(*W4w>HH# 	XE 5(E<<><_UG#<<>oowo7G%%e,Q7P.QQ,mmE1-G'*002I>>),D$G/F&GG$T>AeW,@#AA>d?Cug-B$CC?t#Ew.D%EE# 	?g-%8YZaYbblmqr{m|l}}~/- 7*Qug5P,QQ*g-W%8V/WW-+	Xr   c                 F  	
 d}dddd}d}|j                  |d      }g 	|j                  
	
fd}||_        	 |dk\  r|j                  ||       
|_        t        	      dk(  sJ d	       |d
z  dz  dz  |z  }|j                         r
J d|        y# 
|_        w xY w)u  Lv.2(normal)에서는 함수가 None 반환하고 디렉토리 미생성

        dispatch() 내부 로직: _docs_level >= 3 조건에서만 _create_task_docs 호출.
        함수 자체는 level 인자를 받지만, 실제 레벨 판단은 dispatch()에서 수행.
        level=2로 직접 호출 시에도 함수는 정상 동작(디렉토리 생성)할 수 있으나,
        dispatch() 흐름에서는 level<3이면 호출되지 않음을 검증한다.
        z	task-1873   r5      )normalcriticalsecurityrW   c                 <    j                  | |f        | |      S )N)append)tidlvcalledoriginal_fns     r   _tracking_fnzFTestCreateTaskDocs.test_no_docs_for_normal_level.<locals>._tracking_fn   s     MM3)$sB''r   r   u=   normal 레벨에서 _create_task_docs가 호출되면 안 됨r    r8   r#   u:   normal 레벨에서 디렉토리가 생성되면 안 됨: N)r   r;   lenr*   )r>   r1   r   r?   _level_to_int	level_str
docs_levelr`   rA   r^   r_   s            @@r   test_no_docs_for_normal_levelz0TestCreateTaskDocs.test_no_docs_for_normal_level   s      $%!C	"&&y!4
"44	( *6&	9Q..w
C-8L* 6{a`!``  (*W4w>H&&(u,fgsft*uu(( .9L*s   B 	B c                 6   d}|j                  |d       |dz  dz  dz  |z  }|dz  }|j                         sJ |j                  d	      }|d
z   }|j                  |d	       |j                  |d      }|J |j                  d	      }	|	|k(  sJ d       y)u1   이미 존재하는 파일은 덮어쓰지 않음z	task-1874r5   r6   r    r8   r#   r:   r$   r%   u   
# 추가된 내용Nu@   기존 파일이 덮어써짐: 덮어쓰기 금지 정책 위반)r;   r*   r,   r+   )
r>   r1   r   r?   rA   	plan_fileoriginal_contentmodified_contentresult2after_contents
             r   test_no_overwrite_existing_docsz2TestCreateTaskDocs.test_no_overwrite_existing_docs   s     	&&wa&8(*W4w>H 9,	!!! %...@+.DD-@ 000B """ "++W+= 00t2tt0r   c                     g d}|D ]$  }|j                  |d      }|J d| d|         |dz  dz  d	z  }|j                         r2t        |j                               }t	        |      d
k(  s
J d|        yy)u3   path traversal 등 잘못된 task_id는 None 반환)z../etc/passwdztask-1872/../../../etc	task_1872z	Task-1872ztask-abcztask- ztask-1872 maliciousr5   r6   Nu   잘못된 task_id 'u1   '에 대해 None이 반환되어야 함, 실제: r    r8   r#   r   u0   잘못된 task_id로 디렉토리가 생성됨: )r;   r*   r   iterdirra   )r>   r1   r   invalid_idsbad_idr@   
tasks_rootcreated_dirss           r   test_invalid_task_id_rejectedz0TestCreateTaskDocs.test_invalid_task_id_rejected   s    	
 " 	{F!33F!3DF>z%8@qrxqy#zz>	{
 (72W<

 2 2 45L|$)l-]^j]k+ll) r   N)	__name__
__module____qualname____doc__rD   rS   re   rl   ru    r   r   r3   r3   K   s%    ,
M.XD#vPu:mr   r3   )ry   r
   r   typespathlibr   pytestrM   
ModuleTyper   r   r   REAL_WORKSPACEr)   r(   fixturer1   r3   rz   r   r   <module>r      s    7 	 
    D U5E5E 2 bjjnn%57LMN"Y.<{J   .Ym Ymr   