
    c:j                       d Z ddlm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mZ  ee      j#                         j$                  d   Zedz  dz  dz  d	z  Ze
j*                  j-                  d
e      Ze
j*                  j1                  e      Zej4                  j7                  e       dZdZeeddfdZd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&d Z'd Z(d Z)d Z*d Z+d Z,d Z-d Z.d  Z/d! Z0y)"ue  
test_content_qc_2769.py — content 팀 전용 lightweight QC 회귀.

검증: PASS/FAIL(디스클레이머/권유/PII/외부발송) · 코드혼입 부적격 · self-contained(PYTHONPATH 독립) ·
      finish-task.sh 무수정 · shared/dev/design QC 무변경.
회장 승인: C-minimal — teams/content/qc/qc_verify.py 1파일, finish-task 무수정.
    )annotationsN)Path   teamscontentqcqc_verify.pycontent_qc_2769u  # 연금 정보
연금저축과 IRP는 노후 대비 제도입니다(일반 정보).
어떤 상품을 권하는 글이 아니라 제도 이해용입니다.

## 디스클레이머
본 글은 일반 정보이며 특정 상품 권유가 아닙니다. 가입 전 본인 상황에 맞는 전문가 상담을 권합니다.
세법은 매년 개정될 수 있으므로 최신 기준을 확인하시기 바랍니다.
u   # task-x

## 레벨
문서만

## allowed_resources
allowed_resources:
  paths:
    - "memory/work/insurance_content/doc.md"
  merge_policy: "none"
z$memory/work/insurance_content/doc.mdztask-ct-2769c                    | dz  dz  j                  dd       | dz  dz  | dz  j                  |d       |5| |z  }|j                  j                  dd       |j                  |d       |S )NmemorytasksTparentsexist_okz.mdutf-8encoding)mkdir
write_textparent)tmp_pathtask_mddocdoc_reltiddps         </home/jay/workspace/tests/regression/test_content_qc_2769.py_mkr   -   s    7"))$)F7"uC[0<<Ww<W

		t4
cG,J    c                0    t         j                  |d|       S )Nr   )cqcrun_gate)r   r   s     r   _runr#   7   s    <<Y11r   c                d   t        |       }t        | |      }|d   }d}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j
                  |d         dz   d|iz  }t        t        j                  |            d x}x}}y 	N	qc_resultPASS==z%(py1)s == %(py4)spy1py4reasons
>assert %(py6)spy6r   r#   
@pytest_ar_call_reprcompare	_saferepr_format_assertmsgAssertionError_format_explanationr   r   r@py_assert0@py_assert3@py_assert2@py_format5@py_format7s           r   test_good_doc_passr?   ;   st    
h-CXsA[>1V1>V#111>V111>111V111Qy\1111111r   c                   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}}d
 |d   D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}y )Nu5   # 글
연금저축과 IRP 비교(일반 정보).
끝.r   r&   FAILr(   r*   r+   assert %(py6)sr0   c              3  $   K   | ]  }d |v  
 yw)
disclaimerN .0xs     r   	<genexpr>z/test_missing_disclaimer_fail.<locals>.<genexpr>E   s     7Q|q 7   r.   ,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}anypy0py2r-   )r   r#   r2   r3   r4   r6   r7   rM   @py_builtinslocals_should_repr_global_name)	r   r   r9   r:   r;   r<   r=   r>   @py_assert1s	            r   test_missing_disclaimer_failrU   A   s    
hU
VCXsA[>#V#>V####>V###>###V#######7!I,7737777777773777377777777777777r   c                   t         dz   }t        | |      }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}}d
 |d   D        }	t        |	      }|sddt        j                         v st        j                  t              rt        j
                  t              ndt        j
                  |	      t        j
                  |      dz  }t        t        j                  |            d x}	}y )NuD   
