
    mVi.e                        d Z ddlZddlZddlZddlZddlZddlmZ ddlm	Z	m
Z
 ddlZ ed      Z ee      ej                  vr"ej                  j                  d ee             edz  Zedz  Zd Z G d	 d
      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Zy)u   
test_task_179_1.py - task-179.1 테스트 코드 (헤임달, 테스터)

테스트 대상:
  1. /home/jay/workspace/scripts/project-map.py
  2. /home/jay/workspace/prompts/team_prompts.py
  3. /home/jay/workspace/dispatch.py
    N)Path)	MagicMockpatchz/home/jay/workspacescriptsproject-map.pyc                      ddl } | j                  j                  dt        t                    }| j                  j                  |      }|j                  j                  |       |S )u8   scripts/project-map.py를 모듈로 로드하여 반환.r   Nproject_map)importlib.utilutilspec_from_file_locationstrPROJECT_MAP_SCRIPTmodule_from_specloaderexec_module)	importlibspecmods      1/home/jay/workspace/teams/dev2/test_task_179_1.pyload_project_map_moduler   "   sL    >>11-EWAXYD
..
)
)$
/CKKC J    c                       e Zd ZdZd Zy)TestProjectMapEmptyuR   빈 디렉토리에서 generate_markdown 실행 시 '없음' 섹션 표시 확인.c                     t               }|dz  }|j                  ||dd      }d|v sJ d|v sJ d|v sJ d|v sJ d	|v sJ d
|v sJ d|v sJ d|v sJ y )Nmap.md   Fproject_rootoutput_pathdepthinclude_testsz# Project Map:z## Directory Treez## Types & Interfacesz## API Routesz## Componentsu!   _(타입/인터페이스 없음)_u   _(API 라우트 없음)_u   _(컴포넌트 없음)_)r   generate_markdown)selftmp_pathpmoutput_filecontents        r   &test_empty_dir_produces_valid_markdownz:TestProjectMapEmpty.test_empty_dir_produces_valid_markdown4   s    $&)&&!#	 ' 
  7*** #g---&'111')))'))) 3g===)W444(G333r   N)__name__
__module____qualname____doc__r(    r   r   r   r   1   s
    \4r   r   c                   2    e Zd ZdZdedefdZd Zd Zd Zy)	TestProjectMapNextjsuN   Next.js 프로젝트 시뮬레이션 - 파일 생성 후 추출 결과 검증.r$   returnc                     |dz  dz  dz  }|j                  d       |dz  j                  dd	       |d
z  }|j                  d       |dz  j                  dd	       |dz  }|j                  d       |dz  j                  dd	       |S )u>   테스트용 Next.js 유사 프로젝트 파일 트리 생성.appapisearchTparentszroute.tszexport async function GET(req: Request) { return new Response('ok'); }
export async function POST(req: Request) { return new Response('ok'); }
utf-8encoding
componentszSearchBar.tsxz8export default function SearchBar() { return <div />; }
typeszmodel.tszgexport interface SearchResult { id: string; title: string; }
export type SearchQuery = { q: string; };
mkdir
write_text)r#   r$   	route_dircomp_dir	types_dirs        r   _setup_projectz#TestProjectMapNextjs._setup_projectQ   s     u$u,x7	%	Z	++X 	, 	
 l*t$	O	#//G 	0 	
 w&	%	Z	++: 	, 	
 r   c                     t               }| j                  |      }|dz  }|j                  ||dd      }d|v sJ d|v sJ d|v sJ y )Nr   r   Fr   GETPOSTz/api/searchr   rB   r"   r#   r$   r%   rootr&   r'   s         r   test_api_routes_extractedz.TestProjectMapNextjs.test_api_routes_extractedo   sq    $&""8,)&&#	 ' 
    '''r   c                 z    t               }| j                  |      }|dz  }|j                  ||dd      }d|v sJ y )Nr   r   Fr   	SearchBarrF   rG   s         r   test_components_extractedz.TestProjectMapNextjs.test_components_extracted   sU    $&""8,)&&#	 ' 
 g%%%r   c                     t               }| j                  |      }|dz  }|j                  ||dd      }d|v sJ d|v sJ y )Nr   r   Fr   SearchResultSearchQueryrF   rG   s         r   test_types_extractedz)TestProjectMapNextjs.test_types_extracted   sc    $&""8,)&&#	 ' 
 ((('''r   N)	r)   r*   r+   r,   r   rB   rI   rL   rP   r-   r   r   r/   r/   N   s'    Xt  <("&(r   r/   c                       e Zd ZdZd Zd Zy)TestProjectMapExcludePatternsuK   제외 패턴 (node_modules, .git, __pycache__) 트리에서 제외 확인.c                 x   t               }|dz  j                          |dz  dz  j                          |dz  j                          |dz  j                          |dz  j                          |dz  dz  j                  d       |j                  |d|	      }d
