
    ]j                        d dl Z d dlZd dlZd dlmZmZmZmZ d dlm	Z	m
Z
 d dlmZ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 d
lmZ d dlmZ d dlmZm Z  d dlZd dl!m"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-m.Z. d dl/m0Z0 d dl1m2Z2 d dl3m4Z4 d dl5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z; d dl<m=Z= d dl>m?Z?m@Z@ d dlAmBZBmCZCmDZDmEZE d dlFmGZGmHZHmIZI d dlJmKZKmLZL 	 d dlMmNZN ddlOmPZP d dlAmQZQ d ZRej                  ZUd" ZVdDd#ZWd$ ZX G d% d&e      ZY ed'd i(       G d) d*e             ZZ ed'd i(       G d+ d,e             Z[ ed'd i(       G d- d.e             Z\ G d/ d0e      Z] e	eRd!u d1       G d2 d3e             Z^ G d4 d5e      Z_ G d6 d7e      Z` G d8 d9e      Za G d: d;e      Zb G d< d=e      Zc ed'd i(       G d> d?e             Zd G d@ dAe      Ze G dB dCe      Zfy# eS$ r d!ZRY w xY w)E    N)AnycastDictList)skipIfmock)patchPropertyMock	MagicMock)uuid4)settings)call_command)TestCaseoverride_settings)reverse)
SafeString)ConnectionError)get_current_jobQueue)NoSuchJobError)Job)FinishedJobRegistryScheduledJobRegistry)is_suspended)Worker)DefaultSerializerJSONSerializer)job)get_job_class)rqworker)get_connection	get_queue
get_queuesget_unique_connection_configsDjangoRQget_redis_connection)thread_queue)force_escapeto_localtime)access_selfDummyJob
DummyQueueDummyWorker)get_jobsget_statisticsget_scheduler_pid)
get_workerget_worker_class)	Scheduler   )get_scheduler)DummySchedulerTFc                     | |z  S N )abs     ?/root/env/lib/python3.12/site-packages/django_rq/tests/tests.pydivider=   6   s    q5L    c                 .    t        j                  |        y)NzDone sleeping...)timesleep)timeouts    r<   long_running_jobrC   :   s    JJwr>   c                     | j                   }| j                         D ]G  }|j                  | j                  |       	 t	        j
                  ||      } |j                          I y # t        $ r Y Vw xY w)N
connection)rF   get_job_idszremkeyr   fetchdeleter   )registryrF   job_idr   s       r<   flush_registryrN   ?   sk    $$J&&( f-	))Fz:CCJJL	
  		s   (A((	A43A4c                       e Zd Zd Zy)RqStatsTestc                     ddddddg}t        dt        |      	      5  t        d
       t        d
d       t        d
d       ddd       y# 1 sw Y   yxY w)z@
        Test that rqstats returns the right statistics
        r   	localhost  DBHOSTPORTdefaultconnection_confignamedjango_rq.utils.QUEUES_LISTreturn_valuenew_callablerqstatsz-jz-yN)r	   r
   r   )selfqueuess     r<   test_get_connection_defaultz'RqStatsTest.test_get_connection_defaultK   sg     ' &
 "	
 0|Y_?`a 	*#D)D)		* 	* 	*s   $AAN)__name__
__module____qualname__rd   r9   r>   r<   rP   rP   J   s    *r>   rP   
AUTOCOMMITRQc                   D   e Zd Zd Zd Zd Zd Z ed      d        Z ed      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 ej                  d      d        Z ej                  d      d        Zd Zd Zd Z eddi      d        Zd Zd Zy )!
QueuesTestc                     t        j                         | _        i | j                  j                  j                  j
                  _        | j                  t        j                  d<   y)z1Used to test with / without sentry_sdk available.
sentry_sdkN)	r   r   mock_sdkHubcurrentclientoptionssysmodulesrb   s    r<   setUpzQueuesTest.setUpc   s@    (35!!((0$(MML!r>   c                 &    t         j                  d= y )Nrn   )rt   ru   rv   s    r<   tearDownzQueuesTest.tearDowni   s    KK%r>   c                     t         d   }t               }|j                  j                  }| j	                  |d   |d          | j	                  |d   |d          | j	                  |d   |d          y)	zj
        Test that get_connection returns the right connection based for
        `default` queue.
        rX   hostrV   portrW   dbrU   NQUEUESr!   connection_poolconnection_kwargsassertEqualrb   configrF   r   s       r<   rd   z&QueuesTest.test_get_connection_defaultl   sv    
 	"#%
&66HH*62F6NC*62F6NC*40&,?r>   c                     t         d   }t        d      }|j                  j                  }| j	                  |d   |d          | j	                  |d   |d          | j	                  |d   |d          y)	zg
        Test that get_connection returns the right connection based for
        `test` queue.
        testr{   rV   r|   rW   r}   rU   Nr~   r   s       r<   test_get_connection_testz#QueuesTest.test_get_connection_testx   sw    
 #F+
&66HH*62F6NC*62F6NC*40&,?r>   zdjango_rq.queues.Sentinelc                    t               }||j                  _        |g|_        t        d   }t        d      }| j                  ||       | j                  |j                  j                  d       | j                  |j                  d       |j                  d   d   }| j                  |d   |       |j                  j                  d   }| j                  |d   |d          y)zk
        Test that get_connection returns the right connection based for
        `sentinel` queue.
        sentinel   r   	SENTINELSservice_nameMASTER_NAMEN)
r   
master_forr^   side_effectr   r!   r   
call_count	call_argsassertListEqual)rb   sentinel_class_mocksentinel_mockr   rF   sentinel_instancesr   s          r<   test_get_connection_sentinelz'QueuesTest.test_get_connection_sentinel   s     "0=  -+8/'
##J/
]311<<a@,77;0::1=a@VK02DE)44>>qA*>:F=<QRr>   c                     g dddddddidd	d
dd}t        |       |j                  d   }| j                  |ddddddd	d
dd       y)zY
        Test that Sentinel object is initialized with proper connection kwargs.
        test_masterg?r   z
redis-userz
redis-passsslFzsentinel-userzsentinel-passg333333?)usernamepasswordsocket_timeout)r   r   SOCKET_TIMEOUTrU   USERNAMEPASSWORDCONNECTION_KWARGSSENTINEL_KWARGSr   )r}   r   r   r   r   sentinel_kwargsN)r&   r   assertDictEqual)rb   r   r   sentinel_init_sentinel_kwargss       r<   ,test_sentinel_class_initialized_with_kw_argsz7QueuesTest.test_sentinel_class_initialized_with_kw_args   s     (!$$"',;lop	
 	V$(;(E(Ea(H%),L\_hm  P_  m|  PS  CT  U	
r>   c                 4   t         d   }t        d      }|j                  j                  j                  }| j                  |j                  d       | j                  |d   |d          | j                  |d   |d          | j                  |d   |d          y)	z`
        Test that get_queue use the right parameters for `default`
        connection.
        rX   r{   rV   r|   rW   r}   rU   Nr   r"   rF   r   r   r   r[   rb   r   queuer   s       r<   test_get_queue_defaultz!QueuesTest.test_get_queue_default   s    
 	")$!,,<<NNY/*62F6NC*62F6NC*40&,?r>   c                 L   t         d   }t        d      }|j                  j                  j                  }| j                  |j                  d       | j                  |d   d       | j                  |d   d       | j                  |d   d       | j                  |d   d       y)	zk
        Test that get_queue use the right parameters for queues using URL for
        connection.
        urlr{   r|     r}      r   Nr   r   s       r<   test_get_queue_urlzQueuesTest.test_get_queue_url   s    
 % !,,<<NNU+*62F;*62D9*40!4*:6
