Ë
    :Œ?i63  ã                  ó®   — 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 ddlmZmZ dd	lmZmZ dd
lmZ d„ Z G d„ de«      Z G d„ de«      Zy)z&API tests for investments and rewards.é    )Úannotations)Ú	timedelta)ÚDecimal)Úreverse)Útimezone)Ústatus)Ú	APIClientÚAPITestCase)Ú
InvestmentÚReward)ÚUserc                ó8   — t        | t        «      r	d| v r| d   S | S )z1Handle paginated and non-paginated DRF responses.Úresults)Ú
isinstanceÚdict)Úpayloads    úR/home/cursorai/projects/telegram-earn/backend/apps/investments/tests/test_views.pyÚget_resultsr      s#   € ä�'œ4Ô  Y°'Ñ%9Ø�yÑ!Ð!Ø€Nó    c                  óD   — e Zd Zdd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zy
)ÚInvestmentApiTestsc                ó¼   — t         j                  j                  ddd¬«      | _        t	        «       | _        | j
                  j                  | j                  ¬«       y )Néo   ÚInvestorÚinvestor©Útelegram_user_idÚ
first_nameÚusername©Úuser)r   ÚobjectsÚcreate_userr!   r	   ÚclientÚforce_authenticate)Úselfs    r   ÚsetUpzInvestmentApiTests.setUp   sJ   € Ü—L‘L×,Ñ,Ø Ø!Øð -ó 
ˆŒ	ô
  “kˆŒØ�‰×&Ñ&¨D¯I©IÐ&Õ6r   c                ón  — t        d«      | j                  _        | j                  j                  «        t	        d«      }| j
                  j                  |ddid¬«      }| j                  |j                  t        j                  «       t        j                  j                  |j                  d   ¬«      }| j                  |j                  d	«       | j                  |j                   t        d
«      «       | j                  |j"                  d«       | j                  |j                  t        j$                  «       | j'                  t)        j*                  «       |j,                  z
  t/        d¬«      «       | j                  |j0                  |j,                  z
  j2                  |j"                  «       y)z=POST /investments sets tier, rate, duration, start/end dates.z1500.00000000úinvestment-listÚamountÚ1500Újson©ÚformatÚid©r/   é   z2.50é–   é   )ÚsecondsN)r   r!   Úcredit_balanceÚsaver   r$   ÚpostÚassertEqualÚstatus_coder   ÚHTTP_201_CREATEDr   r"   ÚgetÚdataÚtierÚdaily_reward_rateÚduration_daysÚSTATUS_PENDINGÚ
