
    [i'                        d 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
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        4/home/jay/workspace/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                 h   d}|j                  |d      }d}||u}|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
z   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z  dz  dz  |z  }|j                  } |       }	|	st        j                  d|       dz   dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |	      dz  }
t        t        j                  |
            dx}}	|j                  } |       }	|	sddt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |	      dz  }
t        t        j                  |
            dx}}	g d}|D ]  }||z  }|j                  } |       }	|	st        j                  d|       dz   dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |	      dz  }
t        t        j                  |
            dx}}	 y)u>   Lv.3(critical)에서 3문서 디렉토리 + 파일 3개 생성z	task-1872   levelNis notz%(py0)s is not %(py3)sresultpy0py3u&   _create_task_docs가 None을 반환함
>assert %(py5)spy5z5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstancer   )r=   py1py2py4r    plansr#   u%   디렉토리가 생성되지 않음: C
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}expected_dirr=   rC   rD   zAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.is_dir
}()
}plan.mdzcontext-notes.mdzchecklist.mdu   파일이 생성되지 않음: fpath)_create_task_docs
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgAssertionError_format_explanationrA   r   r*   is_dir)selfr1   r   task_idr;   @py_assert2@py_assert1@py_format4@py_format6@py_assert3@py_format5rG   expected_filesr.   rK   s                  r   #test_create_docs_for_critical_levelz6TestCreateTaskDocs.test_create_docs_for_critical_levelQ   s   //q/A "KvT!KKKvTKKKKKKvKKKvKKKTKKK#KKKKKKK&$''''''''z'''z''''''&'''&''''''$'''$''''''''''  (*W4w>H""\"$\$\\(Ml^&\\\\\\\|\\\|\\\"\\\$\\\\\\""$"$$$$$$$$|$$$|$$$"$$$$$$$$$$ I# 	ME 5(E<<L<>L>LL%DUG#LLLLLLL5LLL5LLL<LLL>LLLLLL	Mr   c           	         d}|j                  |d       |dz  dz  dz  |z  }g d}|D ]*  }||z  }|j                  } |       }	|	st        j                  d|       d	z   d
t	        j
                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |	      dz  }
t        t        j                  |
            dx}}	|j                  d      }|j                  }d}	 ||	      }|st        j                  | d      dz   dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |	      t        j                  |      dz  }t        t        j                  |            dx}x}	}|j                  dd      }|d| j                         }t        j                  |      }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}}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}}|d   }||k(  }|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%|d    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}}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)-uR   생성된 파일의 YAML frontmatter에 task_id, type, scope, status 필드 존재ztask-1872.1r5   r6   r    rE   r#   rI   u   파일 없음: rF   rK   rH   Nr$   r%   z---u   : YAML frontmatter 없음zN
>assert %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.startswith
}(%(py4)s)
}content)r=   rC   rD   py6rX   )in)z%(py1)s in %(py3)sdata)rB   r>   u   : task_id 필드 없음r?   r@   typeu   : type 필드 없음scopeu   : scope 필드 없음statusu   : status 필드 없음==)z%(py1)s == %(py3)su!   : task_id 치환 실패 (기대: u
   , 실제: )z{date})not in)z%(py1)s not in %(py3)su   : {date} 치환 미완료z	{task_id}u   : {task_id} 치환 미완료)rL   r*   rM   rS   rO   rP   rQ   rR   rT   rU   r,   
