
    liV                        d Z ddlZddlmc mZ ddlZddlm	Z	 ddl
Z
 e	e      j                  j                  Z ee      ej                  vr"ej                  j!                  d ee             ddlmZmZmZmZmZ  G d d      Z G d d      Z G d	 d
      Z G d d      Z G d d      ZddlmZ  G d d      Zy)u    utils/sanitize_gate.py 테스트    N)Path)SANITIZE_PATTERNSgenerate_sanitize_reportsanitize_file_contentsanitize_textshould_sanitizec                       e Zd ZdZd Zy)TestShouldSanitizeu)   should_sanitize() 레벨별 동작 검증c                  	   d}t        |      }d}||u }|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}}d
}t        |      }d}||u }|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}}d}t        |      }d}||u }|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}}d}t        |      }d}||u }|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}}d}t        |      }d}||u }|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	)ug   level 0~4에 대해 should_sanitize() 동작 검증:
        0, 1, 2 → False / 3, 4 → True
        r   F)is)z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} is %(py7)sr   )py0py2py4py7assert %(py9)spy9N         T   )	r   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation)self@py_assert1@py_assert3@py_assert6@py_assert5@py_format8@py_format10s          //home/jay/workspace/tests/test_sanitize_gate.pytest_should_sanitize_levelsz.TestShouldSanitize.test_should_sanitize_levels   s     !*q!*U*!U****!U************q***!***U******* *q!*U*!U****!U************q***!***U******* *q!*U*!U****!U************q***!***U******* )q!)T)!T))))!T))))))))))))q)))!)))T))))))) )q!)T)!T))))!T))))))))))))q)))!)))T)))))))    N)__name__
__module____qualname____doc__r'    r(   r&   r
   r
      s
    3*r(   r
   c                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
TestSanitizeTextu$   sanitize_text() PII 마스킹 검증c                    d}t        |      \  }}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}}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   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#   주민등록번호 마스킹 검증u   주민번호: 900101-1234567[RRN-REDACTED]inz%(py1)s in %(py3)smaskedpy1py3assert %(py5)spy5Nr   ==z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slen
detectionsr   r7   r8   py6assert %(py8)spy8r   typerrn)z%(py1)s == %(py4)s)r7   r   zassert %(py6)srA   
r   r   r   r   r   r   r   r   r   r>   )r   textr5   r?   @py_assert0@py_assert2@py_format4@py_format6r#   @py_assert4@py_format7@py_format9r!   @py_format5s                 r&   test_sanitize_text_rrnz'TestSanitizeText.test_sanitize_text_rrn+   sT   -*40
)6))))6)))))))))6)))6))))))):#!#!####!######s###s######:###:######!#######!}V$--$----$---$----------r(   c                    d}t        |      \  }}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}}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}	}y	)u   전화번호 마스킹 검증u   연락처: 010-1234-5678[PHONE-REDACTED]r2   r4   r5   r6   r9   r:   Nr   r;   r=   r>   r?   r@   rB   rC   rF   )r   rG   r5   r?   rH   rI   rJ   rK   r#   rL   rM   rN   s               r&   test_sanitize_text_phonez)TestSanitizeText.test_sanitize_text_phone4   s    )*40
!+!V++++!V+++!++++++V+++V+++++++:#!#!####!######s###s######:###:######!#######r(   c                 n   d}t        |      \  }}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   이메일 마스킹 검증u   이메일: test@example.comz[EMAIL-REDACTED]r2   r4   r5   r6   r9   r:   N	r   r   r   r   r   r   r   r   r   r   rG   r5   _detectionsrH   rI   rJ   rK   s           r&   test_sanitize_text_emailz)TestSanitizeText.test_sanitize_text_email<   sr    ,+D1!+!V++++!V+++!++++++V+++V+++++++r(   c                 n   d}t        |      \  }}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   API 키 마스킹 검증u   키: sk-1234567890abcdefz[APIKEY-REDACTED]r2   r4   r5   r6   r9   r:   NrU   rV   s           r&   test_sanitize_text_apikeyz*TestSanitizeText.test_sanitize_text_apikeyC   sr    )+D1","f,,,,"f,,,",,,,,,f,,,f,,,,,,,r(   c                 n   d}t        |      \  }}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$   보험 증권번호 마스킹 검증u   증권: AB12345678z[POLICY-REDACTED]r2   r4   r5   r6   r9   r:   NrU   rV   s           r&   test_sanitize_text_policyz*TestSanitizeText.test_sanitize_text_policyJ   sr    #+D1","f,,,,"f,,,",,,,,,f,,,f,,,,,,,r(   c                 D   d}t        |      \  }}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}}y
)u%   여러 PII가 섞인 텍스트 검증uS   주민번호: 900101-1234567, 연락처: 010-1234-5678, 이메일: test@example.comr   >=z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)sr>   r?   r@   rB   rC   N
r   r>   r   r   r   r   r   r   r   r   )	r   rG   _maskedr?   rI   r#   rL   rM   rN   s	            r&   test_sanitize_text_multiplez,TestSanitizeText.test_sanitize_text_multipleQ   s    d+D1:#!#!####!######s###s######:###:######!#######r(   c                    d}t        |      \  }}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}}||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
)uA   PII 없는 텍스트 — detections 0건, 원본 그대로 반환u/   안녕하세요. 오늘 날씨가 좋습니다.r   r;   r=   r>   r?   r@   rB   rC   N)z%(py0)s == %(py2)sr5   original)r   r   zassert %(py4)sr   ra   )r   re   r5   r?   rI   r#   rL   rM   rN   r    @py_format3rO   s               r&   test_sanitize_text_no_piiz*TestSanitizeText.test_sanitize_text_no_piiX   s
   D*84