assertLessr   ÚnowÚ
start_dater   Úend_dateÚdays©r&   ÚurlÚresponseÚ
investments       r   Ú0test_create_investment_derives_tier_and_schedulezCInvestmentApiTests.test_create_investment_derives_tier_and_schedule"   sD  € ô $+¨?Ó#;ˆ�	‰	Ô Ø�	‰	�‰ÔäÐ'Ó(ˆØ—;‘;×#Ñ# C¨(°FÐ);ÀFÐ#ÓKˆà×Ñ˜×-Ñ-¬v×/FÑ/FÔGÜ×'Ñ'×+Ñ+¨x¯}©}¸TÑ/BÐ+ÓCˆ
Ø×Ñ˜Ÿ™¨!Ô,Ø×Ñ˜×5Ñ5´w¸v³ÔGØ×Ñ˜×1Ñ1°3Ô7Ø×Ñ˜×*Ñ*¬J×,EÑ,EÔFð 	�‰œŸ™›¨×)>Ñ)>Ñ>Ä	ÐRSÔ@TÔUØ×ÑØ× Ñ  :×#8Ñ#8Ñ8×>Ñ>Ø×$Ñ$õ	
r   c                óæ   — t        d«      }| j                  j                  |ddid¬«      }| j                  |j                  t
        j                  «       | j                  d|j                  «       y)z3Amount under $10 is rejected with validation error.r)   r*   Ú5r,   r-   N©	r   r$   r7   r8   r9   r   ÚHTTP_400_BAD_REQUESTÚassertInr<   ©r&   rG   rH   s      r   Ú(test_create_rejects_amount_below_minimumz;InvestmentApiTests.test_create_rejects_amount_below_minimum9   sZ   € äÐ'Ó(ˆØ—;‘;×#Ñ# C¨(°C¨ÀÐ#ÓHˆà×Ñ˜×-Ñ-¬v×/JÑ/JÔKØ�‰�h §¡Õ.r   c                óæ   — t        d«      }| j                  j                  |ddid¬«      }| j                  |j                  t
        j                  «       | j                  d|j                  «       y)z)Non-numeric amount payload returns a 400.r)   r*   Úabcr,   r-   NrM   rP   s      r   Ú&test_create_rejects_non_numeric_amountz9InvestmentApiTests.test_create_rejects_non_numeric_amountA   s[   € äÐ'Ó(ˆØ—;‘;×#Ñ# C¨(°EÐ):À6Ð#ÓJˆà×Ñ˜×-Ñ-¬v×/JÑ/JÔKØ�‰�h §¡Õ.r   c                ó*  — t        d«      | j                  _        | j                  j                  «        t	        d«      }| j
                  j                  |ddid¬«      }| j                  |j                  t        j                  «       t        j                  j                  |j                  d   ¬«      }| j                  |j                  d	«       | j                  |j                   t        d
«      «       | j                  |j"                  d«       y)z)Amounts > $5,000 receive tier 6 metadata.z6000.00000000r)   r*   Ú6000r,   r-   r/   r0   é   z3.50é´   N)r   r!   r5   r6   r   r$   r7   r8   r9   r   r:   r   r"   r;   r<   r=   r>   r?   rF   s       r   Ú1test_create_assigns_highest_tier_for_large_amountzDInvestmentApiTests.test_create_assigns_highest_tier_for_large_amountI   sÐ   € ô $+¨?Ó#;ˆ�	‰	Ô Ø�	‰	�‰ÔäÐ'Ó(ˆØ—;‘;×#Ñ# C¨(°FÐ);ÀFÐ#ÓKˆà×Ñ˜×-Ñ-¬v×/FÑ/FÔGÜ×'Ñ'×+Ñ+¨x¯}©}¸TÑ/BÐ+ÓCˆ
Ø×Ñ˜Ÿ™¨!Ô,Ø×Ñ˜×5Ñ5´w¸v³ÔGØ×Ñ˜×1Ñ1°3Õ7r   c                ó2  — t        j                  t        d«      «      }t        j                  «       }t         j
                  j                  | j                  t        d«      |d   |d   |d   t         j                  ||t        |d   ¬«      z   ¬«      }t         j
                  j                  | j                  t        d«      |d   |d   |d   t         j                  ||t        |d   ¬«      z   ¬«      }t        d«      }| j                  j                  |«      }| j                  |j                  t        j                   «       t#        |j$                  «      }| j                  |D �cg c]  }|d	   ‘Œ	 c}|j&                  |j&                  g«       y
