Ë
    %xEi3  ã                   ó€   — d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZmZ  G d„ d	e«      Z G d
„ de«      Zy)z0Tests for deposit address and history endpoints.é    )ÚDecimal)ÚTestCase)Ú	APIClient)Ústatus)ÚUser)ÚPaymentAddressÚDepositc                   óL   — e 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)ÚDepositAddressTestCasez.Test deposit address generation and retrieval.c                 óº   — t        «       | _        t        j                  j	                  dd¬«      | _        | j                  j                  | j
                  ¬«       y)úSet up test data.é² ú	Test User©Útelegram_user_idÚ
first_name©ÚuserN)r   Úclientr   ÚobjectsÚcreate_userr   Úforce_authenticate©Úselfs    úR/home/cursorai/projects/telegram-earn/backend/apps/payments/tests/test_deposits.pyÚsetUpzDepositAddressTestCase.setUp   sG   € ä“kˆŒÜ—L‘L×,Ñ,Ø#Ø"ð -ó 
ˆŒ	ð 	�‰×&Ñ&¨D¯I©IÐ&Õ6ó    c                 ó¨  — | j                   j                  dddi«      }| j                  |j                  t        j
                  «       | j                  |j                  d   d«       | j                  |j                  d   d«       | j                  |j                  d   d«       | j                  |j                  d   j                  d	«      «       y
)z)Test creating a new Tron deposit address.ú&/api/payments/addresses/get-or-create/Ú
blockchainÚtronÚassetÚUSDTr   ÚactiveÚaddressÚTN©	r   ÚpostÚassertEqualÚstatus_coder   ÚHTTP_201_CREATEDÚdataÚ
assertTrueÚ
startswith©r   Úresponses     r   Ú*test_get_or_create_address_tron_first_timezADepositAddressTestCase.test_get_or_create_address_tron_first_time   sª   € à—;‘;×#Ñ#Ø4Ø˜6Ð"ó
ˆð
 	×Ñ˜×-Ñ-¬v×/FÑ/FÔGØ×Ñ˜Ÿ™ |Ñ4°fÔ=Ø×Ñ˜Ÿ™ wÑ/°Ô8Ø×Ñ˜Ÿ™ xÑ0°(Ô;Ø�‰˜Ÿ™ iÑ0×;Ñ;¸CÓ@ÕAr   c                 ó,  — | j                   j                  dddi«      }| j                  |j                  t        j
                  «       | j                  |j                  d   d«       | j                  |j                  d   j                  d«      «       y)z(Test creating a new BNB deposit address.r   r    Úbnbr%   Ú0xNr'   r/   s     r   Ú)test_get_or_create_address_bnb_first_timez@DepositAddressTestCase.test_get_or_create_address_bnb_first_time%   sx   € à—;‘;×#Ñ#Ø4Ø˜5Ð!ó
ˆð
 	×Ñ˜×-Ñ-¬v×/FÑ/FÔGØ×Ñ˜Ÿ™ |Ñ4°eÔ<Ø�‰˜Ÿ™ iÑ0×;Ñ;¸DÓAÕBr   c                 óÂ  — | j                   j                  dddi«      }|j                  d   }| j                   j                  dddi«      }| j                  |j                  t
        j                  «       | j                  |j                  d   |«       t        j                  j                  | j                  d¬«      j                  «       }| j                  |d«       y)z?Test retrieving existing address instead of creating duplicate.r   r    r!   r%   )r   r    é   N)r   r(   r,   r)   r*   r   ÚHTTP_200_OKr   r   Úfilterr   Úcount)r   Úfirst_responseÚfirst_addressÚsecond_responseÚaddress_counts        r   Ú+test_get_or_create_address_returns_existingzBDepositAddressTestCase.test_get_or_create_address_returns_existing0   sÔ   € ð Ÿ™×)Ñ)Ø4Ø˜6Ð"ó
ˆð '×+Ñ+¨IÑ6ˆð Ÿ+™+×*Ñ*Ø4Ø˜6Ð"ó
ˆð
 	×Ñ˜×4Ñ4´f×6HÑ6HÔIØ×Ñ˜×-Ñ-¨iÑ8¸-ÔHô '×.Ñ.×5Ñ5Ø—‘Øð 6ó 
