Ë
    %xEiŠ0  ã                   ó€   — d Z ddlmZ ddlmZ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 d	„ Z G d
„ de«      Zy)z&Tests for ROI tracking in investments.é    )ÚDecimal)ÚdateÚ	timedelta)ÚTestCase)Útimezone)ÚUser)Ú
InvestmentÚReward)ÚDistributeRewardsTaskc                  ó>   — t        t        j                  «       ¬«      S )z<Helper to create task instance with required execution_date.)Úexecution_date)r   r   Útoday© ó    úY/home/cursorai/projects/telegram-earn/backend/apps/investments/tests/test_roi_tracking.pyÚget_taskr      s   € ä ´·
±
³Ô=Ð=r   c                   óR   — 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d„ Zy)ÚROITrackingTestCasez2Test ROI accumulation and percentage calculations.c                 ó¸   — t         j                  j                  dd¬«      | _        t	        d«      | j                  _        | j                  j                  «        y)zSet up test data.i² z	Test User)Útelegram_user_idÚ
first_namez10000.00000000N)r   ÚobjectsÚcreate_userÚuserr   Úcredit_balanceÚsave)Úselfs    r   ÚsetUpzROITrackingTestCase.setUp   sE   € ä—L‘L×,Ñ,Ø#Ø"ð -ó 
ˆŒ	ô $+Ð+;Ó#<ˆ�	‰	Ô Ø�	‰	�‰Õr   c                 óœ  — t         j                  j                  | j                  t	        d«      dt	        d«      dt         j
                  t        j                  «       t        j                  «       t        d¬«      z   ¬«      }| j                  |j                  t	        d«      «       | j                  |j                  t	        d«      «       y	)
z:Test newly created investment starts with zero ROI totals.ú1000.00000000é   ú1.00éx   ©Údays©r   ÚamountÚtierÚdaily_reward_rateÚduration_daysÚstatusÚ
start_dateÚend_dateú
0.00000000z0.0000N)r	   r   Úcreater   r   ÚSTATUS_PENDINGr   Únowr   ÚassertEqualÚroi_total_amountÚroi_total_percent)r   Ú
investments     r   Ú test_new_investment_has_zero_roiz4ROITrackingTestCase.test_new_investment_has_zero_roi   s–   € ä×'Ñ'×.Ñ.Ø—‘Ü˜?Ó+ØÜ% f›oØÜ×,Ñ,Ü—|‘|“~Ü—\‘\“^¤i°SÔ&9Ñ9ð /ó 	
ˆ
ð 	×Ñ˜×4Ñ4´g¸lÓ6KÔLØ×Ñ˜×5Ñ5´w¸xÓ7HÕIr   c                 óÌ  — t         j                  j                  | j                  t	        d«      dt	        d«      dt         j
                  t        j                  «       t        d¬«      z
  t        j                  «       t        d¬«      z   ¬«      }t	        d	«      }t        j                  j                  ||t        j                  «       t        d¬«      z
  ¬
«      }t        «       }|j                  |j                  t        j                  «       «       |j                  «        | j!                  |j"                  |«       | j!                  |j$                  t	        d«      «       y)zBTest ROI totals update correctly after single reward distribution.r    r!   r"   r#   é   r$   év   r&   ú10.00000000©r5   r'   Úreward_dateú1.0000N)r	   r   r/   r   r   ÚSTATUS_ACTIVEr   r1   r   r
   r   r   r   Ú_distribute_rewardsr<   Úrefresh_from_dbr2   r3   r4   ©r   r5   Úreward_amountÚrewardÚtasks        r   Ú#test_roi_accumulation_single_rewardz7ROITrackingTestCase.test_roi_accumulation_single_reward.   s
  € ä×'Ñ'×.Ñ.Ø—‘Ü˜?Ó+ØÜ% f›oØÜ×+Ñ+Ü—|‘|“~¬	°qÔ(9Ñ9Ü—\‘\“^¤i°SÔ&9Ñ9ð /ó 	
ˆ
ô   Ó.ˆÜ—‘×&Ñ&Ø!Ø ÜŸ
™
›¤y°aÔ'8Ñ8ð 'ó 
ˆô ‹zˆØ× Ñ  ×!3Ñ!3´X·\±\³^ÔDð 	×"Ñ"Ô$à×Ñ˜×4Ñ4°mÔDØ×Ñ˜×5Ñ5´w¸xÓ7HÕIr   c                 ó  — t         j                  j                  | j                  t	        d«      dt	        d«      dt         j
                  t        j                  «       t        d¬«      z
  t        j                  «       t        d¬«      z   ¬«      }t	        d	«      }t        d
