
    OiO/                        U d Z ddlZddlmc m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                  j7                  ed
      Zej                  j7                  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                 \   t         j                  j                  t        d      }t         j                  }|j                  } ||      }|st        j                  d|       dz   dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            dx}x}}t        |d	      5 }t        j                  |      }dd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}y# 1 sw Y   +xY w)u;   marketing-dev-pipeline.yaml이 유효한 YAML인지 확인.marketing-dev-pipeline.yaml   파일 없음: d
>assert %(py7)s
{%(py7)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.path
}.exists
}(%(py5)s)
}ospathpy0py2py4py5py7Nutf-8encoding5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstancedatadictr   py1r   r   r   r   joinPIPELINES_DIRexists
@pytest_ar_format_assertmsg@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationopenyaml	safe_loadr   r   	selfr   @py_assert1@py_assert3@py_assert6@py_format8fr   @py_format5s	            5/home/jay/workspace/orchestrator/tests/test_phase6.py"test_marketing_pipeline_yaml_loadsz;TestPipelineYAMLValidity.test_marketing_pipeline_yaml_loads<   so   ww||M+HIww=w~~=~d#=#==tf%=======r===r===w===~======d===d===#======$) 	%Q>>!$D	%$%%%%%%%%z%%%z%%%%%%$%%%$%%%%%%%%%%%%%%%%%%%	% 	%   "J!!J+c                 \   t         j                  j                  t        d      }t         j                  }|j                  } ||      }|st        j                  d|       dz   dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            dx}x}}t        |d	      5 }t        j                  |      }dd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}y# 1 sw Y   +xY w)u5   content-pipeline.yaml이 유효한 YAML인지 확인.content-pipeline.yamlr   r   r   r   r   Nr   r   r   r   r   r   r    r"   r1   s	            r9    test_content_pipeline_yaml_loadsz9TestPipelineYAMLValidity.test_content_pipeline_yaml_loadsD   so   ww||M+BCww=w~~=~d#=#==tf%=======r===r===w===~======d===d===#======$) 	%Q>>!$D	%$%%%%%%%%z%%%z%%%%%%$%%%$%%%%%%%%%%%%%%%%%%%	% 	%r;   returnN)__name__
__module____qualname____doc__r:   r>        r9   r   r   9   s    0&&rF   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(  }|st        j                  d|fd||f      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}}y	)
u@   marketing-dev-pipeline.yaml이 pipeline_validator 검증 통과.r   ==z%(py0)s == %(py3)serrorsr   py3   검증 에러: 
>assert %(py5)sr   Nr   r   r#   r$   r   r   r&   _call_reprcomparer(   r)   r*   r+   r'   r,   r-   r2   r   pipelinerM   @py_assert2r3   @py_format4@py_format6s           r9   !test_marketing_pipeline_validatesz8TestPipelineValidation.test_marketing_pipeline_validatesU   s    ww||M+HI &"8,7v|777v777777v777v777777vh7777777rF   c                    t         j                  j                  t        d      }t	        |      }t        |      }g }||k(  }|st        j                  d|fd||f      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}}y	)
u:   content-pipeline.yaml이 pipeline_validator 검증 통과.r=   rJ   rL   rM   rN   rP   rQ   r   NrR   rT   s           r9   test_content_pipeline_validatesz6TestPipelineValidation.test_content_pipeline_validates\   s    ww||M+BC &"8,7v|777v777777v777v777777vh7777777rF   c                 b   t         j                  j                  t        d      }t	        |      }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}y	)
u%   schema_version이 "1.0"인지 확인.r   schema_versionz1.0rJ   )z%(py1)s == %(py4)sr!   r   assert %(py6)spy6N
r   r   r#   r$   r   r&   rS   r+   r,   r-   r2   r   rU   @py_assert0r4   rV   r8   @py_format7s           r9   &test_marketing_pipeline_schema_versionz=TestPipelineValidation.test_marketing_pipeline_schema_versionc   st    ww||M+HI &()2U2)U2222)U222)222U2222222rF   c                 (   t         j                  j                  t        d      }t	        |      }|d   }t        |t              }|sddt        j                         v st        j                  t
              rt        j                  t
              ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            dx}}|d   }t        |      }d}||kD  }|st        j                  d	|fd
