
    i%                         d Z ddlZej                  j                  dd       ddlmZmZmZmZm	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 Zd Zd Zd Zy)uN   
통합 테스트: utils/sanitize_gate.py
task-1837_5.1 - 닌기르수 작성
    Nz/home/jay/workspace)SANITIZE_PATTERNSgenerate_sanitize_reportsanitize_file_contentsanitize_textshould_sanitizec                  v    d} t        |       \  }}d|v sJ d|vsJ t        |      dk(  sJ |d   d   dk(  sJ y)	uS   주민등록번호(6자리-7자리)가 [RRN-REDACTED]로 마스킹되어야 한다.u1   홍길동 주민번호: 901225-1234567 입니다.[RRN-REDACTED]901225-1234567   r   typerrnNr   lentextmasked
detectionss      U/home/jay/workspace/.worktrees/task-2116-dev1/tests/integration/test_sanitize_gate.pytest_sanitize_text_masks_rrnr      s[    >D&t,FJv%%%6)))z?aa= E)))    c                  d    d} t        |       \  }}d|v sJ d|vsJ t        d |D              sJ y)uM   전화번호(010-xxxx-xxxx)가 [PHONE-REDACTED]로 마스킹되어야 한다.u-   연락처: 010-1234-5678 로 문의하세요.[PHONE-REDACTED]010-1234-5678c              3   ,   K   | ]  }|d    dk(    yw)r   phoneN .0ds     r   	<genexpr>z1test_sanitize_text_masks_phone.<locals>.<genexpr>%        8qyG#8   Nr   anyr   s      r   test_sanitize_text_masks_phoner%      sF    :D&t,FJ'''&(((8Z8888r   c                  d    d} t        |       \  }}d|v sJ d|vsJ t        d |D              sJ y)uB   이메일 주소가 [EMAIL-REDACTED]로 마스킹되어야 한다.u-   이메일: user@example.com 로 보내세요.[EMAIL-REDACTED]zuser@example.comc              3   ,   K   | ]  }|d    dk(    yw)r   emailNr   r   s     r   r    z1test_sanitize_text_masks_email.<locals>.<genexpr>.   r!   r"   Nr#   r   s      r   test_sanitize_text_masks_emailr*   (   sF    :D&t,FJ'''V+++8Z8888r   c                  d    d} t        |       \  }}d|v sJ d|vsJ t        d |D              sJ y)uK   sk- 프리픽스 API 키가 [APIKEY-REDACTED]로 마스킹되어야 한다.u'   API 키: sk-abcdefghij1234567890 사용z[APIKEY-REDACTED]zsk-abcdefghij1234567890c              3   ,   K   | ]  }|d    dk(    yw)r   apikeyNr   r   s     r   r    z5test_sanitize_text_masks_apikey_sk.<locals>.<genexpr>7        9qyH$9r"   Nr#   r   s      r   "test_sanitize_text_masks_apikey_skr/   1   sF    4D&t,FJ&((($F2229j9999r   c                  d    d} t        |       \  }}d|v sJ d|vsJ t        d |D              sJ y)ub   계좌번호(3-4자리-6자리-4자리 형식)가 [ACCOUNT-REDACTED]로 마스킹되어야 한다.u2   계좌번호: 123-456789-1234 로 입금하세요.z[ACCOUNT-REDACTED]z123-456789-1234c              3   ,   K   | ]  }|d    dk(    yw)r   accountNr   r   s     r   r    z3test_sanitize_text_masks_account.<locals>.<genexpr>@   s     :!qyI%:r"   Nr#   r   s      r    test_sanitize_text_masks_accountr3   :   sF    ?D&t,FJ6)))F***:z::::r   c                  d    d} t        |       \  }}d|v sJ d|vsJ t        d |D              sJ y)uX   보험 증권번호(대문자+숫자)가 [POLICY-REDACTED]로 마스킹되어야 한다.u.   증권번호: AB123456789 확인 바랍니다.z[POLICY-REDACTED]AB123456789c              3   ,   K   | ]  }|d    dk(    yw)r   policyNr   r   s     r   r    z2test_sanitize_text_masks_policy.<locals>.<genexpr>I   r.   r"   Nr#   r   s      r   test_sanitize_text_masks_policyr8   C   sF    ;D&t,FJ&(((&&&9j9999r   c                      d} t        |       \  }}d|vsJ d|vsJ d|vsJ d|vsJ d|vsJ |D ch c]  }|d   	 }}t        |      dk\  s
J d	|        y
c c}w )uP   여러 종류의 PII가 섞인 텍스트에서 전부 마스킹되는지 확인.u   고객 정보:
이름: 홍길동
주민번호: 901225-1234567
전화번호: 010-9876-5432
이메일: hong@test.co.kr
계좌번호: 110-123456-78901
API 키: sk-MySecretKey12345678
r
   z010-9876-5432zhong@test.co.krz110-123456-78901zsk-MySecretKey12345678r      u   감지된 유형: Nr   )r   r   r   r   detected_typess        r   'test_sanitize_text_mixed_pii_all_maskedr<   L   s    	, 	 't,FJ6)))&(((F***V+++#6111)34Aai4N4~!#J'9.9I%JJ# 5s   Ac                  @    d} t        |       \  }}|| k(  sJ |g k(  sJ y)uA   PII가 없는 일반 텍스트는 detections가 비어야 한다.uB   이 텍스트에는 개인정보가 없습니다. 안녕하세요!N)r   r   s      r   2test_sanitize_text_no_pii_returns_empty_detectionsr>   b   s0    OD&t,FJT>>r   c                      d} t        |       \  }}t        |      dk(  sJ |d   }d|v sJ d|v sJ d|v sJ d|v sJ |d   dk(  sJ |d   d	k(  sJ y
)uU   감지 항목은 type, description, original, replacement 키를 포함해야 한다.u   이메일: admin@corp.comr   r   r   descriptionoriginalreplacementzadmin@corp.comr'   Nr   )r   _r   r   s       r   -test_sanitize_text_detection_record_structurerD   j   s    &D!$'MAzz?a1AQ;;A??AZ=,,,,]1111r   c                     | dz  }|j                  dd       t        t        |            \  }}d|v sJ d|vsJ t        |      dk(  sJ y)	uN   tmp_path에 주민번호가 포함된 파일을 생성하고 마스킹 확인.ztest_pii.txtu   주민번호: 850101-2345678
utf-8encodingr	   z850101-2345678r   N
write_textr   strr   )tmp_path	test_filer   r   s       r   ,test_sanitize_file_content_masks_rrn_in_filerN   z   sa    >)I9GL.s9~>FJv%%%6)))z?ar   c                     | dz  }d}|j                  |d       t        t        |            \  }}d|vsJ d|vsJ t        |      dk\  sJ y)	uC   여러 PII가 담긴 파일에서 전부 마스킹되는지 확인.zmulti_pii.txtu.   전화: 011-234-5678
이메일: test@mail.com
rF   rG   z011-234-5678ztest@mail.com   NrI   )rL   rM   contentr   r   s        r   /test_sanitize_file_content_handles_multiple_piirR      se    ?*I@G73.s9~>FJ'''&(((z?ar   c                     ddl }t        | dz        }|j                  t        t        f      5  t        |       ddd       y# 1 sw Y   yxY w)uO   존재하지 않는 파일 경로 시 FileNotFoundError가 발생해야 한다.r   Nznonexistent.txt)pytestrK   raisesFileNotFoundErrorOSErrorr   )rL   rT   missings      r   1test_sanitize_file_content_raises_on_missing_filerY      sD    (../G	)73	4 'g&' ' 's   AAc                  ^    t        d      du sJ t        d      du sJ t        d      du sJ y)u-   level < 3이면 False를 반환해야 한다.r   Fr   rP   Nr   r   r   r   *test_should_sanitize_below_3_returns_falser\      s;    1&&&1&&&1&&&r   c                  ^    t        d      du sJ t        d      du sJ t        d      du sJ y)u-   level >= 3이면 True를 반환해야 한다.   Tr:   
   Nr[   r   r   r   -test_should_sanitize_3_and_above_returns_truer`      s;    1%%%1%%%2$&&&r   c                  @    t        d      du sJ t        d      du sJ y)u-   경계값: level=2는 False, level=3은 True.rP   Fr^   TNr[   r   r   r   #test_should_sanitize_boundary_valuerb      s(    1&&&1%%%r   c                  &    t        g       } d| v sJ y)uS   감지 항목이 없으면 '감지된 PII 없음' 문자열을 포함해야 한다.u   감지된 PII 없음Nr   )reports    r   .test_generate_sanitize_report_empty_detectionsrf      s    %b)F!V+++r   c                  N    dddddg} t        |       }d|v sJ d|v sJ d|v sJ y)	uS   감지 항목이 있으면 마크다운 테이블 헤더가 포함되어야 한다.r)   	   이메일ztest@example.comr'   r   r@   rA   rB   |u   1건Nrd   r   re   s     r   <test_generate_sanitize_report_with_detections_contains_tablerl      sP     &*-		
J &j1F&==fVr   c                  B    dddddg} t        |       }d|v sJ d|vsJ y)uO   원본 값은 앞 3자리만 표시하고 나머지는 '*'로 가려야 한다.r   u   주민등록번호r
   r	   ri   901Nrd   rk   s     r   7test_generate_sanitize_report_original_partially_hiddenro      sB     /(+		
J &j1FF??6)))r   c                  B    ddddddddd	dg} t        |       }d
|v sJ y)uQ   감지 항목이 여러 개면 총 건수가 리포트에 반영되어야 한다.r)   rh   za@b.comr'   ri   r   u   전화번호r   r   u   2건Nrd   rk   s     r   7test_generate_sanitize_report_multiple_detections_countrq      sI     &!-		
 )'-		
J &j1FVr   c                  h    h d} | j                  t        t        j                                     sJ y)uE   SANITIZE_PATTERNS에 6가지 패턴이 모두 정의되어야 한다.>   r   r)   r   r-   r7   r2   N)issubsetsetr   keys)requireds    r   1test_sanitize_patterns_contains_all_required_keysrw      s*    GHS!2!7!7!9:;;;r   c                      ddl } t        j                         D ]R  \  }}d|v s
J | d       d|v s
J | d       d|v s
J | d       t        |d   | j                        rJJ | d	        y)
uK   각 패턴은 pattern, replacement, description 키를 포함해야 한다.r   Npatternu    에 pattern 없음rB   u    에 replacement 없음r@   u    에 description 없음u     pattern이 re.Pattern이 아님)rer   items
isinstancePattern)rz   keyconfigs      r   ?test_sanitize_patterns_each_has_pattern_replacement_descriptionr      s    (..0 cVF"?se+>$??"&G3%/F(GG&&G3%/F(GG&&+RZZ8bSEAa:bb8	cr   )__doc__syspathinsertutils.sanitize_gater   r   r   r   r   r   r%   r*   r/   r3   r8   r<   r>   rD   rN   rR   rY   r\   r`   rb   rf   rl   ro   rq   rw   r   r   r   r   <module>r      s   
  ( ) *99:;:K,2  	 '''&, *",<cr   