Cr>   c                 L   t         d   }t        d      }|j                  j                  j                  }| j                  |j                  d       | j                  |d   d       | j                  |d   d       | j                  |d   d       | j                  |d   d       y)	z
        Test that get_queue use the right parameters for queues using URL for
        connection, where URL contains the db number (either as querystring
        or path segment).
        url_with_dbr{   r|   r   r}      r   Nr   r   s       r<   test_get_queue_url_with_dbz%QueuesTest.test_get_queue_url_with_db   s     &-(!,,<<NN]3*62F;*62D9*40!4*:6
Cr>   c                 :   t        d      }|j                  j                  j                  }| j	                  |j
                  d       | j	                  |d   d       | j	                  |d   d       | j	                  |d   d       | j	                  |d   d       y)z
        Test that get_queue use the right parameters for queues using URL for
        connection, where no DB given and URL does not contain the db number
        (redis-py defaults to 0, should not break).
        url_default_dbr{   r|   r   r}   Nr   )r"   rF   r   r   r   r[   )rb   r   r   s      r<   "test_get_queue_url_with_db_defaultz-QueuesTest.test_get_queue_url_with_db_default   s     *+!,,<<NN%56*62F;*62D9*40$7*:6
Cr>   c                 4   t         d   }t        d      }|j                  j                  j                  }| j                  |j                  d       | j                  |d   |d          | j                  |d   |d          | j                  |d   |d          y)	z]
        Test that get_queue use the right parameters for `test`
        connection.
        r   r{   rV   r|   rW   r}   rU   Nr   r   s       r<   test_get_queue_testzQueuesTest.test_get_queue_test   s    
 &!!,,<<NNV,*62F6NC*62F6NC*40&,?r>   c                 d    | j                  t        dd      t        d      t        d      g       y)zR
        Checks that getting queues with the same redis connection is ok.
        r   test2N)r   r#   r"   rv   s    r<   test_get_queues_same_connectionz*QueuesTest.test_get_queues_same_connection   s+     	FG4y7H)T[J\6]^r>   c                 <    | j                  t        t        dd       y)zi
        Checks that getting queues with different redis connections raise
        an exception.
        rX   r   NassertRaises
ValueErrorr#   rv   s    r<   %test_get_queues_different_connectionsz0QueuesTest.test_get_queues_different_connections   s    
 	*j)VDr>   c                 <    | j                  t        t        dd       y)z{
        Checks that getting queues with different classes (defined in configuration)
        raises an exception.
        r   test1Nr   rv   s    r<   !test_get_queues_different_classesz,QueuesTest.test_get_queues_different_classes  s    
 	*j&'Br>   c                    ddg}g }|D ]T  }t        |      }|j                  |j                  t        dd      t	        |j
                  |j                        d       V t        dg|ddi |D ]P  }| j                  |d	   j                         | j                  |d	   j                  |d
   j                                R g }|D ]T  }t        |      }|j                  |j                  t        dd      t	        |j
                  |j                        d       V t        dg|ddi |D ]P  }| j                  |d	   j                         | j                  |d	   j                  |d
   j                                R y)zL
        Checks that passing queues via commandline arguments works
        django_rq_testdjango_rq_test2*   r   )r   finished_job_registryr    burstTr   r   zrqworker-poolN)r"   appendenqueuer=   r   r[   rF   r   