||f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            dx}x}x}}y)u4   gates가 비어있지 않은 리스트인지 확인.r   gatesz5assert %(py5)s
{%(py5)s = %(py0)s(%(py2)s, %(py3)s)
}r   list)r   r   rO   r   Nr   >)z/%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} > %(py7)slenr   r   r   r   assert %(py9)spy9)r   r   r#   r$   r   r   rh   r(   r)   r&   r*   r+   r,   r-   rk   rS   )r2   r   rU   r3   @py_assert4rX   r4   r5   @py_assert5r6   @py_format10s              r9   !test_marketing_pipeline_has_gatesz8TestPipelineValidation.test_marketing_pipeline_has_gatesi   s)   ww||M+HI &"7+2z+T22222222z222z222+222222T222T2222222222G$)s$%))%))))%))))))s)))s)))$)))%))))))))))rF   c                 b   t         j                  j                  t        d      }t	        |      }|d   }d}||kD  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}y	)
u$   token_budget이 양수인지 확인.r   token_budgetr   ri   )z%(py1)s > %(py4)sr^   r_   r`   Nra   rb   s           r9   -test_marketing_pipeline_token_budget_positivezDTestPipelineValidation.test_marketing_pipeline_token_budget_positivep   ss    ww||M+HI &'+!+'!++++'!+++'+++!+++++++rF   c                 `   t         j                  j                  t        d      }t	        |      }|j
                  }d} ||      }h d}||v }|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}}y
)u'   blast_radius가 유효값인지 확인.r   blast_radius>   orgstepteamin)zI%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
} in %(py9)srU   )r   r   r   r`   rn   zassert %(py11)spy11N)r   r   r#   r$   r   getr&   rS   r(   r)   r*   r+   r,   r-   )
r2   r   rU   r3   r4   rp   @py_assert8@py_assert7rq   @py_format12s
             r9   *test_marketing_pipeline_blast_radius_validzATestPipelineValidation.test_marketing_pipeline_blast_radius_validv   s    ww||M+HI &||FNF|N+F/FF+/FFFFF+/FFFFFFFxFFFxFFF|FFFNFFF+FFF/FFFFFFFFFrF   c                 6   t         j                  j                  t        d      }t	        |      }|d   }t        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t
              rt        j                  t
              ndt        j                  |      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}x}x}}y
)u2   marketing 파이프라인이 3스텝인지 확인.r   steps   rJ   z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)srk   rl   rm   rn   Nr   r   r#   r$   r   rk   r&   rS   r(   r)   r*   r+   r,   r-   	r2   r   rU   r3   r4   r5   rp   r6   rq   s	            r9   test_marketing_pipeline_3_stepsz6TestPipelineValidation.test_marketing_pipeline_3_steps|   s    ww||M+HI &G$*s$%**%****%******s***s***$***%**********rF   c                    t         j                  j                  t        d      }t	        |      }|d   D cg c]  }|d   	 }}g d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }d	d
|iz  }t        t        j                  |            dx}}yc c}w )u9   ga4_design → dev_implement → qc_verify 순서 확인.r   r   id)
ga4_designdev_implement	qc_verifyrJ   rL   step_idsrN   zassert %(py5)sr   N)r   r   r#   r$   r   r&   rS   r(   r)   r*   r+   r,   r-   )	r2   r   rU   sr   rV   r3   rW   rX   s	            r9   "test_marketing_pipeline_step_orderz9TestPipelineValidation.test_marketing_pipeline_step_order   s    ww||M+HI &%-g%67AdG77GGxGGGGGxGGGGGGGxGGGxGGGGGGGGGGG 8s   C.c           	         t         j                  j                  t        d      }t	        |      }|d   }|d   }|j
                  }d}g } |||      }g }	||	k(  }
|
st        j                  d|
fd||	f      t        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |	      dz  }dd	|iz  }t        t        j                  |            d
x}x}x}x}x}x}
}	d}|d   }|j
                  }d}g } |||      }	||	v }|st        j                  d|fd||	f      t        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |	      dz  }dd	|iz  }t        t        j                  |            d
x}x}x}x}x}x}}	d}|d   }|j
                  }d}g } |||      }	||	v }|st        j                  d|fd||	f      t        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |	      dz  }dd	|iz  }t        t        j                  |            d
x}x}x}x}x}x}}	y
)u9   의존성 체인 확인: design → implement → verify.r   r   r   
depends_onrJ   )zS%(py9)s
{%(py9)s = %(py3)s
{%(py3)s = %(py1)s.get
}(%(py5)s, %(py7)s)
} == %(py12)s)r!   rO   r   r   rn   py12zassert %(py14)spy14Nr      r{   )zU%(py1)s in %(py12)s
{%(py12)s = %(py6)s
{%(py6)s = %(py4)s.get
}(%(py8)s, %(py10)s)
})r!   r   r`   py8py10r   r      )r   r   r#   r$   r   r~   r&   rS   r+   r,   r-   )r2   r   rU   r   rc   rV   ro   r5   r   @py_assert11@py_assert10@py_format13@py_format15r4   rp   r   @py_assert9s                    r9   $test_marketing_pipeline_dependenciesz;TestPipelineValidation.test_marketing_pipeline_dependencies   s   ww||M+HI &!Qx3x||3L3"3|L"-33-3333-333x333|333L333"333-33333333333=uQx=x||=L="=|L"==|=====|====|===x===|===L==="============@%(@(,,@|@R@,|R"@@"@@@@@"@@@@@@@(@@@,@@@|@@@R@@@"@@@@@@@@@rF   c                 6   t         j                  j                  t        d      }t	        |      }|d   }t        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t
              rt        j                  t
              ndt        j                  |      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}x}x}}y
)u0   content 파이프라인이 3스텝인지 확인.r=   r   r   rJ   r   rk   rl   rm   rn   Nr   r   s	            r9   test_content_pipeline_3_stepsz4TestPipelineValidation.test_content_pipeline_3_steps   s    ww||M+BC &G$*s$%**%****%******s***s***$***%**********rF   c           
      >   dD ]  }t         j                  j                  t        |      }t	        |      }t        |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  }t        j                  | d	|d
    d|d    d      dz   d|iz  }	t        t        j                  |	            dx}}  y)uF   모든 step의 target_team이 allowed_teams에 포함되는지 확인.r   r=   allowed_teamsr   target_teamr{   )z%(py1)s in %(py3)sallowed)r!   rO   : step 'r   z' target_team 'z' not in allowed_teamsrQ   r   N)r   r   r#   r$   r   setr&   rS   r+   r(   r)   r*   r'   r,   r-   )
