
    aiqD                     8   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ZddlmZ ddlmZmZ ddlZdedej$                  fdZ ej(                         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_dispatch_workflow.py

dispatch.py의 --workflow 옵션과
image_workflow.py의 build_workflow_overview_prompt() 함수 테스트 (아르고스 작성)

테스트 항목:
- T1: build_workflow_overview_prompt() 기본 동작 (비어있지 않은 문자열, "Phase", "QC" 포함)
- T2: build_workflow_overview_prompt() campaign_type="brand" 파라미터
- T3: dispatch.py argparse에서 --workflow 옵션 인식
- T4: --workflow image-qc-gate 사용 시 task_desc에 워크플로우 프롬프트 prepend 확인
- T5: --workflow 미사용 시 기존 동작 동일 (task_desc 변경 없음)
- T6: build_workflow_overview_prompt() QC 기준 정보 포함 (A-01/글자 겹침, 에스컬레이션)
    N)Path)	MagicMockpatchtmp_pathreturnc                    t        t        j                  j                  dd            }t	        |      t
        j                  vr)t
        j                  j                  dt	        |             ddl}t        t
        j                  j                               D ]  }|dk(  s	t
        j                  |=  ddl}| |_        |S )u   dispatch 모듈을 tmp_path를 WORKSPACE로 설정하여 로드한다.

    test_dispatch.py의 _load_dispatch_with_workspace() 패턴을 따름.
    WORKSPACE_ROOT/home/jay/workspacer   Ndispatch)r   osenvirongetstrsyspathinsertprompts.team_promptslistmoduleskeysr   	WORKSPACE)r   	workspacepromptsmod_name	_dispatchs        3/home/jay/workspace/tests/test_dispatch_workflow.py_load_dispatch_with_workspacer      s    
 RZZ^^$46KLMI
9~SXX%3y>*))+, &z!H%& !"I    c                 v    | dz  j                  dd       | dz  dz  j                  dd       t        |       S )u:   격리된 WORKSPACE를 사용하는 dispatch 모듈 반환memoryT)parentsexist_oktasks)mkdirr   )r   s    r   dispatch_modr%   9   sD     t<7"))$)F(22r   c                   "    e Zd ZdZd Zd Zd Zy)$TestBuildWorkflowOverviewPromptBasicu9   T1: build_workflow_overview_prompt() 기본 동작 검증c                    ddl m}  |d      }t        |t              }|sd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dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      d	z  }t        t        j                  |            d
}t        |      }d}||kD  }|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
)uE   task_id='test-001'로 호출 시 비어있지 않은 문자열 반환r   build_workflow_overview_prompttest-001task_id5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstanceresultr   py0py1py2py4N>z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py6)slenr2   r3   py3py6assert %(py8)spy8prompts.image_workflowr*   r/   r   @py_builtinslocals
@pytest_ar_should_repr_global_name	_safereprAssertionError_format_explanationr9   _call_reprcompare
selfr*   r0   @py_assert3@py_format5@py_assert2@py_assert5@py_assert4@py_format7@py_format9s
             r   test_returns_non_empty_stringzBTestBuildWorkflowOverviewPromptBasic.test_returns_non_empty_stringI   s"   I/
