
    %xEi)0                     ~    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 dd	lmZ  G d
 de      Zy)z4Tests for referral investment summary API endpoints.    )Decimal)TestCase)timezone)	APIClient)status)User)
Investment)
Commissionc                   X    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d Zy)!ReferralInvestmentSummaryTestCasez;Test referral network with investment summary calculations.c                    t               | _        t        j                  j	                  ddd      | _        t        j                  j	                  ddd| j
                        | _        t        j                  j	                  d	d
d| j
                        | _        | j                  j                  | j
                         y)zSet up test data.i Uplineupline_user)telegram_user_id
first_nameusernameid 	Downline1	downline1r   r   r   referred_byi 	Downline2	downline2userN)	r   clientr   objectscreate_userupliner   r   force_authenticate)selfs    ]/home/cursorai/projects/telegram-earn/backend/apps/referrals/tests/test_investment_summary.pysetUpz'ReferralInvestmentSummaryTestCase.setUp   s    k ll..#" / 

 11#" 	 2 
 11#" 	 2 
 	&&DKK&8    c           	         | j                   j                  d      }| j                  |j                  t        j
                         | j                  t        |j                  d         d       |j                  d   D ]b  }| j                  t        t        |d               t        d             | j                  t        t        |d               t        d             d y)zOTest referral network returns zero investment totals when no investments exist./api/referrals/results   active_investment_total0total_investmentN)
r   getassertEqualstatus_coder   HTTP_200_OKlendatar   str)r    responsereferrals      r!   $test_referral_network_no_investmentszFReferralInvestmentSummaryTestCase.test_referral_network_no_investments+   s    ;;??#45--v/A/ABX]]956: i0HWS2K)L%MNPWX[P\]WS2D)E%FGQTV 1r#   c                     t         j                  j                   j                  t	        d      dt	        d      dt         j
                  t        j                         t        j                         t        j                  d      z           j                  j                  d      } j                  |j                  t        j                         t         fd|j                   d	   D              } j                  t	        t#        |d
               t	        d              j                  t	        t#        |d               t	        d             y)z?Test pending investments are included in both active and total.100.00000000   1.00x   daysr   amounttierdaily_reward_rateduration_daysr   
start_dateend_dater%   c              3   \   K   | ]#  }|d    j                   j                  k(  s | % ywidNr   rE   .0rr    s     r!   	<genexpr>zcReferralInvestmentSummaryTestCase.test_referral_network_with_pending_investments.<locals>.<genexpr>G   ,     b)AAQtWPTP^P^PaPaEaa)A   !,,r&   r(   r*   N)r	   r   creater   r   STATUS_PENDINGr   now	timedeltar   r+   r,   r-   r   r.   nextr0   r1   r    r2   downline1_datas   `  r!   .test_referral_network_with_pending_investmentszPReferralInvestmentSummaryTestCase.test_referral_network_with_pending_investments6   s     	!!>*%fo,,||~\\^h&8&8c&BB 	" 		
 ;;??#45--v/A/ABby)Abb^4M%N!OPRYZhRij^4F%G!HI7SaKbcr#   c                 V    t         j                  j                   j                  t	        d      dt	        d      dt         j
                  t        j                         t        j                         t        j                  d      z           j                  j                  d      }t         fd|j                  d	   D              } j                  t	        t        |d
               t	        d              j                  t	        t        |d               t	        d             y)z>Test active investments are included in both active and total.z500.50000000r'   1.50   r:   r<   r%   c              3   \   K   | ]#  }|d    j                   j                  k(  s | % ywrD   rF   rG   s     r!   rJ   zbReferralInvestmentSummaryTestCase.test_referral_network_with_active_investments.<locals>.<genexpr>[   rK   rL   r&   r(   r*   Nr	   r   rM   r   r   STATUS_ACTIVEr   rO   rP   r   r+   rQ   r0   r,   r1   rR   s   `  r!   -test_referral_network_with_active_investmentszOReferralInvestmentSummaryTestCase.test_referral_network_with_active_investmentsL   s    !!>*%fo++||~\\^h&8&8c&BB 	" 		
 ;;??#45by)Abb^4M%N!OPRYZhRij^4F%G!HI7SaKbcr#   c                     t         j                  j                   j                  t	        d      dt	        d      dt         j
                  t        j                         t        j                  d      z
  t        j                         t        j                  d      z
          j                  j                  d	      }t         fd