지금 가입하세요! 이 상품에 가입하시기 바랍니다.rA   r&   rB   r(   r*   r+   rC   r0   c              3  $   K   | ]  }d |v  
 yw)no_solicitationNrF   rG   s     r   rJ   z)test_solicitation_fail.<locals>.<genexpr>M   s     <! A%<rK   r.   rL   rM   rN   	_GOOD_DOCr   r#   r2   r3   r4   r6   r7   rM   rQ   rR   rS   
r   badr   r9   r:   r;   r<   r=   r>   rT   s
             r   test_solicitation_failr]   H   s    
]
]C
hC
 CXsA[>#V#>V####>V###>###V#######<q|<<3<<<<<<<<<3<<<3<<<<<<<<<<<<<<r   c                   dD ]r  }t        | t        dz   |z   d      }t        | |      }|d   }d}||k(  }|st        j                  d|fd||f      t        j
                  |      t        j
                  |      d	z  }t        j                  d
|       dz   d|iz  }t        t        j                  |            d x}x}}d |d   D        }	t        |	      }|sddt        j                         v st        j                  t              rt        j
                  t              ndt        j
                  |	      t        j
                  |      dz  }t        t        j                  |            d x}	}u y )N)u   주민번호 900101-1234567u   연락처 010-1234-5678u   메일 hong@example.com
ztask-pii)r   r   r&   rB   r(   r*   r+   u   PII 미탐: r/   r0   c              3  $   K   | ]  }d |v  
 yw)no_piiNrF   rG   s     r   rJ   z test_pii_fail.<locals>.<genexpr>U   s     7Q8q=7rK   r.   rL   rM   rN   )r   rZ   r#   r2   r3   r4   r5   r6   r7   rM   rQ   rR   rS   )
r   piir   r9   r:   r;   r<   r=   r>   rT   s
             r   test_pii_failrc   P   s    d 8(	D 03 6JG3~==~'===~===~======<u)========7!I,77s777777777s777s77777777777777	8r   c                   t         dz   }t        | |      }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}}d
 |d   D        }	t        |	      }|sddt        j                         v st        j                  t              rt        j
                  t              ndt        j
                  |	      t        j
                  |      dz  }t        t        j                  |            d x}	}y )NuA   
고객에게 발송 완료했습니다. 블로그 게시 완료.rA   r&   rB   r(   r*   r+   rC   r0   c              3  $   K   | ]  }d |v  
 yw)external_sendNrF   rG   s     r   rJ   z*test_external_send_fail.<locals>.<genexpr>]   s     :!#:rK   r.   rL   rM   rN   rY   r[   s
             r   test_external_send_failrg   X   s    
Z
ZC
hC
 CXsA[>#V#>V####>V###>###V#######:Qy\::3:::::::::3:::3::::::::::::::r   c                   t         j                  dd      }t        | |      }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}}d |d   D        }	t        |	      }|sddt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |	      t	        j                  |      dz  }t        t	        j                  |            d x}	}y )N(- "memory/work/insurance_content/doc.md"z@- "memory/work/insurance_content/doc.md"
    - "dispatch/foo.py"r   r&   rB   r(   r*   r+   rC   r0   c              3  0   K   | ]  }d |v xs d|v   yw)u   혼입u	   부적격NrF   rG   s     r   rJ   z0test_code_file_mixed_rejected.<locals>.<genexpr>f   s!     GQx1}0q 00G   r.   rL   rM   rN   _TASK_MDreplacer   r#   r2   r3   r4   r6   r7   rM   rQ   rR   rS   
