
    (ph>                     $   S SK r S SKJrJr  S SKJrJr  S SKJr  S SKrS SK	r	S SK
Jr  S SKJr  S SKJr  S SKJr  S S	KJr  S S
KJrJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJ r   S SK!J"r"J#r#  S SK!J$r%  S SK&J'r'  S SK(J)r)J*r*  S SK+J,r,J-r-  S SK.J/r/  \R`                  S:  a  S SK1Jr2  O S SK3J2r2  \	Rl                  S\4S j5       r7\	Rl                  S.S j5       r8\*Rr                   S\*Rt                   3/r;S\ Rx                  R{                  \'S5      S.S\ Rx                  R{                  \'S5      S.S.r>\)Rr                   S\)Rt                   3/r?S\ Rx                  R{                  \'S5      S.S\ Rx                  R{                  \'S5      S.S .r@\	R                  R                  S! 5       rC\	R                  R                  S" 5       rD\	R                  R                  S# 5       rE\" \;\>S$9\	R                  R                  S%\4S& j5       5       rF\" \?\@S$9\	R                  R                  S%\4S' j5       5       rG\	R                  R                  S( 5       rH\	R                  R                  S) 5       rIS* rJ\" S+S,9S- 5       rKg! \4 a
    S SK5J2r2   GNf = f)/    N)datetime	timedelta)EventValue)mock)ValidationError)IntegrityError)override_settings)timezone)is_naive)Broker
