
    (<iV                     h   d 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                     t        d      du sJ t        d      du sJ t        d      du sJ t        d      du sJ t        d      du sJ y)	ug   level 0~4에 대해 should_sanitize() 동작 검증:
        0, 1, 2 → False / 3, 4 → True
        r   F         T   N)r   selfs    I/home/jay/workspace/.worktrees/task-2057-dev2/tests/test_sanitize_gate.pytest_should_sanitize_levelsz.TestShouldSanitize.test_should_sanitize_levels   sc     q!U***q!U***q!U***q!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                 j    d}t        |      \  }}d|v sJ t        |      dk(  sJ |d   d   dk(  sJ y)u#   주민등록번호 마스킹 검증u   주민번호: 900101-1234567[RRN-REDACTED]r   r   typerrnNr   lenr   textmasked
detectionss       r   test_sanitize_text_rrnz'TestSanitizeText.test_sanitize_text_rrn+   sM    -*40
6))):!###!}V$---r   c                 P    d}t        |      \  }}d|v sJ t        |      dk(  sJ y)u   전화번호 마스킹 검증u   연락처: 010-1234-5678[PHONE-REDACTED]r   Nr    r"   s       r   test_sanitize_text_phonez)TestSanitizeText.test_sanitize_text_phone4   s6    )*40
!V+++:!###r   c                 0    d}t        |      \  }}d|v sJ y)u   이메일 마스킹 검증u   이메일: test@example.comz[EMAIL-REDACTED]Nr   r   r#   r$   _detectionss       r   test_sanitize_text_emailz)TestSanitizeText.test_sanitize_text_email<   s$    ,+D1!V+++r   c                 0    d}t        |      \  }}d|v sJ y)u   API 키 마스킹 검증u   키: sk-1234567890abcdefz[APIKEY-REDACTED]Nr+   r,   s       r   test_sanitize_text_apikeyz*TestSanitizeText.test_sanitize_text_apikeyC   s$    )+D1"f,,,r   c                 0    d}t        |      \  }}d|v sJ y)u$   보험 증권번호 마스킹 검증u   증권: AB12345678z[POLICY-REDACTED]Nr+   r,   s       r   test_sanitize_text_policyz*TestSanitizeText.test_sanitize_text_policyJ   s$    #+D1"f,,,r   c                 D    d}t        |      \  }}t        |      dk\  sJ y)u%   여러 PII가 섞인 텍스트 검증uS   주민번호: 900101-1234567, 연락처: 010-1234-5678, 이메일: test@example.comr   Nr    )r   r#   _maskedr%   s       r   test_sanitize_text_multiplez,TestSanitizeText.test_sanitize_text_multipleQ   s(    d+D1:!###r   c                 R    d}t        |      \  }}t        |      dk(  sJ ||k(  sJ y)uA   PII 없는 텍스트 — detections 0건, 원본 그대로 반환u/   안녕하세요. 오늘 날씨가 좋습니다.r   Nr    )r   originalr$   r%   s       r   test_sanitize_text_no_piiz*TestSanitizeText.test_sanitize_text_no_piiX   s6    D*84
:!###!!!r   N)r   r   r   r   r&   r)   r.   r0   r2   r5   r8   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 sJ d|v sJ t        |      dk\  sJ y)	u]   실제 파일 읽기 테스트 — tmpdir에 PII 포함된 파일 생성 후 마스킹 확인zpii_sample.txtuH   이름: 홍길동
주민번호: 900101-1234567
연락처: 010-9876-5432
zutf-8)encodingr   r(   r   N)
write_textr   strr!   )r   tmp_pathpii_filer$   r%   s        r   test_sanitize_file_contentz2TestSanitizeFileContent.test_sanitize_file_contentd   si    ..Y 	 	

 33x=A
6)))!V+++:!###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   rA   rF   r   r   r   r:   r:   a   s    9$Ir   r:   c                       e Zd ZdZd Zd Zy)TestGenerateSanitizeReportu2   generate_sanitize_report() 리포트 생성 검증c                 &    t        g       }d|v sJ y)uC   detections가 빈 리스트일 때 '감지된 PII 없음' 메시지u   감지된 PII 없음Nr   )r   reports     r   test_generate_report_emptyz5TestGenerateSanitizeReport.test_generate_report_empty{   s    )"-%///r   c                 f    ddddddddd	dg}t        |      }d
|v sJ d|v sJ d|v sJ d|v sJ y)uJ   detections에 여러 항목이 있을 때 markdown 테이블 생성 확인r   u   주민등록번호z900101-1234567r   )r   descriptionr7   replacementphoneu   전화번호z010-1234-5678r(   |2NrJ   )r   r%   rK   s      r   $test_generate_report_with_detectionsz?TestGenerateSanitizeReport.test_generate_report_with_detections   so     3,/	  -+1	

 **5 f}}&   f}}r   N)r   r   r   r   rL   rS   r   r   r   rH   rH   x   s    <0r   rH   c                       e Zd ZdZd Zy)TestPatternsCompletenessu"   SANITIZE_PATTERNS 완전성 검증c                 h    h d}|j                  t        t        j                                     sJ y)uZ   SANITIZE_PATTERNS에 6개 패턴(rrn, phone, email, apikey, account, policy) 존재 확인>   r   emailrP   apikeypolicyaccountN)issubsetsetr   keys)r   required_keyss     r   test_patterns_completenessz3TestPatternsCompleteness.test_patterns_completeness   s*    P%%c*;*@*@*B&CDDDr   N)r   r   r   r   r_   r   r   r   rU   rU      s    ,Er   rU   )format_for_promptc                   "    e Zd ZdZd Zd Zd Zy)TestGateInstructionsSanitizeu>   format_for_prompt()의 sanitize 문자열 포함 여부 검증c                 B    t        d      }d|j                         v sJ y)uA   format_for_prompt(3) 결과에 'sanitize' 문자열 포함 확인r   sanitizeNr`   lowerr   results     r   #test_gate_instructions_sanitize_lv3z@TestGateInstructionsSanitize.test_gate_instructions_sanitize_lv3        "1%V\\^+++r   c                 B    t        d      }d|j                         v sJ y)uA   format_for_prompt(4) 결과에 'sanitize' 문자열 포함 확인r   rd   Nre   rg   s     r   #test_gate_instructions_sanitize_lv4z@TestGateInstructionsSanitize.test_gate_instructions_sanitize_lv4   rj   r   c                 B    t        d      }d|j                         vsJ y)uD   format_for_prompt(2) 결과에 'sanitize' 문자열 미포함 확인r   rd   Nre   rg   s     r   &test_gate_instructions_no_sanitize_lv2zCTestGateInstructionsSanitize.test_gate_instructions_no_sanitize_lv2   s     "1%///r   N)r   r   r   r   ri   rl   rn   r   r   r   rb   rb      s    H,
,
0r   rb   )r   syspathlibr   rC   __file__parent
_WORKSPACEr>   pathinsertutils.sanitize_gater   r   r   r   r   r
   r   r:   rH   rU   prompts.gate_instructionsr`   rb   r   r   r   <module>rx      s    & 
   (^""))
z?#(("HHOOAs:' * *6" 6"rI I.! !HE E 80 0r   