c c}w )z1Ordering backend returns newest investment first.Ú100r=   ÚrateÚduration©rE   ©r!   r*   r=   r>   r?   r   rC   rD   Ú150r)   r/   N)r   Úget_tier_infor   r   rB   r"   Úcreater!   r@   r   r   r$   r;   r8   r9   r   ÚHTTP_200_OKr   r<   r/   )	r&   Ú	tier_inforB   ÚfirstÚlaterrG   rH   r   Úitems	            r   Ú2test_list_orders_investments_descending_by_createdzEInvestmentApiTests.test_list_orders_investments_descending_by_createdX   s]  € ä×,Ñ,¬W°U«^Ó<ˆ	Ü�l‰l‹nˆÜ×"Ñ"×)Ñ)Ø—‘Ü˜5“>Ø˜6Ñ"Ø'¨Ñ/Ø# JÑ/Ü×,Ñ,ØØœ9¨)°JÑ*?Ô@Ñ@ð *ó 	
ˆô ×"Ñ"×)Ñ)Ø—‘Ü˜5“>Ø˜6Ñ"Ø'¨Ñ/Ø# JÑ/Ü×,Ñ,ØØœ9¨)°JÑ*?Ô@Ñ@ð *ó 	
ˆô Ð'Ó(ˆØ—;‘;—?‘? 3Ó'ˆà×Ñ˜×-Ñ-¬v×/AÑ/AÔBÜ˜hŸm™mÓ,ˆØ×Ñ±Ó9±¨˜$˜t›*°Ñ9¸E¿H¹HÀeÇhÁhÐ;OÕPùÒ9s   Å)Fc                ó  — t         j                  j                  ddd¬«      }t        j                  t        d«      «      }t        j                  «       }t        j                  j                  |t        d«      |d   |d   |d   t        j                  ||t        |d   ¬	«      z   ¬
«      }t        d|j                  g¬«      }| j                  j                  |«      }| j                  |j                   t"        j$                  «       y)z4Users cannot fetch another user's investment detail.iç  ÚOtherzother-detailr   Ú120r=   r\   r]   r^   r_   zinvestment-detail)ÚargsN)r   r"   r#   r   ra   r   r   rB   rb   r@   r   r   r/   r$   r;   r8   r9   r   ÚHTTP_404_NOT_FOUND)r&   Ú
other_userrd   rB   Ú	other_invrG   rH   s          r   Ú0test_retrieve_other_users_investment_returns_404zCInvestmentApiTests.test_retrieve_other_users_investment_returns_404x   sá   € ä—\‘\×-Ñ-Ø ¨W¸~ð .ó 
ˆ
ô ×,Ñ,¬W°U«^Ó<ˆ	Ü�l‰l‹nˆÜ×&Ñ&×-Ñ-ØÜ˜5“>Ø˜6Ñ"Ø'¨Ñ/Ø# JÑ/Ü×,Ñ,ØØœ9¨)°JÑ*?Ô@Ñ@ð .ó 	
ˆ	ô Ð)°·±°Ô?ˆØ—;‘;—?‘? 3Ó'ˆà×Ñ˜×-Ñ-¬v×/HÑ/HÕIr   c                ó`  — t         j                  j                  ddd¬«      }t        j                  t        d«      «      }t        j                  «       }t        j                  j                  | j                  t        d«      |d   |d   |d   t        j                  ||t        |d   ¬	«      z   ¬
«      }t        j                  j                  |t        d«      |d   |d   |d   t        j                  ||t        |d   ¬	«      z   ¬
«       t        d«      }| j                  j                  |«      }| j                  |j                   t"        j$                  «       t'        |j(                  «      }| j                  t+        |«      d«       | j                  |d   d   |j,                  «       y)z3Authenticated user only sees their own investments.éÞ   rj   Úotherr   r[   r=   r\   r]   r^   r_   Ú200r)   é   r   r/   N)r   r"   r#   r   ra   r   r   rB   rb   r!   r@   r   r   r$   r;   r8   r9   r   rc   r   r<   Úlenr/   )r&   rn   rd   rB   Úuser_invrG   rH   r   s           r   Ú)test_list_is_scoped_to_authenticated_userz<InvestmentApiTests.test_list_is_scoped_to_authenticated_user�   sw  € ä—\‘\×-Ñ-Ø ¨W¸wð .ó 
ˆ
ô ×,Ñ,¬W°U«^Ó<ˆ	Ü�l‰l‹nˆÜ×%Ñ%×,Ñ,Ø—‘Ü˜5“>Ø˜6Ñ"Ø'¨Ñ/Ø# JÑ/Ü×,Ñ,ØØœ9¨)°JÑ*?Ô@Ñ@ð -ó 	
ˆô 	×Ñ×!Ñ!ØÜ˜5“>Ø˜6Ñ"Ø'¨Ñ/Ø# JÑ/Ü×,Ñ,ØØœ9¨)°JÑ*?Ô@Ñ@ð 	"ô 		
ô Ð'Ó(ˆØ—;‘;—?‘? 3Ó'ˆà×Ñ˜×-Ñ-¬v×/AÑ/AÔBÜ˜hŸm™mÓ,ˆØ×Ñœ˜W› qÔ)Ø×Ñ˜ ™ DÑ)¨8¯;©;Õ7r   c                ó    — t        «       }|j                  t        d«      «      }| j                  |j                  t
        j                  «       y)z&Unauthenticated requests are rejected.r)   N©r	   r;   r   r8   r9   r   ÚHTTP_401_UNAUTHORIZED©r&   r$   rH   s      r   Útest_requires_authenticationz/InvestmentApiTests.test_requires_authentication³   s9   € ä“ˆØ—:‘:œgÐ&7Ó8Ó9ˆØ×Ñ˜×-Ñ-¬v×/KÑ/KÕLr   N©ÚreturnÚNone)Ú__name__Ú