assertTrueis_finishedassertInidrG   )rb   queue_namesjobs
queue_namer   r   s         r<   $test_pass_queue_via_commandline_argsz/QueuesTest.test_pass_queue_via_commandline_args
  sw    ():;% 	Jj)EKK ==Q7-@UM]M]-^	 	Z:+:T: 	UCOOCJ223MM#e*---D)E)Q)Q)ST	U
 % 	Jj)EKK ==Q7-@UM]M]-^	 	_?{?$? 	UCOOCJ223MM#e*---D)E)Q)Q)ST	Ur>   c           	         t        j                  d       | j                  j                  j	                  dd d| j                  j
                  j                  j                         | j                  j
                  j                  j                         | j                  j
                  j                  j                         g       y )Nhttps://1@sentry.io/1Fca_certsdebugintegrationsr    configure_sentryro   initassert_called_once_withr   redisRedisIntegrationrqRqIntegrationdjangoDjangoIntegrationrv   s    r<   test_configure_sentryz QueuesTest.test_configure_sentry0  s    !!"9:22#**00AAC**--;;=**11CCE	 	3 		
r>   c           	         t        j                  ddd       | j                  j                  j	                  ddd| j                  j
                  j                  j                         | j                  j
                  j                  j                         | j                  j
                  j                  j                         g       y)z>Check that debug and ca_certs can be passed through to Sentry.r   T/certs)sentry_debugsentry_ca_certsr   Nr   rv   s    r<   test_configure_sentry__optionsz)QueuesTest.test_configure_sentry__options=  s    !!"9^fg22#**00AAC**--;;=**11CCE	 	3 		
r>   c           	         dg}t        dg|ddddd | j                  j                  j                  ddd| j                  j                  j
                  j                         | j                  j                  j                  j                         | j                  j                  j                  j                         g       y)	z>Check that options are passed to configure_sentry as expected.r   r    Tr   r   )r   
sentry_dsnr   r   r   N)r   ro   r   r   r   r   r   r   r   r   r   )rb   r   s     r<   test_sentry_dsnzQueuesTest.test_sentry_dsnK  s    '(	
	
 .$	
 	22#**00AAC**--;;=**11CCE	 	3 		
r>   z7django_rq.management.commands.rqworker.configure_sentryc                 d    dg}t        dg|dddd | j                  |j                  d       y)z<Check that sentry is ignored if sentry_dsn is not passed in.r   r    Tr   )r   r   r   r   N)r   r   r   rb   mockedr   s      r<   test_sentry_dsn__noopz QueuesTest.test_sentry_dsn__noopb  s9     ((Zg+gT^fg**A.r>   c                     t         |_        dg}| j                  t              5  t	        dg|ddd ddd       y# 1 sw Y   yxY w)z4Check the command handles import errors as expected.r   r    Tr   )r   r   N)ImportErrorr   r   
SystemExitr   r   s      r<   test_sentry_sdk_import_errorz'QueuesTest.test_sentry_sdk_import_errorj  sP     )'(z* 	cbkbJab	c 	c 	cs	   >Ac                     dddd}dddd}||d}t        |      }| j                  t        |      d       | j                  ||       | j                  ||       ||d}| j                  t        |      |g       y )NrR   rS   r   rV   rW   rU   r   )rX   r   r4   )r$   r   lenr   )rb   connection_params_1connection_params_2r   unique_configss        r<   "test_get_unique_connection_configsz-QueuesTest.test_get_unique_connection_configsz  s    
  

 1:MN6v>^,a0)>:)>: 1:MN6v>AT@UVr>   c                    dddd}dddd}t        |      }t        |      }t        |      }d|d<   |||d}t        |      }| j                  t        |      d       | j	                  ||       | j	                  ||       y )	NrR   rS   r   r   r   DEFAULT_TIMEOUT)rX   test_btest_cr4   )dictr$   r   r   r   )rb   r   r   queue_params_aqueue_params_bqueue_params_cr   r   s           r<   9test_get_unique_connection_configs_with_different_timeoutzDQueuesTest.test_get_unique_connection_configs_with_different_timeout  s    
  

 121212,-()%$$

 7v>^,a0)>:)>:r>   c           	      r   t        d      }| j                  |j                         t        dd      }| j                  |j                         t        di t	        t
        t        t        f   ddi      }| j                  |j                         t        d      }| j                  |j                         y)z;
        Checks whether asynchronous settings work
        rX   F)is_asyncasyncN)rX   )r"   r   	_is_asyncassertFalser   r   strr   )rb   default_queuedefault_queue_is_asyncdefault_queue_asyncasync_queues        r<   
test_asynczQueuesTest.test_async  s    
 "),//0 "+9u!E/99:
 (\T$sCx.7TYJZ5[\,667  (../r>   rh   Fri   c                    t        d      }| j                  |j                         t        d      }| j                  |j                         t               }| j                  |j                         t	        d      }| j                  |d   j                         t	        d      }| j                  |d   j                         t	               }| j                  |d   j                         y)z<
        Checks whether autocommit is set properly.
        T)
