
    i%                         d Z ddlZddlmc m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                     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}}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	)uS   주민등록번호(6자리-7자리)가 [RRN-REDACTED]로 마스킹되어야 한다.u1   홍길동 주민번호: 901225-1234567 입니다.[RRN-REDACTED]inz%(py1)s in %(py3)smaskedpy1py3assert %(py5)spy5N901225-1234567not inz%(py1)s not in %(py3)s   ==z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slen
detectionspy0r   r   py6assert %(py8)spy8r   typerrnz%(py1)s == %(py4)sr   py4assert %(py6)sr   )
r   
@pytest_ar_call_reprcompare	_saferepr@py_builtinslocals_should_repr_global_nameAssertionError_format_explanationr   )textr   r   @py_assert0@py_assert2@py_format4@py_format6@py_assert5@py_assert4@py_format7@py_format9@py_assert3@py_format5s                ;/home/jay/workspace/tests/integration/test_sanitize_gate.pytest_sanitize_text_masks_rrnr<      s   >D&t,FJ%v%%%%v%%%%%%%%%v%%%v%%%%%%%)6))))6)))))))))6)))6)))))))z?a?a?a33zz?aa= )E) E)))) E))) )))E)))))))    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}}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 |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	)uM   전화번호(010-xxxx-xxxx)가 [PHONE-REDACTED]로 마스킹되어야 한다.u-   연락처: 010-1234-5678 로 문의하세요.[PHONE-REDACTED]r
   r   r   r   r   r   N010-1234-5678r   r   c              3   ,   K   | ]  }|d    dk(    yw)r"   phoneN .0ds     r;   	<genexpr>z1test_sanitize_text_masks_phone.<locals>.<genexpr>%        8qyG#8   ,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}anyr   py2r&   