«      D ]Ž  }t	        d«      }t        j                  j                  ||t        j                  «       t        d
|z
  ¬«      z
  ¬«      }t        «       }|j                  |j                  t        j                  «       «       ||z  }Œ� |j!                  «        | j#                  |j$                  |«       | j#                  |j&                  t	        d«      «       y)z=Test ROI totals accumulate correctly across multiple rewards.r    r!   r"   r#   é   r$   és   r&   r.   é   r:   r;   z3.0000N)r	   r   r/   r   r   r>   r   r1   r   Úranger
   r   r   r   r?   r<   r@   r2   r3   r4   )r   r5   Útotal_expectedÚirB   rC   rD   s          r   Ú&test_roi_accumulation_multiple_rewardsz:ROITrackingTestCase.test_roi_accumulation_multiple_rewardsM   s0  € ä×'Ñ'×.Ñ.Ø—‘Ü˜?Ó+ØÜ% f›oØÜ×+Ñ+Ü—|‘|“~¬	°qÔ(9Ñ9Ü—\‘\“^¤i°SÔ&9Ñ9ð /ó 	
ˆ
ô ! Ó.ˆÜ�q–ˆAÜ# MÓ2ˆMÜ—^‘^×*Ñ*Ø%Ø$Ü ŸJ™J›L¬9¸!¸A¹#Ô+>Ñ>ð +ó ˆFô “:ˆDØ×$Ñ$ V×%7Ñ%7¼¿¹»ÔHà˜mÑ+‰Nð ð 	×"Ñ"Ô$à×Ñ˜×4Ñ4°nÔEØ×Ñ˜×5Ñ5´w¸xÓ7HÕIr   c                 ó˜  — t         j                  j                  | j                  t	        d«      dt	        d«      dt         j
                  t        j                  «       t        d¬«      z
  t        j                  «       t        d¬«      z   ¬«      }t	        d	«      }t        j                  j                  ||t        j                  «       t        d¬«      z
  ¬
«      }t        «       }|j                  |j                  t        j                  «       «       |j                  «        | j!                  t#        |j$                  «      dd¬«       y)z0Test ROI percentage maintains correct precision.z333.33333333r!   z1.50r#   r8   r$   r9   r&   z
4.99999999r;   g      ø?©ÚplacesN©r	   r   r/   r   r   r>   r   r1   r   r
   r   r   r   r?   r<   r@   ÚassertAlmostEqualÚfloatr4   rA   s        r   Ú)test_roi_percentage_calculation_precisionz=ROITrackingTestCase.test_roi_percentage_calculation_precisionn   ó   € ä×'Ñ'×.Ñ.Ø—‘Ü˜>Ó*ØÜ% f›oØÜ×+Ñ+Ü—|‘|“~¬	°qÔ(9Ñ9Ü—\‘\“^¤i°SÔ&9Ñ9ð /ó 	
ˆ
ô   Ó-ˆÜ—‘×&Ñ&Ø!Ø ÜŸ
™
›¤y°aÔ'8Ñ8ð 'ó 
ˆô ‹zˆØ× Ñ  ×!3Ñ!3´X·\±\³^ÔDà×"Ñ"Ô$ð 	×ÑÜ�*×.Ñ.Ó/ØØð 	õ 	
r   c                 ó€  — t         j                  j                  | j                  t	        d«      dt	        d«      dt         j
                  t        j                  «       t        d¬«      z
  t        j                  «       t        d¬«      z   ¬«      }t	        d«      }t        j                  j                  ||t        j                  «       t        d¬«      z
  ¬	«      }t        «       }|j                  |j                  t        j                  «       «       |j                  «        | j!                  |j"                  «       y
)zLTest ROI percentage calculation handles edge case of zero investment amount.z
0.00000001r!   r"   r#   r8   r$   r9   r&   r;   N)r	   r   r/   r   r   r>   r   r1   r   r
   r   r   r   r?   r<   r@   ÚassertIsNotNoner4   rA   s        r   Ú!test_roi_zero_division_protectionz5ROITrackingTestCase.test_roi_zero_division_protection�   sï   € ô  ×'Ñ'×.Ñ.Ø—‘Ü˜<Ó(ØÜ% f›oØÜ×+Ñ+Ü—|‘|“~¬	°qÔ(9Ñ9Ü—\‘\“^¤i°SÔ&9Ñ9ð /ó 	
ˆ
ô   Ó-ˆÜ—‘×&Ñ&Ø!Ø ÜŸ
™
›¤y°aÔ'8Ñ8ð 'ó 
ˆô ‹zˆØ× Ñ  ×!3Ñ!3´X·\±\³^ÔDà×"Ñ"Ô$ð 	×Ñ˜Z×9Ñ9Õ:r   c                 óÐ  — t         j                  j                  | j                  t	        d«      dt	        d«      dt         j
                  t        j                  «       t        d¬«      z
  t        j                  «       t        d¬«      z   ¬«      }t	        d	«      }t        j                  j                  ||t        j                  «       t        d
