
    (<i                         d 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 ddl	Z	dej                  fdZ e	j                         defd       Z e	j                         d        Z G d	 d
      Zy)u  
test_dispatch_memory_check.py

dispatch._check_memory_before_dispatch() 단위 테스트 (모리건 작성)

테스트 항목:
- MEMORY.md 없을 때 graceful skip (debug 로그)
- ★ 항목 추출 → info 로그 확인
- 디자인 키워드 + dev 팀 → warning 로그
- 디자인 키워드 + non-dev 팀 → warning 없음
- 디자인 키워드 없음 + dev 팀 → warning 없음
- ★ 링크된 .md 파일 읽기 시도
    N)Path)patchreturnc                  n   t        t        j                  j                  dd            } t	        |       t
        j                  vr)t
        j                  j                  dt	        |              t        t
        j                  j                               D ]  }|dk(  s	t
        j                  |=  ddl}|S )u@   dispatch 모듈을 sys.modules에서 캐시 없이 로드한다.WORKSPACE_ROOTz/home/jay/workspacer   dispatchN)r   osenvirongetstrsyspathinsertlistmoduleskeysr   )	workspacemod_name	_dispatchs      Q/home/jay/workspace/.worktrees/task-2057-dev2/tests/test_dispatch_memory_check.py_get_dispatch_moduler      s    RZZ^^$46KLMI
9~SXX%3y>* ))+, &z!H%& !    c                 6    | dz  }|j                  dd       |S )uA   테스트용 memory 디렉토리 (실제 파일 시스템 격리)memoryT)parentsexist_ok)mkdir)tmp_pathds     r   
memory_dirr    3   s#     	8AGGD4G(Hr   c                 4    t               }t        |d|        |S )u<   _MEMORY_BASE_PATH가 memory_dir로 교체된 dispatch 모듈_MEMORY_BASE_PATH)r   setattr)r    mods     r   dispatch_modr%   ;   s     
 CC$j1Jr   c                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	TestCheckMemoryBeforeDispatchu-   _check_memory_before_dispatch() 동작 검증c                    |j                  t        j                  d      5  |j                  dd       ddd       |j                  D cg c]"  }|j
                  t        j                  k\  s!|$ }}t        |      dk(  sJ |j                  D cg c]"  }|j
                  t        j                  k(  s!|$ }}t        |      dk\  sJ y# 1 sw Y   xY wc c}w c c}w )uL   MEMORY.md가 없으면 예외 없이 반환하고 debug 로그를 남긴다.r   logger	dev1-teamu   일반 작업입니다Nr      )at_levelloggingDEBUG_check_memory_before_dispatchrecordslevelnoWARNINGlen)selfr%   caplogrwarning_recordsdebug_recordss         r    test_memory_check_no_memory_filez>TestCheckMemoryBeforeDispatch.test_memory_check_no_memory_fileL   s     __W]]:_> 	^66{D\]	^ '-nnU		W__8T1UU?#q((( %+NNQqaii7==6PQQ=!Q&&&	^ 	^ V Rs#   C"C.C"C5CCc                 f   |dz  }|j                  dd       |j                  t        j                  d      5  |j	                  dd       d	d	d	       |j
                  D cg c]"  }|j                  t        j                  k(  s!|$ }}t        |      d
k\  sJ d       y	# 1 sw Y   VxY wc c}w )u]   ★ 항목 2개가 있는 MEMORY.md → star_items 개수 관련 info 로그가 출력된다.	MEMORY.mdu   # 메모리
- 일반 항목
★ [팀 라우팅 가이드](feedback_design_team_routing_v2.md)
★ [배포 체크리스트](deploy_checklist.md)
utf-8encodingr   r)   r+   u   일반 작업Nr,   u+   ★ 항목 추출 후 info 로그가 없음)	
write_textr-   r.   r/   r0   r1   r2   INFOr4   )r5   r%   r    r6   	memory_mdr7   info_recordss          r   &test_memory_check_star_items_extractedzDTestCheckMemoryBeforeDispatch.test_memory_check_star_items_extracted[   s    ,	B  	 	
 __W]]:_> 	U66{OT	U $*>>OaQYY',,5NOO< A%T'TT%		U 	U P   B"#"B.B."B+c                 f   |dz  }|j                  dd       |j                  t        j                  d      5  |j	                  dd       d	d	d	       |j
                  D cg c]"  }|j                  t        j                  k\  s!|$ }}t        |      d
