
    ſi                       d Z ddlmZ ddlZddlmZ ddlZ ed      Z ee      ej                  vr"ej                  j                  d ee             ddlmZmZ  G d d      Z ej                         dd	       Zdd
ZddZddZddZddZddZddZddZddZddZddZ	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 ddZddZy)u   task-2410: 3문서 API 테스트.

dashboard.routes_get 의 handle_get_three_docs_list / handle_get_three_docs_doc
핸들러가 type 화이트리스트, path traversal, 정상 조회 시나리오를
올바르게 처리하는지 검증한다.
    )annotationsN)Pathz/home/jay/workspace)handle_get_three_docs_dochandle_get_three_docs_listc                      e Zd ZddZy)_FakeLoaderc                     y N )selfs    Q/home/jay/workspace/.worktrees/task-2487-B-dev2/tests/dev7/test_three_docs_api.py
reload_allz_FakeLoader.reload_all   s        N)returnNone)__name__
__module____qualname__r   r   r   r   r   r      s    r   r   c                     t               S r
   )r   r   r   r   loaderr      s
    =r   c                    t        d|       \  }}|dk(  sJ t        |t              sJ t        |      dkD  sJ |d   }h dt	        |      k  sJ |d   dk(  sJ y )Nz/api/three-docs?type=system   r   >   idtypetitlehas_plan
updated_athas_checklisthas_context_notesr   system)r   
isinstancelistlenset)r   codedataitems       r   test_list_system_returns_arrayr(   &   so    +,I6RJD$3;;dD!!!t9q==7Dbfijnfoooo<8###r   c                    t        d|       \  }}|dk(  sJ t        |t              sJ t        |      dk\  sJ t	        d |D              sJ y )Nz/api/three-docs?type=projectr      c              3  ,   K   | ]  }|d    dk(    yw)r   projectNr   .0r'   s     r   	<genexpr>z2test_list_project_returns_array.<locals>.<genexpr>6   s     :TtF|y(:   )r   r!   r"   r#   allr   r%   r&   s      r   test_list_project_returns_arrayr3   0   sS    +,JFSJD$3;;dD!!!t9>>:T::::r   c                    t        d|       \  }}|dk(  sJ t        |t              sJ t        |      dk\  sJ t	        d |D              sJ t        ||dd        D ]  \  }}|d   |d   k\  rJ  y )Nz/api/three-docs?type=taskr   r*   c              3  ,   K   | ]  }|d    dk(    yw)r   taskNr   r-   s     r   r/   z6test_list_task_returns_array_sorted.<locals>.<genexpr>>   s     7$tF|v%7r0   r   )r   r!   r"   r#   r1   zip)r   r%   r&   prevcurrs        r   #test_list_task_returns_array_sortedr:   9   s    +,GPJD$3;;dD!!!t9>>7$7777$QR) 8
dL!T,%77778r   c                <    t        d|       \  }}|dk(  sJ d|v sJ y )Nz/api/three-docs?type=evil  errorr   r2   s      r   "test_list_invalid_type_returns_400r?   D   s+    +,GPJD$3;;d??r   c                0    t        d|       \  }}|dk(  sJ y )Nz/api/three-docsr<   r>   r   r%   _s      r   "test_list_missing_type_returns_400rC   J   s    ():FCGD!3;;r   c                0    t        d|       \  }}|dk(  sJ y )Nz)/api/three-docs/system/..%2F..%2Fetc/planr<   r   rA   s      r   test_doc_path_traversal_blockedrF   R   s     '(SU[\GD!3;;r   c                0    t        d|       \  }}|dk(  sJ y )Nz&/api/three-docs/project/ins%2Furo/planr<   rE   rA   s      r   !test_doc_topic_with_slash_blockedrH   W   s     '(PRXYGD!3;;r   c                0    t        d|       \  }}|dk(  sJ y )Nz/api/three-docs/evil/topic/planr<   rE   rA   s      r   test_doc_invalid_type_blockedrJ   \   s    '(I6RGD!3;;r   c                0    t        d|       \  }}|dk(  sJ y )Nz*/api/three-docs/system/3docs-schema/secretr<   rE   rA   s      r   test_doc_invalid_doc_blockedrL   a   s     '(TV\]GD!3;;r   c                <    t        d|       \  }}|dk(  sJ d|v sJ y )Nz*/api/three-docs/system/anu-guide/checklist  expected_pathrE   r2   s      r   !test_doc_missing_file_returns_404rP   f   s.    *+WY_`JD$3;;d"""r   c                    t        d|       \  }}|dk(  sJ d|v sJ d|v sJ d|v sJ |d   dk(  sJ |d   d	k(  sJ |d
   dk(  sJ y )Nz-/api/three-docs/project/anu-guide-system/planr   contentsizemtimedocplantopiczanu-guide-systemr   r,   rE   r2   s      r   'test_doc_valid_project_plan_returns_200rX   m   s    *7JD$ 3;;T>>d??;&   =....<9$$$r   c                   ddl m} dz  }|j                          |dz  j                  dd       |j                  dfd}|j                  |d	|       t        d
|       \  }}|dk(  sJ d|v sJ |d   j                  d      sJ y)u\   task topic에 plan.md만 있을 때 context-notes 요청 → 404 + expected_path 키 포함.r   Nmy-task-topicplan.md# My Task Plan
utf-8encodingc                "    | dk(  rS  |       S Nr6   r   doc_typeorig_get_basetmp_paths    r   
_fake_basezVtest_404_response_includes_expected_path_for_missing_context_notes.<locals>._fake_base       vOX&&r   _three_docs_get_base_dirz0/api/three-docs/task/my-task-topic/context-notesrN   rO   zcontext-notes.mdrc   strdashboard.routes_get
routes_getmkdir
write_textrh   setattrr   endswith	r   re   monkeypatchrg	topic_dirrf   r%   r&   rd   s	    `      @r   Btest_404_response_includes_expected_path_for_missing_context_notesrv   ~   s     & ?*IOO&&'9G&L //M'
 6