C&#&&&&&&&&z&&&z&&&&&&&&&&&&&&&&&#&&&#&&&&&&&&&&6{Q{Q{Qss66{Qr   c                 l   ddl m}  |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%   반환값에 'Phase' 문자열 포함r   r)   r+   r,   Phaseinz%(py1)s in %(py3)sr0   r3   r;   assert %(py5)spy5N
r@   r*   rC   rH   rE   rA   rB   rD   rF   rG   rJ   r*   r0   @py_assert0rM   @py_format4@py_format6s          r   test_contains_phase_stringz?TestBuildWorkflowOverviewPromptBasic.test_contains_phase_stringQ   sh    I/
C w&    w&   w      &   &       r   c                 l   ddl m}  |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"   반환값에 'QC' 문자열 포함r   r)   r+   r,   QCrU   rW   r0   rX   rY   rZ   Nr[   r\   s          r   test_contains_qc_stringz<TestBuildWorkflowOverviewPromptBasic.test_contains_qc_stringX   sg    I/
Ctv~tvtvvr   N)__name__
__module____qualname____doc__rR   r`   rc    r   r   r'   r'   F   s    C!r   r'   c                   "    e Zd ZdZd Zd Zd Zy)+TestBuildWorkflowOverviewPromptCampaignTypeu,   T2: campaign_type 파라미터 동작 검증c                    ddl m}  |d      }t        |t              }|sd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dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      d	z  }t        t        j                  |            d
}t        |      }d}||kD  }|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
)ug   task_id만으로 호출 시 비어있지 않은 문자열 반환 (campaign_type 파라미터 제거됨)r   r)   r+   r,   r.   r/   r0   r   r1   Nr6   r8   r9   r:   r=   r>   r?   rI   s
             r   +test_brand_campaign_type_included_in_resultzWTestBuildWorkflowOverviewPromptCampaignType.test_brand_campaign_type_included_in_resulth   s"   I/
C&#&&&&&&&&z&&&z&&&&&&&&&&&&&&&&&#&&&#&&&&&&&&&&6{Q{Q{Qss66{Qr   c                    ddl m}  |d      }t        |t              }|sd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dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      d	z  }t        t        j                  |            d
}t        |      }d}||kD  }|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
)uO   기본 campaign_type은 'conversion'이어야 함 (명시 없이 호출 가능)r   r)   r+   r,   r.   r/   r0   r   r1   Nr6   r8   r9   r:   r=   r>   r?   rI   s
             r   (test_default_campaign_type_is_conversionzTTestBuildWorkflowOverviewPromptCampaignType.test_default_campaign_type_is_conversionq   s$   I 0
C&#&&&&&&&&z&&&z&&&&&&&&&&&&&&&&&#&&&#&&&&&&&&&&6{Q{Q{Qss66{Qr   c                    ddl m}  |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}}y)u]   task_id만으로 호출 시 Phase 및 QC 내용 포함 (campaign_type 파라미터 제거됨)r   r)   r+   r,   rT   rU   rW   r0   rX   rY   rZ   Nrb   r[   r\   s          r   0test_conversion_campaign_type_included_in_resultz\TestBuildWorkflowOverviewPromptCampaignType.test_conversion_campaign_type_included_in_resultz   s    I/
C w&    w&   w      &   &       tv~tvtvvr   N)rd   re   rf   rg   rl   rn   rp   rh   r   r   rj   rj   e   s    6r   rj   c                       e Zd ZdZd Zd Zy)TestDispatchWorkflowArgparseuB   T3: --workflow 옵션이 argparse에 등록되어 있는지 검증c                    t        t        j                  j                  dd            }|dz  }t	        j
                  t        j                  t        |      dgddd      }|j                  |j                  z   }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|j                  dd  d|j                  dd        dz   d|iz  }t%        t        j&                  |            dx}}y)u:   subprocess로 --help 실행 시 '--workflow' 포함 확인r	   r
   dispatch.py--helpT   capture_outputtexttimeout
--workflowrU   rW   combined_outputrX   u=   dispatch.py --help 출력에 '--workflow'가 없음.
stdout: N  z	
stderr: 
>assert %(py5)srZ   r   r   r   r   
subprocessrunr   
executabler   stdoutstderrrC   rH   rE   rA   rB   rD   _format_assertmsgrF   rG   	rJ   r   dispatch_pyr0   r|   r]   rM   r^   r_   s	            r   )test_help_output_contains_workflow_optionzFTestDispatchWorkflowArgparse.test_help_output_contains_workflow_option   s2   (8:OPQ	-/^^S-x8	
 !--&--7 	
|. 	
 		
| 	
 	
 
		  	
 	
 
6		
 	
 	  / 	
 	
 
		  / 	
 	
 }}Tc*+ ,}}Tc*+-	
 	
 	
 		
 	
r   c                    t        t        j                  j                  dd            }|dz  }t	        j
                  t        j                  t        |      dgddd      }|j                  |j                  z   }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|j                  dd        dz   d|iz  }t%        t        j&                  |            dx}}y)u8   --help 출력에 'image-qc-gate' 선택지 포함 확인r	   r
   rt   ru   Trv   rw   image-qc-gaterU   rW   r|   rX   u@   dispatch.py --help 출력에 'image-qc-gate'가 없음.
stdout: Nr}   r~   rZ   r   r   s	            r   +test_workflow_choices_include_image_qc_gatezHTestDispatchWorkflowArgparse.test_workflow_choices_include_image_qc_gate   s   (8:OPQ	-/^^S-x8	
 !--&--7 	
/1 	
 	
/ 	
 	
 		  	
 	
	6	
 	
  #2 	
 	
 		 #2 	
 	
  TTZTaTabfcfTgShi	
 	
 	
 	
 	
r   N)rd   re   rf   rg   r   r   rh   r   r   rr   rr      s    L
&
r   rr   c                   $    e Zd ZdZddZd Zd Zy)TestDispatchWorkflowPrependup   T4: --workflow image-qc-gate 사용 시 task_desc 앞에 워크플로우 프롬프트가 prepend되는지 검증Nc                 v    t               }||_        ||nt        j                  ddi      |_        ||_        |S )Nstatusok)r   
returncodejsondumpsr   r   )rJ   r   r   r   mock_results        r   _make_mock_subprocessz1TestDispatchWorkflowPrepend._make_mock_subprocess   s=    k!+'-'9Vtzz8UYJZ?[#r   c                 ~
   ddl m} dg |j                  }fd}|j                  |d|       |j                  t        dddd	d
ddg       ddl}ddlm} |j                         }	 ||	      5  |j                          ddd       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}}d   }|v }|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  }t        j"                  d|dd        dz   d |iz  }t%        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  }t        j"                  d$|dd        d%z   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  }t        j"                  d(|dd        d%z   d&|iz  }t%        t        j&                  |            dx}}
|j)                  d!      }|j)                        }||k  }|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  }t        j"                  d-| d.| d/      dz   d |iz  }t%        t        j&                  |            d}y# 1 sw Y   xY w)0uf   --workflow image-qc-gate 전달 시 task_desc 앞에 워크플로우 개요 프롬프트가 prepend됨r   r)   u   이미지 QC 테스트 작업c            	          j                  |j                  dt        |       dkD  r| d   nd             dddddd	i d
S N	task_desc    
dispatchedztask-1.1	dev1-teamu   헤르메스normalr   )r   r-   teamleadleveldescriptionmessagecron_responseappendr   r9   argskwargscaptured_task_descsoriginal_tasks     r   mock_dispatchzcTestDispatchWorkflowPrepend.test_workflow_prompt_prepended_when_workflow_set.<locals>.mock_dispatch   P    &&vzz+#d)VW-tAw]_'`a&%#&!,!#	 	r   r   argvrt   --teamr   --taskr{   r   Nredirect_stdoutr   ==z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr9   r   r:   u0   dispatch()가 정확히 1회 호출되어야 함z
>assert %(py8)sr>   rU   )z%(py0)s in %(py2)sr   actual_task_descr2   r4   u1   원래 task_desc가 유지되어야 함. 실제:    
>assert %(py4)sr5   rT   rW   rX   uH   워크플로우 프롬프트의 'Phase'가 task_desc에 없음. 실제: r~   rZ   rb   uE   워크플로우 프롬프트의 'QC'가 task_desc에 없음. 실제: )<)z%(py0)s < %(py2)s	phase_idxtask_idxu(   워크플로우 프롬프트('Phase' at u   )가 원래 task_desc(at u   ) 앞에 있어야 함)r@   r*   r   setattrr   io
contextlibr   StringIOmainr9   rC   rH   rA   rB   rD   rE   r   rF   rG   find)rJ   r%   monkeypatchcapsysr*   original_dispatchr   r   r   frM   rN   rO   rP   rQ   r   @py_assert1@py_format3rL   r]   r^   r_   r   r   r   r   s                           @@r   0test_workflow_prompt_prepended_when_workflow_setzLTestDispatchWorkflowPrepend.test_workflow_prompt_prepended_when_workflow_set   sz   I7 (11	 	L*mDHk8]LZij	
 	.KKMQ 	 	  &'`1`'1,```'1``````s```s``````&```&```'```1```.````````.q1  00~~~} 0~~~~~~}~~~}~~~~~~ 0~~~ 0~~~~4efvw{x{f|e}2~~~~~~~ 	o''	o]n]n	o'	o 	oenen 	o 	ohnhn	o 	oVnVn (	o 	oenen (	o 	o]n]nUVfgkhkVlUmn	o 	o 	o[n[n	o 	o 	l$$	lZkZk	l$	l 	lbkbk 	l 	lekek	l 	lSkSk %	l 	lbkbk %	l 	lZkZkRScdhehSiRjk	l 	l 	lXkXk	l 	l
 %))'2	#((7 	{iziz	{	{ 	{tztz	{ 	{bzbz 	{ 	{qzqz 	{ 	{tztz	{ 	{bzbz !	{ 	{qzqz !	{ 	{iziz5i[@YZbYccyz	{ 	{ 	{gzgz	{ 	{'	  	 s   2T22T<c                    ddl m} dg fd}|j                  |d|       |j                  t        dddd	d