|j                  d   D              } j                  t	        t        |d               t	        d              j                  t	        t        |d               t	        d             y)z>Test completed investments are NOT in active but ARE in total.1000.00000000   2.00      r:   
   r<   r%   c              3   \   K   | ]#  }|d    j                   j                  k(  s | % ywrD   rF   rG   s     r!   rJ   zeReferralInvestmentSummaryTestCase.test_referral_network_with_completed_investments.<locals>.<genexpr>o   rK   rL   r&   r(   r)   r*   N)r	   r   rM   r   r   STATUS_COMPLETEDr   rO   rP   r   r+   rQ   r0   r,   r1   rR   s   `  r!   0test_referral_network_with_completed_investmentszRReferralInvestmentSummaryTestCase.test_referral_network_with_completed_investments`   s    !!?+%fo..||~(:(:(DD\\^h&8&8b&AA 	" 		
 ;;??#45by)Abb^4M%N!OPRYZ]R^_^4F%G!HI7SbKcdr#   c                     t         j                  j                   j                  t	        d      dt	        d      dt         j
                  t        j                         t        j                         t        j                  d      z          t         j                  j                   j                  t	        d      dt	        d	      d
t         j                  t        j                         t        j                         t        j                  d
      z          t         j                  j                   j                  t	        d      dt	        d      dt         j                  t        j                         t        j                  d      z
  t        j                         t        j                  d      z
          j                  j                  d      }t         fd|j                  d   D              } j                  t	        t!        |d               t	        d              j                  t	        t!        |d               t	        d             y)z3Test correct totals with mixed investment statuses.r6   r7   r8   r9   r:   r<   z500.00000000r'   rV   rW   r]   r^   r_   r`   ra   rb   r%   c              3   \   K   | ]#  }|d    j                   j                  k(  s | % ywrD   rF   rG   s     r!   rJ   zdReferralInvestmentSummaryTestCase.test_referral_network_mixed_investment_statuses.<locals>.<genexpr>   rK   rL   r&   r(   z600.00000000r*   z1600.00000000N)r	   r   rM   r   r   rN   r   rO   rP   rZ   rd   r   r+   rQ   r0   r,   r1   rR   s   `  r!   /test_referral_network_mixed_investment_statuseszQReferralInvestmentSummaryTestCase.test_referral_network_mixed_investment_statusest   s    	!!>*%fo,,||~\\^h&8&8c&BB 	" 		
 	!!>*%fo++||~\\^h&8&8c&BB 	" 		
 	!!?+%fo..||~(:(:(DD\\^h&8&8b&AA 	" 		
 ;;??#45by)Abb 	^4M%N!OPRYZhRij^4F%G!HI7SbKcdr#   c                     t         j                  j                   j                  t	        d      dt	        d      dt         j
                  t        j                         t        j                         t        j                  d      z          t         j                  j                   j                  t	        d      dt	        d	      d
t         j
                  t        j                         t        j                         t        j                  d
      z           j                  j                  d      }t         fd|j                  d   D              }t         fd|j                  d   D              } j                  t	        t        |d               t	        d              j                  t	        t        |d               t	        d             y)z?Test investment totals calculated separately for each downline.z300.00000000r7   r8   r9   r:   r<   z700.00000000r'   rV   rW   r%   c              3   \   K   | ]#  }|d    j                   j                  k(  s | % ywrD   rF   rG   s     r!   rJ   z]ReferralInvestmentSummaryTestCase.test_referral_network_multiple_downlines.<locals>.<genexpr>   rK   rL   r&   c              3   \   K   | ]#  }|d    j                   j                  k(  s | % ywrD   )r   rE   rG   s     r!   rJ   z]ReferralInvestmentSummaryTestCase.test_referral_network_multiple_downlines.<locals>.<genexpr>   rK   rL   r(   N)r	   r   rM   r   r   rZ   r   rO   rP   r   r   r+   rQ   r0   r,   r1   )r    r2   rS   downline2_datas   `   r!   (test_referral_network_multiple_downlineszJReferralInvestmentSummaryTestCase.test_referral_network_multiple_downlines   s\    	!!>*%fo++||~\\^h&8&8c&BB 	" 		
 	!!>*%fo++||~\\^h&8&8c&BB 	" 		
 ;;??#45by)Abbby)Abb^4M%N!OPRYZhRij^4M%N!OPRYZhRijr#   c                     t         j                  j                   j                  t	        d      dt	        d      dt         j
                  t        j                         t        j                         t        j                  d      z           j                  j                  d      }t         fd|j                  d	   D              }t	        t        |d
               } j                  |t	        d             y)z4Test investment totals maintain 8-decimal precision.z123.45678901r7   r8   r9   r:   r<   r%   c              3   \   K   | ]#  }|d    j                   j                  k(  s | % ywrD   rF   rG   s     r!   rJ   zaReferralInvestmentSummaryTestCase.test_referral_network_high_precision_amounts.<locals>.<genexpr>   rK   rL   r&   r(   N)r	   r   rM   r   r   rZ   r   rO   rP   r   r+   rQ   r0   r1   r,   )r    r2   rS   r=   s   `   r!   ,test_referral_network_high_precision_amountszNReferralInvestmentSummaryTestCase.test_referral_network_high_precision_amounts   s    !!>*%fo++||~\\^h&8&8c&BB 	" 		
 ;;??#45by)Abb ^,EFGH!89r#   c                     | j                   j                  d       | j                   j                  d      }| j                  |j                  t
        j                         y)z)Test unauthenticated request is rejected.Nr   r%   )r   r   r+   r,   r-   r   HTTP_401_UNAUTHORIZED)r    r2   s     r!   %test_referral_network_unauthenticatedzGReferralInvestmentSummaryTestCase.test_referral_network_unauthenticated   sF    &&D&1;;??#45--v/K/KLr#   c                     t         j                  j                  ddd| j                        }t        j                  j                  |t        d      dt        d      dt        j                  t        j                         t        j                         t        j                  d	      z   
       | j                  j                  d      }| j                  t        |j                  d         d       |j                  d   D cg c]  }|d   	 }}| j!                  | j                  j"                  |       | j!                  | j$                  j"                  |       | j'                  |j"                  |       yc c}w )z?Test only direct referrals (Level 1) are included, not Level 2.i Level2level2r   z999.00000000r^   r_   r`   r:   r<   r%   r&   r'   rE   N)r   r   r   r   r	   rM   r   rZ   r   rO   rP   r   r+   r,   r/   r0   assertInrE   r   assertNotIn)r    level2_userr2   rI   user_idss        r!   +test_referral_network_only_direct_referralszMReferralInvestmentSummaryTestCase.test_referral_network_only_direct_referrals   s,    ll..#	 / 
 	!!>*%fo++||~\\^h&8&8c&BB 	" 		
 ;;??#45 	X]]956:%-]]9%=>%=AdG%=>dnn''2dnn''22 ?s   E;c                     t         j                  j                   j                  t	        d      dt	        d      dt         j
                  t        j                         t        j                         t        j                  d      z           j                  j                  d      }t         fd|j                  d	   D              } j                  t	        t        |d
               t	        d             y)z/Test handling of very large investment amounts.z999999999.99999999   z3.50   r:   r<   r%   c              3   \   K   | ]#  }|d    j                   j                  k(  s | % ywrD   rF   rG   s     r!   rJ   zcReferralInvestmentSummaryTestCase.test_referral_network_large_investment_amounts.<locals>.<genexpr>  rK   rL   r&   r(   z1000000000.00000000NrY   rR   s   `  r!   .test_referral_network_large_investment_amountszPReferralInvestmentSummaryTestCase.test_referral_network_large_investment_amounts   s    !!/0%fo++||~\\^h&8&8c&BB 	" 		
 ;;??#45by)AbbC'@ABC)*	