r2   filenamer   rU   r   ry   rc   rV   rW   rX   s
             r9    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   *g  	 +  6   /6  	 /6      jd4G]H[G\\rs    		rF   r?   )rA   rB   rC   rD   rY   r[   re   rr   ru   r   r   r   r   r   r   rE   rF   r9   rH   rH   R   s?    ;883*,G+HA+	rF   rH   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                    t         j                  }|j                  } |t              }|st	        j
                  dt               dz   dt        j                         v st	        j                  t               rt	        j                  t               ndt	        j                  |      t	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      dz  }t        t	        j                  |            dx}x}}y)u%   templates 디렉토리 존재 확인.u   디렉토리 없음: zc
>assert %(py7)s
{%(py7)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.path
}.isdir
}(%(py5)s)
}r   TEMPLATES_DIRr   N)r   r   isdirr   r&   r'   r(   r)   r*   r+   r,   r-   )r2   r3   r4   r5   r6   s        r9   test_templates_dir_existsz+TestTemplateFiles.test_templates_dir_exists   s    wwTw}}T}]+T+TT/D]O-TTTTTTTrTTTrTTTwTTT}TTTTTT]TTT]TTT+TTTTTTrF   c           	         t         j                  j                  t        d      }t         j                  }|j                  } ||      }|st        j                  d|       dz   dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            dx}x}}t         j                  }|j                  } ||      }d}||kD  }|s4t        j                  d	|fd
||f      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      t        j                  |      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}x}x}}y)u   ga4-design.md 존재 확인.zga4-design.mdr   r   r   r   r   Nr   ri   zg%(py7)s
{%(py7)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.path
}.getsize
}(%(py5)s)
} > %(py10)sr   r   r   r   r   r      파일이 비어있음
>assert %(py12)sr   r   r   r#   r   r%   r&   r'   r(   r)   r*   r+   r,   r-   getsizerS   
r2   r   r3   r4   r5   r6   r   r   @py_format11r   s
             r9   test_ga4_design_template_existsz1TestTemplateFiles.test_ga4_design_template_exists   s{   ww||M?;ww=w~~=~d#=#==tf%=======r===r===w===~======d===d===#======wwBwBt$BqB$q(BBB$qBBBBBBrBBBrBBBwBBBBBBBBBtBBBtBBB$BBBqBBB*BBBBBBBBrF   c           	         t         j                  j                  t        d      }t         j                  }|j                  } ||      }|st        j                  d|       dz   dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            dx}x}}t         j                  }|j                  } ||      }d}||kD  }|s4t        j                  d	|fd
||f      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      t        j                  |      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}x}x}}y)u   dev-implement.md 존재 확인.zdev-implement.mdr   r   r   r   r   Nr   ri   r   r   r   r   r   r   r   s
             r9   "test_dev_implement_template_existsz4TestTemplateFiles.test_dev_implement_template_exists   s|   ww||M+=>ww=w~~=~d#=#==tf%=======r===r===w===~======d===d===#======wwBwBt$BqB$q(BBB$qBBBBBBrBBBrBBBwBBBBBBBBBtBBBtBBB$BBBqBBB*BBBBBBBBrF   c           	         t         j                  j                  t        d      }t         j                  }|j                  } ||      }|st        j                  d|       dz   dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            dx}x}}t         j                  }|j                  } ||      }d}||kD  }|s4t        j                  d	|fd