ddg       ddl}ddlm} |j                         } ||      5  |j                          ddd       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}
}	d   }t        |      }t              }||kD  }
|
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                  |      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                  |      dz  }t        j$                  d      dz   d|iz  }t!        t        j"                  |            dx}x}
}y# 1 sw Y   xY w)uJ   build_workflow_overview_prompt가 실제 task_id를 전달받아 호출됨r   r)   u(   워크플로우 task_id 확인 테스트c            	          j                  |j                  dt        |       dkD  r| d   nd             dddddd	i d
S r   r   r   s     r   r   z\TestDispatchWorkflowPrepend.test_workflow_prompt_uses_correct_task_id.<locals>.mock_dispatch   r   r   r   r   rt   r   r   r   r{   r   Nr   r   r   r   r9   r   r:   r=   r>   r6   )zM%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py8)s
{%(py8)s = %(py5)s(%(py6)s)
}r   r   )r2   r3   r;   rZ   r<   r>   uW   워크플로우 옵션 사용 시 task_desc가 원래보다 길어야 함 (prepend 됨)z
>assert %(py10)spy10)r@   r*   r   r   r   r   r   r   r   r9   rC   rH   rA   rB   rD   rE   rF   rG   r   )rJ   r%   r   r*   r   r   r   r   rM   rN   rO   rP   rQ   r   @py_assert7@py_format11r   r   s                   @@r   )test_workflow_prompt_uses_correct_task_idzETestDispatchWorkflowPrepend.test_workflow_prompt_uses_correct_task_id   s   IB 	 	L*mDHk8]LZij	
 	.KKMQ 	 	  &',1,'1,,,,'1,,,,,,s,,,s,,,,,,&,,,&,,,',,,1,,,,,,,.q1#$ 	es(
 	e$ (
 
 	e 	eSdSd	e$ (
 	e 	e^d^d	e 	eLdLd  	e 	e[d[d  	e 	e^d^d	e 	eLdLd $ 	e 	e[d[d $ 	e 	e[d[d % 	e 	e^d^d	e 	eLdLd (+ 	e 	e[d[d (+ 	e 	e^d^d	e 	eLdLd 	e 	e[d[d 	e 	e[d[d(
 	e 	eSdSdd	e 	e 	eQdQd	e 	e 	e	  	 s   &MM)r   Nr   )rd   re   rf   rg   r   r   r   rh   r   r   r   r      s    z6{p'er   r   c                       e Zd ZdZd Zd Zy)TestDispatchNoWorkflowuG   T5: --workflow 미사용 시 task_desc가 변경되지 않음을 검증c           	         dg fd}|j                  |d|       |j                  t        dddddg       d	d
l}d	dlm} |j                         } ||      5  |j                          d
d
d
       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}	}d	   }|k(  }|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  }t        j                   d d| d      dz   d|iz  }t        t        j                  |            d
}y
# 1 sw Y   xY w)uF   --workflow 없이 dispatch 호출 시 task_desc가 그대로 전달됨u'   워크플로우 미사용 기본 작업c            	          j                  |j                  dt        |       dkD  r| d   nd             dddddd	i d
S r   r   r   s     r   r   zRTestDispatchNoWorkflow.test_no_workflow_task_desc_unchanged.<locals>.mock_dispatch-  r   r   r   r   rt   r   r   r   r   Nr   r   r   r   r9   r   r:   r=   r>   z%(py0)s == %(py2)sr   r   r   uB   --workflow 미사용 시 task_desc 변경 없어야 함.
기대: 'u   '
실제: ''r   r5   )r   r   r   r   r   r   r   r9   rC   rH   rA   rB   rD   rE   rF   rG   r   rJ   r%   r   r   r   r   r   rM   rN   rO   rP   rQ   r   r   r   rL   r   r   s                   @@r   $test_no_workflow_task_desc_unchangedz;TestDispatchNoWorkflow.test_no_workflow_task_desc_unchanged(  s   A 	 	L*mDHk8]K	
 	.KKMQ 	 	  &',1,'1,,,,'1,,,,,,s,,,s,,,,,,&,,,&,,,',,,1,,,,,,,.q1=0 	
 		
= 	
 	
 
6		
 	
 	   	
 	
 
		   	
 	
 
6		
 	
 	 $1 	
 	
 
		 $1 	
 	
 % '(),	
 	
 	
 		
 	
	  	 s   I99Jc           	         dg fd}|j                  |d|       |j                  t        dddddg       d	d
l}d	dlm} |j                         } ||      5  |j                          d
d
d
       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}	}d	   }|k(  }|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
}y
# 1 sw Y   xY w)uC   --workflow 없을 때 task_desc에 'Phase'나 'QC' 주입이 없음u)   일반 코딩 작업 - Phase나 QC 없음c            	          j                  |j                  dt        |       dkD  r| d   nd             dddddd	i d
S r   r   r   s     r   r   z]TestDispatchNoWorkflow.test_no_workflow_means_no_phase_or_qc_injection.<locals>.mock_dispatchV  r   r   r   r   rt   r   r   r   r   Nr   r   r   r   r9   r   r:   r=   r>   r   r   r   r   zassert %(py4)sr5   )r   r   r   r   r   r   r   r9   rC   rH   rA   rB   rD   rE   rF   rG   r   s                   @@r   /test_no_workflow_means_no_phase_or_qc_injectionzFTestDispatchNoWorkflow.test_no_workflow_means_no_phase_or_qc_injectionQ  s   C 	 	L*mDHk8]K	
 	.KKMQ 	 	  &',1,'1,,,,'1,,,,,,s,,,s,,,,,,&,,,&,,,',,,1,,,,,,,.q1=0000=000000000000000=000=0000000	  	 s   II&N)rd   re   rf   rg   r   r   rh   r   r   r   r   %  s    Q'