startswithindexstripyaml	safe_loadrN   )rW   r1   r   rX   rG   r_   r.   rK   rZ   r]   r^   rb   @py_assert5@py_format7end_idx	yaml_textre   @py_assert0rY   r[   r\   s                        r   test_yaml_frontmatter_validz.TestCreateTaskDocs.test_yaml_frontmatter_validh   s   &&wa&8(*W4w>HH# 	XE 5(E<<<<><><<_UG#<<<<<<<5<<<5<<<<<<<><<<<<<oowo7G%%QeQ%e,Q,QQ7P.QQQQQQQ7QQQ7QQQ%QQQeQQQ,QQQQQQmmE1-G'*002I>>),DG9$GGG9GGG9GGGGGGGGGGGGG/F&GGGGGGGA6T>AAA6TAAA6AAAAAATAAATAAAAeW,@#AAAAAAAC7d?CCC7dCCC7CCCCCCdCCCdCCCCug-B$CCCCCCCE8t#EEE8tEEE8EEEEEEtEEEtEEEEw.D%EEEEEEE 	??g-?g?gg%8YZaYbblmqr{m|l}}~/ Q87*QQQ87QQQ8QQQQQQ7QQQ7QQQQug5P,QQQQQQQW;g-WWW;gWWW;WWWWWWgWWWgWWWW%8V/WWWWWWWW+	Xr   c                    d}dddd}d}|j                  |d      }g |j                  fd}||_        	 |dk\  r|j                  ||       |_        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      dz   d|iz  }t        t        j                  |            dx}x}
}	|dz  dz  dz  |z  }|j                  } |       }| }	|	st        j                  d|       dz   dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        t        j                  |            dx}x}}	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securityr{   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   ri   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenr   r=   rB   r>   rc   u=   normal 레벨에서 _create_task_docs가 호출되면 안 됨
>assert %(py8)spy8Nr    rE   r#   u:   normal 레벨에서 디렉토리가 생성되면 안 됨: zG
>assert not %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}rG   rH   )r   rL   r   rM   rN   rO   rP   rQ   rR   rS   rT   rU   r*   )rW   r1   r   rX   _level_to_int	level_str
docs_levelr   rY   rr   @py_assert4rs   @py_format9rG   rZ   r]   r\   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`{a```{a``````s```s``````6```6```{```a```!````````  (*W4w>H&&u&(u((u(uu,fgsft*uuuuuuu<uuu<uuu&uuu(uuuuuu .9L*s   I 	Ic                 R   d}|j                  |d       |dz  dz  dz  |z  }|dz  }|j                  } |       }|sdd	t        j                         v st	        j
                  |      rt	        j                  |      nd	t	        j                  |      t	        j                  |      d
z  }t        t	        j                  |            dx}}|j                  d      }	|	dz   }
|j                  |
d       |j                  |d      }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}}|j                  d      }||
k(  }|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z   d|iz  }t        t	        j                  |            d}y)u1   이미 존재하는 파일은 덮어쓰지 않음z	task-1874r5   r6   r    rE   r#   rJ   zAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}	plan_filerH   Nr$   r%   u   
# 추가된 내용r8   r:   result2r<   zassert %(py5)sr@   ri   )z%(py0)s == %(py2)safter_contentmodified_content)r=   rC   u@   기존 파일이 덮어써짐: 덮어쓰기 금지 정책 위반z
>assert %(py4)srD   )rL   r*   rO   rP   rM   rQ   rR   rT   rU   r,   r+   rN   rS   )rW   r1   r   rX   rG   r   rZ   r]   r^   original_contentr   r   rY   r[   r\   r   @py_format3s                    r   test_no_overwrite_existing_docsz2TestCreateTaskDocs.test_no_overwrite_existing_docs   s    	&&wa&8(*W4w>H 9,	!!!!!!!!!y!!!y!!!!!!!!!!!!! %...@+.DD-@ 000B #"wd""""wd""""""w"""w"""d""""""" "++W+= 00ttt} 0tttttt}ttt}tttttt 0ttt 0tttt2tttttttr   c                    g d}|D ]  }|j                  |d      }d}||u }|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}} |dz  dz  dz  }
|
j                         rDt        |
j                               }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|       dz   d|iz  }t        t        j                  |            dx}x}}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   N)is)z%(py0)s is %(py3)sr;   r<   u   잘못된 task_id 'u1   '에 대해 None이 반환되어야 함, 실제: r?   r@   r    rE   r#   r   ri   r   r   created_dirsr   u0   잘못된 task_id로 디렉토리가 생성됨: r   r   )rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   r*   r   iterdirr   )rW   r1   r   invalid_idsbad_idr;   rY   rZ   r[   r\   
tasks_rootr   rr   r   rs   r   s                   r   test_invalid_task_id_rejectedz0TestCreateTaskDocs.test_invalid_task_id_rejected   s   	
 " 	{F!33F!3DF!z6T>zzz6Tzzzzzz6zzz6zzzTzzz%8@qrxqy#zzzzzzz	{
 (72W<

 2 2 45L|$ll$)lll$llllll3lll3llllll|lll|lll$llllll-]^j]k+llllllll r   N)	__name__
__module____qualname____doc__r`   rw   r   r   r    r   r   r3   r3   K   s%    ,
M.XD#vPu:mr   r3   )r   builtinsrO   _pytest.assertion.rewrite	assertionrewriterM   r
   r   typespathlibr   pytestrp   
ModuleTyper   r   r   REAL_WORKSPACEr)   r(   fixturer1   r3   r   r   r   <module>r      s    7   	 
    D U5E5E 2 bjjnn%57LMN"Y.<{J   .Ym Ymr   