autocommitFr   N)r"   r   _autocommitr	  r#   )rb   r   rc   s      r<   test_autocommitzQueuesTest.test_autocommit  s    
 T*))*U+**+**+t,q	--.u-../../r>   c                     t               }| j                  |j                  d       t        d      }| j                  |j                  d       y)z+Ensure DEFAULT_TIMEOUT are properly parsed.i  r     N)r"   r   _default_timeoutrb   r   s     r<   test_default_timeoutzQueuesTest.test_default_timeout  s?    //5'"//5r>   c                     t        d      }| j                  |j                  d       | j                  |j                  t        j
                  j                         y)zG
        Test that the correct serializer is set on the queue.
        test_serializerN)r"   r   r[   
serializerr   serializersr   r  s     r<   test_get_queue_serializerz$QueuesTest.test_get_queue_serializer  sD     +,%67))2>>+H+HIr>   N) re   rf   rg   rw   ry   rd   r   r	   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r  r  r  r9   r>   r<   rl   rl   a   s   2&
@
@ &'S (S, &'
 (
*@DDD@_EC$UL


. TZZIJ/ K/ TZZIJc KcW.;20, </00 10&6Jr>   rl   c                       e Zd Zd Zd Z eddd      d        Z eddd      d        Z eddd      d	        Zd
 Z	y)DecoratorTestc                     d}t         |   }t        |      d        }|j                         }t        |      }| j	                  |j
                  |       |j                          y )Ntest3c                       y r8   r9   r9   r>   r<   r   z.DecoratorTest.test_job_decorator.<locals>.test      r>   )r   r   delayr"   r   originrK   )rb   r   r   r   resultr   s         r<   test_job_decoratorz DecoratorTest.test_job_decorator  s[    

#	Z	 
	 *%
3r>   c                     t         d        }|j                         }| j                  |j                  d       |j	                          y )Nc                       y r8   r9   r9   r>   r<   r   z6DecoratorTest.test_job_decorator_default.<locals>.test  r#  r>   rX   )r   r$  r   r%  rK   rb   r   r&  s      r<   test_job_decorator_defaultz(DecoratorTest.test_job_decorator_default  s>    		 
	 	2r>   T<   rh   DEFAULT_RESULT_TTLri   c                     d}t         |   }t        |d      d        }|j                         }| j                  |j                  d       | j                  |d   d       |j                          y )Nr!  i  )
result_ttlc                       y r8   r9   r9   r>   r<   r   z>DecoratorTest.test_job_decorator_with_result_ttl.<locals>.test  r#  r>   r.  r   r   r$  r   r0  assertNotEqualrK   rb   r   r   r   r&  s        r<   "test_job_decorator_with_result_ttlz0DecoratorTest.test_job_decorator_with_result_ttl  sn     

#	ZC	(	 
)	 **C0F#78#>r>   c                     d}t         |   }t        |      d        }|j                         }| j                  |j                  |d          | j                  |d   d       |j                          y )Nr!  c                       y r8   r9   r9   r>   r<   r   z?DecoratorTest.test_job_decorator_queue_result_ttl.<locals>.test  r#  r>   r.  r,  r2  r4  s        r<   #test_job_decorator_queue_result_ttlz1DecoratorTest.test_job_decorator_queue_result_ttl  sq     

#	Z	 
	 **F3G,HIF#78"=r>   c                     d}t         |   }t        |      d        }|j                         }| j                  |j	                  d             | j                  |j                  d       |j                          y )Nr   c                       y r8   r9   r9   r>   r<   r   zGDecoratorTest.test_job_decorator_queue_without_result_ttl.<locals>.test#  r#  r>   r.  r,  )r   r   r$  assertIsNonegetr   r0  rK   r4  s        r<   +test_job_decorator_queue_without_result_ttlz9DecoratorTest.test_job_decorator_queue_without_result_ttl  sm     &

#	Z	 
	 &**%9:;**B/r>   c                     t         d        }|j                         }| j                  |j                  t        d   d          |j                          y )Nc                       y r8   r9   r9   r>   r<   r   zGDecoratorTest.test_job_decorator_default_queue_result_ttl.<locals>.test/  r#  r>   rX   r.  )r   r$  r   r0  r   rK   r*  s      r<   +test_job_decorator_default_queue_result_ttlz9DecoratorTest.test_job_decorator_default_queue_result_ttl,  sM     
	 
	 **F9,=>R,STr>   N)