j	                  |      }d|vsJ d|vsJ d|v sJ y )Nnode_modulessome_pkg.git__pycache__srczindex.tszexport const x = 1;r   r    r   
r   r=   r>   
build_treejoin)r#   r$   r%   
tree_lines	tree_texts        r   test_excluded_dirs_not_in_treez<TestProjectMapExcludePatterns.test_excluded_dirs_not_in_tree   s    $& 
N	"))+	N	"Z	/668	F	!!#	M	!((* 
E	  "	E	J	&223HI]]818]L
IIj)	 Y...I--- 	!!!r   c                 >   t               }|j                  d      du sJ |j                  d      du sJ |j                  d      du sJ |j                  d      du sJ |j                  d      du sJ |j                  d      du sJ |j                  d	      du sJ y )
NrT   TrV   rW   z.nextdistrX   Fr:   )r   is_excluded_dirr#   r%   s     r   test_is_excluded_dir_functionz;TestProjectMapExcludePatterns.test_is_excluded_dir_function   s    $&!!.1T999!!&)T111!!-0D888!!'*d222!!&)T111!!%(E111!!,/5888r   N)r)   r*   r+   r,   r`   re   r-   r   r   rR   rR      s    U".	9r   rR   c                       e Zd ZdZd Zd Zy)TestProjectMapDepthu\   --depth 옵션: depth=1 시 하위 디렉토리는 보이지만 더 깊은 곳은 미표시.c                     t               }|dz  dz  dz  }|j                  d       |dz  j                  d       |j                  |d|	      }d
j	                  |      }d|v sJ d|vsJ d|vsJ y )NrX   r:   uiTr5   
Button.tsx#export default function Button() {}   rY   rZ   r[   r#   r$   r%   deepr^   r_   s         r   #test_depth_1_hides_deep_directoriesz7TestProjectMapDepth.test_depth_1_hides_deep_directories   s    $& %,.5

4
 		(()NO ]]818]L
IIj)		!!!9,,,9$$$r   c                     t               }|dz  dz  dz  }|j                  d       |dz  j                  d       |j                  |d|	      }d
j	                  |      }d|v sJ d|v sJ d|vsJ y )NrX   r:   ri   Tr5   rj   rk      rY   rZ   r[   rm   s         r   !test_depth_2_shows_one_level_deepz5TestProjectMapDepth.test_depth_2_shows_one_level_deep   s    $&%,.5

4
 		(()NO ]]818]L
IIj)		!!!y(((9$$$r   N)r)   r*   r+   r,   ro   rr   r-   r   r   rg   rg      s    f% %r   rg   c                   .    e Zd ZdZdefdZd Zd Zd Zy)TestProjectMapIncludeTestsu7   --include-tests: 테스트 파일 포함/제외 확인.r$   c                     |dz  }|j                          |dz  j                  d       |dz  j                  d       |dz  }|j                          |dz  j                  d       y	)
uG   테스트 파일과 일반 파일이 함께 있는 프로젝트 생성.r;   user.tsz&export interface User { id: string; }
user.test.tsz.export interface TestUser { testId: string; }
	__tests__zspec.tsz,export interface SpecData { data: string; }