__module__Ú__qualname__r'   rJ   rQ   rT   rY   rh   rp   rx   r}   © r   r   r   r      s4   „ ó7ò
ò./ò/ò8òQò@Jò."8óHMr   r   c                  ó2   — e Zd Zdd„Zd„ Zd„ Zd„ Zd„ Zd„ Zy)	ÚRewardApiTestsc                óì  — t         j                  j                  ddd¬«      | _        t	        «       | _        | j
                  j                  | j                  ¬«       t        j                  t        d«      «      }t        j                  «       }t        j                  j                  | j                  t        d«      |d   |d   |d	   t        j                  ||t        |d	   ¬
«      z   ¬«      | _        y )NiM  Ú
RewardUserÚ
rewarduserr   r    Ú500r=   r\   r]   r^   r_   )r   r"   r#   r!   r	   r$   r%   r   ra   r   r   rB   rb   ÚSTATUS_ACTIVEr   rI   )r&   rd   rB   s      r   r'   zRewardApiTests.setUp»   sÊ   € Ü—L‘L×,Ñ,Ø Ø#Ø!ð -ó 
ˆŒ	ô
  “kˆŒØ�‰×&Ñ&¨D¯I©IÐ&Ô6ä×,Ñ,¬W°U«^Ó<ˆ	Ü�l‰l‹nˆÜ$×,Ñ,×3Ñ3Ø—‘Ü˜5“>Ø˜6Ñ"Ø'¨Ñ/Ø# JÑ/Ü×+Ñ+ØØœ9¨)°JÑ*?Ô@Ñ@ð 4ó 	
ˆ�r   c                ó@  — t         j                  j                  | j                  t	        d«      t        j                  «       j                  «       ¬«       t        j                  j                  ddd¬«      }t        j                  t	        d«      «      }t        j                  j                  |t	        d«      |d   |d	   |d
   t        j                  t        j                  «       t        j                  «       t        |d
   ¬«      z   ¬«      }t         j                  j                  |t	        d«      t        j                  «       j                  «       ¬«       t        d«      }| j                  j!                  |d| j                  j"                  i«      }| j%                  |j&                  t(        j*                  «       t-        |j.                  «      }| j%                  t1        |«      d«       | j%                  |d   d   | j                  j"                  «       y)z1GET /rewards supports filtering by investment_id.ú
5.00000000©rI   r*   Úreward_datei¼  rj   Úother2r   Ú50r=   r\   r]   r^   r_   ú
1.00000000úreward-listÚinvestment_idru   r   rI   N)r   r"   rb   rI   r   r   rB   Údater   r#   r   ra   r‹   r   r   r$   r;   r/   r8   r9   r   rc   r   r<   rv   ©r&   rn   rd   ro   rG   rH   r   s          r   Útest_list_filters_by_investmentz.RewardApiTests.test_list_filters_by_investmentÑ   sŸ  € ä�‰×ÑØ—‘Ü˜<Ó(Ü Ÿ™›×+Ñ+Ó-ð 	ô 	
ô
 —\‘\×-Ñ-Ø ¨W¸xð .ó 