C*:FJD$ 3;;d""" ))*<===r   c                   ddl m} dz  }|j                          |dz  j                  dd       |j                  dfd}|j                  |d	|       t        d
|       \  }}|dk(  sJ d|v sJ |d   j                  d      sJ y)uX   task topic에 plan.md만 있을 때 checklist 요청 → 404 + expected_path 키 포함.r   NrZ   r[   r\   r]   r^   c                "    | dk(  rS  |       S ra   r   rb   s    r   rf   zRtest_404_response_includes_expected_path_for_missing_checklist.<locals>._fake_base   rg   r   rh   z,/api/three-docs/task/my-task-topic/checklistrN   rO   zchecklist.mdri   rk   rr   s	    `      @r   >test_404_response_includes_expected_path_for_missing_checklistry      s     &?*IOO&&'9G&L//M'
 6
C*6JD$ 3;;d""" )).999r   c                4   ddl m} dz  j                  dd       |j                  dfd}|j	                  |d|       t        d	|       \  }}|d
k(  sJ d|v sJ t        d|       \  }}|d
k(  sJ d|v sJ t        d|       \  }}|dk(  sJ d|v sJ y)uO   system 타입 단독 .md 파일: context-notes/checklist → 404, plan → 200.r   Nzfoo.mdz
# Foo Doc
r]   r^   c                "    | dk(  rS  |       S )Nr    r   rb   s    r   rf   zGtest_system_single_md_returns_404_for_non_plan_docs.<locals>._fake_base   s    xOX&&r   rh   z(/api/three-docs/system/foo/context-notesrN   rO   z$/api/three-docs/system/foo/checklistz/api/three-docs/system/foo/planr   rR   ri   )rl   rm   ro   rh   rp   r   )r   re   rs   rt   rf   r%   r&   rd   s    `     @r   3test_system_single_md_returns_404_for_non_plan_docsr|      s     & $$]W$E//M'
 6
C ++UW]^JD$3;;d""" ++QSYZJD$3;;d""" ++LfUJD$3;;r   c                N    t        d|       \  }}|dk(  sJ d|v sJ d|d   v sJ y)uQ   doc 이름이 올바르지 않을 때 → 400 + error 키 + 'Invalid doc' 포함.z//api/three-docs/system/3docs-schema/invalid-docr<   r=   zInvalid docNrE   r2   s      r   4test_400_response_has_error_key_for_invalid_doc_namer~      sA    *96JD$ 3;;d??DM)))r   )r   r   )r   r   r   r   )r   r   re   r   rs   zpytest.MonkeyPatchr   r   ) __doc__
__future__r   syspathlibr   pytestWORKSPACE_ROOTrj   pathinsertrl   r   r   r   fixturer   r(   r3   r:   r?   rC   rF   rH   rJ   rL   rP   rX   rv   ry   r|   r~   r   r   r   <module>r      s#   # 
  +,~chh&HHOOAs>*+ 
  $;8



#%">>#'>6H>	>:::#':6H:	:6#'6H	D*r   