re   rf   rg   r'  r+  r   r5  r8  r=  r@  r9   r>   r<   r  r    sn     RHI J RHI J RHI J	r>   r  c                   L    e Zd Zd Zd Zd Zd Zd Zd Z e	d      d        Z
y	)
WorkersTestc                 n    t               }|j                  d   }| j                  |j                  d       y)zX
        By default, ``get_worker`` should return worker for ``default`` queue.
        r   rX   N)r1   rc   r   r[   )rb   workerr   s      r<   test_get_worker_defaultz#WorkersTest.test_get_worker_default:  s-     a Y/r>   c                     t        d      }| j                  t        |j                        d       |j                  d   }| j                  |j                  d       y)zi
        Checks if a worker with specified queues is created when queue
        names are given.
        r!  r   r   N)r1   r   r   rc   r[   )rb   wr   s      r<   test_get_worker_specifiedz%WorkersTest.test_get_worker_specifiedB  sG    
 wQXX*W-r>   c                     t        ddd      }| j                  |j                  t               | j	                  |j
                  d   t               | j	                  |t               y )N!django_rq.tests.fixtures.DummyJobz#django_rq.tests.fixtures.DummyQueue$django_rq.tests.fixtures.DummyWorker)	job_classqueue_classworker_classr   )r1   assertIsrL  r+   assertIsInstancerc   r,   r-   rb   rG  s     r<   test_get_worker_custom_classesz*WorkersTest.test_get_worker_custom_classesL  sQ    9=?

 	akk8,ahhqk:6a-r>   c                 \    t        d      }| j                  |j                  t               y )Nzrq.serializers.JSONSerializer)r  )r1   r   r  r   rQ  s     r<   !test_get_worker_custom_serializerz-WorkersTest.test_get_worker_custom_serializerV  s%    6
 	~6r>   c                 X    t               }| j                  |j                  t               y r8   )r1   r   r  r   rQ  s     r<   "test_get_worker_default_serializerz.WorkersTest.test_get_worker_default_serializer\  s    L'89r>   c                     t               }|j                  t              }t        dd       t	        d|j
                        }| j                  |j                  |j                  v         |j                          y)z
        Ensure that functions using RQ's ``get_current_job`` doesn't fail
        when run from rqworker (the job id is not in the failed queue).
        r    z--burstfailed)r[   rF   N)
r"   r   r*   r   r   rF   r	  r   job_idsrK   )rb   r   r   failed_queues       r<   test_get_current_jobz WorkersTest.test_get_current_job`  s]    
 mmK(Z+(u7G7GH<#7#778

r>   z8django_rq.management.commands.rqworker.setup_loghandlersc                     ddddd}dD ]4  }|j                          t        d|d       |j                  ||          6 y )NWARNINGINFODEBUGr   r   r4      r    T)	verbosityr   )
reset_mockr   r   )rb   setup_loghandlers_mockexpected_levelrb  s       r<   0test_commandline_verbosity_affects_logging_levelz<WorkersTest.test_commandline_verbosity_affects_logging_levell  sU     	
 & 	VI"--/yE"::>);TU	Vr>   N)re   rf   rg   rE  rH  rR  rT  rV  r[  r	   rf  r9   r>   r<   rB  rB  8  s=    0..7:
 EF
V G
Vr>   rB  c                       e Zd Z eddi      d        Z eddi      d        Zd Zd Z eddi      d	        Z eddi      d
        Z	y)ThreadQueueTestrh   Tri   c                     t               }|j                  t        dd      }| j                  |j                  |j
                  v         |j                          y)zn
        Running ``enqueue`` when AUTOCOMMIT is on should
        immediately persist job into Redis.
        r   N)r"   r   r=   r   r   rY  rK   )rb   r   r   s      r<   test_enqueue_autocommit_onz*ThreadQueueTest.test_enqueue_autocommit_on{  sA     mmFAq)%--/0

r>   Fc                    t               }|j                  t        dd      }| j                  |du        t	        j                          }| j                  |d   d   |       | j                  |d   d   d       |d   d   }| j                  |d   d       | j                  |d	   d       | j                  |d
   ddi       | j                  |d   t               | j                  |d   d       y)z
        Running ``enqueue`` when AUTOCOMMIT is off should
        put the job in the delayed queue instead of enqueueing it right away.
        r   )r;   Nr   r9   r4   argsr   r0  kwargsr;   funcrB   )r"   r   r=   r   r'   r   )rb   r   r   delayed_queuern  s        r<   test_enqueue_autocommit_offz+ThreadQueueTest.test_enqueue_autocommit_off  s     mmFAm+t$$..0q)!,e4q)!,b1q!!$.-t4)C840	*D1r>   c                 b   t               }t        j                          }|j                          | j                  |j                  d       |j                  t        dddi       t        j                          | j                  |j                  d       | j                  t        |      d       y)zi
        Ensure that commit_delayed_jobs properly enqueue jobs and clears
        delayed_queue.
        r   rm  r;   r   )rl  rn  N)	r"   r'   emptyr   countenqueue_callr=   commitr   rb   r   rp  s      r<   test_commitzThreadQueueTest.test_commit  s    
 $..0a(6c1X>a(]+Q/r>   c                     t               }t        j                          }|j                  |t        dddif       t        j                          t        j                          }| j                  |g        y )Nrm  r;   r   )r"   r'   r   r=   clearr   rw  s      r<   
test_clearzThreadQueueTest.test_clear  s\    $..0eVTC8<=$..0+r>   c                    t               }|j                          t        j                          | j	                  |j
                  d       | j                  j                  t        d             | j	                  |j
                  d       y )Nr   successr   )	r"   rs  r'   rz  r   rt  rr   r<  r   r  s     r<   test_successzThreadQueueTest.test_success  s[    a(	*+a(r>   c                    t               }|j                          | j                  |j                  d       t	        d      }| j                  t        | j                  j                  |       | j                  |j                  d       y )Nr   error)	r"   rs  r   rt  r   r   r   rr   r<  )rb   r   r   s      r<   