÷ ‰%‹'ð 	ð 	×Ñ˜¨Õ*r   c                 ó”   — | j                   j                  dddi«      }| j                  |j                  t        j
                  «       y)z&Test error for unsupported blockchain.r   r    ÚethereumN)r   r(   r)   r*   r   ÚHTTP_400_BAD_REQUESTr/   s     r   Ú-test_get_or_create_address_invalid_blockchainzDDepositAddressTestCase.test_get_or_create_address_invalid_blockchainI   s?   € à—;‘;×#Ñ#Ø4Ø˜:Ð&ó
ˆð
 	×Ñ˜×-Ñ-¬v×/JÑ/JÕKr   c                 ó|  — | j                   j                  dddi«      }| j                   j                  dddi«      }| j                  |j                  t        j
                  «       | j                  |j                  t        j                  «       | j                  |j                  d   |j                  d   «       y)z.Test blockchain parameter is case-insensitive.r   r    ÚTRONÚTrOnr%   N)r   r(   r)   r*   r   r+   r8   r,   )r   Ú	response1Ú	response2s      r   Ú+test_get_or_create_address_case_insensitivezBDepositAddressTestCase.test_get_or_create_address_case_insensitiveR   sž   € à—K‘K×$Ñ$Ø4Ø˜6Ð"ó
ˆ	ð —K‘K×$Ñ$Ø4Ø˜6Ð"ó
ˆ	ð
 	×Ñ˜×.Ñ.´×0GÑ0GÔHØ×Ñ˜×.Ñ.´×0BÑ0BÔCØ×Ñ˜Ÿ™¨	Ñ2°I·N±NÀ9Ñ4MÕNr   c                 óh  — | j                   j                  dddi«      }| j                   j                  dddi«      }| j                  |j                  d   |j                  d   «       t        j
                  j                  | j                  ¬«      j                  «       }| j                  |d«       y)	z>Test separate addresses are created for different blockchains.r   r    r!   r3   r%   r   é   N)
r   r(   ÚassertNotEqualr,   r   r   r9   r   r:   r)   )r   Útron_responseÚbnb_responser>   s       r   Ú2test_get_or_create_address_separate_per_blockchainzIDepositAddressTestCase.test_get_or_create_address_separate_per_blockchaina   s    € àŸ™×(Ñ(Ø4Ø˜6Ð"ó
ˆð —{‘{×'Ñ'Ø4Ø˜5Ð!ó
ˆð
 	×Ñ˜M×.Ñ.¨yÑ9¸<×;LÑ;LÈYÑ;WÔXä&×.Ñ.×5Ñ5¸4¿9¹9Ð5ÓE×KÑKÓMˆØ×Ñ˜¨Õ*r   c                 óÌ   — | j                   j                  d¬«       | j                   j                  dddi«      }| j                  |j                  t
        j                  «       y)ú)Test unauthenticated request is rejected.Nr   r   r    r!   )r   r   r(   r)   r*   r   ÚHTTP_401_UNAUTHORIZEDr/   s     r   Ú*test_get_or_create_address_unauthenticatedzADepositAddressTestCase.test_get_or_create_address_unauthenticatedq   sT   € à�‰×&Ñ&¨DÐ&Ô1Ø—;‘;×#Ñ#Ø4Ø˜6Ð"ó
