Ë
    ±Œ?i  ã                  ó    — d dl mZ d dlZd dlZd dlZd dlZd dlmZmZm	Z	 d dl
mZmZ d dlmZ d dlmZmZmZ  G d„ de«      Z G d	„ d
e«      Zy)é    )ÚannotationsN)ÚdatetimeÚ	timedeltaÚtimezone)Ú	MagicMockÚpatch)ÚSimpleTestCase)ÚTelegramDataValidationErrorÚsend_telegram_messageÚvalidate_telegram_init_datac                  ó8   — e Zd ZdZd	d
d„Zd„ Zd„ Zd„ Zd„ Zd„ Z	y)ÚValidateTelegramInitDataTestsztest-bot-tokenNc                ó²  — |xs | j                   }dj                  d„ t        |j                  «       «      D «       «      }t	        j
                  |j                  «       «      j                  «       }t        j                  ||j                  «       t        j
                  «      j                  «       }i |¥d|i¥}t        j                  j                  |«      S )NÚ
c              3  ó0   K  — | ]  \  }}|› d |› �–— Œ y­w)Ú=N© )Ú.0ÚkeyÚvalues      úU/home/cursorai/projects/telegram-earn/backend/apps/users/tests/test_telegram_utils.pyÚ	<genexpr>zAValidateTelegramInitDataTests._build_init_data.<locals>.<genexpr>   s$   è ø€ ð &
Ù/C¡  eˆsˆe�1�U�GÔÑ/Cùs   ‚Úhash)Ú	bot_tokenÚjoinÚsortedÚitemsÚhashlibÚsha256ÚencodeÚdigestÚhmacÚnewÚ	hexdigestÚurllibÚparseÚ	urlencode)ÚselfÚdatar   ÚtokenÚdata_check_stringÚ
secret_keyÚ	signatureÚpayloads           r   Ú_build_init_dataz.ValidateTelegramInitDataTests._build_init_data   s®   € ØÒ+˜TŸ^™^ˆØ ŸI™Iñ &
Ü/5°d·j±j³lÔ/Có&
ó 
Ðô —^‘^ E§L¡L£NÓ3×:Ñ:Ó<ˆ
Ü—H‘HØØ×$Ñ$Ó&Ü�N‰Nó
÷ ‰)‹+ð	 	ð
 .�TÐ-˜6 9Ñ-ˆÜ�|‰|×%Ñ% gÓ.Ð.ó    c                ót   — | j                  t        d«      5  t        dd¬«       d d d «       y # 1 sw Y   y xY w)NzBot token not configuredzuser=1&hash=abcÚ ©r   )ÚassertRaisesMessager
   r   )r(   s    r   Ú+test_validate_raises_when_bot_token_missingzIValidateTelegramInitDataTests.test_validate_raises_when_bot_token_missing$   s3   € Ø×%Ñ%Ü'Ð)Cõ
ô (Ð(9ÀRÕH÷
÷ 
ñ 
ús   —.®7c                óô   — t         j                  j                  dt        j                  ddi«      i«      }| j                  t        d«      5  t        || j                  ¬«       d d d «       y # 1 sw Y   y xY w)NÚuserÚidé   zMissing hash in init_datar3   )	r%   r&   r'   ÚjsonÚdumpsr4   r
   r   r   )r(   Ú	init_datas     r   Ú&test_validate_raises_when_hash_missingzDValidateTelegramInitDataTests.test_validate_raises_when_hash_missing*   s\   € Ü—L‘L×*Ñ*¨F´D·J±JÀÀa¸yÓ4IÐ+JÓKˆ	Ø×%Ñ%Ü'Ð)Dõ
ô (¨	¸T¿^¹^ÕL÷
÷ 
ñ 
ús   ÁA.Á.A7c                óf  — t        t        j                  t        j                  ¬«      j                  «       «      }| j                  t        |«      t        j                  ddi«      dœd¬«      }| j                  t        d«      5  t        || j                  ¬«       d d d «       y # 1 sw Y   y xY w)	N©Útzr8   r9   ©Ú	auth_dater7   zdifferent-token)r)   r   z#Invalid hash - data may be tamperedr3   )Úintr   Únowr   ÚutcÚ	timestampr/   Ústrr:   r;   r4   r
   r   r   )r(   rD   r<   s      r   Ú%test_validate_raises_on_hash_mismatchzCValidateTelegramInitDataTests.test_validate_raises_on_hash_mismatch1   sŽ   € Ü”(—,‘,¤(§,¡,Ô/×9Ñ9Ó;Ó<ˆØ×)Ñ)ä  ›XÜŸ
™
 D¨! 9Ó-ñð (ð *ó 
ˆ	ð ×%Ñ%Ü'Ð)Nõ
ô (¨	¸T¿^¹^ÕL÷
÷ 
ñ 
ús   ÂB'Â'B0c                ó€  — t        t        j                  t        j                  ¬«      t        d¬«      z
  j                  «       «      }| j                  t        |«      t        j                  ddi«      dœ¬«      }| j                  t        d«      5  t        || j                  d	¬
«       d d d «       y # 1 sw Y   y xY w)Nr?   é   )Úhoursr8   r9   rA   ©r)   z&initData expired (older than 24 hours)é   )r   Úexpiration_hours)rC   r   rD   r   rE   r   rF   r/   rG   r:   r;   r4   r
   r   r   )r(   Úexpiredr<   s      r   Ú+test_validate_raises_when_auth_date_expiredzIValidateTelegramInitDataTests.test_validate_raises_when_auth_date_expired?   s–   € Ü”x—|‘|¤x§|¡|Ô4´yÀrÔ7JÑJ×UÑUÓWÓXˆØ×)Ñ)ä  ›\ÜŸ
