
    iqD                        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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        M/home/jay/workspace/.worktrees/task-2116-dev1/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                 f    ddl m}  |d      }t        |t              sJ t	        |      dkD  sJ y)uE   task_id='test-001'로 호출 시 비어있지 않은 문자열 반환r   build_workflow_overview_prompttest-001task_idNprompts.image_workflowr*   
isinstancer   lenselfr*   results      r   test_returns_non_empty_stringzBTestBuildWorkflowOverviewPromptBasic.test_returns_non_empty_stringI   s/    I/
C&#&&&6{Qr   c                 .    ddl m}  |d      }d|v sJ y)u%   반환값에 'Phase' 문자열 포함r   r)   r+   r,   PhaseNr/   r*   r2   s      r   test_contains_phase_stringz?TestBuildWorkflowOverviewPromptBasic.test_contains_phase_stringQ   s    I/
C&   r   c                 .    ddl m}  |d      }d|v sJ y)u"   반환값에 'QC' 문자열 포함r   r)   r+   r,   QCNr8   r2   s      r   test_contains_qc_stringz<TestBuildWorkflowOverviewPromptBasic.test_contains_qc_stringX   s    I/
Cv~~r   N)__name__
__module____qualname____doc__r5   r9   r<    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                 f    ddl m}  |d      }t        |t              sJ t	        |      dkD  sJ y)ug   task_id만으로 호출 시 비어있지 않은 문자열 반환 (campaign_type 파라미터 제거됨)r   r)   r+   r,   Nr.   r2   s      r   +test_brand_campaign_type_included_in_resultzWTestBuildWorkflowOverviewPromptCampaignType.test_brand_campaign_type_included_in_resulth   s/    I/
C&#&&&6{Qr   c                 f    ddl m}  |d      }t        |t              sJ t	        |      dkD  sJ y)uO   기본 campaign_type은 'conversion'이어야 함 (명시 없이 호출 가능)r   r)   r+   r,   Nr.   r2   s      r   (test_default_campaign_type_is_conversionzTTestBuildWorkflowOverviewPromptCampaignType.test_default_campaign_type_is_conversionq   s1    I 0
C&#&&&6{Qr   c                 :    ddl m}  |d      }d|v sJ d|v sJ y)u]   task_id만으로 호출 시 Phase 및 QC 내용 포함 (campaign_type 파라미터 제거됨)r   r)   r+   r,   r7   r;   Nr8   r2   s      r   0test_conversion_campaign_type_included_in_resultz\TestBuildWorkflowOverviewPromptCampaignType.test_conversion_campaign_type_included_in_resultz   s)    I/
C&   v~~r   N)r=   r>   r?   r@   rE   rG   rI   rA   r   r   rC   rC   e   s    6r   rC   c                       e Zd ZdZd Zd Zy)TestDispatchWorkflowArgparseuB   T3: --workflow 옵션이 argparse에 등록되어 있는지 검증c                 N   t        t        j                  j                  dd            }|dz  }t	        j
                  t        j                  t        |      dgddd      }|j                  |j                  z   }d|v s'J d	|j                  d
d  d|j                  d
d         y
)u:   subprocess로 --help 실행 시 '--workflow' 포함 확인r	   r
   dispatch.py--helpT   capture_outputtexttimeout
--workflowu=   dispatch.py --help 출력에 '--workflow'가 없음.
stdout: N  z	
stderr: r   r   r   r   
subprocessrunr   
executabler   stdoutstderrr3   r   dispatch_pyr4   combined_outputs        r   )test_help_output_contains_workflow_optionzFTestDispatchWorkflowArgparse.test_help_output_contains_workflow_option   s    (8:OPQ	-/^^S-x8	
 !--&--7. 	
}}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 sJ d	|j                  d
d         y
)u8   --help 출력에 'image-qc-gate' 선택지 포함 확인r	   r
   rM   rN   TrO   rP   image-qc-gateu@   dispatch.py --help 출력에 'image-qc-gate'가 없음.
stdout: NrU   rV   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 	
STZTaTabfcfTgShi	
1r   N)r=   r>   r?   r@   r_   rb   rA   r   r   rK   rK      s    L
&
r   rK   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dumpsrZ   r[   )r3   rh   rZ   r[   mock_results        r   _make_mock_subprocessz1TestDispatchWorkflowPrepend._make_mock_subprocess   s=    k!+'-'9Vtzz8UYJZ?[#r   c                 4   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J d       d   }
|
v sJ d|
dd         d|
v sJ d|
dd         d|
v sJ d|
dd         |
j                  d      }|
j                        }||k  sJ d| d| d       y# 1 sw Y   xY w)uf   --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   헤르메스normalrg   )rf   r-   teamleadleveldescriptionmessagecron_responseappendr   r1   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   argvrM   --teamrt   --taskrT   ra   Nredirect_stdoutrq   u0   dispatch()가 정확히 1회 호출되어야 함u1   원래 task_desc가 유지되어야 함. 실제:    r7   uH   워크플로우 프롬프트의 'Phase'가 task_desc에 없음. 실제: r;   uE   워크플로우 프롬프트의 'QC'가 task_desc에 없음. 실제: u(   워크플로우 프롬프트('Phase' at u   )가 원래 task_desc(at u   ) 앞에 있어야 함)r/   r*   r   setattrr   io
contextlibr   StringIOmainr1   find)r3   r%   monkeypatchcapsysr*   original_dispatchr   r   r   factual_task_desc	phase_idxtask_idxr   r   s                @@r   0test_workflow_prompt_prepended_when_workflow_setzLTestDispatchWorkflowPrepend.test_workflow_prompt_prepended_when_workflow_set   s   I7 (11	 	L*mDHk8]LZij	
 	.KKMQ 	 	  &'1,`.``,.q1  00~4efvw{x{f|e}2~~0 ''	oUVfgkhkVlUmn	o' $$	lRScdhehSiRjk	l$ %))'2	#((7 	{5i[@YZbYccyz	{ )	  	 s   2DD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(  sJ 	d   }t        |      t        
      kD  sJ d       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 ro   r|   r~   s     r   r   z\TestDispatchWorkflowPrepend.test_workflow_prompt_uses_correct_task_id.<locals>.mock_dispatch   r   r   r   r   rM   r   rt   r   rT   ra   Nr   rq   uW   워크플로우 옵션 사용 시 task_desc가 원래보다 길어야 함 (prepend 됨))