ˆð
 	×Ñ˜×-Ñ-¬v×/KÑ/KÕLr   c                 óÎ  — t         j                  j                  | j                  dddt         j                  ¬«       t         j                  j                  | j                  dddt         j                  ¬«       | j
                  j                  d«      }| j                  |j                  t        j                  «       | j                  t        |j                  d   «      d	«       y
)z&Test listing user's payment addresses.r!   r#   ÚT1234567890©r   r    r"   r%   r   r3   Ú0x1234567890ú/api/payments/addresses/ÚresultsrK   N)r   r   Úcreater   ÚSTATUS_ACTIVEr   Úgetr)   r*   r   r8   Úlenr,   r/   s     r   Útest_list_payment_addressesz2DepositAddressTestCase.test_list_payment_addresses{   s¹   € ô 	×Ñ×%Ñ%Ø—‘ØØØ!Ü!×/Ñ/ð 	&ô 	
ô 	×Ñ×%Ñ%Ø—‘ØØØ"Ü!×/Ñ/ð 	&ô 	
ð —;‘;—?‘?Ð#=Ó>ˆà×Ñ˜×-Ñ-¬v×/AÑ/AÔBØ×Ñœ˜XŸ]™]¨9Ñ5Ó6¸Õ:r   c                 óò  — t         j                  j                  dd¬«      }t        j                  j	                  | j
                  dddt        j                  ¬«       t        j                  j	                  |dddt        j                  ¬«       | j                  j                  d	«      }| j                  t        |j                  d
   «      d«       | j                  |j                  d
   d   d   d«       y)z(Test user only sees their own addresses.éd ú
Other Userr   r!   r#   ÚT1111111111rV   ÚT2222222222rX   rY   r7   r   r%   N)r   r   r   r   rZ   r   r[   r   r\   r)   r]   r,   )r   Ú
other_userr0   s      r   Ú+test_list_payment_addresses_filters_by_userzBDepositAddressTestCase.test_list_payment_addresses_filters_by_user’   sÛ   € ä—\‘\×-Ñ-Ø#Ø#ð .ó 
ˆ
ô
 	×Ñ×%Ñ%Ø—‘ØØØ!Ü!×/Ñ/ð 	&ô 	
ô 	×Ñ×%Ñ%ØØØØ!Ü!×/Ñ/ð 	&ô 	
ð —;‘;—?‘?Ð#=Ó>ˆà×Ñœ˜XŸ]™]¨9Ñ5Ó6¸Ô:Ø×Ñ˜Ÿ™ yÑ1°!Ñ4°YÑ?ÀÕOr   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r1   r5   r?   rC   rI   rO   rS   r^   re   © r   r   r   r      s=   „ Ù8ò7òBò	Cò+ò2LòOò+ò Mò;ó.Pr   r   c                   óF   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zy)ÚDepositHistoryTestCasezTest deposit history retrieval.c                 ó<  — t        «       | _        t        j                  j	                  dd¬«      | _        t        j                  j                  | j
                  dddt        j                  ¬«      | _	        | j                  j                  | j
                  ¬«       y	)
r   r   r   r   r!   r#   rU   rV   r   N)r   r   r   r   r   r   r   rZ   r[   r%   r   r   s    r   r   zDepositHistoryTestCase.setUp±   s   € ä“kˆŒÜ—L‘L×,Ñ,Ø#Ø"ð -ó 
ˆŒ	ô &×-Ñ-×4Ñ4Ø—‘ØØØ!Ü!×/Ñ/ð 5ó 
ˆŒð 	�‰×&Ñ&¨D¯I©IÐ&Õ6r   c                 óÞ   — | j                   j                  d«      }| j                  |j                  t        j
                  «       | j                  t        |j                  d   «      d«       y)zTest empty deposit history.ú/api/payments/deposits/rY   r   N)r   r\   r)   r*   r   r8   r]   r,   r/   s     r   Útest_deposit_history_emptyz1DepositHistoryTestCase.test_deposit_history_emptyÁ   sO   € à—;‘;—?‘?Ð#<Ó=ˆà×Ñ˜×-Ñ-¬v×/AÑ/AÔBØ×Ñœ˜XŸ]™]¨9Ñ5Ó6¸Õ:r   c           
      ó&  — t         j                  j                  | j                  | j                  ddt        d«      ddt         j                  ¬«       t         j                  j                  | j                  | j                  ddt        d«      dd	t         j                  ¬«       | j                  j                  d
«      }| j                  |j                  t        j                  «       | j                  t        |j                  d   «      d«       y)z Test retrieving deposit history.r!   r#   ú100.00000000Ú0xabc123é
   ©r   r%   r    r"   ÚamountÚtransaction_hashÚconfirmationsr   z50.50000000Ú0xdef456é   ro   rY   rK   N)r	   r   rZ   r   r%   r   ÚSTATUS_CONFIRMEDÚSTATUS_PENDINGr   r\   r)   r*   r   r8   r]   r,   r/   s     r   Ú"test_deposit_history_with_depositsz9DepositHistoryTestCase.test_deposit_history_with_depositsÈ   s×   € ä�‰×ÑØ—‘Ø—L‘LØØÜ˜>Ó*Ø'ØÜ×+Ñ+ð 	ô 		
