§
    l¯½jë  ã                   óÒ   — d 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 ddlmZmZmZ  G d„ d¦  «        Z G d„ de
j        ¦  «        Zed	k    r e
j        ¦   «          dS dS )
u•   
Unit tests for Chat Multi-Channel Routing, Multilingual Profanity Filter,
RMT/Chá»£ Ä�en Surveillance, and Cryptographic Item Linking in FreeExile.
é    N)ÚItemLinkService)ÚAsyncSentinelRMTDetectorÚChatModerationPipelineÚSynchronousTrieFilterc                   óL   — e Zd ZdZd	d„Zdedefd„Zdedeeee	f         fd„Z
dS )
ÚMultilingualFilterPythonzLPython mirror of C++ MultilingualProfanityFilter for unit test verification.ÚreturnNc                 óÄ   — h d£| _         t          j        d¦  «        t          j        dt          j        ¦  «        t          j        dt          j        ¦  «        g| _        d S )N>   ÚclÚdmÚsbÚcacÚcnmÚditÚdkmÚlonÚnmdÚvclÚbuoiÚfuckÚscamÚshitÚbitchz(03|05|07|08|09)\d{8}z-(zalo|telegram|tele|fb\.com)[\s\:\@\.\-_]*\w+z5(chuyen khoan|atm|momo|ban vang|thu mua ngoc|ban acc))Úbanned_wordsÚreÚcompileÚ
IGNORECASEÚrmt_patterns©Úselfs    ú<C:\Projects\FreeExile\tests\unit\test_chat_and_moderation.pyÚ__init__z!MultilingualFilterPython.__init__   s\   € ð
ð 
ð 
ˆÔõ
 ŒJÐ/Ñ0Ô0ÝŒJÐGÍÌÑWÔWÝŒJÐOÕQSÔQ^Ñ_Ô_ð