ˆ
ô ×,Ñ,¬W°T«]Ó;ˆ	Ü×&Ñ&×-Ñ-ØÜ˜4“=Ø˜6Ñ"Ø'¨Ñ/Ø# JÑ/Ü×+Ñ+Ü—|‘|“~Ü—\‘\“^¤i°Y¸zÑ5JÔ&KÑKð .ó 	
ˆ	ô 	�‰×ÑØ Ü˜<Ó(Ü Ÿ™›×+Ñ+Ó-ð 	ô 	
ô �mÓ$ˆØ—;‘;—?‘? 3¨¸$¿/¹/×:LÑ:LÐ(MÓNˆà×Ñ˜×-Ñ-¬v×/AÑ/AÔBÜ˜hŸm™mÓ,ˆØ×Ñœ˜W› qÔ)Ø×Ñ˜ ™ LÑ1°4·?±?×3EÑ3EÕFr   c                óº  — t        j                  «       j                  «       }|t        d¬«      z
  }t        j
                  j                  | j                  t        d«      |¬«       t        j
                  j                  | j                  t        d«      |¬«       | j                  j                  t        d«      «      }| j                  |j                  t        j                  «       t!        |j"                  «      }|D �cg c]  }|d   ‘Œ	 }}| j                  |d   |j%                  «       «       | j                  |d   |j%                  «       «       y	c c}w )
z*Ordering returns newest reward date first.ru   r^   r�   rŽ   z
6.00000000r“   r�   r   N)r   rB   r•   r   r   r"   rb   rI   r   r$   r;   r   r8   r9   r   rc   r   r<   Ú	isoformat)r&   ÚtodayÚ	yesterdayrH   r   rg   Údatess          r   Ú#test_list_orders_rewards_descendingz2RewardApiTests.test_list_orders_rewards_descendingô   s  € ä—‘“×#Ñ#Ó%ˆØœI¨1Ô-Ñ-ˆ	Ü�‰×ÑØ—‘Ü˜<Ó(Ø!ð 	ô 	
ô
 	�‰×ÑØ—‘Ü˜<Ó(Øð 	ô 	
ð —;‘;—?‘?¤7¨=Ó#9Ó:ˆà×Ñ˜×-Ñ-¬v×/AÑ/AÔBÜ˜hŸm™mÓ,ˆÙ18Ó9±¨��mÓ$°ˆÐ9Ø×Ñ˜˜q™ 5§?¡?Ó#4Ô5Ø×Ñ˜˜q™ 9×#6Ñ#6Ó#8Õ9ùò :s   ÄEc                ó  — t         j                  j                  | j                  t	        d«      t        j                  «       j                  «       ¬«       t        j                  j                  ddd¬«      }t        j                  t	        d«      «      }t        j                  j                  |t	        d«      |d   |d	   |d
   t        j                  t        j                  «       t        j                  «       t        |d
   ¬«      z   ¬«      }t         j                  j                  |t	        d«      t        j                  «       j                  «       ¬«       | j                  j                  t!        d«      «      }| j#                  |j$                  t&        j(                  «       t+        |j,                  «      }| j#                  t/        |«      d«       | j#                  |d   d   | j                  j0                  «       y)z;Authenticated user only sees rewards for their investments.r�   rŽ   i+  rj   Úother3r   Ú60r=   r\   r]   r^   r_   r’   r“   ru   r   rI   N)r   r"   rb   rI   r   r   rB   r•   r   r#   r   ra   r‹   r   r$   r;   r   r8   r9   r   rc   r   r<   rv   r/   )r&   rn   rd   ro   rH   r   s         r   Útest_rewards_are_scoped_to_userz.RewardApiTests.test_rewards_are_scoped_to_user  s‰  € ä�‰×ÑØ—‘Ü˜<Ó(Ü Ÿ™›×+Ñ+Ó-ð 	ô 	