ô 	�‰×ÑØ—‘Ø—L‘LØØÜ˜=Ó)Ø'ØÜ×)Ñ)ð 	ô 		
ð —;‘;—?‘?Ð#<Ó=ˆà×Ñ˜×-Ñ-¬v×/AÑ/AÔBØ×Ñœ˜XŸ]™]¨9Ñ5Ó6¸Õ:r   c           
      ó^  — t         j                  j                  | j                  | j                  ddt        d«      ddt         j                  ¬«       | j                  j                  d«      }| j                  t        t        |j                  d   d	   d
   «      «      t        d«      «       y)z2Test deposit amounts maintain 8-decimal precision.r!   r#   z123.45678901rs   rt   ru   ro   rY   r   rv   N©r	   r   rZ   r   r%   r   r{   r   r\   r)   Ústrr,   r/   s     r   Útest_deposit_history_precisionz5DepositHistoryTestCase.test_deposit_history_precisionä   s�   € ä�‰×ÑØ—‘Ø—L‘LØØÜ˜>Ó*Ø'ØÜ×+Ñ+ð 	ô 		
ð —;‘;—?‘?Ð#<Ó=ˆà×ÑÜ”C˜Ÿ™ iÑ0°Ñ3°HÑ=Ó>Ó?Ü�NÓ#õ	
r   c           	      óÌ  — t         j                  j                  dd¬«      }t        j                  j	                  |dddt        j
                  ¬«      }t        j                  j	                  | j                  | j                  ddt        d«      d	t        j                  ¬
«       t        j                  j	                  ||ddt        d«      dt        j                  ¬
«       | j                  j                  d«      }| j                  t        |j                  d   «      d«       | j                  t        t!        |j                  d   d   d   «      «      t        d«      «       y)z'Test user only sees their own deposits.r`   ra   r   r!   r#   ÚT9999999999rV   rr   rs   ©r   r%   r    r"   rv   rw   r   ú200.00000000ry   ro   rY   r7   r   rv   N)r   r   r   r   rZ   r[   r	   r   r%   r   r{   r   r\   r)   r]   r,   r€   )r   rd   Úother_addressr0   s       r   Ú$test_deposit_history_filters_by_userz;DepositHistoryTestCase.test_deposit_history_filters_by_userø   s3  € ä—\‘\×-Ñ-Ø#Ø#ð .ó 
ˆ
ô '×.Ñ.×5Ñ5ØØØØ!Ü!×/Ñ/ð 6ó 
ˆô 	�‰×ÑØ—‘Ø—L‘LØØÜ˜>Ó*Ø'Ü×+Ñ+ð 	ô 	
ô 	�‰×ÑØØ!ØØÜ˜>Ó*Ø'Ü×+Ñ+ð 	ô 	
ð —;‘;—?‘?Ð#<Ó=ˆà×Ñœ˜XŸ]™]¨9Ñ5Ó6¸Ô:Ø×Ñœ¤ X§]¡]°9Ñ%=¸aÑ%@ÀÑ%JÓ!KÓLÌgÐVdÓNeÕfr   c           	      óˆ  — ddl m} ddlm} t        j
                  j                  | j                  | j                  ddt        d«      dt        j                  ¬«      }|j                  «        |d	¬
«      z
  |_        |j                  «        t        j
                  j                  | j                  | j                  ddt        d«      dt        j                  ¬«      }| j                  j!                  d«      }| j#                  |j$                  d   d   d   d«       | j#                  |j$                  d   d   d   d«       y)z8Test deposits are ordered by detected_at (latest first).r   )Útimezone)Ú	timedeltar!   r#   rr   Ú0xoldr„   rz   )Údaysr…   Ú0xnewro   rY   rw   r7   N)Údjango.utilsr‰   ÚdatetimerŠ   r	   r   rZ   r   r%   r   r{   ÚnowÚdetected_atÚsaver|   r   r\   r)   r,   )r   r‰   rŠ   Úold_depositÚnew_depositr0   s         r   Útest_deposit_history_orderingz4DepositHistoryTestCase.test_deposit_history_ordering  s  € å)Ý&ä—o‘o×,Ñ,Ø—‘Ø—L‘LØØÜ˜>Ó*Ø$Ü×+Ñ+ð -ó 
