
    &<iO/                        U d Z ddlZddlZddlmZmZ ddlZddlZdZeej                  vrej                  j                  de       ddlmZmZ ddlmZ 	 ddlmZ eZedef   ed	<   ej                  j+                  ed
      Zej                  j+                  ed      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Zy# e$ r dZY tw xY w)u  Phase 6 파이프라인 YAML + 유스케이스 테스트.

검증 대상:
1. marketing-dev-pipeline.yaml 유효성
2. content-pipeline.yaml 유효성
3. 파이프라인 YAML 구조 (pipeline_validator 통과)
4. 템플릿 파일 존재 확인
5. auto_orch.py cmd_validate 통합 검증
6. dry-run 모드 시뮬레이션 (cmd_run with dry_run=True)

작성자: 벨레스 (dev6-team tester)
날짜: 2026-03-24
    N)AnyCallablez/home/jay/workspace)cmd_validateload_pipeline)validate_pipeline)cmd_run._cmd_run	pipelineszpipelines/templatesc                        e Zd ZdZddZddZy)TestPipelineYAMLValidityu&   T6-1: YAML 문법 유효성 테스트.Nc                 0   t         j                  j                  t        d      }t         j                  j	                  |      s
J d|        t        |d      5 }t        j                  |      }ddd       t        t              sJ y# 1 sw Y   xY w)u;   marketing-dev-pipeline.yaml이 유효한 YAML인지 확인.marketing-dev-pipeline.yaml   파일 없음: utf-8encodingN
ospathjoinPIPELINES_DIRexistsopenyaml	safe_load
isinstancedictselfr   fdatas       O/home/jay/workspace/.worktrees/task-2057-dev2/orchestrator/tests/test_phase6.py"test_marketing_pipeline_yaml_loadsz;TestPipelineYAMLValidity.test_marketing_pipeline_yaml_loads<   sx    ww||M+HIww~~d#=tf%==#$) 	%Q>>!$D	%$%%%	% 	%   BBc                 0   t         j                  j                  t        d      }t         j                  j	                  |      s
J d|        t        |d      5 }t        j                  |      }ddd       t        t              sJ y# 1 sw Y   xY w)u5   content-pipeline.yaml이 유효한 YAML인지 확인.content-pipeline.yamlr   r   r   Nr   r   s       r"    test_content_pipeline_yaml_loadsz9TestPipelineYAMLValidity.test_content_pipeline_yaml_loadsD   sx    ww||M+BCww~~d#=tf%==#$) 	%Q>>!$D	%$%%%	% 	%r$   returnN)__name__
__module____qualname____doc__r#   r'        r"   r   r   9   s    0&&r/   r   c                   h    e Zd ZdZddZddZddZddZddZddZ	dd	Z
dd
ZddZddZddZy)TestPipelineValidationu1   P6-2: pipeline_validator 전건 통과 테스트.Nc                     t         j                  j                  t        d      }t	        |      }t        |      }|g k(  s
J d|        y)u@   marketing-dev-pipeline.yaml이 pipeline_validator 검증 통과.r      검증 에러: Nr   r   r   r   r   r   r   r   pipelineerrorss       r"   !test_marketing_pipeline_validatesz8TestPipelineValidation.test_marketing_pipeline_validatesU   sC    ww||M+HI &"8,|7vh77|r/   c                     t         j                  j                  t        d      }t	        |      }t        |      }|g k(  s
J d|        y)u:   content-pipeline.yaml이 pipeline_validator 검증 통과.r&   r3   Nr4   r5   s       r"   test_content_pipeline_validatesz6TestPipelineValidation.test_content_pipeline_validates\   sC    ww||M+BC &"8,|7vh77|r/   c                 v    t         j                  j                  t        d      }t	        |      }|d   dk(  sJ y)u%   schema_version이 "1.0"인지 확인.r   schema_versionz1.0Nr   r   r   r   r   r   r   r6   s      r"   &test_marketing_pipeline_schema_versionz=TestPipelineValidation.test_marketing_pipeline_schema_versionc   s5    ww||M+HI &()U222r/   c                     t         j                  j                  t        d      }t	        |      }t        |d   t              sJ t        |d         dkD  sJ y)u4   gates가 비어있지 않은 리스트인지 확인.r   gatesr   N)r   r   r   r   r   r   listlenr>   s      r"   !test_marketing_pipeline_has_gatesz8TestPipelineValidation.test_marketing_pipeline_has_gatesi   sN    ww||M+HI &(7+T2228G$%)))r/   c                 v    t         j                  j                  t        d      }t	        |      }|d   dkD  sJ y)u$   token_budget이 양수인지 확인.r   token_budgetr   Nr=   r>   s      r"   -test_marketing_pipeline_token_budget_positivezDTestPipelineValidation.test_marketing_pipeline_token_budget_positivep   s4    ww||M+HI &'!+++r/   c                     t         j                  j                  t        d      }t	        |      }|j                  d      dv sJ y)u'   blast_radius가 유효값인지 확인.r   blast_radius>   orgstepteamNr   r   r   r   r   getr>   s      r"   *test_marketing_pipeline_blast_radius_validzATestPipelineValidation.test_marketing_pipeline_blast_radius_validv   s9    ww||M+HI &||N+/FFFFr/   c                     t         j                  j                  t        d      }t	        |      }t        |d         dk(  sJ y)u2   marketing 파이프라인이 3스텝인지 확인.r   steps   Nr   r   r   r   r   rC   r>   s      r"   test_marketing_pipeline_3_stepsz6TestPipelineValidation.test_marketing_pipeline_3_steps|   s9    ww||M+HI &8G$%***r/   c                     t         j                  j                  t        d      }t	        |      }|d   D cg c]  }|d   	 }}|g dk(  sJ yc c}w )u9   ga4_design → dev_implement → qc_verify 순서 확인.r   rQ   id)
ga4_designdev_implement	qc_verifyNr=   )r   r   r6   sstep_idss        r"   "test_marketing_pipeline_step_orderz9TestPipelineValidation.test_marketing_pipeline_step_order   sQ    ww||M+HI &%-g%67AdG77GGGG 8s   Ac                    t         j                  j                  t        d      }t	        |      }|d   }|d   j                  dg       g k(  sJ d|d   j                  dg       v sJ d|d   j                  dg       v sJ y	)
u9   의존성 체인 확인: design → implement → verify.r   rQ   r   
depends_onrW      rX      NrM   )r   r   r6   rQ   s       r"   $test_marketing_pipeline_dependenciesz;TestPipelineValidation.test_marketing_pipeline_dependencies   s    ww||M+HI &!Qx||L"-333uQx||L"====%(,,|R"@@@@r/   c                     t         j                  j                  t        d      }t	        |      }t        |d         dk(  sJ y)u0   content 파이프라인이 3스텝인지 확인.r&   rQ   rR   NrS   r>   s      r"   test_content_pipeline_3_stepsz4TestPipelineValidation.test_content_pipeline_3_steps   s9    ww||M+BC &8G$%***r/   c           	          dD ]f  }t         j                  j                  t        |      }t	        |      }t        |d         }|d   D ]  }|d   |v rJ | d|d    d|d    d        h y	)
uF   모든 step의 target_team이 allowed_teams에 포함되는지 확인.r   r&   allowed_teamsrQ   target_team: step 'rV   z' target_team 'z' not in allowed_teamsN)r   r   r   r   r   set)r   filenamer   r6   allowedrK   s         r"    test_all_target_teams_in_allowedz7TestPipelineValidation.test_all_target_teams_in_allowed   s    P 	H77<<x8D$T*H(?34G ) M*g5 jd4G]H[G\\rs5		r/   r(   )r*   r+   r,   r-   r8   r:   r?   rD   rG   rO   rT   r\   ra   rc   rl   r.   r/   r"   r1   r1   R   s?    ;883*,G+HA+	r/   r1   c                   8    e Zd ZdZddZddZddZddZddZy)	TestTemplateFilesu%   T6-2: 템플릿 파일 존재 확인.Nc                 f    t         j                  j                  t              sJ dt                y)u%   templates 디렉토리 존재 확인.u   디렉토리 없음: N)r   r   isdirTEMPLATES_DIR)r   s    r"   test_templates_dir_existsz+TestTemplateFiles.test_templates_dir_exists   s%    ww}}]+T/D]O-TT+r/   c                     t         j                  j                  t        d      }t         j                  j	                  |      s
J d|        t         j                  j                  |      dkD  sJ d       y)u   ga4-design.md 존재 확인.zga4-design.mdr   r      파일이 비어있음Nr   r   r   rq   r   getsizer   r   s     r"   test_ga4_design_template_existsz1TestTemplateFiles.test_ga4_design_template_exists   sY    ww||M?;ww~~d#=tf%==#wwt$q(B*BB(r/   c                     t         j                  j                  t        d      }t         j                  j	                  |      s
J d|        t         j                  j                  |      dkD  sJ d       y)u   dev-implement.md 존재 확인.zdev-implement.mdr   r   rt   Nru   rw   s     r"   "test_dev_implement_template_existsz4TestTemplateFiles.test_dev_implement_template_exists   sZ    ww||M+=>ww~~d#=tf%==#wwt$q(B*BB(r/   c                     t         j                  j                  t        d      }t         j                  j	                  |      s
J d|        t         j                  j                  |      dkD  sJ d       y)u   qc-verify.md 존재 확인.zqc-verify.mdr   r   rt   Nru   rw   s     r"   test_qc_verify_template_existsz0TestTemplateFiles.test_qc_verify_template_exists   sY    ww||M>:ww~~d#=tf%==#wwt$q(B*BB(r/   c           
      X   dD ]  }t         j                  j                  t        |      }t	        |      }|d   D ]l  }|j                  dd      }t         j                  j                  t        |      }t         j                  j                  |      rYJ | d|d    d| d|          y	)