ˆÔÐÐó    Útextc                 óÖ   — |                      ¦   «         }dddddddœ}|                     ¦   «         D ]\  }}|                     ||¦  «        }ŒdD ]}|                     |d¦  «        }Œ|S )	NÚaÚoÚiÚeÚs)ú@Ú0Ú1ú!Ú3ú$)ú.Ú_ú-ú ú/Ú )ÚlowerÚitemsÚreplace)r    r$   r*   ÚsubsÚkÚvÚchs          r!   Ú	normalizez"MultilingualFilterPython.normalize    s{   € Ø�JŠJ‰LŒLˆØ˜s¨°3¸SÀsÐKÐKˆØ—J’J‘L”Lð 	 ð 	 ‰DˆAˆqØ—	’	˜!˜Q‘”ˆAˆAØ+ð 	"ð 	"ˆBØ—	’	˜"˜bÑ!Ô!ˆAˆAØˆr#   Úraw_contentc                 óø   ‡‡— |                       ‰¦  «        Št          ˆfd„| j        D ¦   «         ¦  «        }t          ˆˆfd„| j        D ¦   «         ¦  «        }d}|r|dz  }|r|dz  }||t	          |d¦  «        fS )Nc              3   ó    •K  — | ]}|‰v V — Œ	d S ©N© )Ú.0ÚwÚ
normalizeds     €r!   ú	<genexpr>z2MultilingualFilterPython.filter.<locals>.<genexpr>+   s'   øè è € ÐGÐG°˜A ˜OÐGÐGÐGÐGÐGÐGr#   c              3   ól   •K  — | ].}|                      ‰¦  «        p|                      ‰¦  «        V — Œ/d S rB   )Úsearch)rD   ÚprF   r?   s     €€r!   rG   z2MultilingualFilterPython.filter.<locals>.<genexpr>,   s@   øè è € Ð^Ð^Àq�Q—X’X˜kÑ*Ô*ÐB¨a¯hªh°zÑ.BÔ.BÐ^Ð^Ð^Ð^Ð^Ð^r#   r   é   é<   éd   )r>   Úanyr   r   Úmin)r    r?   Úhas_profanityÚis_rmtÚ
risk_scorerF   s    `   @r!   ÚfilterzMultilingualFilterPython.filter)   s¢   øø€ Ø—^’^ KÑ0Ô0ˆ
ÝÐGÐGÐGÐG°TÔ5FÐGÑGÔGÑGÔGˆÝÐ^Ð^Ð^Ð^Ð^ÈDÔL]Ð^Ñ^Ô^Ñ^Ô^ˆàˆ
Øð 	Ø˜"ÑˆJØð 	Ø˜"ÑˆJà˜f¥c¨*°cÑ&:Ô&:Ð:Ð:r#   ©r	   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r"   Ústrr>   ÚtupleÚboolÚintrS   rC   r#   r!   r   r      s}   € € € € € ØVÐVð	
ð 	
ð 	
ð 	
ð˜cð  cð ð ð ð ð; #ð ;¨%°°d¸C°Ô*@ð ;ð ;ð ;ð ;ð ;ð ;r#   r   c                   óF   — e Zd Zd
d„Zd
d„Zd
d„Zd
d„Zd
d„Zd
d„Zd
d	„Z	dS )ÚTestChatAndModerationr	   Nc                 ó¬   — t          ¦   «         | _        t          ¦   «         | _        t	          ¦   «         | _        t          ¦   «         | _        d| _        d S )Ns!   FREEEXILE_SECRET_SIGNING_KEY_2026)	r   Úlegacy_filterr   Útrie_filterr   Úpipeliner   Úitem_link_serviceÚ
secret_keyr   s    r!   ÚsetUpzTestChatAndModeration.setUp8   sD   € Ý5Ñ7Ô7ˆÔÝ0Ñ2Ô2ˆÔÝ.Ñ0Ô0ˆŒÝ!0Ñ!2Ô!2ˆÔØ>ˆŒˆˆr#   c                 óŽ   — g d¢}|D ]=\  }}| j                              |¦  «        \  }}}|                      ||d|› �¦  «         Œ>dS )zATest catching toxic words hidden with dots, leetspeak, or spaces.))zd.m mayT)zthang d-k-mT)z	con l_o_nT)zwhat the f.u.c.kT)zchao ban nheF)zanh em tap trung danh bossFzFailed for: N)r`   rS   ÚassertEqual)r    Ú
test_casesr$   Úexpected_profaneÚhas_profaner2   s         r!   Ú0test_multilingual_profanity_and_leetspeak_bypasszFTestChatAndModeration.test_multilingual_profanity_and_leetspeak_bypass?   sz   € ð
ð 
ð 
ˆ
ð '1ð 	Sð 	SÑ"ˆDÐ"Ø $Ô 2× 9Ò 9¸$Ñ ?Ô ?ÑˆK˜˜AØ×Ò˜[Ð*:Ð<QÈ4Ð<QÐ<QÑRÔRÐRÐRð	Sð 	Sr#   c                 ó¾   — g d¢}|D ]U\  }}| j                              |¦  «        \  }}}|                      ||d|› �¦  «         |r|                      |d¦  «         ŒVdS )zXTest identifying illegal real money trading (RMT), phone numbers, and Zalo/Tele handles.))z'Ban vang gia re lien he zalo 0987654321T)zNhan chuyen khoan atm lay ngocT)zInbox telegram @trader_proT)z!Ai mua kiem cam pm toi trong gameFzFailed RMT test for: rL   N)r`   rS   rg   ÚassertGreaterEqual)r    Ú	rmt_casesr$   Úexpected_rmtr2   rQ   Úscores          r!   Ú#test_rmt_and_black_market_detectionz9TestChatAndModeration.test_rmt_and_black_market_detectionM   s�   € ð
ð 
ð 
ˆ	ð #,ð 	3ð 	3ÑˆD�,Ø#Ô1×8Ò8¸Ñ>Ô>ÑˆAˆv�uØ×Ò˜V \Ð3QÈ4Ð3QÐ3QÑRÔRÐRØð 3Ø×'Ò'¨¨rÑ2Ô2Ð2øð		3ð 	3r#   c                 ó^  — d}d}d}|› d|› d|› �                      d¦  «        }t          j        | j        |t          j        ¦  «                             ¦   «         }|› d|› d|› �                      d¦  «        }t          j        | j        |t          j        ¦  «                             ¦   «         }|                      ||¦  «         |› d|› d�                      d¦  «        }t          j        | j        |t          j        ¦  «                             ¦   «         }	|                      ||	¦  «         dS )zETest HMAC-SHA256 signature generation and anti-spoofing verification.Úitem_sword_999zThanh Phong Huyen Kiemé   ú:zutf-8z:5N)	ÚencodeÚhmacÚnewrd   ÚhashlibÚsha256Ú	hexdigestrg   ÚassertNotEqual)
r    Ú	item_uuidÚ	item_nameÚrarityÚmessageÚ	signatureÚ	valid_msgÚexpected_sigÚspoofed_msgÚspoofed_sigs
             r!   Ú)test_cryptographic_item_linking_signaturez?TestChatAndModeration.test_cryptographic_item_linking_signature[   s(  € à$ˆ	Ø,ˆ	Øˆð Ð5Ð5 Ð5Ð5¨VÐ5Ð5×<Ò<¸WÑEÔEˆÝ”H˜Tœ_¨gµw´~ÑFÔF×PÒPÑRÔRˆ	ð !Ð7Ð7 9Ð7Ð7¨vÐ7Ð7×>Ò>¸wÑGÔGˆ	Ý”x ¤°½G¼NÑKÔK×UÒUÑWÔWˆØ×Ò˜ LÑ1Ô1Ð1ð #Ð2Ð2 YÐ2Ð2Ð2×9Ò9¸'ÑBÔBˆÝ”h˜tœ°½W¼^ÑLÔL×VÒVÑXÔXˆØ×Ò˜I {Ñ3Ô3Ð3Ð3Ð3r#   c                 óâ  — | j                              d¦  «        \  }}|                      |¦  «         |                      d|¦  «         |                      d|¦  «         | j                              d¦  «        \  }}|                      |¦  «         |                      d|¦  «         | j                              d¦  «        \  }}|                      |¦  «         |                      |d¦  «         dS )zRTest SynchronousTrieFilter masks vulgarities with *** and preserves harmless text.zthang d.m may c_a_cz***zd.mu   thang Ä‘.á»‹.t mayzchao ban, toi hoc class nayN)ra   Úscan_and_censorÚ
assertTrueÚassertInÚassertNotInÚassertFalserg   )r    Úhas_profÚmaskedÚ	has_prof2Úmasked2Ú	has_prof3Útext3s          r!   Ú$test_synchronous_trie_censor_maskingz:TestChatAndModeration.test_synchronous_trie_censor_maskingo   sï   € ð  Ô+×;Ò;Ð<QÑRÔRÑˆ�&Ø�Š˜Ñ!Ô!Ð!Ø�Š�e˜VÑ$Ô$Ð$Ø×Ò˜ Ñ'Ô'Ð'ð "Ô-×=Ò=Ð>RÑSÔSÑˆ	�7Ø�Š˜	Ñ"Ô"Ð"Ø�Š�e˜WÑ%Ô%Ð%ð  Ô+×;Ò;Ð<YÑZÔZÑˆ	�5Ø×Ò˜Ñ#Ô#Ð#Ø×Ò˜Ð =Ñ>Ô>Ð>Ð>Ð>r#   c                 ó|  — | j                              d¦  «        }|                      |j        ¦  «         |                      |j        ¦  «         |                      |j        d¦  «         | j                              d¦  «        }|                      |j        ¦  «         |                      |j        ¦  «         |                      |j        d¦  «         | j                              d¦  «        }|                      |j        ¦  «         |                      |j        ¦  «         |                      |j        d¦  «         dS )zHTest ChatModerationPipeline computes risk scores and triggers auto-mute.z$Ban vang chuyen khoan atm 0912345678rL   z Ban acc nhan usdt qua vi dien tuz,Toi muon ban cay kiem pham cap 50 trong gamer   N)	rb   Úprocessr‰   rQ   Úshould_auto_muterm   rR   rŒ   rg   )r    Úres1Úres2Úres3s       r!   Ú&test_pipeline_rmt_and_crypto_auto_mutez<TestChatAndModeration.test_pipeline_rmt_and_crypto_auto_mute�   s  € ð Œ}×$Ò$Ð%KÑLÔLˆØ�Š˜œÑ$Ô$Ð$Ø�Š˜Ô-Ñ.Ô.Ð.Ø×Ò ¤°Ñ4Ô4Ð4ð Œ}×$Ò$Ð%GÑHÔHˆØ�Š˜œÑ$Ô$Ð$Ø�Š˜Ô-Ñ.Ô.Ð.Ø×Ò ¤°Ñ4Ô4Ð4ð Œ}×$Ò$Ð%SÑTÔTˆØ×Ò˜œÑ%Ô%Ð%Ø×Ò˜Ô.Ñ/Ô/Ð/Ø×Ò˜œ¨!Ñ,Ô,Ð,Ð,Ð,r#   c           	      ó  — | j                              ddddddd¬¦  «        }|                      | j                              ddd|j        ¦  «        ¦  «         |                      | j                              ddd|j        ¦  «        ¦  «         d	S )
zMTest ItemLinkService creates snapshots, verifies HMAC, and detects tampering.Úaxe_777zKhai Son Phué   é   é   éK   z	Cuong Dao)r}   Úitem_name_keyr   ÚelementÚqualityÚ
item_levelÚcrafter_nameN)rc   Úcreate_item_snapshotr‰   Úverify_item_signatureÚhmac_signaturerŒ   )r    Úsnaps     r!   Ú$test_item_link_service_full_workflowz:TestChatAndModeration.test_item_link_service_full_workflow•   sœ   € àÔ%×:Ò:ØØ(ØØØØØ$ð ;ñ 
ô 
ˆð 	�Š˜Ô.×DÒDÀYÐP^Ð`aÐcgÔcvÑwÔwÑxÔxÐxà×Ò˜Ô/×EÒEÀiÐQ_ÐabÐdhÔdwÑxÔxÑyÔyÐyÐyÐyr#   rT   )
rU   rV   rW   re   rk   rq   r†   r“   rš   rª   rC   r#   r!   r^   r^   7   sª   € € € € € ð?ð ?ð ?ð ?ðSð Sð Sð Sð3ð 3ð 3ð 3ð4ð 4ð 4ð 4ð(?ð ?ð ?ð ?ð$-ð -ð -ð -ð(zð zð zð zð zð zr#   r^   Ú__main__)rX   ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arry   rw   r   ÚunittestÚserver.chat.item_link_servicer   Úserver.chat.moderationr   r   r   r   ÚTestCaser^   rU   ÚmainrC   r#   r!   ú<module>r·      s   ððð ð
 € € € € € € € € € € € € €€€€Ø €€€Ø 	€	€	€	Ø €€€à 9Ð 9Ð 9Ð 9Ð 9Ð 9ðð ð ð ð ð ð ð ð ð ð!;ð !;ð !;ð !;ð !;ñ !;ô !;ð !;ðHkzð kzð kzð kzð kz˜HÔ-ñ kzô kzð kzð\ ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr#   