||f      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      t        j                  |      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}x}x}}y)u   qc-verify.md 존재 확인.zqc-verify.mdr   r   r   r   r   Nr   ri   r   r   r   r   r   r   r   s
             r9   test_qc_verify_template_existsz0TestTemplateFiles.test_qc_verify_template_exists   s{   ww||M>:ww=w~~=~d#=#==tf%=======r===r===w===~======d===d===#======wwBwBt$BqB$q(BBB$qBBBBBBrBBBrBBBwBBBBBBBBBtBBBtBBB$BBBqBBB*BBBBBBBBrF   c                 n   dD ]  }t         j                  j                  t        |      }t	        |      }|d   D ]t  }|j                  dd      }t         j                  j                  t        |      }t         j                  }|j                  } ||      }	|	st        j                  | d|d    d| d|       d	z   d
t        j                         v st        j                  t               rt        j                  t               nd
t        j                  |      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      dz  }
t        t        j                  |
            dx}x}}	w  y)uX   파이프라인의 task_file_template 경로가 실제 파일로 존재하는지 확인.r   r   task_file_template r   r   z' task_file_template 'z' not found at r   r   	full_pathr   N)r   r   r#   r$   r   r~   WORKSPACE_ROOTr%   r&   r'   r(   r)   r*   r+   r,   r-   )r2   r   r   rU   ry   tplr   r3   r4   r5   r6   s              r9   +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 w~~ ~i0 0     jd4NseSbclbmn 6     	   	   	 &  6   '0  	 '0  	 1      	rF   r?   )	rA   rB   rC   rD   r   r   r   r   r   rE   rF   r9   r   r      s"    /UCCC