r   mdr   r9   r:   r;   r<   r=   r>   rT   s
             r   test_code_file_mixed_rejectedrr   `   s    			D]
_B
h
#CXsA[>#V#>V####>V###>###V#######G!I,GG3GGGGGGGGG3GGG3GGGGGGGGGGGGGGr   c                b   t         j                  dd      }t        | |      }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 )Nu   ## 레벨
문서만

 rj   r&   rB   r(   r*   r+   rC   r0   )	rn   ro   r   r#   r2   r3   r4   r6   r7   	r   rq   r   r9   r:   r;   r<   r=   r>   s	            r   test_no_level_marker_rejectedrv   i   s{    			4b	9B
h
#CXsA[>#V#>V####>V###>###V#######r   c                   t        |       }t        | |       | dz  dz  | dz  }|j                  } |       }|sddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}t        j                  |j                  d            }g }d	}||v }|}	|r|d
   }
d}|
|k(  }|}	|	s+t        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                  |       |r_t        j                  dfd
f      t        j                  |
      t        j                  |      dz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            d x}	x}x}x}x}
x}}y )Nr   events
.qc-resultzAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}rprN   r   r   r&   modecontent_lightweight_qc)in)z%(py3)s in %(py5)sdata)py3py5z%(py7)spy7r(   )z%(py10)s == %(py13)s)py10py13z%(py15)spy15r   zassert %(py18)spy18)r   r#   existsrQ   rR   r2   rS   r4   r6   r7   jsonloads	read_textr3   append_format_boolop)r   r   rz   rT   r;   r=   r~   r<   @py_assert4r:   @py_assert9@py_assert12@py_assert11@py_format6@py_format8@py_format14@py_format16@py_format17@py_format19s                      r   test_qc_result_file_writtenr   p   s^   
h-C3	H	x	'SE*<	<B999;;229;::bllGl45DK;K;$K4<K3KK<3K#KKKKK;$KKK;KKKKKK$KKK$KKKKKKK<3KKKK<KKK3KKKKKKKKKKKKKKKr   c                ,   t        |       }ddi}t        j                  t        j                  t        t              dd|dddt        |       g	dd|t        |       	      }|j                  }d
}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        j                  |j                        dz   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}| |z  }d}||z  }| d}||z  }|j$                  } |       }|sddt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }t!        t        j"                  |            d x}x}x}x}x}x}x}}y )NPATHz/usr/bin:/binz--gatez	--task-idz--teamr   z--workspaceT)capture_outputtextenvcwdr   r(   )z2%(py2)s
{%(py2)s = %(py0)s.returncode
} == %(py5)sproc)rO   rP   r   z
>assert %(py7)sr   ModuleNotFoundErrornot in)z2%(py1)s not in %(py5)s
{%(py5)s = %(py3)s.stderr
})r,   r   r   zassert %(py7)sr   rx   ry   iassert %(py13)s
{%(py13)s = %(py11)s
{%(py11)s = (((%(py0)s / %(py2)s) / %(py5)s) / %(py8)s).exists
}()
}r   rO   rP   r   py8py11r   )r   
subprocessrunsys
executablestr_QC
returncoder2   r3   rQ   rR   rS   r4   r5   stderrr6   r7   r   )r   r   r   r   rT   r   r;   r   r   r:   r<   @py_assert6@py_assert7r   @py_assert10r   r   s                    r   !test_self_contained_no_pythonpathr   y   s   
h-C?
#C>>	S8[#x	H	'$CS]D
 ??,a,?a,,,?a,,,,,,4,,,4,,,?,,,a,,,,,,,,,, 33 3333 333 3333333333333333333IHxI(I(*IuJ-?I*-??I?GGIGIIIIIIIIHIIIHIIIxIII(III-?IIIGIIIIIIIIIIIr   c            
     V   d} t         | z  }d}||z  }|j                  } |       }|sddt        j                         v st	        j
                  t               rt	        j                  t               ndt	        j                  |       t	        j                  |      t	        j                  |      t	        j                  |      dz  }t        t	        j                  |            d x} x}x}x}x}}d} t         | z  }d}||z  }d}||z  }|j                  } |       }|sd	dt        j                         v st	        j
                  t               rt	        j                  t               ndt	        j                  |       t	        j                  |      t	        j                  |      t	        j                  |      t	        j                  |      d
z  }	t        t	        j                  |	            d x} x}x}x}x}x}x}}dd l	}
t        j                  d      }d}||v}|st	        j                  d|fd||f      t	        j                  |      dt        j                         v st	        j
                  |      rt	        j                  |      nddz  }dd|iz  }t        t	        j                  |            d x}}|
j                  } d}|
j                  } | |||      }| }|s7ddt        j                         v st	        j
                  |
      rt	        j                  |
      ndt	        j                  |       t	        j                  |      dt        j                         v st	        j
                  |      rt	        j                  |      nddt        j                         v st	        j
                  |
      rt	        j                  |
      ndt	        j                  |      t	        j                  |      dz  }t        t	        j                  |            d x} x}x}x}}y )Nscriptszfinish-task.shz[assert %(py10)s
{%(py10)s = %(py8)s
{%(py8)s = ((%(py0)s / %(py2)s) / %(py5)s).exists
}()
}_ROOT)rO   rP   r   r   r   r   sharedr	   r   r   r   r   r   z
from utilsr   )z%(py1)s not in %(py3)ssrc)r,   r   zassert %(py5)sr   z ^\s*(from|import)\s+\S*verifierszwassert not %(py10)s
{%(py10)s = %(py2)s
{%(py2)s = %(py0)s.search
}(%(py4)s, %(py5)s, %(py8)s
{%(py8)s = %(py6)s.M
})
}_re)rO   rP   r-   r   r0   r   r   )r   r   rQ   rR   r2   rS   r4   r6   r7   rer   r   r3   searchM)rT   r;   r   r   r   r   @py_format11r   r   r   r   r   r:   r<   @py_format4r   r   @py_format12s                     r   (test_finish_task_and_shared_qc_unchangedr      s   :EI: 0: 00:088:8::::::::E:::E:::I::: 0:::8:::::::::::AEGOAhAOh&AA&7A7??A?AAAAAAAAEAAAEAAAGAAAhAAAAAA?AAAAAAAAAAA 
---
)C"<s""""<s"""<""""""s"""s"""""""zzJ=JCEEJz=sEJJJJJJJJJJJsJJJsJJJzJJJ=JJJJJJsJJJsJJJJJJCJJJCJJJEJJJJJJJJJJJr   c                   t        | d       dD ]e  }t        j                  |d|       }|d   }d}||k(  }|st        j                  d|fd||f      t        j
                  |      t        j
                  |      d	z  }t        j                  d
|      dz   d|iz  }t        t        j                  |            d x}x}}d |d   D        }t        |      }|sddt        j                         v st        j                  t              rt        j
                  t              ndt        j
                  |      t        j
                  |      dz  }t        t        j                  |            d x}}h y )Nztask-tpl-2769r   )z../etc/passwdza/bz..zfoo barrt   zx;rmr   r&   rB   r(   r*   r+   u   unsafe task_id 통과: r/   r0   c              3  $   K   | ]  }d |v  
 yw)task_idNrF   rG   s     r   rJ   z8test_high1_task_id_traversal_rejected.<locals>.<genexpr>   s     8a9>8rK   r.   rL   rM   rN   )r   r!   r"   r2   r3   r4   r5   r6   r7   rM   rQ   rR   rS   )	r   r\   r9   r:   r;   r<   r=   r>   rT   s	            r   %test_high1_task_id_traversal_rejectedr      s    o&D 9LLi2~JJ~'JJJ~JJJ~JJJJJJ+B3')JJJJJJJJ81Y<88s888888888s888s888888888888889r   c                ~   t        | d      }t        j                  dd|       }|d   }d}||k(  }|st        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }t        j                  |d	         d
z   d|iz  }t        t        j                  |            d x}x}}y )Nz	task-2770r   r   r&   r'   r(   r*   r+   r.   r/   r0   )	r   r!   r"   r2   r3   r4   r5   r6   r7   r8   s           r   test_high1_valid_task_id_passr      s}    
hK
(C[)X6A[>1V1>V#111>V111>111V111Qy\1111111r   c                   t         j                  dd      }t        | |      }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}}d |d   D        }	t        |	      }|sddt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |	      t	        j                  |      dz  }t        t	        j                  |            d x}	}y )Nri   z- "/etc/passwd"rj   r&   rB   r(   r*   r+   rC   r0   c              3  $   K   | ]  }d |v  
 yw)u   절대경로NrF   rG   s     r   rJ   z4test_high2_absolute_path_rejected.<locals>.<genexpr>        9q~"9rK   r.   rL   rM   rN   rm   rp   s
             r   !test_high2_absolute_path_rejectedr      s    			DFW	XB
h
#CXsA[>#V#>V####>V###>###V#######9AiL9939999999993999399999999999999r   c                   t         j                  dd      }t        | |      }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}}d |d   D        }	t        |	      }|sddt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |	      t	        j                  |      dz  }t        t	        j                  |            d x}	}y )Nri   z- "../../../../etc/passwd"rj   r&   rB   r(   r*   r+   rC   r0   c              3  0   K   | ]  }d |v xs d|v   yw)u   workspace 밖	traversalNrF   rG   s     r   rJ   z5test_high2_traversal_path_rejected.<locals>.<genexpr>   s"     NA!#7{a'77Nrl   r.   rL   rM   rN   rm   rp   s
             r   "test_high2_traversal_path_rejectedr      s    			D6
8B
h
#CXsA[>#V#>V####>V###>###V#######N9NN3NNNNNNNNN3NNN3NNNNNNNNNNNNNNr   c                d   t        |       }t        | |      }|d   }d}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j
                  |d         dz   d|iz  }t        t        j                  |            d x}x}}y r%   r1   r8   s           r   &test_high2_internal_relative_path_passr      st    
h-CXsA[>1V1>V#111>V111>111V111Qy\1111111r   c                F   | dz  dz  j                  dd       | dz  dz  dz  dz  j                  dd       | dz  dz  dz  j                  t        d	
       t        j	                  dd|       }|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}}d |d   D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}y )Nr   r   Tr   workinsurance_contentzdoc.mdztask-dir-2769.mdr   r   ztask-dir-2769r   r&   rB   r(   r*   r+   rC   r0   c              3  $   K   | ]  }d |v  
 yw)u   디렉토리NrF   rG   s     r   rJ   z3test_medium4_directory_not_crash.<locals>.<genexpr>   r   rK   r.   rL   rM   rN   )r   r   rn   r!   r"   r2   r3   r4   r6   r7   rM   rQ   rR   rS   )r   r9   r:   r;   r<   r=   r>   rT   s           r    test_medium4_directory_not_crashr      s0   7"))$)F6!$77(BIIRVaeIf7"%77CCHW^C__i:A[>#V#>V####>V###>###V#######9AiL9939999999993999399999999999999r   c                   t         j                  dd      }t        | |      }t        | |      }|d   }d}||k(  }|st	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }t	        j                  |d	         d
z   d|iz  }t        t	        j                  |            d x}x}}y )Nri   u6   - "memory/work/insurance_content/doc.md"   # 산출물rj   r&   r'   r(   r*   r+   r.   r/   r0   )
rn   ro   r   r#   r2   r3   r4   r5   r6   r7   ru   s	            r   #test_medium3_trailing_comment_pathsr      s    			DR
TB
h
#CXsA[>1V1>V#111>V111>111V111Qy\1111111r   )1__doc__
__future__r   builtinsrQ   _pytest.assertion.rewrite	assertionrewriter2   importlib.util	importlibr   r   r   pathlibr   __file__resolver   r   r   utilspec_from_file_location_specmodule_from_specr!   loaderexec_modulerZ   rn   r   r#   r?   rU   r]   rc   rg   rr   rv   r   r   r   r   r   r   r   r   r   r   rF   r   r   <module>r      s   #       
 X ((+go	!D(>9../@#Fnn%%e,    	
 #	;agu 228=8;H$LJ	K92:O2:2r   