r#   c                     	 t         j                  j                   j                  t	        d      dt	        d      dt         j
                  t        j                         t        j                         t        j                  d      z           j                  j                  d      }t         fd|j                  d	   D              } j                  t	        t        |d
               t	        d             y# t        $ r Y yw xY w)zGTest edge case: investment with zero amount (if allowed by validation).z
0.00000000r7   r8   r9   r:   r<   r%   c              3   \   K   | ]#  }|d    j                   j                  k(  s | % ywrD   rF   rG   s     r!   rJ   zaReferralInvestmentSummaryTestCase.test_referral_network_zero_amount_investment.<locals>.<genexpr>#  s,     !f-E4TXTbTbTeTeIe!-ErL   r&   r(   r)   N)r	   r   rM   r   r   rZ   r   rO   rP   r   r+   rQ   r0   r,   r1   	ExceptionrR   s   `  r!   ,test_referral_network_zero_amount_investmentzNReferralInvestmentSummaryTestCase.test_referral_network_zero_amount_investment  s    	%%^^|,")&/!!//#<<>!(*<*<#*FF & 	 {{'89H!!fX]]9-E!ffNWS8Q)R%STV]^aVbc 		s   C8C< <	DDN)__name__
__module____qualname____doc__r"   r4   rT   r[   re   rh   rm   rp   rs   r{   r   r    r#   r!   r   r      sJ    E94	Wd,d(e(+eZ kD:*M3<
,r#   r   N)r   decimalr   django.testr   django.utilsr   rest_framework.testr   rest_frameworkr   apps.users.modelsr   apps.investments.modelsr	   apps.referrals.modelsr
   r   r   r#   r!   <module>r      s.    :    ! ) ! " . ,Z Zr#   