¬«      z
  ¬«      }t        «       }|j                  |j                  t        j                  «       «       |j                  «        | j!                  |j"                  |«       | j%                  t'        |j(                  «      dd¬«       y)z5Test ROI tracking with very large investment amounts.z999999.99999999é   z3.50é´   r8   r$   é²   r&   z34999.99999999r!   r;   g      @rO   N)r	   r   r/   r   r   r>   r   r1   r   r
   r   r   r   r?   r<   r@   r2   r3   rR   rS   r4   rA   s        r   Útest_roi_large_amountsz*ROITrackingTestCase.test_roi_large_amounts¬   s  € ä×'Ñ'×.Ñ.Ø—‘ÜÐ,Ó-ØÜ% f›oØÜ×+Ñ+Ü—|‘|“~¬	°qÔ(9Ñ9Ü—\‘\“^¤i°SÔ&9Ñ9ð /ó 	
ˆ
ô  Ð 0Ó1ˆÜ—‘×&Ñ&Ø!Ø ÜŸ
™
›¤y°aÔ'8Ñ8ð 'ó 
ˆô ‹zˆØ× Ñ  ×!3Ñ!3´X·\±\³^ÔDà×"Ñ"Ô$à×Ñ˜×4Ñ4°mÔDØ×ÑÜ�*×.Ñ.Ó/ØØð 	õ 	
r   c                 óî  — t         j                  j                  | j                  t	        d«      dt	        d«      dt         j
                  t        j                  «       t        j                  «       t        d¬«      z   ¬«      }| j                  |j                  t	        d«      «       t         j                  |_        |j                  «        t        j                  j                  |t	        d«      t        j                   «       ¬	«      }t#        «       }|j%                  |j&                  t        j                  «       «       |j)                  «        | j                  |j                  t	        d«      «       t         j*                  |_        |j                  «        |j)                  «        | j                  |j                  t	        d«      «       | j                  |j,                  t	        d
«      «       y)z6Test ROI tracking from pending -> active -> completed.r    r!   r"   r#   r$   r&   r.   r:   r;   r=   N)r	   r   r/   r   r   r0   r   r1   r   r2   r3   r>   r+   r   r
   r   r   r   r?   r<   r@   ÚSTATUS_COMPLETEDr4   )r   r5   rC   rD   s       r   Ú-test_roi_tracking_across_investment_lifecyclezAROITrackingTestCase.test_roi_tracking_across_investment_lifecycleÍ   sj  € ä×'Ñ'×.Ñ.Ø—‘Ü˜?Ó+ØÜ% f›oØÜ×,Ñ,Ü—|‘|“~Ü—\‘\“^¤i°SÔ&9Ñ9ð /ó 	
ˆ
ð 	×Ñ˜×4Ñ4´g¸lÓ6KÔLô '×4Ñ4ˆ
ÔØ�‰Ôä—‘×&Ñ&Ø!Ü˜=Ó)ÜŸ
™
›ð 'ó 
ˆô ‹zˆØ× Ñ  ×!3Ñ!3´X·\±\³^ÔDà×"Ñ"Ô$Ø×Ñ˜×4Ñ4´g¸mÓ6LÔMô '×7Ñ7ˆ
ÔØ�‰ÔØ×"Ñ"Ô$à×Ñ˜×4Ñ4´g¸mÓ6LÔMØ×Ñ˜×5Ñ5´w¸xÓ7HÕIr   c                 ó  — t         j                  j                  | j                  t	        d«      dt	        d«      dt         j
                  t        j                  «       t        d¬«      z
  t        j                  «       t        d¬«      z   ¬«      }t	        d	«      }t        j                  j                  ||t        j                  «       t        d¬«      z
  ¬