test_errorzThreadQueueTest.test_error  s^    a(g*dkkoos;a(r>   N)
re   rf   rg   r   rj  rq  rx  r{  r~  r  r9   r>   r<   rh  rh  z  s    <./ 0 </02 12$0, </0) 1) </0) 1)r>   rh  RQ Scheduler not installedc                       e Zd Zd Zd Z ed       ed      d               Z eddi      d	        Z ed
di      d        Z	 eddd      d        Z
y)SchedulerTestc                 4   t         d   }t        d      }|j                  j                  j                  }| j                  |j                  d       | j                  |d   |d          | j                  |d   |d          | j                  |d   |d          y)	z~
        Ensure get_scheduler creates a scheduler instance with the right
        connection params for `test` queue.
        r   r{   rV   r|   rW   r}   rU   N)r   r5   rF   r   r   r   r   )rb   r   	schedulerr   s       r<   test_get_schedulerz SchedulerTest.test_get_scheduler  s    
 !&)	%00@@RR--v6*62F6NC*62F6NC*40&,?r>   c                     t        d      5 }t        d|      }| j                  |j                  |       ddd       y# 1 sw Y   yxY w)zJ
        Ensure get_scheduler respects the `connection` argument.
        r   rE   N)r!   r5   rO  rF   )rb   rF   r  s      r<   $test_get_scheduler_custom_connectionz2SchedulerTest.test_get_scheduler_custom_connection  sC    
 F# 	<z%fDIMM)..