r/   r*   r   r   r   r   r   r   r   r1   )r3   r%   r   r*   r   r   r   r   r   r   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,,,.q1#$s(
 
 	ed	e 
	  	 s   &B33B<)r   Nrr   )r=   r>   r?   r@   rl   r   r   rA   r   r   rd   rd      s    z6{p'er   rd   c                       e Zd ZdZd Zd Zy)TestDispatchNoWorkflowuG   T5: --workflow 미사용 시 task_desc가 변경되지 않음을 검증c           	      X  	 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(  sJ d	   }|	k(  sJ d	 d| d       y
# 1 sw Y   2x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 ro   r|   r~   s     r   r   zRTestDispatchNoWorkflow.test_no_workflow_task_desc_unchanged.<locals>.mock_dispatch-  r   r   r   r   rM   r   rt   r   r   Nr   rq   uB   --workflow 미사용 시 task_desc 변경 없어야 함.
기대: 'u   '
실제: ''r   r   r   r   r   r   r   r1   
r3   r%   r   r   r   r   r   r   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,,,.q1=0 	
% '(),	
0	  	 s   B  B)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(  sJ d	   }|	k(  sJ 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 ro   r|   r~   s     r   r   z]TestDispatchNoWorkflow.test_no_workflow_means_no_phase_or_qc_injection.<locals>.mock_dispatchV  r   r   r   r   rM   r   rt   r   r   Nr   rq   r   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,,,.q1=000	  	 s   BBN)r=   r>   r?   r@   r   r   rA   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                 N    ddl m}  |d      }d|vsJ d       d|vsJ d       y	)
uW   QC 상세(A-01, 글자 겹침 등)는 overview에 포함하지 않음 (Phase별 로딩)r   r)   r+   r,   zA-01u5   QC 상세 A-01이 overview에 인라인되면 안 됨u   글자 겹침u@   QC 상세 '글자 겹침'이 overview에 인라인되면 안 됨Nr8   r2   s      r   'test_qc_details_not_inlined_in_overviewzMTestBuildWorkflowOverviewPromptQCInfo.test_qc_details_not_inlined_in_overview  s7    I/
CV#\%\\#f,p.pp,r   c                 N    ddl m}  |d      }d|v sJ d       d|v sJ d       y	)
u:   QC 기준은 각 Phase에서 로딩된다는 안내 포함r   r)   r+   r,   u	   QC 기준u   'QC 기준' 안내가 없음u   각 Phase에서 로딩u)   '각 Phase에서 로딩' 안내가 없음Nr8   r2   s      r   !test_qc_loading_reference_presentzGTestBuildWorkflowOverviewPromptQCInfo.test_qc_loading_reference_present  s7    I/
Cf$D&DD$'61^3^^1r   c                 D    ddl m}  |d      }d|v sJ d|dd         y)	u4   반환값에 에스컬레이션 관련 내용 포함r   r)   r+   r,   u   에스컬레이션u@   '에스컬레이션' 텍스트가 없음. 반환값 앞 500자: NrU   r8   r2   s      r   test_contains_escalation_infozCTestBuildWorkflowOverviewPromptQCInfo.test_contains_escalation_info  s>    I/
C#v-  	A1qrxy}z}r~q  0A  	A-r   c                     ddl m}  |d      }t        d      D ]/  }d| |v rd| |j                         v r!J d| d	|d
d          y
)u=   반환값에 5Phase (Phase 0~4) 워크플로우 구조 포함r   r)   r+   r,      zPhase phasez'Phase u0   '가 반환값에 없음. 반환값 앞 500자: NrU   )r/   r*   rangelower)r3   r*   r4   	phase_nums       r   "test_contains_five_phase_structurezHTestBuildWorkflowOverviewPromptQCInfo.test_contains_five_phase_structure  sr    I/
Cq 	cI$.E)2E2Wc#STZ[_\_T`SabcW	cr   c                 D    ddl m}  |d      }d|v sJ d|dd         y)u%   반환값에 전달된 task_id 포함r   r)   ztest-qc-999r,   uD   task_id 'test-qc-999'가 반환값에 없음. 반환값 앞 500자: NrU   r8   r2   s      r   test_contains_task_id_in_resultzETestBuildWorkflowOverviewPromptQCInfo.test_contains_task_id_in_result  s5    I/F&}*nouvzwzo{n|(}}&r   N)	r=   r>   r?   r@   r   r   r   r   r   rA   r   r   r   r   |  s#    iq_A	c~r   r   )r@   ri   r   rW   r   typespathlibr   unittest.mockr   r   pytest
ModuleTyper   fixturer%   r'   rC   rK   rd   r   r   rA   r   r   <module>r      s     	  
   * D U5E5E 4 3 3 > F$
 $
Xie iebO1 O1n+~ +~r   