
    l?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
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      7/home/jay/workspace/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(  }|st        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  }dd|iz  }	t        t        j                  |	            dx}x}}|j                  D cg c]"  }|j
                  t        j                  k(  s!|$ }
}t        |
      }d}||k\  }|st        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  }dd|iz  }	t        t        j                  |	            dx}x}}y# 1 sw Y   xY wc c}w c c}w )uL   MEMORY.md가 없으면 예외 없이 반환하고 debug 로그를 남긴다.r   logger	dev1-teamu   일반 작업입니다Nr   ==z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenwarning_recordspy0py1py3py6zassert %(py8)spy8   >=z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)sdebug_records)at_levelloggingDEBUG_check_memory_before_dispatchrecordslevelnoWARNINGr/   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation)selfr%   caplogrr0   @py_assert2@py_assert5@py_assert4@py_format7@py_format9r;   s              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(#q((((#q((((((s(((s((((((?(((?(((#(((q((((((( %+NNQqaii7==6PQQ=!&Q&!Q&&&&!Q&&&&&&s&&&s&&&&&&=&&&=&&&!&&&Q&&&&&&&	^ 	^ V Rs#   K"K.K"K5KKc                    |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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	# 1 sw Y   ix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   일반 작업Nr7   r8   r:   r/   info_recordsr1   u+   ★ 항목 추출 후 info 로그가 없음
>assert %(py8)sr6   )
write_textr<   r=   r>   r?   r@   rA   INFOr/   rC   rD   rE   rF   rG   rH   _format_assertmsgrI   rJ   )rK   r%   r    rL   	memory_mdrM   rY   rN   rO   rP   rQ   rR   s               r   &test_memory_check_star_items_extractedzDTestCheckMemoryBeforeDispatch.test_memory_check_star_items_extracted[   s2   ,	B  	 	
 __W]]:_> 	U66{OT	U $*>>OaQYY',,5NOO< TAT A%TTT ATTTTTTsTTTsTTTTTT<TTT<TTT TTTATTT'TTTTTTTT		U 	U P   F4#"GG4F>c                    |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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	# 1 sw Y   ixY wc c}w )uM   task_desc에 '배너' + team_id='dev1-team' 조합 → logger.warning 호출.rU   @   # 메모리
★ [라우팅](feedback_design_team_routing_v2.md)
rV   rW   r   r)   r+      배너 제작 작업입니다Nr7   r8   r:   r/   r0   r1   u<   디자인 키워드 + dev 팀인데 warning 로그가 없음rZ   r6   r[   r<   r=   r>   r?   r@   rA   rB   r/   rC   rD   rE   rF   rG   rH   r]   rI   rJ   rK   r%   r    rL   r^   rM   r0   rN   rO   rP   rQ   rR   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?#hqh#q(hhh#qhhhhhhshhhshhhhhh?hhh?hhh#hhhqhhh*hhhhhhhh		e 	e Vr`   c                    |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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	# 1 sw Y   ixY wc c}w )uC   task_desc에 '배너' + team_id='design' → warning 로그 없음.rU   rb   rV   rW   r   r)   designrc   Nr   r,   r.   r/   r0   r1   u-   non-dev 팀인데 warning 로그가 발생함rZ   r6   rd   re   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?#YqY#q(YYY#qYYYYYYsYYYsYYYYYY?YYY?YYY#YYYqYYY*YYYYYYYY		b 	b Vr`   c                    |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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	# 1 sw Y   ixY wc c}w )uU   디자인 키워드 없는 task_desc + team_id='dev1-team' → warning 로그 없음.rU   rb   rV   rW   r   r)   r+   u   API 서버 버그 수정Nr   r,   r.   r/   r0   r1   u<   디자인 키워드가 없는데 warning 로그가 발생함rZ   r6   rd   re   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?#hqh#q(hhh#qhhhhhhshhhshhhhhh?hhh?hhh#hhhqhhh*hhhhhhhh		` 	` Vr`   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 }
|
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# 1 sw Y   xY w# 1 sw Y   xY wc c}w )uN   ★ 항목에 링크된 .md 파일이 실제 존재하면 파일을 읽는다.zdeploy_checklist.mdu/   # 배포 체크리스트
- 단계 1
- 단계 2
rV   rW   rU   u>   # 메모리
★ [배포 체크리스트](deploy_checklist.md)
c                 >    j                  |         | g|i |S )N)append)rK   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   배포 진행N)in)z%(py1)s in %(py3)s
read_names)r3   r4   u?   ★ 항목에 링크된 deploy_checklist.md가 읽히지 않음z
>assert %(py5)spy5)r[   r   rt   r   objectr<   r=   r>   r?   namerC   rD   rH   rE   rF   rG   r]   rI   rJ   )rK   r%   r    rL   linked_filer^   rs   prv   @py_assert0rN   @py_format4@py_format6rq   rr   s                @@r   #test_memory_check_linked_files_readzATestCheckMemoryBeforeDispatch.test_memory_check_linked_files_read   sJ    !#88S^ef,	N 	 	

 "$
	8 \\$^< 	YzB Y::;XY	Y '11aff1
1$u$
2uuu$
uuu$uuuuuu
uuu
uuuu4uuuuuuu	Y Y	Y 	Y 2s*   &"FF F/F F		FFN)
__name__
__module____qualname____doc__rS   r_   rf   ri   rk   r    r   r   r'   r'   H   s(    7'U$iZivr   r'   )r   builtinsrE   _pytest.assertion.rewrite	assertionrewriterC   r=   r	   r   typespathlibr   unittest.mockr   pytest
ModuleTyper   fixturer    r%   r'   r   r   r   <module>r      s      	 
    e.. , D    gv gvr   