;	< 	< 	<s	   *?Az7django_rq.management.commands.rqscheduler.get_schedulerz;django_rq.management.commands.rqscheduler.setup_loghandlersc                     d |j                   _        ddddd}dD ]3  }|j                          t        d|       |j	                  ||          5 y )Nr]  r^  r_  r`  rqscheduler)rb  )runr^   rc  r   r   )rb   rd  get_scheduler_mockre  rb  s        r<   rf  z>SchedulerTest.test_commandline_verbosity_affects_logging_level  sb     /3+	
 & 	VI"--/)<"::>);TU	Vr>   SCHEDULER_CLASSz'django_rq.tests.fixtures.DummySchedulerri   c                 F    t        d      }| j                  |t               y)z0
        Scheduler class customization.
        rX   N)r5   rP  r6   )rb   r  s     r<   test_scheduler_defaultz$SchedulerTest.test_scheduler_default  s    
 "),	i8r>   rh   Tc                 L   t        d      }|j                  t        j                  j                         t        j                  d      z   t
        dd      }| j                  ||j                         v        | j                  |j                  d        |j                          y)\
        Ensure scheduler respects DEFAULT_RESULT_TTL value for `result_ttl` param.
        test_schedulerr   daysr  N)r5   
enqueue_atdatetimenow	timedeltar=   r   r.   r   rB   rK   rb   r  r   s      r<   test_scheduler_default_timeoutz,SchedulerTest.test_scheduler_default_timeout  s    
 ""23	""8#4#4#8#8#:X=O=OUV=W#WY_abdefy11334c*

r>   8  r-  c                 L   t        d      }|j                  t        j                  j                         t        j                  d      z   t
        dd      }| j                  ||j                         v        | j                  |j                  d        |j                          y)r  r  r   r  r  N)r5   r  r  r  r  r=   r   r.   r   r0  rK   r  s      r<   !test_scheduler_default_result_ttlz/SchedulerTest.test_scheduler_default_result_ttl  s    
 ""23	""8#4#4#8#8#:X=O=OUV=W#WY_abdefy11334.

r>   N)re   rf   rg   r  r  r	   rf  r   r  r  r  r9   r>   r<   r  r    s    @< DE
HIV J FV ,.WXY9 Z9 <./ 0 TJK Lr>   r  c                       e Zd Z eej
                  dk7  d       ed      d               Z eej
                  dk7  d      d        Zy)	RedisCacheTestdjango-rediszdjango-redis not installedz!django_redis.get_redis_connectionc                     t        d      }|j                  t               | j                  t	        |      d       | j                  |j
                  d       y)O
        Test that the USE_REDIS_CACHE option for configuration works.
        r  r   N)r"   r   r*   r   r   r   )rb   r   r   s      r<   test_get_queue_django_redisz*RedisCacheTest.test_get_queue_django_redis
  sD     .)k"UQ'**A.r>   django-redis-cachez django-redis-cache not installedc                 4   d}t        |      }|j                  j                  j                  }| j	                  |j
                  |       t        j                  |   d   j                  d      d   }t        j                  |   d   j                  d      d   }t        j                  |   d   d   }| j	                  |d   |       | j	                  |d	   t        |             | j	                  |d
   t        |             | j	                  |d   d       y)r  r  LOCATION:r   r   OPTIONSrU   r{   r|   r}   r   N)
r"   rF   r   r   r   r[   r   CACHESsplitint)rb   	queueNamer   r   	cacheHost	cachePort
cacheDBNums          r<   !test_get_queue_django_redis_cachez0RedisCacheTest.test_get_queue_django_redis_cache  s    
 )	)$!,,<<NNY/OOI.z:@@EaH	OOI.z:@@EaH	__Y/	:4@
*62I>*62C	NC*40#j/B*:6=r>   N)	re   rf   rg   r   r   REDIS_CACHE_TYPEr	   r  r  r9   r>   r<   r  r  	  s_    H%%79UV
.// 0 W/ H%%)==?ab> c>r>   r  c                   :    e Zd Zd Z eddi      d        Zd Zy)JobClassTestc                 D    t               }| j                  |t               y r8   )r   rO  r   rb   rL  s     r<   test_default_job_classz#JobClassTest.test_default_job_class*  s    !O	i%r>   	JOB_CLASSrJ  ri   c                 D    t               }| j                  |t               y r8   )r   rO  r+   r  s     r<   test_custom_classzJobClassTest.test_custom_class.  s    !O	i*r>   c                 B    | j                  t        d      t               y )NrJ  )rO  r   r+   rv   s    r<   test_local_overridez JobClassTest.test_local_override3  s    m$GH(Sr>   N)re   rf   rg   r  r   r  r  r9   r>   r<   r  r  )  s-    & ;(KLM+ N+Tr>   r  c                       e Zd Zd Zy)SuspendResumeTestc                     t               }| j                  t        |      d       t        d       | j                  t        |      d       t        d       | j                  t        |      d       y )Nr   	rqsuspendr   rqresume)r!   r   r   r   )rb   rF   s     r<    test_suspend_and_resume_commandsz2SuspendResumeTest.test_suspend_and_resume_commands7  sY    #%
j115[!j115Z j115r>   N)re   rf   rg   r  r9   r>   r<   r  r  6  s    6r>   r  c                       e Zd Zd Zd Zd Zy)QueueClassTestc                 F    t        d      }| j                  |t               y )Nr   )r"   rP  r%   r  s     r<   test_default_queue_classz'QueueClassTest.test_default_queue_classA  s    &!eX.r>   c                 F    t        d      }| j                  |t               y )Nr   )r"   rP  r,   r  s     r<   test_for_queuezQueueClassTest.test_for_queueE  s    '"eZ0r>   c                 R    t        dt              }| j                  |t               y )Nr   )rM  )r"   r,   rP  r  s     r<   test_in_kwargszQueueClassTest.test_in_kwargsI  s    &j9eZ0r>   N)re   rf   rg   r  r  r  r9   r>   r<   r  r  @  s    /11r>   r  c                   :    e Zd Zd Z eddi      d        Zd Zy)WorkerClassTestc                 D    t               }| j                  |t               y r8   )r1   rP  r   rb   rD  s     r<   test_default_worker_classz)WorkerClassTest.test_default_worker_classO  s    ff-r>   WORKER_CLASSrK  ri   c                 D    t               }| j                  |t               y r8   )r1   rP  r-   r  s     r<   r  z!WorkerClassTest.test_custom_classS  s    fk2r>   c                 B    | j                  t        d      t               y )NrK  )rO  r2   r-   rv   s    r<   r  z#WorkerClassTest.test_local_overrideX  s    &'MNP[\r>   N)re   rf   rg   r  r   r  r  r9   r>   r<   r  r  N  s-    . >+QRS3 T3]r>   r  c                       e Zd Zd Zd Zd Zy)TemplateTagTestc                 4   | j                  d      5  t               }|j                  t              }t	        |j
                        }| j                  |j                         | j                   |j                  d      d       d d d        y # 1 sw Y   y xY w)NzAsia/Jakarta)	TIME_ZONEz%zz+0700)
r   r"   r   r*   r)   
created_atassertIsNotNonetzinfor   strftime)rb   r   r   r@   s       r<   test_to_localtimez!TemplateTagTest.test_to_localtime^  su    ]]^]4 	;KE--,C/D  -]T]]40':	; 	; 	;s   A2BBc                 \    d}t        |      }t        |      }d}| j                  ||       y )Nz<h1>hello world</h1>z &lt;h1&gt;hello world&lt;/h1&gt;r   r(   r   rb   htmlsafe_stringescaped_stringexpecteds        r<   test_force_escape_safe_stringz-TemplateTagTest.test_force_escape_safe_stringg  s0    % &%k252r>   c                 \    d}t        |      }t        |      }d}| j                  ||       y )Nzhello worldr  r  s        r<    test_force_escape_regular_stringz0TemplateTagTest.test_force_escape_regular_stringp  s0     &%k2 2r>   N)re   rf   rg   r  r  r  r9   r>   r<   r  r  \  s    ;33r>   r  c                       e Zd Z eedu d      d        Z eedu d      d        Z eedu d      d        Z eedu d      d        Zy	)
SchedulerPIDTestFr  c                 &   d}dddd|dg}t        dt        |      	      5  t        |      }|j                          | j	                  t        t        |j                              d
       |j                          d d d        y # 1 sw Y   y xY w)Nscheduler_scheduler_active_testr   rR   rS   rT   rY   r\   r]   r_   F)	r	   r
   r5   register_birthrO  r0   r"   r   register_death)rb   
test_queuerc   r  s       r<   #test_scheduler_scheduler_pid_activez4SchedulerPIDTest.test_scheduler_scheduler_pid_active{  s    6
 #"
 
  0%6:< 	'%j1I$$&MM+Ii6J6J,KLeT$$&	' 	' 	'   ABBc                 \   d}dddd|dg}t        dt        |      	      5  t        |      }|j                          t	        |      }|j                          |j                          | j                  t        t        |j                              d
       d d d        y # 1 sw Y   y xY w)N!scheduler_scheduler_inactive_testr   rR   rS   rT   rY   r\   r]   r_   F)r	   r
   r!   flushallr5   remove_lockr  rO  r0   r"   r   )rb   r  rc   rF   r  s        r<   %test_scheduler_scheduler_pid_inactivez6SchedulerPIDTest.test_scheduler_scheduler_pid_inactive  s    8
 #"
 
  0%6:< 	U'
3J!%j1I!!#$$&MM+Ii6J6J,KLeT	U 	U 	Us   A5B""B+Tz2RQ Scheduler installed (no worker--with-scheduler)c                    d}dddd|dg}t        d      5 }t        dt        |	      
      5  t        |      }t        |t	               j
                        }|j                  dd       t        |      }| j                  |       | j                  |d       | j                  |t               ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)eThe worker works as scheduler too if RQ Scheduler not installed, and the pid scheduler_pid is correctworker_scheduler_active_testr   rR   rS   rT   rY   z&rq.scheduler.RQScheduler.release_locksr\   r]   r_   r[   Twith_schedulerr   FN)r	   r
   r"   r1   r   hexworkr0   r  assertIsNotrP  r  )rb   r  rc   mock_release_locksr   rD  pids          r<    test_worker_scheduler_pid_activez1SchedulerPIDTest.test_worker_scheduler_pid_active  s     4
 #"
 
  ;< 		0@R4)v>@ 0!*-#JUW[[A4t<'.$$S)  e,%%c3/0		0 		00 0		0 		0s#   CBC2CC	CCc                 &   d}dddd|dg}t        dt        |      	      5  t        |t               j                  
      }|j                  dd       | j                  t        |j                  d                ddd       y# 1 sw Y   yxY w)r  worker_scheduler_inactive_testr   rR   rS   rT   rY   r\   r]   r_   r  FTr  N)	r	   r
   r1   r   r  r  r;  r0   rc   )rb   r  rc   rD  s       r<   "test_worker_scheduler_pid_inactivez3SchedulerPIDTest.test_worker_scheduler_pid_inactive  s     6
 #"
 
  0%6:< 	C
=FKKuDK9/a0@AB		C 	C 	Cr  N)	re   rf   rg   r   RQ_SCHEDULER_INSTALLEDr  r  r  r  r9   r>   r<   r  r  z  s    "e+-IJ' K'" "e+-IJU KU& "d*,`a0 b0, "d*,`aC bCr>   r  c                       e Zd Zd Zd Zy)	UtilsTestc                 f   ddddddg}t        dt        |      	      5  t        dt               j                  
      }|j                          t               }|d   d   }| j                  |d   d       | j                  |d   d       |j                          ddd       y# 1 sw Y   yxY w)z4get_statistics() returns the right number of workersr   rR   rS   rT   r  rY   r\   r]   r_   r  rc   r[   workersr   N)	r	   r
   r1   r   r  r  r/   r   r  )rb   rc   rD  
