
    Ni6$                     V   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mZmZ ddlZ eej                   j#                  dd            Z ee      e	j(                  vr"e	j(                  j+                  d ee             ddlmZ  G d d      Z G d	 d
      Z G d d      Zy)uf   
test_composite_prompt.py

build_composite_prompt() 및 관련 함수 테스트 (아르고스 작성)
    N)Path)patch	MagicMockWORKSPACE_ROOTz/home/jay/workspacec                   (    e Zd ZdZd Zd Zd Zd Zy)TestLoadLogicalTeamAgentsu%   _load_logical_team_agents() 테스트c                 @    t         j                  j                          y)u"   각 테스트 전 캐시 초기화Ntp_TEAM_AGENT_CACHEclearselfs    2/home/jay/workspace/tests/test_composite_prompt.pysetup_methodz&TestLoadLogicalTeamAgents.setup_method   s    
""$    c                    dddddid}|dz  dz  }|j                  d	
       |dz  j                  t        j                  |      d       t	        j
                  t        dt        |            5  t        j                  d      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                   |            dx}}d}|d   }	||	v }|slt        j                  d|fd||	f      t        j                  |      t        j                  |	      dz  }
dd|
iz  }t        t        j                   |            dx}x}}	ddd       y# 1 sw Y   yxY w)u.   org-details JSON 파일이 존재하면 로드zmarketing-teamapollo	   아폴론u   콘텐츠 크리에이터)nameroleteam_idmembers_detailmemoryorg-detailsTparentszmarketing-team.jsonutf-8encodingr   	marketingr   inz%(py1)s in %(py3)sresultpy1py3assert %(py5)spy5N)z%(py1)s in %(py4)s)r(   py4zassert %(py6)spy6)mkdir
write_textjsondumpsr   objectr   str_load_logical_team_agents
@pytest_ar_call_reprcompare	_saferepr@py_builtinslocals_should_repr_global_nameAssertionError_format_explanation)r   tmp_path	team_data
detail_dirr&   @py_assert0@py_assert2@py_format4@py_format6@py_assert3@py_format5@py_format7s               r   test_loads_existing_jsonz2TestLoadLogicalTeamAgents.test_loads_existing_json   sJ    ('+Gb)cd
	 (=8
&	+	+77

98MX_7`\\".H> 	811+>F#-#v----#v---#------v---v-------7v&67787777787777877777777777	8 	8 	8s   2D:F55F>c                    di d}|dz  dz  }|j                  d       |dz  j                  t        j                  |      d	       t	        j
                  t        d
t        |            5  t        j                  d      }t        j                  d      }||u }|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  }dd|iz  }t        t        j                   |            d}ddd       y# 1 sw Y   yxY w)u6   같은 팀을 두 번 로드하면 캐시에서 반환zdesign-teamr   r   r   Tr   zdesign-team.jsonr   r    r   design)is)z%(py0)s is %(py2)sresult1result2)py0py2zassert %(py4)sr,   N)r.   r/   r0   r1   r   r2   r   r3   r4   r5   r6   r8   r9   r:   r7   r;   r<   )	r   r=   r>   r?   rK   rL   @py_assert1@py_format3rE   s	            r   test_caches_resultz,TestLoadLogicalTeamAgents.test_caches_result,   s    -D	(=8
&	(	(44TZZ	5JU\4]\\".H> 	&228<G228<Gg%%%%7g%%%%%%7%%%7%%%%%%g%%%g%%%%%%%	& 	& 	&s   -C9E//E8c                    t        j                  t        dt        |            5  t        j                  d      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd	|iz  }t        t        j                  |            d
x}}d
d
d
       y
# 1 sw Y   y
xY w)uA   JSON 파일이 없으면 TEAM_INFO에서 members 문자열 사용r   r"   membersr#   r%   r&   r'   r*   r+   N)r   r2   r   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   )r   r=   r&   r@   rA   rB   rC   s          r   test_fallback_to_team_infoz4TestLoadLogicalTeamAgents.test_fallback_to_team_info8   s    \\".H> 	'11+>F&9&&&&9&&&9&&&&&&&&&&&&&&&&	' 	' 	's   B;C))C2N)__name__
__module____qualname____doc__r   rG   rQ   rT    r   r   r   r      s    /%8
&'r   r   c                   L    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zy)TestBuildCompositePromptu"   build_composite_prompt() 테스트c                 @    t         j                  j                          y )Nr
   r   s    r   r   z%TestBuildCompositePrompt.setup_methodB   s    
""$r   c                     t        j                  t        d      5  t        j                  ddgdd       ddd       y# 1 sw Y   yxY w)u)   허용되지 않은 팀 ID → ValueErroru   허용되지 않은 팀 IDmatchr"   invalidtask-1.1	test descNpytestraises
ValueErrorr   build_composite_promptr   s    r   "test_defense_in_depth_invalid_teamz;TestBuildCompositePrompt.test_defense_in_depth_invalid_teamE   sA    ]]:-IJ 	Y%%{I&>
KX	Y 	Y 	Ys	   ?Ac                     t        j                  t        d      5  t        j                  dgdd       ddd       y# 1 sw Y   yxY w)u   2개 미만 팀 → ValueErroru   2개 이상r^   r"   ra   rb   Nrc   r   s    r   !test_defense_in_depth_single_teamz:TestBuildCompositePrompt.test_defense_in_depth_single_teamJ   s=    ]]:]; 	N%%{mZM	N 	N 	Ns	   >Ac           	      x   ddddddii}t        j                  t        dt        |            5  t        j                  t        d|	      5  |d
z  dz  j	                  dd       t        j
                  ddgdd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d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  }d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  }d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  }dd|iz  }t        t        j                  |            dx}}ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)u&   2팀 조합 프롬프트 정상 생성r   agent1Agent1Role1sonnet)r   r   modelr   r4   return_valuer   tasksTr   exist_okr"   rI   task-test.1u   테스트 작업u   임시팀장r#   r%   promptr'   r*   r+   Nr   r2   r   r3   r.   rg   r5   r6   r7   r8   r9   r:   r;   r<   r   r=   mock_agentsrw   r@   rA   rB   rC   s           r    test_two_teams_prompt_generationz9TestBuildCompositePrompt.test_two_teams_prompt_generationO   s    8WxP

 \\".H> 		&\\"9T		& 7*11$1N..h'8JF "+>V++++>V+++>++++++V+++V+++++++ *=F****=F***=******F***F*******(;&((((;&(((;((((((&(((&(((((((%8v%%%%8v%%%8%%%%%%v%%%v%%%%%%%		& 		& 		& 		& 		& 		&s$   L0KL$L0$L-	)L00L9c           	         di i}t        j                  t        dt        |            5  t        j                  t        d|      5  |dz  dz  j	                  dd       t        j
                  d	d
gddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            dx}}ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)u!   critical 레벨 → 헤더 포함r   r   r4   rq   r   rs   Trt   r"   rI   rv   testcriticallevelz
[CRITICAL]r#   r%   rw   r'   r*   r+   Nrx   ry   s           r   test_critical_level_headerz3TestBuildCompositePrompt.test_critical_level_headera       ',\\".H> 	*\\"9T	* 7*11$1N..h'jF  )<6))))<6)))<))))))6)))6)))))))	* 	* 	* 	* 	* 	*$   D=CD1 D=1D:	6D==Ec           	         di i}t        j                  t        dt        |            5  t        j                  t        d|      5  |dz  dz  j	                  dd       t        j
                  d	d
gddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            dx}}ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)u!   security 레벨 → 헤더 포함r   r   r4   rq   r   rs   Trt   r"   rI   rv   r}   securityr   z
[SECURITY]r#   r%   rw   r'   r*   r+   Nrx   ry   s           r   test_security_level_headerz3TestBuildCompositePrompt.test_security_level_headerl   r   r   c           	         di i}t        j                  t        dt        |            5  t        j                  t        d|      5  |dz  dz  j	                  dd       t        j
                  d	d
gdd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d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  }dd|iz  }t        t        j                  |            dx}}ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)u6   marketing+design 조합 → 전용 핸드오프 필드r   r   r4   rq   r   rs   Trt   r"   rI   rv   r}      톤앤매너r#   r%   rw   r'   r*   r+   Nu
   CTA 문구rx   ry   s           r   test_handoff_fields_dynamicz4TestBuildCompositePrompt.test_handoff_fields_dynamicw   sI   ',\\".H> 	*\\"9T	* 7*11$1N..h'F "+>V++++>V+++>++++++V+++V+++++++)<6))))<6)))<))))))6)))6)))))))	* 	* 	* 	* 	* 	*s$   G E=GG G	G  G)c           	         di i}t        j                  t        dt        |            5  t        j                  t        d|      5  |dz  dz  j	                  dd       t        j
                  g d	d
d      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            dx}}ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)u-   3팀 조합 → DEFAULT_HANDOFF_FIELDS 사용r   r   r4   rq   r   rs   Trt   )r"   rI   
consultingrv   r}   u   핵심 결정사항r#   r%   rw   r'   r*   r+   Nrx   ry   s           r   +test_default_handoff_fields_for_three_teamszDTestBuildCompositePrompt.test_default_handoff_fields_for_three_teams   s    ',\\".H> 	3\\"9T	3 7*11$1N..5}fF )2(F2222(F222(222222F222F2222222	3 	3 	3 	3 	3 	3s$   D;CD/D;/D8	4D;;Ec           	         di i}t        j                  t        dt        |            5  t        j                  t        d|      5  |dz  dz  j	                  dd       t        j
                  d	d
gdd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d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  }d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  }d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  }d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  }d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  }d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  }d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  }d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  }dd|iz  }t        t        j                  |            dx}}ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)u,   프롬프트에 9개 섹션 키워드 포함r   r   r4   rq   r   rs   Trt   r"   rI   rv   r}   u   작업 지시r#   r%   rw   r'   r*   r+   Nu   팀별 에이전트u   Phase 관리 프로토콜u   핸드오프 규격zQuality Gateu   보고서 규칙u   토큰 관리u   완료 마무리zfinish-task.shrx   ry   s           r   !test_prompt_contains_all_sectionsz:TestBuildCompositePrompt.test_prompt_contains_all_sections   s   ',\\".H> 	.\\"9T	. 7*11$1N..h'F #,?f,,,,?f,,,?,,,,,,f,,,f,,,,,,,(2(F2222(F222(222222F222F2222222.8.&8888.&888.888888&888&8888888(2(F2222(F222(222222F222F2222222!+>V++++>V+++>++++++V+++V+++++++%/%////%///%////////////////",?f,,,,?f,,,?,,,,,,f,,,f,,,,,,,%/%////%///%////////////////#-#v----#v---#------v---v-------	. 	. 	. 	. 	. 	.s$   Y#X YY#Y 	Y##Y,c           
         di i}t        j                  t        dt        |            5  t        j                  t        d|      5  |dz  dz  j	                  dd       t        j
                  d	d
gdd       |dz  d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}||k(  }	|	st        j                  d|	fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}x}x}	}ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)u    task_desc가 파일로 저장됨r   r   r4   rq   r   rs   Trt   r"   rI   rv   u   테스트 작업 내용ztask-test.1.mdzAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}	task_file)rM   rN   r,   Nr   r    )==)zX%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.read_text
}(encoding=%(py4)s)
} == %(py9)s)rM   rN   r,   r-   py9zassert %(py11)spy11)r   r2   r   r3   r.   rg   existsr8   r9   r5   r:   r7   r;   r<   	read_textr6   )r   r=   rz   r   rO   rD   rE   @py_assert5@py_assert8@py_assert7@py_format10@py_format12s               r   test_task_file_createdz/TestBuildCompositePrompt.test_task_file_created   s   ',\\".H> 	V\\"9T	V 7*11$1N%%h'8Q !8+g58HHI##%#%%%%%%%%9%%%9%%%#%%%%%%%%%%&&UU&8U<UU8<UUUUU8<UUUUUUU9UUU9UUU&UUUUUU8UUU<UUUUUUUU	V 	V 	V 	V 	V 	Vs$   IG#H:)I:I	?IIN)rU   rV   rW   rX   r   rh   rj   r{   r   r   r   r   r   r   rY   r   r   r[   r[   ?   s:    ,%Y
N
&$	*	*
*	3.&Vr   r[   c                       e Zd ZdZd Zd Zy)TestAssembleCompositePromptu4   _assemble_composite_prompt() 내부 함수 테스트c           	         dddddddiiddd	d
dddiid}t        j                  ddg|dgdddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d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  }d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  }d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  }dd|iz  }t        t        j                  |            dx}}y)u;   members_detail이 dict인 경우 에이전트 목록 생성r   r   r   u	   콘텐츠haikuzcontent-strategy)r   r   rp   mapped_skill	benzaitenu   벤자이텐u	   템플릿ro   zsatori-cardnewsr"   rI   r"   rI   r   ra   /tmp/task.mdnormalNr#   r%   rw   r'   r*   r+   
r   _assemble_composite_promptr5   r6   r7   r8   r9   r:   r;   r<   r   team_agentsrw   r@   rA   rB   rC   s          r   test_agents_with_dict_membersz9TestAssembleCompositePrompt.test_agents_with_dict_members   s    !{KRYk}~# !.+X`  sD  "E#
 ..(#[>2B$
 ${f$$$${f$$${$$$$$$f$$$f$$$$$$$'~''''~'''~''''''''''''''''!+!V++++!V+++!++++++V+++V+++++++ * F**** F*** ******F***F*******r   c           	         ddiddid}t        j                  ddg|dgdd	d
d      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            dx}}y)u)   members가 문자열인 경우 (fallback)rS   u"   아폴론, 페이토, 에이레네u   벤자이텐, 비너스r   r"   rI   r   ra   r   r   Nr#   r%   rw   r'   r*   r+   r   r   s          r   test_agents_with_string_membersz;TestAssembleCompositePrompt.test_agents_with_string_members   s     $%IJ ";<
 ..(#[>2B$
 4=3v====3v===3======v===v=======r   N)rU   rV   rW   rX   r   r   rY   r   r   r   r      s    >+.
>r   r   )rX   builtinsr8   _pytest.assertion.rewrite	assertionrewriter5   r0   ossyspathlibr   unittest.mockr   r   rd   environget
_WORKSPACEr3   pathinsertprompts.team_promptsteam_promptsr   r   r[   r   rY   r   r   <module>r      s      	 
  * "**..!13HIJ
z?#(("HHOOAs:' !&' &'RmV mV`$> $>r   