rF   r   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 }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}d}|j                  }||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}d}|j                  }||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}d}|j                  }||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}d}|j                  }||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}y)uG   marketing-dev-pipeline dry-run이 에러 없이 완료되는지 확인.N;   cmd_run이 orchestrator.auto_orch에서 import되지 않음zmarketing-dev-pipelineTdry_runDRY-RUNr{   z+%(py1)s in %(py5)s
{%(py5)s = %(py3)s.out
}capturedr!   rO   r   assert %(py7)sr   r   r   r   r	   pytestfail
readouterroutr&   rS   r+   r(   r)   r*   r,   r-   r2   r   r   rc   ro   rV   rX   r6   s           r9   test_cmd_run_dry_run_marketingz)TestDryRun.test_cmd_run_dry_run_marketing   sR   KKUV)48$$&(HLL(yL((((yL(((y((((((H(((H(((L((((((('78<<7'<7777'<777'77777787778777<7777777+x||+||++++||+++|++++++x+++x+++|+++++++.(,,.,....,.........(...(...,.......*hll*{l****{l***{******h***h***l*******rF   c                    t         t        j                  d       t        dd       |j                         }d}|j                  }||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}d}|j                  }||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}y)uA   content-pipeline dry-run이 에러 없이 완료되는지 확인.Nr   zcontent-pipelineTr   r   r{   r   r   r   r   r   r   r   s           r9   test_cmd_run_dry_run_contentz'TestDryRun.test_cmd_run_dry_run_content   s   KKUV#T2$$&(HLL(yL((((yL(((y((((((H(((H(((L(((((((!1X\\1!\1111!\111!111111X111X111\1111111rF   c                    t         t        j                  d       t        dd       |j                         }d}|j                  }||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}y)uH   존재하지 않는 파이프라인 dry-run 시 에러 메시지 출력.Nr   znonexistent-pipelineTr   ERRORr{   r   r   r   r   r   r   r   s           r9   %test_cmd_run_dry_run_invalid_pipelinez0TestDryRun.test_cmd_run_dry_run_invalid_pipeline   s    KKUV'6$$&&(,,&w,&&&&w,&&&w&&&&&&(&&&(&&&,&&&&&&&rF   )
rA   rB   rC   rD   r   CaptureFixturestrr   r   r   rE   rF   r9   r   r      sc    >+V5J5J35O +TX +263H3H3M 2RV 2'F<Q<QRU<V '[_ 'rF   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 }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}y	)
u6   --validate로 marketing 파이프라인 검증 성공.r   Validr{   r   r   r   r   r   Nr   r   r#   r$   r   r   r   r&   rS   r+   r(   r)   r*   r,   r-   	r2   r   r   r   rc   ro   rV   rX   r6   s	            r9    test_validate_marketing_pipelinez0TestCmdValidate.test_validate_marketing_pipeline   s    ww||M+HIT$$&&(,,&w,&&&&w,&&&w&&&&&&(&&&(&&&,&&&&&&&rF   c                    t         j                  j                  t        d      }t	        |       |j                         }d}|j                  }||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}y	)
u4   --validate로 content 파이프라인 검증 성공.r=   r   r{   r   r   r   r   r   Nr   r   s	            r9   test_validate_content_pipelinez.TestCmdValidate.test_validate_content_pipeline  s    ww||M+BCT$$&&(,,&w,&&&&w,&&&w&&&&&&(&&&(&&&,&&&&&&&rF   )	rA   rB   rC   rD   r   r   r   r   r   rE   rF   r9   r   r      sC    9'v7L7LS7Q 'VZ ''V5J5J35O 'TX 'rF   r   )#rD   builtinsr(   _pytest.assertion.rewrite	assertionrewriter&   r   systypingr   r   r   r/   r   r   insertorchestrator.auto_orchr   r   orchestrator.pipeline_validatorr   r   _cmd_run_implr	   __annotations__ImportErrorr#   r$   r   r   rH   r   r   r   rE   rF   r9   <module>r      s     	 
    
 '!HHOOA~&
 ? =
?#0HhsCx 0 ^[9^-BC& &2O On# #V!' !'R' 'g  Hs   $C! !C+*C+