statisticsdatas        r<   test_get_statisticszUtilsTest.test_get_statistics  s    
 ' &
  	
 0|Y_?`a 	$egkk:F!!#')Jh'*DT&\73T)_a0!!#	$ 	$ 	$s   A<B''B0c                 n   t        d      }t        |j                  |j                        }t	        |       t
        j
                  j                         }|j                  |t              }|j                  |t              }| j                  t        ||j                  |j                  g      ||g       | j                  t        |      d       |j                  j                  |j                         | j                  t        ||j                  |j                  g      |g       | j                  t        |      d       |j                  j                  |j                         | j                  t        ||j                  |j                  g|      g        | j                  t        |      d       y)zget_jobs() works properlyr   r4   r   N)r"   r   r[   rF   rN   r  r  r  r*   r   r.   r   r   rK   rI   )rb   r   rL   r  r   job2s         r<   test_get_jobszUtilsTest.test_get_jobs  sG   *+'

E4D4DEx ##%sK0[1%#&&$''):;c4[IX* 	(%#&&$''):;dVDX* 	)%#&&$''):HErJX*r>   N)re   rf   rg   r
  r  r9   r>   r<   r  r    s    $,+r>   r  )
   )grt   r  r@   typingr   r   r   r   unittestr   r   unittest.mockr	   r
   r   uuidr   django.confr   django.core.managementr   django.testr   r   django.urlsr   django.utils.safestringr   redis.exceptionsr   r   r   r   rq.exceptionsr   rq.jobr   rq.registryr   r   rq.suspensionr   	rq.workerr   rq.serializersr   r   django_rq.decoratorsr   django_rq.jobsr   django_rq.management.commandsr    django_rq.queuesr!   r"   r#   r$   r%   r&   	django_rqr'    django_rq.templatetags.django_rqr(   r)   django_rq.tests.fixturesr*   r+   r,   r-   django_rq.utilsr.   r/   r0   django_rq.workersr1   r2   rq_schedulerr3   rc   r5   r6   r  r   	RQ_QUEUESr   r=   rC   rN   rP   rl   r  rB  rh  r  r  r  r  r  r  r  r  r  r9   r>   r<   <module>r*     s   
   ( ( ! 8 8    / 3  . , % 	 (  A &  < $ ( 2  # G S S G G :#&&7! 
		
*( *. |T*+J J ,JD |T*+PH P ,Pf |T*+>V( >V ,>VBE)h E)P %')EFCH C GCL>X >@T8 T6 61X 1]h ] |T*+3h 3 ,3:NCx NC`-+ -+u  #"#s   G% %G0/G0