R#1r   r   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)%TestBuildWorkflowOverviewPromptQCInfou_   T6: 반환값에 카테고리 A 관련 내용과 에스컬레이션 관련 내용 포함 검증c                    ddl m}  |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  }t        j                  d
      dz   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  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}}y)uW   QC 상세(A-01, 글자 겹침 등)는 overview에 포함하지 않음 (Phase별 로딩)r   r)   r+   r,   zA-01)not in)z%(py1)s not in %(py3)sr0   rX   u5   QC 상세 A-01이 overview에 인라인되면 안 됨r~   rZ   Nu   글자 겹침u@   QC 상세 '글자 겹침'이 overview에 인라인되면 안 됨r@   r*   rC   rH   rE   rA   rB   rD   r   rF   rG   r\   s          r   'test_qc_details_not_inlined_in_overviewzMTestBuildWorkflowOverviewPromptQCInfo.test_qc_details_not_inlined_in_overview  s    I/
C\vV#\\\vV\\\v\\\\\\V\\\V\\\\%\\\\\\\pf,pppfpppppppppfpppfpppp.pppppppr   c                    ddl m}  |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  }t        j                  d
      dz   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  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}}y)u:   QC 기준은 각 Phase에서 로딩된다는 안내 포함r   r)   r+   r,   u	   QC 기준rU   rW   r0   rX   u   'QC 기준' 안내가 없음r~   rZ   Nu   각 Phase에서 로딩u)   '각 Phase에서 로딩' 안내가 없음r   r\   s          r   !test_qc_loading_reference_presentzGTestBuildWorkflowOverviewPromptQCInfo.test_qc_loading_reference_present  s    I/