get_broker)Conf)monitor)pusher)Queue)	scheduler)Schedulefetch)schedule)BASE_DIR)!TestingMultipleAppsDatabaseRouterTestingReplicaDatabaseRouter)
add_months	localtime)worker)   r   )ZoneInforeturnc                 D    U R                  [        SS5        [        5       $ )zd
Patches the Conf object setting the DJANGO_REDIS attribute allowing a default
redis configuration.
DJANGO_REDISdefault)setattrr   r   monkeypatchs    P/var/www/html/venv/lib/python3.13/site-packages/django_q/tests/test_scheduler.pybrokerr'   (   s     ni8<    c                 2    U R                  [        SS5        g)zNPatches the Conf object setting the ORM attribute to a database named default.ORMr"   N)r#   r   r$   s    r&   
orm_brokerr+   2   s     eY/r(   .zdjango.db.backends.sqlite3z
db.sqlite3)ENGINENAME)writablereplica)r"   adminc           	      $   UR                  [        SS5        [        S5      nSU l        [	        SSSSSS5      n[        S	SS
S[        R                  US9n[        U S9  UR                  5         UR                  n[        U5      S:X  d   eUR                  U5      n[        U5      S:X  d   e[        U S9  UR                  5         UR                  n[        U5      S:X  d   eUR                  U5      n[        U5      S:X  d   e[        U S9  UR                  5         UR                  n[        U5      S:X  d   eUR                  U5      n[        U5      S:X  d   e[	        SSSSSS5      n[        SSS[        R                  US9n[        U S9  UR                  5         UR                  n[        U5      S:X  d   eUR                  U5      n[        U5      S:X  d   e[        U S9  UR                  5         UR                  n[        U5      S:X  d   eUR                  U5      n[        U5      S:X  d   e[        U S9  UR                  5         UR                  n[        U5      S:X  d   eUR                  U5      n[        U5      S:X  d   eg )N	TIME_ZONEzEurope/Amsterdamscheduler_test:qi           r   math.copysign	test math)nameschedule_typenext_runr'   z2021-03-28 00:00:00+00:00z2021-03-28 01:00:00+01:00z2021-03-28 23:00:00+00:00z2021-03-29 01:00:00+02:00z2021-03-29 23:00:00+00:00z2021-03-30 01:00:00+02:00
      "django_q.tests.tasks.word_multiply   multiplyz2021-10-29 23:00:00+00:00z2021-10-30 01:00:00+02:00z2021-10-30 23:00:00+00:00z2021-10-31 01:00:00+02:00z2021-11-01 00:00:00+00:00z2021-11-01 01:00:00+01:00)r#   r   r   list_keyr   create_scheduler   DAILYr   refresh_from_dbr=   str
astimezone)r'   r%   tz
start_dater   r=   s         r&   )test_scheduler_daylight_saving_time_dailyrL   U   s   
 k+=>	$	%B(FO $2q!Q/J 	
nnH V   Hx=7777 ""2&Hx=7777 V  Hx=7777""2&Hx=7777 V  Hx=7777""2&Hx=7777 $B1a0J,	nnH V  Hx=7777""2&Hx=7777 V  Hx=7777""2&Hx=7777 V  Hx=7777 ""2&Hx=7777r(   c                     SU l         U R                  5         [        SSSSS[        R                  SS9nUR                  5       b   e[        R                  " [        5         [        SSSSS[        R                  SS9nS S S 5        [        U S9  [        5       n[        5       nUR                  5         [        X4U S9  UR                  5       S:X  d   eU R                  5       S	:X  d   eUR!                  S
5        [        5       n[#        X5[%        SS5      5        UR                  5       S:X  d   eUR!                  S
5        ['        U5        UR                  5       S	:X  d   e[        R(                  R+                  UR,                  S9nUR.                  S	:X  d   eUR                  5       c   eUR1                  5       SL d   eUR2                  [4        R6                  " 5       [9        SS9-   :  d   e[;        UR<                  5      nUc   eUR0                  SL d   eUR>                  S	:  d   e[        SSS[        R@                  SSS9n[C        US5      SL d   e[        SSS[        RD                  SSS9n[C        US5      SL d   e[        SSS[        RF                  SS9n	[C        U	S5      SL d   e[        SSS[        RH                  SS9n
[C        U
S5      SL d   eU
RK                  5       b   eU
RM                  5       S:X  d   e[        R                  " [N        5         [        SSS[        RH                  SS9  S S S 5        [        RP                   HN  nUS	   [        RH                  :X  a  M  [        SSSUS	   SSS9nUc   eUR                  5       b   e[        U S9  MP     [        R(                  RS                  SSS[        RD                  S9  [        U S9  [        R(                  RU                  UR,                  S9RW                  5       SL d   eURY                  [Z        SS5        [4        R6                  " 5       n[        SSS[        R                  [4        R6                  " 5       [9        SS9-
  SS 9n[        U S9  [        R(                  R+                  UR,                  S9nUR2                  U:  d   eURY                  [Z        SS5        [        U S9  [        R(                  R+                  UR,                  S9nUR2                  U:  d   eU R                  5         [        SSS[        R\                  S!9n[        U S9  [        R(                  R+                  UR,                  S9nUR2                  R_                  5       [a        [4        R6                  " 5       S5      R_                  5       :X  d   e[        SSS[        Rb                  S!9n[        U S9  [        R(                  R+                  UR,                  S9nUR2                  R_                  5       [4        R6                  " 5       [9        SS"9-   R_                  5       :X  d   eU R                  5         URY                  [Z        S#S$5        [        SSSS%S[        R                  S&SS'9n[        U S9  [        5       n[        5       nUR                  5         [        X4U S9  UR                  5       S	:X  d   eURY                  [Z        S#S(5        [        SSSS)S[        R                  S(SS'9n[        U S9  [        5       n[        5       nUR                  5         [        X4U S9  UR                  5       S:X  d   eg ! , (       d  f       GN= f! , (       d  f       GNC= f)*Nr4   r8   r7   r9   r:   django_q.tests.tasks.result)r;   hookr<   repeatsr>   r   STOPb)pkThoursrA   rB   django)wordr<   rP   rO   rS   r?   )rW   r<   minutesz0 22 * * 1-5)rW   r<   cronz0 22 * * 1-122zword="django")funcargskwargsr<   FCATCH_UPcatch_up   )rW   r<   r=   rP   )rW   r<   )weeksCLUSTER_NAMEsome_cluster_namez"test schedule on a another clustersome_other_cluster_name)r;   rO   r<   clusterrP   r"   ztest schedule with no cluster)2rD   delete_queuerE   r   HOURLYlast_runpytestraisesr	   r   r   r   setr   qsize
queue_sizeputr   r   r   objectsgetrS   rP   successr=   r   nowr   r   taskresultONCEhasattrrF   MINUTESCRON
full_clean__str__r   TYPEcreatefilterexistsr#   r   	BIMONTHLYdater   BIWEEKLY)r'   r%   r   
task_queue
stop_eventresult_queuers   once_schedulealways_scheduleminute_schedulecron_scheduletrr   s                r&   test_schedulerr      s   (FO
	
*ooH &&&	~	&"."//
 
' VJJNN
:&1"""!###NN67L
:U3^41$$$VL1$$$##x{{#3Hq   ***%%%x||~	0BBBBBD<<4;;??#,	mm*M =$'4///%,	nn*O ?D)T111%,	&&O ?D)T111#,	mmM =$'4///##%---  "&JJJJ		'0"-- 	
 
( ]]Q48== "0A$.
 ###  "***   1nn	   V""m&6&6"7>>@EIIIj$/
,,.C,	oo)""55H V##x{{#3Hs"""j%0V##x{{#3Hs"""
 ,	((	H V##x{{#3H!!#z(,,.!'D'I'I'KKKK ,	''	H V##x{{#3H!!#9K(K'Q'Q'SSSS
n.AB	
1*oo)	H VJJNN
:&1 """ni8	
,*oo	H VJJNN
:&1 """W 
'	&\ 
(	's   "],&]>,
];>
^c                     SU l         U R                  5         [        R                  " 5       [	        SS9-
  n[        SSSSS[        R                  SUSS	9	nUR                  5       b   eUR                  S:X  d   e[        U S
9  [        5       n[        5       nUR                  5         [        XEU S
9  UR                  5       S:X  d   eUR!                  5       nSUS   ;   d   eUS   S   UR#                  5       :X  d   eg )Nr4   r7   rT   r8   r9   r:   rN   intended_date)r;   rO   r<   rP   r=   intended_date_kwargr>   r]   )rD   rf   r   rr   r   rE   r   rg   rh   r   r   r   r   rk   r   rl   rp   	isoformat)r'   r%   run_dater   r   r   rs   s          r&   test_intended_schedule_kwargr     s    (FO
||~	 22H	
*oo+
H &&&''?:::VJJNN
:&1""">>Dd8n,,,>/*h.@.@.BBBBr(   )DATABASE_ROUTERS	DATABASESr+   c                     [        SS9n[        R                  " S5       n[        US9  UR                  R                  SS9  SSS5        g! , (       d  f       g= f)z
GIVEN a environment with a read/write configured replica database
WHEN the scheduler is called
THEN the transaction must be called with the write database.
r4   rD   django_q.cluster.db.transactionr>   r/   usingNr   r   patchr   atomicassert_called_withr+   r'   	mocked_dbs      r&   /test_scheduler_atomic_must_specify_the_write_dbr     sI     !34F	5	6) ++*+= 
7	6	6   #A
Ac                     [        SS9n[        R                  " S5       n[        US9  UR                  R                  SS9  SSS5        g! , (       d  f       g= f)z
GIVEN a environment without a read replica database
WHEN the scheduler is called
THEN the transaction atomic must be called using the default connection.
r4   r   r   r>   r"   r   Nr   r   s      r&   Ktest_scheduler_atomic_must_specify_the_database_based_on_router_redirectionr     sI     !34F	5	6) ++)+< 
7	6	6r   c                      Sn [        S[         R                  U S9nUR                  c   eUR                  b   eUR                  nUR	                  5         UR                  U:  d   eg)zBEnsure Schedule.save() sets next_run correctly for CRON schedules.
0 12 * * *	math.sqrtr[   r<   rY   N)r   rx   r=   rS   save)cron_expressionr   initial_next_runs      r&   )test_schedule_save_sets_next_run_for_cronr     sp     #OmmH (((;;((MMO ////r(   c                    Sn[         R                  R                  S[         R                  US9nUR                  c   eUR                  [
        R                  " 5       :  d   e[        U 5        U R                  5       S:X  d   eg)zNEnsure Schedule.save() updates next_run correctly when created directly in DB.r   r   r   Nr   )	r   ro   r|   rx   r=   r   rr   r   rm   )r'   r   r   s      r&   test_schedule_save_direct_dbr     s     #O &&mm ' H (((x||~---f!###r(   c                  8    [        [        5       5      (       a   eg Nr   r    r(   r&   test_localtimer     s    	$$$$$r(   F)USE_TZc                  8    [        [        5       5      (       d   eg r   r   r   r(   r&   test_naive_localtimer   	  s    IK    r(   )r   N)Losr   r   multiprocessingr   r   unittestr   rV   ri   django.core.exceptionsr   	django.dbr	   django.testr
   django.utilsr   django.utils.timezoner   django_q.brokersr   r   django_q.confr   django_q.monitorr   django_q.pusherr   django_q.queuesr   django_q.schedulerr   django_q.tasksr   r   r   rE   django_q.tests.settingsr   :django_q.tests.testing_utilities.multiple_database_routersr   r   django_q.utilsr   r   django_q.workerr   VERSIONpytzr   zoneinfoImportErrorbackports.zoneinfofixturer'   r+   
__module____name__REPLICA_DATABASE_ROUTERSpathjoinREPLICA_DATABASESMULTIPLE_APPS_DATABASE_ROUTERSMULTIPLE_APPS_DATABASESmark	django_dbrL   r   r   r   r   r   r   r   r   r   r(   r&   <module>r      s   	 ( (    2 $ ) ! * /  $ " ! ( * 6 , 1 "	>>F)0%
 6   0 0 $../q1M1V1V0WX 
 /X|4
 /X|4	  )334A6W6`6`5ab" 
 /X|4
 /X|4	  b8 b8J Y# Y#x C C> -9J >> > 3?V == = 0 0& $ $(% % ! !!M  0//0s   )I? ?JJ