r   r(   r)   r*   r+   r,   r-   r.   r/   rK   
r0   r   r   r1   r2   r3   r4   @py_assert1r9   r:   s
             r;   test_sanitize_text_masks_phonerQ      s*   :D&t,FJ''''''''''''''''''''''''(?&((((?&(((?((((((&(((&(((((((8Z8838888888883888388888888888888r=   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}}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 |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	)uB   이메일 주소가 [EMAIL-REDACTED]로 마스킹되어야 한다.u-   이메일: user@example.com 로 보내세요.[EMAIL-REDACTED]r
   r   r   r   r   r   Nzuser@example.comr   r   c              3   ,   K   | ]  }|d    dk(    yw)r"   emailNrC   rD   s     r;   rG   z1test_sanitize_text_masks_email.<locals>.<genexpr>.   rH   rI   rJ   rK   rL   rN   rO   s
             r;   test_sanitize_text_masks_emailrV   (   s-   :D&t,FJ''''''''''''''''''''''''+V++++V+++++++++V+++V+++++++8Z8838888888883888388888888888888r=   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}}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 |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	)uK   sk- 프리픽스 API 키가 [APIKEY-REDACTED]로 마스킹되어야 한다.u'   API 키: sk-abcdefghij1234567890 사용z[APIKEY-REDACTED]r
   r   r   r   r   r   Nzsk-abcdefghij1234567890r   r   c              3   ,   K   | ]  }|d    dk(    yw)r"   apikeyNrC   rD   s     r;   rG   z5test_sanitize_text_masks_apikey_sk.<locals>.<genexpr>7        9qyH$9rI   rJ   rK   rL   rN   rO   s
             r;   "test_sanitize_text_masks_apikey_skr[   1   s-   4D&t,FJ(&((((&(((((((((&(((&((((((($2$F2222$F222$222222F222F22222229j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                     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}}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 |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	)ub   계좌번호(3-4자리-6자리-4자리 형식)가 [ACCOUNT-REDACTED]로 마스킹되어야 한다.u2   계좌번호: 123-456789-1234 로 입금하세요.z[ACCOUNT-REDACTED]r
   r   r   r   r   r   Nz123-456789-1234r   r   c              3   ,   K   | ]  }|d    dk(    yw)r"   accountNrC   rD   s     r;   rG   z3test_sanitize_text_masks_account.<locals>.<genexpr>@   s     :!qyI%:rI   rJ   rK   rL   rN   rO   s
             r;    test_sanitize_text_masks_accountr_   :   s-   ?D&t,FJ)6))))6)))))))))6)))6)))))))*F****F*********F***F*******:z::3:::::::::3:::3::::::::::::::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}}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 |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	)uX   보험 증권번호(대문자+숫자)가 [POLICY-REDACTED]로 마스킹되어야 한다.u.   증권번호: AB123456789 확인 바랍니다.z[POLICY-REDACTED]r
   r   r   r   r   r   NAB123456789r   r   c              3   ,   K   | ]  }|d    dk(    yw)r"   policyNrC   rD   s     r;   rG   z2test_sanitize_text_masks_policy.<locals>.<genexpr>I   rZ   rI   rJ   rK   rL   rN   rO   s
             r;   test_sanitize_text_masks_policyrd   C   s*   ;D&t,FJ(&((((&(((((((((&(((&(((((((&=&&&&=&&&=&&&&&&&&&&&&&&&&9j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                  	   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}}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}}|D ch c]  }|d   	 }}t        |      }d}	||	k\  }
|
st        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  }t        j                  d|       dz   d|iz  }t        t        j                  |            d	x}x}
}	y	c c}w )uP   여러 종류의 PII가 섞인 텍스트에서 전부 마스킹되는지 확인.u   고객 정보:
이름: 홍길동
주민번호: 901225-1234567
전화번호: 010-9876-5432
이메일: hong@test.co.kr
계좌번호: 110-123456-78901
API 키: sk-MySecretKey12345678
r   r   r   r   r   r   r   Nz010-9876-5432zhong@test.co.krz110-123456-78901zsk-MySecretKey12345678r"      >=z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)sr   detected_typesr   u   감지된 유형: z
>assert %(py8)sr!   )r   r(   r)   r*   r+   r,   r-   r.   r/   r   _format_assertmsg)r0   r   r   r1   r2   r3   r4   rF   rj   r5   r6   r7   r8   s                r;   'test_sanitize_text_mixed_pii_all_maskedrl   L   s   	, 	 't,FJ)6))))6)))))))))6)))6)))))))(?&((((?&(((?((((((&(((&(((((((*F****F*********F***F*******+V++++V+++++++++V+++V+++++++#1#61111#6111#111111611161111111)34Aai4N4~J!J!#JJJ!JJJJJJ3JJJ3JJJJJJ~JJJ~JJJJJJ!JJJ'9.9I%JJJJJJJJ 5s   Rc                     d} t        |       \  }}|| 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	}g }||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	)uA   PII가 없는 일반 텍스트는 detections가 비어야 한다.uB   이 텍스트에는 개인정보가 없습니다. 안녕하세요!r   )z%(py0)s == %(py2)sr   r0   )r   rM   zassert %(py4)sr&   N)z%(py0)s == %(py3)sr   )r   r   r   r   )	r   r(   r)   r+   r,   r-   r*   r.   r/   )	r0   r   r   rP   @py_format3r:   r2   r3   r4   s	            r;   2test_sanitize_text_no_pii_returns_empty_detectionsro   b   s    OD&t,FJT>6T66TT::::r=   c                  v	   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}}|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}	}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   }	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}|	|k(  }|slt        j                  d|fd|	|f      t        j                  |	      t        j                  |      dz  }dd|iz  }t        t        j                  |            d
x}	x}}y
)uU   감지 항목은 type, description, original, replacement 키를 포함해야 한다.u   이메일: admin@corp.comr   r   r   r   r   r   r    r!   Nr   r"   r
   r   rF   r   r   r   descriptionoriginalreplacementzadmin@corp.comr$   r%   r'   r   rS   )
r   r   r(   r)   r+   r,   r-   r*   r.   r/   )r0   _r   r2   r5   r6   r7   r8   rF   r1   r3   r4   r9   r:   s                 r;   -test_sanitize_text_detection_record_structureru   j   s   &D!$'MAzz?a?a?a33zz?a1A6Q;6Q6QQ=A=A=AA:?::=A=A=AAZ=,,,=,,,,,=,,,,=,,,,,,,,,,,]11111111111111111111111r=   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)uN   tmp_path에 주민번호가 포함된 파일을 생성하고 마스킹 확인.ztest_pii.txtu   주민번호: 850101-2345678
utf-8encodingr	   r
   r   r   r   r   r   Nz850101-2345678r   r   r   r   r   r   r   r   r    r!   
write_textr   strr(   r)   r*   r+   r,   r-   r.   r/   r   )tmp_path	test_filer   r   r1   r2   r3   r4   r5   r6   r7   r8   s               r;   ,test_sanitize_file_content_masks_rrn_in_filer   z   sw   >)I9GL.s9~>FJ%v%%%%v%%%%%%%%%v%%%v%%%%%%%)6))))6)))))))))6)))6)))))))z?a?a?a33zz?ar=   c                    | dz  }d}|j                  |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)uC   여러 PII가 담긴 파일에서 전부 마스킹되는지 확인.zmulti_pii.txtu.   전화: 011-234-5678
이메일: test@mail.com
rw   rx   z011-234-5678r   r   r   r   r   r   Nztest@mail.com   rg   ri   r   r   r   r    r!   rz   )r}   r~   contentr   r   r1   r2   r3   r4   r5   r6   r7   r8   s                r;   /test_sanitize_file_content_handles_multiple_piir      su   ?*I@G73.s9~>FJ'>''''>'''>''''''''''''''''(?&((((?&(((?((((((&(((&(((((((z?a?a?a33z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)pytestr|   raisesFileNotFoundErrorOSErrorr   )r}   r   missings      r;   1test_sanitize_file_content_raises_on_missing_filer      sD    (../G	)73	4 'g&' ' 's   AAc                  h   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	)u-   level < 3이면 False를 반환해야 한다.r   Fisz0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} is %(py7)sr   r   rM   r&   py7assert %(py9)spy9Nr   r   	r   r(   r)   r+   r,   r-   r*   r.   r/   rP   r9   @py_assert6r5   @py_format8@py_format10s         r;   *test_should_sanitize_below_3_returns_falser      s   &?1&&&&&&&&&&&&?&&&?&&&1&&&&&&&&&&&&&&?1&&&&&&&&&&&&?&&&?&&&1&&&&&&&&&&&&&&?1&&&&&&&&&&&&?&&&?&&&1&&&&&&&&&&&&&r=   c                  h   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	)u-   level >= 3이면 True를 반환해야 한다.   Tr   r   r   r   r   r   Nrf   
   r   r   s         r;   -test_should_sanitize_3_and_above_returns_truer      s   %?1%%%%%%%%%%%%?%%%?%%%1%%%%%%%%%%%%%%?1%%%%%%%%%%%%?%%%?%%%1%%%%%%%%%%%%%&?2&$&$&&&&$&&&&&&?&&&?&&&2&&&&&&$&&&&&&&r=   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}}y	)u-   경계값: level=2는 False, level=3은 True.r   Fr   r   r   r   r   r   Nr   Tr   r   s         r;   #test_should_sanitize_boundary_valuer      s   &?1&&&&&&&&&&&&?&&&?&&&1&&&&&&&&&&&&&%?1%%%%%%%%%%%%?%%%?%%%1%%%%%%%%%%%%%r=   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)	uS   감지 항목이 없으면 '감지된 PII 없음' 문자열을 포함해야 한다.u   감지된 PII 없음r
   r   reportr   r   r   N	r   r(   r)   r*   r+   r,   r-   r.   r/   )r   r1   r2   r3   r4   s        r;   .test_generate_sanitize_report_empty_detectionsr      sh    %b)F!+!V++++!V+++!++++++V+++V+++++++r=   c                     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}}y)uS   감지 항목이 있으면 마크다운 테이블 헤더가 포함되어야 한다.rU   	   이메일ztest@example.comrS   r"   rq   rr   rs   |r
   r   r   r   r   r   Nu   1건r   r   r   r1   r2   r3   r4   s         r;   <test_generate_sanitize_report_with_detections_contains_tabler      s2    &*-		
J &j1F3&=3&3&&7f7f7ff6V6V6VVr=   c                     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}}y)uO   원본 값은 앞 3자리만 표시하고 나머지는 '*'로 가려야 한다.r#   u   주민등록번호r   r	   r   901r
   r   r   r   r   r   Nr   r   r   r   s         r;   7test_generate_sanitize_report_original_partially_hiddenr      s     /(+		
J &j1F5F?5F5FF)6))))6)))))))))6)))6)))))))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}}y)uQ   감지 항목이 여러 개면 총 건수가 리포트에 반영되어야 한다.rU   r   za@b.comrS   r   rB   u   전화번호r@   r?   u   2건r
   r   r   r   r   r   Nr   r   s         r;   7test_generate_sanitize_report_multiple_detections_countr      s     &!-		
 )'-		
J &j1F6V6V6VVr=   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)uE   SANITIZE_PATTERNS에 6가지 패턴이 모두 정의되어야 한다.>   r#   rU   rB   rY   rc   r^   zassert %(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setr   )r   rM   r   r&   r   r!   py10py12N)issubsetr   keysr   r+   r,   r(   r-   r*   r.   r/   )r   rP   r5   @py_assert7@py_assert9@py_assert11@py_format13s          r;   1test_sanitize_patterns_contains_all_required_keysr      s    GH;!2!7!7;!7!9;S!9:;:;;;;;;;;8;;;8;;;;;;;;;S;;;S;;;;;;!2;;;!2;;;!7;;;!9;;;:;;;;;;;;;;;r=   c            	         ddl } t        j                         D ]i  \  }}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	z   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  }t        j                  | d      d	z   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  }t        j                  | d      d	z   d
|iz  }t        t        j                  |            dx}}|d   }| j                  }t        ||      }	|	st        j                  | d      dz   dt        j                         v st        j                  t              rt        j
                  t              ndt        j
                  |      dt        j                         v st        j                  |       rt        j
                  |       ndt        j
                  |      t        j
                  |	      dz  }
t        t        j                  |
            dx}x}}	l y)uK   각 패턴은 pattern, replacement, description 키를 포함해야 한다.r   Npatternr
   r   configr   u    에 pattern 없음z
>assert %(py5)sr   rs   u    에 replacement 없음rq   u    에 description 없음u     pattern이 re.Pattern이 아님zT
>assert %(py7)s
{%(py7)s = %(py0)s(%(py2)s, %(py5)s
{%(py5)s = %(py3)s.Pattern
})
}
isinstancere)r   rM   r   r   r   )r   r   itemsr(   r)   r*   r+   r,   r-   rk   r.   r/   Patternr   )r   keyr   r1   r2   r3   r4   rP   r6   r   r   s              r;   ?test_sanitize_patterns_each_has_pattern_replacement_descriptionr      s   (..0 cV?yF"???yF???y??????F???F????se+>$???????G}&GGG}GGG}GGGGGGGGGGGGG3%/F(GGGGGGGG}&GGG}GGG}GGGGGGGGGGGGG3%/F(GGGGGGG +bRZZbz+Z8b8bbSEAa:bbbbbbbzbbbzbbb+bbbbbbRbbbRbbbZbbb8bbbbbb	cr=   )%__doc__builtinsr+   _pytest.assertion.rewrite	assertionrewriter(   syspathinsertutils.sanitize_gater   r   r   r   r   r<   rQ   rV   r[   r_   rd   rl   ro   ru   r   r   r   r   r   r   r   r   r   r   r   r   rC   r=   r;   <module>r      s   
  
 ( ) *99:;:K,2  	 '''&, *",<cr=   