«      }t        «       }|j                  |j                  t        j                  «       «       |j                  «        |j                   }|j                  |j                  t        j                  «       «       |j                  «        | j#                  |j                   |«       y)z=Test distributing the same reward twice doesn't double-count.r    r!   r"   r#   r8   r$   r9   r&   r:   r;   N)r	   r   r/   r   r   r>   r   r1   r   r
   r   r   r   r?   r<   r@   r3   r2   )r   r5   rB   rC   rD   Úfirst_totals         r   Útest_roi_idempotencyz(ROITrackingTestCase.test_roi_idempotencyõ   s$  € ä×'Ñ'×.Ñ.Ø—‘Ü˜?Ó+ØÜ% f›oØÜ×+Ñ+Ü—|‘|“~¬	°qÔ(9Ñ9Ü—\‘\“^¤i°SÔ&9Ñ9ð /ó 	
ˆ
ô   Ó.ˆÜ—‘×&Ñ&Ø!Ø ÜŸ
™
›¤y°aÔ'8Ñ8ð 'ó 
ˆô ‹zˆØ× Ñ  ×!3Ñ!3´X·\±\³^ÔDà×"Ñ"Ô$Ø ×1Ñ1ˆð 	× Ñ  ×!3Ñ!3´X·\±\³^ÔDà×"Ñ"Ô$ð 	×Ñ˜×4Ñ4°kÕBr   c                 ó˜  — t         j                  j                  | j                  t	        d«      dt	        d«      dt         j
                  t        j                  «       t        d¬«      z
  t        j                  «       t        d¬«      z   ¬«      }t	        d«      }t        j                  j                  ||t        j                  «       t        d	¬«      z
  ¬
«      }t        «       }|j                  |j                  t        j                  «       «       |j                  «        | j!                  t#        |j$                  «      dd¬«       y)z8Test ROI percentage calculation with fractional results.z777.77777777r8   z1.23é‚   r$   é€   r&   z
9.56666666r!   r;   g®Gáz®ó?rO   NrQ   rA   s        r   Útest_roi_fractional_percentagesz3ROITrackingTestCase.test_roi_fractional_percentages  rU   r   c                 óx  — ddl m} ddlm} t        j
                  j                  | j                  t        d«      dt        d«      dt        j                  t        j                  «       t        j                  «       t        d¬«      z   t        d	«      t        d
«      ¬«
      } ||«      }|j                  }| j                  d|«       | j                  d|«       | j                  t        t!        |d   «      «      t        d	«      «       | j                  t        t!        |d   «      «      t        d
«      «       y)z2Test ROI fields are included in API serialization.r   )Ú	APIClient)ÚInvestmentSerializerr    r!   r"   r#   r$   z50.00000000z5.0000)
r   r'   r(   r)   r*   r+   r,   r-   r3   r4   r3   r4   N)Úrest_framework.testri   Úapps.investments.serializersrj   r	   r   r/   r   r   r>   r   r1   r   ÚdataÚassertInr2   Ústr)r   ri   rj   r5   Ú
serializerrm   s         r   Útest_roi_serializer_outputz.ROITrackingTestCase.test_roi_serializer_output9  sñ   € å1ÝEä×'Ñ'×.Ñ.Ø—‘Ü˜?Ó+ØÜ% f›oØÜ×+Ñ+Ü—|‘|“~Ü—\‘\“^¤i°SÔ&9Ñ9Ü$ ]Ó3Ü% hÓ/ð /ó 
ˆ
ñ *¨*Ó5ˆ
Ø�‰ˆà�‰Ð(¨$Ô/Ø�‰Ð)¨4Ô0Ø×Ñœ¤ TÐ*<Ñ%=Ó!>Ó?ÄÈÓAWÔXØ×Ñœ¤ TÐ*=Ñ%>Ó!?Ó@Ä'È(ÓBSÕTr   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r6   rE   rM   rT   rX   r]   r`   rc   rg   rq   r   r   r   r   r      sH   „ Ù<òòJò Jò>JòB
òB;ò:
òB&JòP!CòF
óBUr   r   N)ru   Údecimalr   Údatetimer   r   Údjango.testr   Údjango.utilsr   Úapps.users.modelsr   Úapps.investments.modelsr	   r
   Úapps.investments.cron_tasksr   r   r   r   r   r   Ú<module>r}      s2   ðÙ ,å ß $Ý  Ý !å "ß 6Ý =ò>ô
U˜(õ Ur   