Nr<   )r#   r$   rA   test_dirs       r   _create_test_projectz/TestProjectMapIncludeTests._create_test_project   sr     w&		Y	**5	

 
^	#//=	

 k)	I	));	
r   c                     t               }| j                  |       |j                  |d      }dj                  |j	                               }d|vsJ d|v sJ y )NFr!    rw   rv   r   rz   extract_types_interfacesr]   keysr#   r$   r%   	types_map	all_filess        r   test_exclude_tests_by_defaultz8TestProjectMapIncludeTests.test_exclude_tests_by_default  s`    $&!!(+///N	HHY^^-.	 Y...I%%%r   c                     t               }| j                  |       |j                  |d      }dj                  |j	                               }d|v sJ d|v sJ y )NTr|   r}   rv   rw   r~   r   s        r   test_include_tests_flagz2TestProjectMapIncludeTests.test_include_tests_flag  s`    $&!!(+///M	HHY^^-.	 I%%%***r   c                     t               }|j                  d      du sJ |j                  d      du sJ |j                  d      du sJ |j                  d      du sJ |j                  d      du sJ y )Nzsrc/__tests__/foo.tsTzfoo.test.tszfoo.spec.tszsrc/components/Button.tsxFztypes/model.ts)r   is_test_pathrd   s     r   test_is_test_path_functionz5TestProjectMapIncludeTests.test_is_test_path_function  s    $&56$>>>}-555}-555:;uDDD/0E999r   N)	r)   r*   r+   r,   r   rz   r   r   r   r-   r   r   rt   rt      s     A
T 
*
&	+:r   rt   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestBuildProjectMapSectionu,   _build_project_map_section 함수 테스트.c                     ddl m} |j                  |dt        |             d}|dz  dz  }|j	                  d       || d	z  j                  d
       |j                  |      }d|v sJ ||v sJ y)u[   project-map 파일이 존재하면 프롬프트에 '프로젝트 구조 맵' 섹션 포함.r   NWORKSPACE_ROOTztest-projectmemoryproject-mapsTr5   .mdu"   # Project Map
테스트 맵 내용   프로젝트 구조 맵)prompts.team_promptsteam_promptssetattrr   r=   r>   _build_project_map_section)r#   r$   monkeypatchtp
project_idmap_dirresults          r   (test_project_map_exists_includes_sectionzCTestBuildProjectMapSection.test_project_map_exists_includes_section*  s    ) 	B 0#h-@ $
X%6d#	j\%	%112WX..z:(F222V###r   c                     ddl m} |j                  |dt        |             |dz  dz  }|j	                  d       |j                  d      }|d	k(  sJ y)
uB   project-map 파일이 존재하지 않으면 빈 문자열 반환.r   Nr   r   r   Tr5   znonexistent-project )r   r   r   r   r=   r   )r#   r$   r   r   r   r   s         r   )test_project_map_not_exists_returns_emptyzDTestBuildProjectMapSection.test_project_map_not_exists_returns_empty<  sX    )B 0#h-@ X%6d#../DE||r   c                 x    ddl m} |j                  |dt        |             |j	                  d      }|dk(  sJ y)u.   project_id가 None이면 빈 문자열 반환.r   Nr   r   )r   r   r   r   r   )r#   r$   r   r   r   s        r   "test_project_id_none_returns_emptyz=TestBuildProjectMapSection.test_project_id_none_returns_emptyJ  s8    )B 0#h-@..t4||r   c                    ddl m} |j                  |dt        |             d}|dz  dz  }|j	                  d       || d	z  j                  d
       |dz  dz  }|j	                  d       |j                  ddd|      }d|v sJ y)uY   build_prompt 호출 시 project-map이 있으면 반환된 프롬프트에 섹션 포함.r   Nr   	myprojectr   r   Tr5   r   z# Project Maptasks	dev2-teamz
