
    :?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 )No   Investorinvestortelegram_user_id
first_nameusernameuser)r   objectscreate_userr!   r	   clientforce_authenticate)selfs    r   setUpzInvestmentApiTests.setUp   sJ    LL,, ! - 
	
  k&&DII&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5wvG113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5wvG113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]   ,,WU^<	lln""))5>6"'/#J/,,9)J*?@@ * 	
 ""))5>6"'/#J/,,9)J*?@@ * 	
 '(;;??3'--v/A/ABhmm,9$t*9EHHehh;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~ . 

 ,,WU^<	lln&&--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   \\-- Ww . 

 ,,WU^<	lln%%,,5>6"'/#J/,,9)J*?@@ - 	
 	!!5>6"'/#J/,,9)J*?@@ 	" 		
 '(;;??3'--v/A/ABhmm,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."8H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    LL,, #! - 
	
  k&&DII&6,,WU^<	lln$,,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   <( ++- 	 	

 \\-- Wx . 

 ,,WT];	&&--4=6"'/#J/++||~\\^iYz5J&KK . 	
	 	 <( ++- 	 	
 m$;;??3$//:L:L(MN--v/A/ABhmm,Wq)L14??3E3E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   ##%I1--	<(! 	 	

 	<( 	 	
 ;;??7=#9:--v/A/ABhmm,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   <( ++- 	 	

 \\-- Wx . 

 ,,WT];	&&--4=6"'/#J/++||~\\^iYz5J&KK . 	
	 	 <( ++- 	 	
 ;;??7=#9:--v/A/ABhmm,Wq)L14??3E3E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   \\-- Wx . 

 ,,WT];	&&--4=6"'/#J/++||~\\^iYz5J&KK . 	
	 	 <( ++- 	 	
 m$;;??3),,(GH--v/A/ABhmm,"%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    ::gm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   