ˆð #+§,¡,£.±9À!Ô3DÑ"DˆÔØ×ÑÔä—o‘o×,Ñ,Ø—‘Ø—L‘LØØÜ˜>Ó*Ø$Ü×)Ñ)ð -ó 
ˆð —;‘;—?‘?Ð#<Ó=ˆð 	×Ñ˜Ÿ™ yÑ1°!Ñ4Ð5GÑHÈ'ÔRØ×Ñ˜Ÿ™ yÑ1°!Ñ4Ð5GÑHÈ'ÕRr   c                 óz  — g d¢}t        |«      D ]Q  \  }}t        j                  j                  | j                  | j
                  ddt        |dz   › d�«      d|› �|¬«       ŒS | j                  j                  d«      }|j                  d	   D �cg c]  }|d
   ‘Œ	 }}|D ]  }| j                  ||«       Œ yc c}w )z6Test all deposit status values are returned correctly.)ÚpendingÚ	confirmedÚfailedÚ	duplicater!   r#   r7   z00.00000000r4   r„   ro   rY   r   N)Ú	enumerater	   r   rZ   r   r%   r   r   r\   r,   ÚassertIn)r   ÚstatusesÚidxÚstatus_valuer0   ÚdÚreturned_statusess          r   Ú"test_deposit_history_status_valuesz9DepositHistoryTestCase.test_deposit_history_status_values?  s¾   € âBˆä!*¨8Ö!4ÑˆC�Ü�O‰O×"Ñ"Ø—Y‘YØŸ™Ø!ØÜ #¨¡' ¨+Ð6Ó7Ø#% l ^Ð!4Ø#ð #õ ð "5ð —;‘;—?‘?Ð#<Ó=ˆà2:·-±-À	Ò2JÓKÑ2J¨Q˜Q˜x›[Ð2JÐÐKÛ$ˆLØ�M‰M˜,Ð(9Õ:ñ %ùò Ls   ÂB8c           	      ó\  — t         j                  j                  | j                  | j                  ddt        d«      dt         j                  ¬«       | j                  j                  d«      }| j                  t        t        |j                  d   d   d	   «      «      t        d
«      «       y)z)Test handling very large deposit amounts.r!   r#   z999999999.99999999Ú0xhuger„   ro   rY   r   rv   z1000000000.00000000Nr   r/   s     r   Ú"test_deposit_history_large_amountsz9DepositHistoryTestCase.test_deposit_history_large_amountsT  sŽ   € ä�‰×ÑØ—‘Ø—L‘LØØÜÐ/Ó0Ø%Ü×+Ñ+ð 	ô 	
ð —;‘;—?‘?Ð#<Ó=ˆà×ÑÜ”C˜Ÿ™ iÑ0°Ñ3°HÑ=Ó>Ó?ÜÐ)Ó*õ	
r   c                 óÆ   — | j                   j                  d¬«       | j                   j                  d«      }| j                  |j                  t
        j                  «       y)rQ   Nr   ro   )r   r   r\   r)   r*   r   rR   r/   s     r   Ú$test_deposit_history_unauthenticatedz;DepositHistoryTestCase.test_deposit_history_unauthenticatedg  sF   € à�‰×&Ñ&¨DÐ&Ô1Ø—;‘;—?‘?Ð#<Ó=ˆà×Ñ˜×-Ñ-¬v×/KÑ/KÕLr   N)rf   rg   rh   ri   r   rp   r}   r�   r‡   r•   r¢   r¥   r§   rj   r   r   rl   rl   ®   s7   „ Ù)ò7ò ;ò;ò8
ò($gòLSòB;ò*
ó&Mr   rl   N)ri   Údecimalr   Údjango.testr   Úrest_framework.testr   Úrest_frameworkr   Úapps.users.modelsr   Úapps.payments.modelsr   r	   r   rl   rj   r   r   Ú<module>r®      s;   ðÙ 6å Ý  Ý )Ý !å "ß 8ô_P˜Xô _PôD~M˜Xõ ~Mr   