task-179.1u   테스트 작업team_idtask_id	task_descr   r   )r   r   r   r   r=   r>   build_prompt)r#   r$   r   r   r   r   	tasks_dirprompts           r   .test_build_prompt_includes_project_map_sectionzITestBuildProjectMapSection.test_build_prompt_includes_project_map_sectionT  s    )B 0#h-@ !
X%6d#	j\%	%11/Bx''1	% (!	 ! 
 )F222r   c                     ddl m} |j                  |dt        |             |dz  dz  }|j	                  d       |j                  dd	d
d      }d|vsJ y)u\   build_prompt 호출 시 project-map이 없으면 반환된 프롬프트에 섹션 미포함.r   Nr   r   r   Tr5   r   z
task-179.2u   테스트 작업 2zno-such-projectr   r   )r   r   r   r   r=   r   )r#   r$   r   r   r   r   s         r   >test_build_prompt_excludes_project_map_section_when_not_existszYTestBuildProjectMapSection.test_build_prompt_excludes_project_map_section_when_not_existsl  sj     	*B 0#h-@x''1	% *(	 ! 
 )666r   N)	r)   r*   r+   r,   r   r   r   r   r   r-   r   r   r   r   '  s    6$$307r   r   c                       e Zd ZdZd Zd Zy)TestDispatchRefreshMapFlagu2   --refresh-map 플래그 argparse 파싱 테스트.c                    ddl }|j                         }|j                  ddd       |j                  ddd       |j                  d	d
       |j                  dd       |j                  dd       |j                  dd       |j                  d|j                  d       |j	                  g       }|j
                  du sJ y)uE   --refresh-map 미지정 시 기본값 True로 파싱 (자동 갱신).r   N--teamFr   requireddefault--task	test task--levelnormalr   	--session	--project--chain--refresh-mapTactionr   argparseArgumentParseradd_argumentBooleanOptionalAction