uX   파이프라인의 task_file_template 경로가 실제 파일로 존재하는지 확인.re   rQ   task_file_template rh   rV   z' task_file_template 'z' not found at N)r   r   r   r   r   rN   WORKSPACE_ROOTr   )r   rj   r   r6   rK   tpl	full_paths          r"   +test_template_files_referenced_in_pipelinesz=TestTemplateFiles.test_template_files_referenced_in_pipelines   s    P 	H77<<x8D$T*H ) hh3R8GGLL=	ww~~i0 jd4NseSbclbmn0	r/   r(   )	r*   r+   r,   r-   rr   rx   rz   r|   r   r.   r/   r"   rn   rn      s"    /UCCC
r/   rn   c                       e Zd ZdZdej
                  e   ddfdZdej
                  e   ddfdZdej
                  e   ddfdZ	y)
TestDryRunu4   T6-3/P6-4: dry-run 모드 시뮬레이션 테스트.capsysr)   Nc                    t         t        j                  d       t        dd       |j                         }d|j                  v sJ d|j                  v sJ d|j                  v sJ d|j                  v sJ d	|j                  v sJ y)
uG   marketing-dev-pipeline dry-run이 에러 없이 완료되는지 확인.N;   cmd_run이 orchestrator.auto_orch에서 import되지 않음zmarketing-dev-pipelineTdry_runDRY-RUNrW   rX   rY   r	   pytestfail
readouterroutr   r   captureds      r"   test_cmd_run_dry_run_marketingz)TestDryRun.test_cmd_run_dry_run_marketing   s    KKUV)48$$&HLL((('8<<777x||+++(,,...hll***r/   c                     t         t        j                  d       t        dd       |j                         }d|j                  v sJ d|j                  v sJ y)uA   content-pipeline dry-run이 에러 없이 완료되는지 확인.Nr   zcontent-pipelineTr   r   r   r   s      r"   test_cmd_run_dry_run_contentz'TestDryRun.test_cmd_run_dry_run_content   sR    KKUV#T2$$&HLL(((!X\\111r/   c                     t         t        j                  d       t        dd       |j                         }d|j                  v sJ y)uH   존재하지 않는 파이프라인 dry-run 시 에러 메시지 출력.Nr   znonexistent-pipelineTr   ERRORr   r   s      r"   %test_cmd_run_dry_run_invalid_pipelinez0TestDryRun.test_cmd_run_dry_run_invalid_pipeline   s@    KKUV'6$$&(,,&&&r/   )
r*   r+   r,   r-   r   CaptureFixturestrr   r   r   r.   r/   r"   r   r      sc    >+V5J5J35O +TX +263H3H3M 2RV 2'F<Q<QRU<V '[_ 'r/   r   c                   d    e Zd ZdZdej
                  e   ddfdZdej
                  e   ddfdZy)TestCmdValidateu/   P6-3: auto_orch.py --validate 통합 테스트.r   r)   Nc                     t         j                  j                  t        d      }t	        |       |j                         }d|j                  v sJ y)u6   --validate로 marketing 파이프라인 검증 성공.r   ValidNr   r   r   r   r   r   r   r   r   r   r   s       r"    test_validate_marketing_pipelinez0TestCmdValidate.test_validate_marketing_pipeline   s?    ww||M+HIT$$&(,,&&&r/   c                     t         j                  j                  t        d      }t	        |       |j                         }d|j                  v sJ y)u4   --validate로 content 파이프라인 검증 성공.r&   r   Nr   r   s       r"   test_validate_content_pipelinez.TestCmdValidate.test_validate_content_pipeline  s?    ww||M+BCT$$&(,,&&&r/   )	r*   r+   r,   r-   r   r   r   r   r   r.   r/   r"   r   r      sC    9'v7L7LS7Q 'VZ ''V5J5J35O 'TX 'r/   r   )r-   r   systypingr   r   r   r   r   r   insertorchestrator.auto_orchr   r   orchestrator.pipeline_validatorr   r   _cmd_run_implr	   __annotations__ImportErrorr   r   rq   r   r1   rn   r   r   r.   r/   r"   <module>r      s    
 
    
 '!HHOOA~&
 ? =
?#0HhsCx 0 ^[9^-BC& &2O On# #V!' !'R' 'g  Hs   C CC