CD{f$DDD{fDDD{DDDDDDfDDDfDDDD&DDDDDDD'^'61^^^'6^^^'^^^^^^6^^^6^^^^3^^^^^^^r   c                    ddl m}  |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  }t        j                  d
|dd        dz   d|iz  }t        t        j                  |            dx}}y)u4   반환값에 에스컬레이션 관련 내용 포함r   r)   r+   r,   u   에스컬레이션rU   rW   r0   rX   u@   '에스컬레이션' 텍스트가 없음. 반환값 앞 500자: Nr}   r~   rZ   r   r\   s          r   test_contains_escalation_infozCTestBuildWorkflowOverviewPromptQCInfo.test_contains_escalation_info  s    I/
C#  	A#v-  	A  	A  	A#v  	A  	A  	A#  	A  	A  	A  	A  	A  	Av  	A  	A  	Av  	A  	A  	A  	A1qrxy}z}r~q  0A  	A  	A  	A  	A  	A  	Ar   c           	         ddl m}  |d      }t        d      D ]  }g }d| }||v }|}|sd| }|j                  }	 |	       }
||
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  }|j                  |       |st	        j
                  dfd
f      t	        j                  |      d
t        j                         v st	        j                  |      rt	        j                  |      nd
t	        j                  	      t	        j                  |
      dz  }dd|iz  }|j                  |       t	        j                  |d      i z  }t	        j                  d| d|dd        dz   d|iz  }t        t	        j                  |            dx}x}x}x}x}x}x}	}
 y)u=   반환값에 5Phase (Phase 0~4) 워크플로우 구조 포함r   r)   r+   r,      zPhase phaserU   )z%(py3)s in %(py5)sr0   )r;   rZ   z%(py7)spy7)zJ%(py10)s in %(py16)s
{%(py16)s = %(py14)s
{%(py14)s = %(py12)s.lower
}()
})r   py12py14py16z%(py18)spy18r   z'Phase u0   '가 반환값에 없음. 반환값 앞 500자: Nr}   z
>assert %(py21)spy21)r@   r*   rangelowerrC   rH   rE   rA   rB   rD   r   _format_boolopr   rF   rG   )rJ   r*   r0   	phase_numr   rM   rO   r]   @py_assert9@py_assert13@py_assert15@py_assert11r_   @py_format8@py_format17@py_format19@py_format20@py_format22s                     r   "test_contains_five_phase_structurezHTestBuildWorkflowOverviewPromptQCInfo.test_contains_five_phase_structure  s<   I/
Cq 	cIc$c$.c49)2EcIOcIUc2E2Wc cQbQbc$c cYbYb %c c\b\bc cJbJb )/c cYbYb )/c c c\b\bc\bcQbQbc2Ec cYbYb 3Fc c\b\bc cJbJb JPc cYbYb JPc cYbYb JVc cYbYb JXc c c\b\bc\bcTbTbc cQbQb#STZ[_\_T`Sabc c cObObc c c c	cr   c                    ddl m}  |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  }t        j                  d	|d
d        dz   d|iz  }t        t        j                  |            d
x}}y
)u%   반환값에 전달된 task_id 포함r   r)   ztest-qc-999r,   rU   rW   r0   rX   uD   task_id 'test-qc-999'가 반환값에 없음. 반환값 앞 500자: Nr}   r~   rZ   r   r\   s          r   test_contains_task_id_in_resultzETestBuildWorkflowOverviewPromptQCInfo.test_contains_task_id_in_result  s    I/F}}&}}}}}}}}}}}}}}}}}}}}}*nouvzwzo{n|(}}}}}}}r   N)	rd   re   rf   rg   r   r   r   r   r   rh   r   r   r   r   |  s#    iq_A	c~r   r   )rg   builtinsrA   _pytest.assertion.rewrite	assertionrewriterC   r   r   r   r   typespathlibr   unittest.mockr   r   pytest
ModuleTyper   fixturer%   r'   rj   rr   r   r   r   rh   r   r   <module>r     s      	  
   * D U5E5E 4 3 3 > F$
 $
Xie iebO1 O1n+~ +~r   