ô
 —\‘\×-Ñ-Ø ¨W¸xð .ó 
ˆ
ô ×,Ñ,¬W°T«]Ó;ˆ	Ü×&Ñ&×-Ñ-ØÜ˜4“=Ø˜6Ñ"Ø'¨Ñ/Ø# JÑ/Ü×+Ñ+Ü—|‘|“~Ü—\‘\“^¤i°Y¸zÑ5JÔ&KÑKð .ó 	
ˆ	ô 	�‰×ÑØ Ü˜<Ó(Ü Ÿ™›×+Ñ+Ó-ð 	ô 	
ð —;‘;—?‘?¤7¨=Ó#9Ó:ˆà×Ñ˜×-Ñ-¬v×/AÑ/AÔBÜ˜hŸm™mÓ,ˆØ×Ñœ˜W› qÔ)Ø×Ñ˜ ™ LÑ1°4·?±?×3EÑ3EÕFr   c                ó  — t         j                  j                  ddd¬«      }t        j                  t        d«      «      }t        j                  j                  |t        d«      |d   |d   |d   t        j                  t        j                  «       t        j                  «       t        |d   ¬	«      z   ¬
«      }t        j                  j                  |t        d«      t        j                  «       j                  «       ¬«       t        d«      }| j                  j                  |d|j                   i«      }| j#                  |j$                  t&        j(                  «       t+        |j,                  «      }| j#                  |g «       y)z:Filtering by another user's investment returns no results.i,  rj   Úother4r   Ú70r=   r\   r]   r^   r_   r’   rŽ   r“   r”   N)r   r"   r#   r   ra   r   rb   r‹   r   rB   r   r   r•   r   r$   r;   r/   r8   r9   r   rc   r   r<   r–   s          r   Ú8test_rewards_filter_other_users_investment_returns_emptyzGRewardApiTests.test_rewards_filter_other_users_investment_returns_empty-  s8  € ä—\‘\×-Ñ-Ø ¨W¸xð .ó 
ˆ
ô ×,Ñ,¬W°T«]Ó;ˆ	Ü×&Ñ&×-Ñ-ØÜ˜4“=Ø˜6Ñ"Ø'¨Ñ/Ø# JÑ/Ü×+Ñ+Ü—|‘|“~Ü—\‘\“^¤i°Y¸zÑ5JÔ&KÑKð .ó 	
ˆ	ô 	�‰×ÑØ Ü˜<Ó(Ü Ÿ™›×+Ñ+Ó-ð 	ô 	
ô �mÓ$ˆØ—;‘;—?‘? 3¨¸)¿,¹,Ð(GÓHˆà×Ñ˜×-Ñ-¬v×/AÑ/AÔBÜ˜hŸm™mÓ,ˆØ×Ñ˜ "Õ%r   c                ó    — t        «       }|j                  t        d«      «      }| j                  |j                  t
        j                  «       y)z*Unauthenticated reward access returns 401.r“   Nrz   r|   s      r   Ú#test_rewards_require_authenticationz2RewardApiTests.test_rewards_require_authenticationJ  s8   € ä“ˆØ—:‘:œg mÓ4Ó5ˆà×Ñ˜×-Ñ-¬v×/KÑ/KÕLr   Nr~   )	r�   r‚   rƒ   r'   r—   r�   r¡   r¥   r§   r„   r   r   r†   r†   º   s%   „ ó
ò,!GòF:ò. GòD&ó:Mr   r†   N)Ú__doc__Ú
__future__r   Údatetimer   Údecimalr   Údjango.urlsr   Údjango.utilsr   Úrest_frameworkr   Úrest_framework.testr	   r
   Úapps.investments.modelsr   r   Úapps.users.modelsr   r   r   r†   r„   r   r   Ú<module>r²      sI   ðÙ ,å "å Ý å Ý !Ý !ß 6ç 6Ý "òô_M˜ô _MôDUM�[õ UMr   