k\  sJ d       y	# 1 sw Y   VxY wc c}w )uM   task_desc에 '배너' + team_id='dev1-team' 조합 → logger.warning 호출.r<   @   # 메모리
★ [라우팅](feedback_design_team_routing_v2.md)
r=   r>   r   r)   r+      배너 제작 작업입니다Nr,   u<   디자인 키워드 + dev 팀인데 warning 로그가 없음	r@   r-   r.   r/   r0   r1   r2   r3   r4   r5   r%   r    r6   rB   r7   r8   s          r   1test_memory_check_design_keyword_dev_team_warningzOTestCheckMemoryBeforeDispatch.test_memory_check_design_keyword_dev_team_warningm   s    ,	P 	 	
 __W]]:_> 	e66{Dcd	e '-nnU		W__8T1UU?#q(h*hh(		e 	e VrE   c                 f   |dz  }|j                  dd       |j                  t        j                  d      5  |j	                  dd       d	d	d	       |j
                  D cg c]"  }|j                  t        j                  k\  s!|$ }}t        |      d
k(  sJ d       y	# 1 sw Y   VxY wc c}w )uC   task_desc에 '배너' + team_id='design' → warning 로그 없음.r<   rG   r=   r>   r   r)   designrH   Nr   u-   non-dev 팀인데 warning 로그가 발생함rI   rJ   s          r   8test_memory_check_design_keyword_non_dev_team_no_warningzVTestCheckMemoryBeforeDispatch.test_memory_check_design_keyword_non_dev_team_no_warning{   s    ,	P 	 	
 __W]]:_> 	b66xA`a	b '-nnU		W__8T1UU?#q(Y*YY(		b 	b VrE   c                 f   |dz  }|j                  dd       |j                  t        j                  d      5  |j	                  dd       d	d	d	       |j
                  D cg c]"  }|j                  t        j                  k\  s!|$ }}t        |      d
k(  sJ d       y	# 1 sw Y   VxY wc c}w )uU   디자인 키워드 없는 task_desc + team_id='dev1-team' → warning 로그 없음.r<   rG   r=   r>   r   r)   r+   u   API 서버 버그 수정Nr   u<   디자인 키워드가 없는데 warning 로그가 발생함rI   rJ   s          r   .test_memory_check_no_design_keyword_no_warningzLTestCheckMemoryBeforeDispatch.test_memory_check_no_design_keyword_no_warning   s    ,	P 	 	
 __W]]:_> 	`66{D^_	` '-nnU		W__8T1UU?#q(h*hh(		` 	` VrE   c                   	
 |dz  }|j                  dd       |dz  }|j                  dd       g 
t        j                  		
fd}t        j                  t        d|      5  |j                  t        j                  d	
      5  |j                  dd       ddd       ddd       
D cg c]  }|j                   }}d|v sJ d       y# 1 sw Y   6xY w# 1 sw Y   :xY wc c}w )uN   ★ 항목에 링크된 .md 파일이 실제 존재하면 파일을 읽는다.zdeploy_checklist.mdu/   # 배포 체크리스트
- 단계 1
- 단계 2
r=   r>   r<   u>   # 메모리
★ [배포 체크리스트](deploy_checklist.md)
c                 >    j                  |         | g|i |S )N)append)r5   argskwargsoriginal_read
read_pathss      r   _spy_read_textzYTestCheckMemoryBeforeDispatch.test_memory_check_linked_files_read.<locals>._spy_read_text   s&    d# 7777r   	read_textr   r)   r+   u   배포 진행Nu?   ★ 항목에 링크된 deploy_checklist.md가 읽히지 않음)
r@   r   rY   r   objectr-   r.   r/   r0   name)r5   r%   r    r6   linked_filerB   rX   p
read_namesrV   rW   s            @@r   #test_memory_check_linked_files_readzATestCheckMemoryBeforeDispatch.test_memory_check_linked_files_read   s     !#88S^ef,	N 	 	

 "$
	8 \\$^< 	YzB Y::;XY	Y '11aff1
1$
2u4uu2	Y Y	Y 	Y 2s*   &"CCC/C(C	CC%N)
__name__
__module____qualname____doc__r:   rD   rK   rN   rP   r_    r   r   r'   r'   H   s(    7'U$iZivr   r'   )rc   r.   r	   r   typespathlibr   unittest.mockr   pytest
ModuleTyper   fixturer    r%   r'   rd   r   r   <module>rk      s     	 
    e.. , D    gv gvr   