
    Bi                         d 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 ddlmZmZmZmZ ddlmZmZ dd	lmZ dd
lmZ ddlmZ  G d de      Zy)z1Tests for the individual cron tasks (R001, D001).    )date	timedelta)Decimal)TestCase)timezone)CronExecution)CalculateRewardsTaskDistributeRewardsTaskCALCULATE_TASK_CODEDISTRIBUTE_TASK_CODE)
InvestmentReward)
Commission)Transaction)Userc                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	CronTasksTestc                    t         j                  j                  ddd      | _        t         j                  j                  ddd| j                        | _        t        j                         }|t        d	
      z
  | _        t        j                  t        d            }t        j                  j                  | j                  t        d      |d   |d   |d   t        j                  | j                  | j                  t        d
      z         | _        | j                  j                         t        d
      z   | _        y )Ni  Uplineupline)telegram_user_id
first_nameusernamei  Downlinedownline)r   r   r   referred_by   days1000tierratedurationx   useramountr!   daily_reward_rateduration_daysstatus
start_dateend_date   )r   objectscreate_userr   r   r   nowr   r+   r   get_tier_infor   createSTATUS_ACTIVE
investmentr   target_date)selfr0   	tier_infos      W/home/cursorai/projects/telegram-earn/backend/apps/investments/tests/test_cron_tasks.pysetUpzCronTasksTest.setUp   s   ll..!h / 
 00!!	 1 
 lln	q 11,,WV_=	$,,336?6"'/#J/++__yc':: 4 	
  ??//1I14EE    c                 R   t        | j                        }|j                         }| j                  |j                         t
        j                  j                  | j                  | j                        }| j                  |j                  t        d             | j                  |j                         | j                  j                          | j                  | j                  j                  t         j"                         | j%                  t&        j                  j)                                | j%                  t*        j                  j)                                t,        j                  j                  t.        | j                        }| j                  |j                         y)z3R001 should create rewards but NOT distribute them.r4   reward_datez20.00000000)	task_codeexecution_dateN)r	   r5   run
assertTruesuccessr   r.   getr4   assertEqualr'   r   assertIsNonedistributed_atrefresh_from_dbr*   r   r3   assertFalser   existsr   r   r   )r6   taskresultreward	executions        r8   +test_calculate_task_creates_pending_rewardsz9CronTasksTest.test_calculate_task_creates_pending_rewards8   s+   #D$4$45' ##tDL\L\#](>?&//0 	'')//1I1IJ 	++2245 	,,3356 "))--)$:J:J . 
	 		))*r:   c                     t        | j                        }|j                         }| j                  |j                         y)zHD001 should fail/skip if R001 hasn't run successfully for the same date.N)r
   r5   r@   rA   skipped)r6   rJ   rK   s      r8   0test_distribute_task_skips_if_calculate_not_donez>CronTasksTest.test_distribute_task_skips_if_calculate_not_doneT   s1    $T%5%56  	'r:   c                    t        | j                        }|j                          t        j                  j                  | j                  | j                        }| j                  |j                         t        | j                        }|j                         }| j                  |j                         | j                  |j                         |j                          | j                  |j                         t         j                  j#                  | j$                  t         j&                        j)                         }| j                  |       | j+                  |j,                  |j,                         t.        j                  j#                  |      j)                         }| j                  |       | j+                  |j0                  d       | j+                  |j2                  | j4                         | j+                  |j6                  t.        j8                         t         j                  j#                  | j4                  t         j:                        j)                         }| j                  |       y)z=D001 should distribute rewards if R001 success record exists.r<   )r&   transaction_type)rL   r-   N)r	   r5   r@   r   r.   rC   r4   rE   rF   r
   rA   rB   rH   rP   rG   assertIsNotNoner   filterr   TYPE_REWARDfirstrD   r'   r   levelupline_userr   r*   STATUS_DISTRIBUTEDTYPE_COMMISSION)r6   	calc_taskrL   	dist_taskrK   txcommctxs           r8   :test_distribute_task_distributes_rewards_after_calculationzHCronTasksTest.test_distribute_task_distributes_rewards_after_calculationa   s    ))9)9:	 ##tDL\L\#]&//0 *$*:*:;	'( 	 V223   ''1H1H ( 

%' 	 	R FMM2 !!(((7==?T"Q'))4;;7j&C&CD !!(({/J/J ) 

%' 	 	S!r:   c                 8   t        | j                        }|j                          t        j                  j                         j                          |j                  | j                         | j                  t        j                  j                         d       y)z8R001 should not duplicate rewards if run multiple times.r-   N)r	   r5   r@   r   r.   alldeleteexecuterD   r   count)r6   rJ   s     r8   test_calculate_task_idempotencyz-CronTasksTest.test_calculate_task_idempotency   si    #D$4$45
 	!!#**, 	T%%&--/3r:   c                    t        | j                        j                          t        | j                        j                          t        j
                  j                         }| j                  |j                         t        j
                  j                         }t        | j                        }t        j
                  j                  t              j                          |j                         }| j                  d|j                          | j#                  t        j
                  j                         |       y)z:D001 should not re-distribute already distributed rewards.)r>   zDistributed 0 rewardsN)r	   r5   r@   r
   r   r.   rW   rT   rF   r   rf   r   rU   r   rd   assertInmessagerD   )r6   rL   initial_tx_countrJ   rK   s        r8    test_distribute_task_idempotencyz.CronTasksTest.test_distribute_task_idempotency   s     	T--.224d../335 %%'V223&..446 %T%5%56$$/C$DKKM 	-v~~>,,2246FGr:   c                 $   t         j                  j                  | j                  t	        d      dddt         j
                  | j                  t        d      z
  | j                        }t        | j                        }|j                          |j                          | j                  |j                  t         j                         | j                  t        j                  j!                  || j                        j#                                y)z;Investment should be marked pending -> active -> completed.100r-   g      ?r   r%   r<   N)r   r.   r2   r   r   STATUS_PENDINGr5   r   r	   r@   rG   rD   r*   STATUS_COMPLETEDrA   r   rU   rI   )r6   	short_invrJ   s      r8    test_investment_completion_logicz.CronTasksTest.test_investment_completion_logic   s     &&--5>!,,'')*;;%% . 	
	 $D$4$45
!!#)):+F+FG 	NN!!YDDTDT!U\\^	
r:   N)
__name__
__module____qualname__r9   rN   rQ   ra   rg   rl   rr    r:   r8   r   r      s)    FB+8	('"R4H*
r:   r   N)__doc__datetimer   r   decimalr   django.testr   django.utilsr   django_cronjob_utils.modelsr   apps.investments.cron_tasksr	   r
   r   r   apps.investments.modelsr   r   apps.referrals.modelsr   apps.transactions.modelsr   apps.users.modelsr   r   rv   r:   r8   <module>r      s=    7 $    ! 5  7 , 0 "r
H r
r:   