™
 D¨! 9Ó-ñð *ó 
ˆ	ð ×%Ñ%Ü'Ð)Qõ
ô (¨	¸T¿^¹^Ð^`Õa÷
÷ 
ñ 
ús   ÂB4Â4B=c                ó¦  — ddddœ}t        t        j                  t        j                  ¬«      j                  «       «      }| j                  t        |«      t        j                  |«      dœ¬«      }t        || j                  ¬«      }| j                  |d	   |d	   «       | j                  |d
   |d
   «       | j                  |d   |d   «       y )Né{   ÚAliceÚalice)r8   Ú
first_nameÚusernamer?   rA   rL   r3   r8   rU   rV   )rC   r   rD   r   rE   rF   r/   rG   r:   r;   r   r   ÚassertEqual)r(   Úuser_payloadrD   r<   Úresults        r   Ú-test_validate_returns_user_payload_when_validzKValidateTelegramInitDataTests.test_validate_returns_user_payload_when_validL   sº   € Ø!°ÀgÑNˆÜ”(—,‘,¤(§,¡,Ô/×9Ñ9Ó;Ó<ˆØ×)Ñ)ä  ›XÜŸ
™
 <Ó0ñð *ó 
ˆ	ô -¨YÀ$Ç.Á.ÔQˆà×Ñ˜ ™ |°DÑ'9Ô:Ø×Ñ˜ Ñ-¨|¸LÑ/IÔJØ×Ñ˜ 
Ñ+¨\¸*Ñ-EÕFr0   )N)r)   zdict[str, str]r   z
str | NoneÚreturnrG   )
Ú__name__Ú
__module__Ú__qualname__r   r/   r5   r=   rH   rP   rZ   r   r0   r   r   r      s*   „ Ø €Iô/òIòMòMòbóGr0   r   c                  ó|   — e Zd Z ed«      d„ «       Z ed«      d„ «       Z ed«      d„ «       Z ed«      d„ «       Zy)ÚSendTelegramMessageTestsz%utils.telegram.urllib.request.urlopenc                ób   — t        ddd¬«      }| j                  |«       |j                  «        y )Nr2   r9   Úhello©Úchat_idÚtext)r   ÚassertFalseÚassert_not_called©r(   Úmock_urlopenÚsents      r   Ú2test_send_message_returns_false_when_token_missingzKSendTelegramMessageTests.test_send_message_returns_false_when_token_missing^   s*   € ä$ R°¸ÔAˆØ×Ñ˜ÔØ×&Ñ&Õ(r0   c                ó´   — t        «       }||j                  _        d|_        ||_        t	        ddd¬«      }| j                  |«       |j                  «        y )Niô  r*   r9   rb   rc   )r   Ú	__enter__Úreturn_valueÚstatusr   rf   Úassert_called_once©r(   ri   Úmock_responserj   s       r   Ú3test_send_message_returns_false_on_non_200_responsezLSendTelegramMessageTests.test_send_message_returns_false_on_non_200_responsed   sO   € ä!›ˆØ/<ˆ×ÑÔ,Ø"ˆÔØ$1ˆÔ!ä$ W°a¸gÔFˆà×Ñ˜ÔØ×'Ñ'Õ)r0   c                ó´   — t        «       }||j                  _        d|_        ||_        t	        ddd¬«      }| j                  |«       |j                  «        y )NéÈ   r*   é*   Úwelcomerc   )r   rm   rn   ro   r   Ú
assertTruerp   rq   s       r   Ú)test_send_message_returns_true_on_successzBSendTelegramMessageTests.test_send_message_returns_true_on_successp   sM   € ä!›ˆØ/<ˆ×ÑÔ,Ø"ˆÔØ$1ˆÔ!ä$ W°b¸yÔIˆà�‰˜ÔØ×'Ñ'Õ)r0   c                ó‚   — t        d«      |_        t        ddd¬«      }| j                  |«       |j	                  «        y )Nznetwork errorr*   éc   Úoopsrc   )Ú	ExceptionÚside_effectr   rf   rp   rh   s      r   Ú$test_send_message_handles_exceptionsz=SendTelegramMessageTests.test_send_message_handles_exceptions|   s7   € ä#,¨_Ó#=ˆÔ ä$ W°b¸vÔFˆà×Ñ˜ÔØ×'Ñ'Õ)r0   N)r\   r]   r^   r   rk   rs   ry   r   r   r0   r   r`   r`   ]   sh   „ Ù
Ð2Ó3ñ)ó 4ð)ñ
 Ð2Ó3ñ	*ó 4ð	*ñ Ð2Ó3ñ	*ó 4ð	*ñ Ð2Ó3ñ*ó 4ñ*r0   r`   )Ú
__future__r   r   r"   r:   Úurllib.parser%   r   r   r   Úunittest.mockr   r   Údjango.testr	   Úutils.telegramr
   r   r   r   r`   r   r0   r   Ú<module>r…      sG   ðÝ "ã Û Û Û ß 2Ñ 2ß *å &÷ñ ôGG Nô GGôT&*˜~õ &*r0   