:#!#!####!######s###s######:###:######!#######!!!!v!!!!!!v!!!v!!!!!!!!!!!!!!!!r(   N)r)   r*   r+   r,   rP   rS   rX   rZ   r\   rc   rg   r-   r(   r&   r/   r/   (   s(    ..$,--$"r(   r/   c                       e Zd ZdZd Zd Zy)TestSanitizeFileContentu/   sanitize_file_content() 파일 읽기 테스트c                    |dz  }|j                  dd       t        t        |            \  }}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}}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}
}	y)u]   실제 파일 읽기 테스트 — tmpdir에 PII 포함된 파일 생성 후 마스킹 확인zpii_sample.txtuH   이름: 홍길동
주민번호: 900101-1234567
연락처: 010-9876-5432
zutf-8)encodingr1   r2   r4   r5   r6   r9   r:   NrR   r   r^   r`   r>   r?   r@   rB   rC   )
write_textr   strr   r   r   r   r   r   r   r   r>   )r   tmp_pathpii_filer5   r?   rH   rI   rJ   rK   r#   rL   rM   rN   s                r&   test_sanitize_file_contentz2TestSanitizeFileContent.test_sanitize_file_contentd   s   ..Y 	 	

 33x=A
)6))))6)))))))))6)))6)))))))!+!V++++!V+++!++++++V+++V+++++++:#!#!####!######s###s######:###:######!#######r(   c                 v    t        j                  t              5  t        d       ddd       y# 1 sw Y   yxY w)u7   존재하지 않는 파일 → FileNotFoundError 예외z#/tmp/nonexistent_file_xyz_12345.txtN)pytestraisesFileNotFoundErrorr   )r   s    r&   test_sanitize_file_not_foundz4TestSanitizeFileContent.test_sanitize_file_not_foundr   s1    ]],- 	I!"GH	I 	I 	Is   /8N)r)   r*   r+   r,   rp   ru   r-   r(   r&   ri   ri   a   s    9$Ir(   ri   c                       e Zd ZdZd Zd Zy)TestGenerateSanitizeReportu2   generate_sanitize_report() 리포트 생성 검증c                 d   t        g       }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)	uC   detections가 빈 리스트일 때 '감지된 PII 없음' 메시지u   감지된 PII 없음r2   r4   reportr6   r9   r:   N	r   r   r   r   r   r   r   r   r   )r   ry   rH   rI   rJ   rK   s         r&   test_generate_report_emptyz5TestGenerateSanitizeReport.test_generate_report_empty{   sh    )"-%/%////%///%////////////////r(   c                 ^   ddddddddd	dg}t        |      }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}}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)uJ   detections에 여러 항목이 있을 때 markdown 테이블 생성 확인rE   u   주민등록번호z900101-1234567r1   )rD   descriptionre   replacementphoneu   전화번호z010-1234-5678rR   |r2   r4   ry   r6   r9   r:   N2rz   )r   r?   ry   rH   rI   rJ   rK   s          r&   $test_generate_report_with_detectionsz?TestGenerateSanitizeReport.test_generate_report_with_detections   s    3,/	  -+1	

 **5 sf}sfsffuuu w&    w&   w      &   &       sf}sfsffr(   N)r)   r*   r+   r,   r{   r   r-   r(   r&   rw   rw   x   s    <0r(   rw   c                       e Zd ZdZd Zy)TestPatternsCompletenessu"   SANITIZE_PATTERNS 완전성 검증c                 H   h d}|j                   }t        j                  } |       }t        |      } ||      }|s[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                  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}}y)uZ   SANITIZE_PATTERNS에 6개 패턴(rrn, phone, email, apikey, account, policy) 존재 확인>   rE   emailr   apikeypolicyaccountzassert %(py12)s
{%(py12)s = %(py2)s
{%(py2)s = %(py0)s.issubset
}(%(py10)s
{%(py10)s = %(py3)s(%(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py4)s.keys
}()
})
})
}required_keyssetr   )r   r   r8   r   rA   rC   py10py12N)issubsetr   keysr   r   r   r   r   r   r   r   )r   r   r    r#   @py_assert7@py_assert9@py_assert11@py_format13s           r&   test_patterns_completenessz3TestPatternsCompleteness.test_patterns_completeness   s    P%%D*;*@*@D*@*BDc*B&CD%&CDDDDDDDD}DDD}DDD%DDDDDDcDDDcDDDDDD*;DDD*;DDD*@DDD*BDDD&CDDDDDDDDDDDr(   N)r)   r*   r+   r,   r   r-   r(   r&   r   r      s    ,Er(   r   )format_for_promptc                   "    e Zd ZdZd Zd Zd Zy)TestGateInstructionsSanitizeu>   format_for_prompt()의 sanitize 문자열 포함 여부 검증c                    t        d      }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                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}x}}y	)
uA   format_for_prompt(3) 결과에 'sanitize' 문자열 포함 확인r   sanitizer2   zD%(py1)s in %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.lower
}()
}resultr7   r8   r:   r   r   r   N
r   lowerr   r   r   r   r   r   r   r   r   r   rH   rL   r"   rI   r$   r%   s           r&   #test_gate_instructions_sanitize_lv3z@TestGateInstructionsSanitize.test_gate_instructions_sanitize_lv3       "1%+V\\+\^+z^++++z^+++z++++++V+++V+++\+++^+++++++r(   c                    t        d      }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                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}x}}y	)
uA   format_for_prompt(4) 결과에 'sanitize' 문자열 포함 확인r   r   r2   r   r   r   r   r   Nr   r   s           r&   #test_gate_instructions_sanitize_lv4z@TestGateInstructionsSanitize.test_gate_instructions_sanitize_lv4   r   r(   c                    t        d      }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                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}x}}y	)
uD   format_for_prompt(2) 결과에 'sanitize' 문자열 미포함 확인r   r   )not in)zH%(py1)s not in %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.lower
}()
}r   r   r   r   Nr   r   s           r&   &test_gate_instructions_no_sanitize_lv2zCTestGateInstructionsSanitize.test_gate_instructions_no_sanitize_lv2   s    "1%///z////z///z//////////////////////r(   N)r)   r*   r+   r,   r   r   r   r-   r(   r&   r   r      s    H,
,
0r(   r   )r,   builtinsr   _pytest.assertion.rewrite	assertionrewriter   syspathlibr   rr   __file__parent
_WORKSPACErm   pathinsertutils.sanitize_gater   r   r   r   r   r
   r/   ri   rw   r   prompts.gate_instructionsr   r   r-   r(   r&   <module>r      s    &   
   (^""))
z?#(("HHOOAs:' * *6" 6"rI I.! !HE E 80 0r(   