parse_argsrefresh_mapr#   r   parserargss       r    test_refresh_map_default_is_truez;TestDispatchRefreshMapFlag.test_refresh_map_default_is_true  s    ((*HukJHukJIx8K6K6It411 	 	
   $4'''r   c                    ddl }|j                         }|j                  ddd       |j                  ddd       |j                  d	d
       |j                  dd       |j                  dd       |j                  dd       |j                  d|j                  d       |j	                  dg      }|j
                  du sJ y)u,   --no-refresh-map 지정 시 False로 파싱.r   Nr   Fr   r   r   r   r   r   r   r   r   r   r   Tr   z--no-refresh-mapr   r   s       r   test_no_refresh_map_disablesz7TestDispatchRefreshMapFlag.test_no_refresh_map_disables  s    ((*HukJHukJIx8K6K6It411 	 	
   "4!565(((r   N)r)   r*   r+   r,   r   r   r-   r   r   r   r     s    <(()r   r   c                   4    e Zd ZdZdefdZd Zd Zd Zd Z	y)	TestDispatchAutoRefreshu=   24시간 기준 자동갱신 및 최신 맵 스킵 테스트.r$   c                    |dz  dz  j                  d       |dz  dz  j                  d       |dz  dz  j                  d       |dz  dz  j                  d       |dz  dz  j                  d       |d	z  d
z  }|j                  d       |dz  }|j                  d       |dz  j                  d       |dz  dz  }|j                  t        j                  di i      d       |dz  dz  j                  d       |S )uA   dispatch() 호출에 필요한 최소 디렉토리 구조 생성.r   r   Tr5   r   eventsreportslogsprojectsr   r   r   z# stubztask-timers.jsonr7   r8   ztask-timer.py)r=   r>   jsondumps)r#   r$   project_dirscripts_dir
timer_files        r   _make_dispatch_envz*TestDispatchAutoRefresh._make_dispatch_env  s/    
H	w	&--d-;	H	~	-44T4B	H	x	'..t.<	H	y	(///=	H	v	%,,T,: +k9$' *$'	'	'33H= (+==
djj'27'J 
H		.::8Dr   c           	         ddl }| j                  |      }|dz  dz  dz  }|j                  d       t        j                         dz
  }t	        j
                  t        |      ||f       |j                  dt        |             ddl}|j                  |d	|       |j                  d
d       |j                  |dddddd       g fd}t        d|      5  |j                  ddddd       ddd       D 	cg c]  }	t        d |	D              r|	 }
}	t        |
      dk\  s
J d        y# 1 sw Y   CxY wc c}	w )uG   mtime이 25시간 전인 경우 → project-map.py 호출되어야 함.r   Nr   r   myproject.md	# Old Map_ r   	WORKSPACECOKACDIR_KEY_DEV2fake-dev2-keyBOT_KEYSfake-anu-keyfake-dev1-keyfake-dev3-keyanudev1dev2dev3c                     j                  |        t               }d|_        t        j                  ddi      |_        d|_        |S Nr   okTr   appendr   
returncoder   r   stdoutstderrcmdkwargsr   captured_callss      r   mock_subprocess_runzRTestDispatchAutoRefresh.test_old_map_triggers_refresh.<locals>.mock_subprocess_run  @    !!#&[F !F JJd|4FMFMMr   dispatch.subprocess.runside_effectr   zrefresh map test taskr   r   Tr   r   levelr   r   c              3   6   K   | ]  }d t        |      v   ywr   Nr   .0args     r   	<genexpr>zHTestDispatchAutoRefresh.test_old_map_triggers_refresh.<locals>.<genexpr>       ?C#s3x/?   rl   u7   project-map.py 호출이 없음. 실제 호출 목록: )r   r   r>   timeosutimer   setenvdispatchr   r   anylen)r#   r$   r   r   envmap_pathold_timedispatch_modr   r   project_map_callsr   s              @r   test_old_map_triggers_refreshz5TestDispatchAutoRefresh.test_old_map_triggers_refresh  sq    %%h/ >N2^CK(99;),
X8 45 	+SX6 	(L+s; 	.@L*!###	7
 	 	 ,:MN 	!!#1&  " 	 *
?3?? 
 
 $%* 	
EnEUV	
*	 	
s   D4>E 4D=c           	        
 | j                  |      }|dz  dz  dz  }|j                  d       t        j                         dz
  }t        j                  t        |      ||f       |j                  dt        |             ddl}|j                  |d	|       |j                  d
d       |j                  |dddddd       g 

fd}t        d|      5  |j                  ddddd       ddd       
D cg c]  }t        d |D              r| }	}t        |	      dk(  s
J d|	        y# 1 sw Y   CxY wc c}w )uA   mtime이 1시간 전인 경우 → project-map.py 호출 안 됨.r   r   r   z# Fresh Mapi  r   r   Nr   r   r   r   r   r   r   r   c                     j                  |        t               }d|_        t        j                  ddi      |_        d|_        |S r   r   r   s      r   r   zQTestDispatchAutoRefresh.test_fresh_map_skips_refresh.<locals>.mock_subprocess_run$  r   r   r   r   r   zfresh map test taskr   r   Tr   c              3   6   K   | ]  }d t        |      v   ywr   r   r  s     r   r  zGTestDispatchAutoRefresh.test_fresh_map_skips_refresh.<locals>.<genexpr>8  r  r  u.   최신 맵인데 project-map.py가 호출됨: r   r>   r  r  r	  r   r
  r  r   r   r  r  )r#   r$   r   r  r  
fresh_timer  r   r   r  r   s             @r   test_fresh_map_skips_refreshz4TestDispatchAutoRefresh.test_fresh_map_skips_refresh  sg   %%h/ >N2^CM*YY[4'

XZ 89+SX6'L+s;.@L*!###	7
 	 	 ,:MN 	!!#/&  " 	 *
?3?? 
 
 $%* 	
<=N<OP	
*	 	
   D0:D<0D9c           	         | j                  |      }|j                  dt        |             ddl}|j	                  |d|       |j                  dd       |j	                  |ddd	dd
d       g fd}t        d|      5  |j                  ddddd       ddd       D cg c]  }t        d |D              r| }}t        |      dk\  s
J d        y# 1 sw Y   CxY wc c}w )uK   project-map 파일이 없는 경우 → project-map.py 호출되어야 함.r   r   Nr   r   r   r   r   r   r   r   c                     j                  |        t               }d|_        t        j                  ddi      |_        d|_        |S r   r   r   s      r   r   zYTestDispatchAutoRefresh.test_map_not_exists_triggers_refresh.<locals>.mock_subprocess_runR  r   r   r   r   r   zno map test taskr   r   Tr   c              3   6   K   | ]  }d t        |      v   ywr   r   r  s     r   r  zOTestDispatchAutoRefresh.test_map_not_exists_triggers_refresh.<locals>.<genexpr>e  r  r  rl   uB   맵 파일 없는데 project-map.py 호출 없음. 실제 호출: )r   r
  r   r  r   r   r  r  )	r#   r$   r   r  r  r   r   r  r   s	           @r   $test_map_not_exists_triggers_refreshz<TestDispatchAutoRefresh.test_map_not_exists_triggers_refresh>  s   %%h/ 	+SX6'L+s;.@L*!###	7
 	 	 ,:MN 	!!#,&  " 	 *
?3?? 
 
 $%* 	
PQ_P`a	
*	 	
s   C&C(C%c           	        
 | j                  |      }|dz  dz  dz  }|j                  d       t        j                         dz
  }t        j                  t        |      ||f       |j                  dt        |             ddl}|j                  |d	|       |j                  d
d       |j                  |dddddd       g 

fd}t        d|      5  |j                  ddddd       ddd       
D cg c]  }t        d |D              r| }	}t        |	      dk(  s
J d|	        y# 1 sw Y   CxY wc c}w )uM   refresh_map=False이면 맵이 오래되어도 project-map.py 호출 안 됨.r   r   r   r   r   r   r   Nr   r   r   r   r   r   r   r   c                     j                  |        t               }d|_        t        j                  ddi      |_        d|_        |S r   r   r   s      r   r   zXTestDispatchAutoRefresh.test_refresh_map_false_skips_always.<locals>.mock_subprocess_run  r   r   r   r   r   zno refresh flag testr   r   Fr   c              3   6   K   | ]  }d t        |      v   ywr   r   r  s     r   r  zNTestDispatchAutoRefresh.test_refresh_map_false_skips_always.<locals>.<genexpr>  r  r  u2   refresh_map=False인데 project-map.py 호출됨: r  )r#   r$   r   r  r  r  r  r   r   r  r   s             @r   #test_refresh_map_false_skips_alwaysz;TestDispatchAutoRefresh.test_refresh_map_false_skips_alwaysk  sg   %%h/ >N2^CK(99;),
X8 45+SX6'L+s;.@L*!###	7
 	 	 ,:MN 	!!#0&! " 	 *
?3?? 
 
 $%* 	
@AR@ST	
*	 	
r  N)
r)   r*   r+   r,   r   r   r  r  r  r"  r-   r   r   r   r     s(    G4 88
t1
f+
Z0
r   r   )r,   r   r   r  sysr  pathlibr   unittest.mockr   r   pytestr   r   pathinsertSCRIPTS_DIRr   r   r   r/   rR   rg   rt   r   r   r   r-   r   r   <module>r*     s      	 
   * 
 +,~chh&HHOOAs>*+y( #33 4 4:O( O(d#9 #9L %  %F6: 6:|W7 W7~)) ))Xi
 i
r   