
    ]jI                        d dl Z d dlmZmZmZ d dlmZ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mZmZ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#  eddi       G d de
             Z$y)    N)datetime	timedeltatimezone)PropertyMockpatch)User)TestCaseoverride_settings)Client)reverse)Job	JobStatus)DeferredJobRegistryFailedJobRegistryFinishedJobRegistryScheduledJobRegistryStartedJobRegistry)	get_queue)get_scheduler)
get_worker   )access_selffailing_job)get_queue_index
AUTOCOMMITT)RQc                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)ViewTestc                    t         j                  j                  dd      | _        d| j                  _        d| j                  _        | j                  j                          t               | _        | j                  j                  | j                  j                  d       t        d      j                  j                          y )Nfoopass)passwordT)usernamer"   django_rq_test)r   objectscreate_useruseris_staff	is_activesaver   clientloginr#   r   
connectionflushall)selfs    D/root/env/lib/python3.12/site-packages/django_rq/tests/test_views.pysetUpzViewTest.setUp   s    LL,,UV,D	!		"				h499#5#5G"#..779    c                     t        d      }|j                  t              }t        d      }| j                  j                  t        d|g            }| j                  |j                  d   |g       y)z$Jobs in queue are displayed properlydefaultrq_jobsargsjobsN)	r   enqueuer   r   r+   getr   assertEqualcontext)r/   queuejobqueue_indexresponses        r0   	test_jobszViewTest.test_jobs&   s\    )$mmK(%i0;;??79K=#IJ))&1C59r2   c                    t        d      }|j                  t              }t        d      }t	        d||j
                  g      }| j                  j                  |      }| j                  |j                  d   |       |j                  j                  |j                  dd       | j                  j                  |      }| j                  |j                  d       | j                  d|j                  j!                                y	)
zJob data is displayed properlyr4   rq_job_detailr6   r>   datazunpickleable data   DeserializationErrorN)r   r9   r   r   r   idr+   r:   r;   r<   r-   hsetkeystatus_codeassertIncontentdecode)r/   r=   r>   r?   urlr@   s         r0   test_job_detailszViewTest.test_job_details.   s    )$mmK(%i0o[#&&,AB;;??3'))%0#6 	cggv/BC;;??3'--s3,h.>.>.E.E.GHr2   c                 v   t        d      }|j                  t              }t        d      }t	        d      }|j                  d       |j                         d   }t        d||j                  g      }| j                  j                  |      }|j                  sJ | j                  ||j                         y)z&Job with results is displayed properlyr4   Tburstr   rC   r6   N)r   r9   r   r   r   workresultsr   rG   r+   r:   assertContains)r/   r=   r>   r?   workerresultrN   r@   s           r0   test_job_details_with_resultsz&ViewTest.test_job_details_with_results>   s    )$mmK(%i0I&$q!o[#&&,AB;;??3'yyyHfii0r2   c                    t        d      }t        d      }|j                  t              }|j                  t        |      }|j	                          t        d||j                  g      }| j                  j                  |      }| j                  |j                  d       | j                  |j                  |j                  j                                y)z:Page doesn't crash even if job.dependency has been deletedr4   
depends_onrC   r6   rE   N)r   r   r9   r   deleter   rG   r+   r:   r;   rJ   rK   _dependency_idrL   rM   )r/   r=   r?   r>   
second_jobrN   r@   s          r0   &test_job_details_on_deleted_dependencyz/ViewTest.test_job_details_on_deleted_dependencyK   s    )$%i0mmK(]];3]?


o[*--,HI;;??3'--s3j//1A1A1H1H1JKr2   c                    t        d      }t        d      }|j                  t              }t	        d      }|j                  d       |j                          | j                  |j                         | j                  j                  t        d||j                  g      ddi       | j                  ||j                         |j                          y)	zV
        Ensure that a failed job gets requeued when rq_requeue_job is called
        r4   TrQ   rq_requeue_jobr6   requeueRequeueN)r   r   r9   r   r   rS   refresh
assertTrue	is_failedr+   postr   rG   rK   r8   r\   )r/   r=   r?   r>   rV   s        r0   test_requeue_jobzViewTest.test_requeue_jobX   s     )$%i0mmK(I&$&!1cff8MNQZ\ePfgc5::&

r2   c                    t        d      }t        d      }|j                  t               |j                  t               t	        d      }|j                  d       | j                  j                  t        d|g            }| j                  |j                  d   d       | j                  j                  t        d|g            }| j                  t        |      d       y)	D
        Ensure that requeuing all failed job work properly
        r4   TrQ   rq_requeue_allr6   
total_jobs   N)r   r   r9   r   r   rS   r+   r:   r   r;   r<   rg   len)r/   r=   r?   rV   r@   s        r0   test_requeue_allzViewTest.test_requeue_allg   s     )$%i0k"k"I&$;;??7+;;-#PQ)),7;;;##G,<K=$QRUQ'r2   c                    t        d      }t        d      }|j                  t              }|j                  t               t	        d      }|j                  d       | j                  j                  t        d|g            }| j                  |j                  d   d       |j                          | j                  j                  t        d|g            }| j                  t        |      d       y	)
rj   r4   TrQ   rk   r6   rl   rm   r   N)r   r   r9   r   r   rS   r+   r:   r   r;   r<   r\   rg   rn   )r/   r=   r?   r>   rV   r@   s         r0   test_requeue_all_if_deleted_jobz(ViewTest.test_requeue_all_if_deleted_jobx   s     )$%i0mmK(k"I&$;;??7+;;-#PQ)),7;

 ;;##G,<K=$QRUQ'r2   c                    t        d      }t        d      }|j                  t              }| j                  j                  t        d||j                  g      ddi       | j                  t        j                  |j                  |j                               | j                  |j                  |j                         y)zq
        In addition to deleting job from Redis, the job id also needs to be
        deleted from Queue.
        r$   rq_delete_jobr6   rg   yesr-   N)r   r   r9   r   r+   rg   r   rG   assertFalser   existsr-   assertNotInjob_idsr/   r=   r?   r>   s       r0   test_delete_jobzViewTest.test_delete_job   s    
 *+%&67mmK(SVV7LMPVX]_CFFu7G7GHI/r2   c                    t        d      }t        d      }g }t        dd      D ]2  }|j                  t              }|j                  |j                         4 | j                  j                  t        d|g      d|d       |D ]N  }| j                  t        j                  ||j                               | j                  ||j                         P y )	Nr$   r      
rq_actionsr6   r\   actionry   ru   )r   r   ranger9   r   appendrG   r+   rg   r   rv   r   rw   r-   rx   ry   )r/   r=   r?   ry   _r>   job_ids          r0   test_action_delete_jobsz ViewTest.test_action_delete_jobs   s    *+%&67 q! 	#A--,CNN366"	#
 	[MBxdkDlm  	4FSZZ5;K;KLMVU]]3	4r2   c                 R   t        d      }t        d      }d }t        dd      D ]  }|j                  t        |      }|} }| j                  |j                         t        j                         | j                  |j                         | j                  j                  t        d||j                  g            }|j                  |j                        }|sJ | j                  |j                         t        j                          | j#                  |j                         y )Nr$   r   r}   rZ   rq_enqueue_jobr6   )r   r   r   r9   r   r;   
get_statusr   DEFERREDassertIsNoneenqueued_atr+   rg   r   rG   	fetch_jobQUEUEDassertIsNotNone)r/   r=   r?   previous_jobr   r>   last_jobr@   s           r0   test_enqueue_jobszViewTest.test_enqueue_jobs   s    *+%&67 q! 	A---ECL	
 ,,.	0B0BC(../ ;;##G,<KQYQ\Q\C]$^_ ??8;;/x,,.	0@0@AX112r2   c                    t        d      }t        d      }g }g }t        dd      D ]C  }|j                  t              }|j                  |       |j                  |j                         E t        d      }|j                  d       |D ]  }| j                  |j                          | j                  j                  t        d|g      d|d	       |D ]  }| j                  |j                          y )
Nr$   r   r}   TrQ   r~   r6   rb   r   )r   r   r   r9   r   r   rG   r   rS   re   rf   r+   rg   r   rv   )r/   r=   r?   r8   ry   r   r>   rV   s           r0   test_action_requeue_jobsz!ViewTest.test_action_requeue_jobs   s    *+%&67 q! 	#A--,CKKNN366"	# ,-$  	+COOCMM*	+ 	[MByelDmn  	,CS]]+	,r2   c                 n   t        d      }t        d      }|j                  t              }| j                  j                  t        d|g      ddi       | j                  t        j                  |j                  |j                               | j                  |j                  |j                         y)z4Test that the queue clear actually clears the queue.r$   rq_clearr6   rg   rt   ru   N)r   r   r9   r   r+   rg   r   rv   r   rw   rG   r-   rx   ry   rz   s       r0   test_clear_queuezViewTest.test_clear_queue   s    *+%&67mmK(;-@65/RCFFu7G7GHI/r2   c                 L   t        d      }t        d      }|j                  t              }t	        |j
                  |j                        }|j                  |d       | j                  j                  t        d|g            }| j                  |j                  d   |g       y)z.Ensure that finished jobs page works properly.r$   rm   rq_finished_jobsr6   r8   N)r   r   r9   r   r   namer-   addr+   r:   r   r;   r<   r/   r=   r?   r>   registryr@   s         r0   test_finished_jobszViewTest.test_finished_jobs       *+%&67mmK(&uzz53C3CDS!;;??7+=[M#RS))&1C59r2   c                    t        d      }t        d      }| j                  j                  t	        d|g            }| j                  |j                  d       |j                  t              }t        |j                  |j                        }|j                  |d       | j                  j                  t	        d|g            }| j                  |j                  d   |g       y)z,Ensure that failed jobs page works properly.r$   rq_failed_jobsr6   rE   rm   r8   N)r   r   r+   r:   r   r;   rJ   r9   r   r   r   r-   r   r<   )r/   r=   r?   r@   r>   r   s         r0   test_failed_jobszViewTest.test_failed_jobs   s    *+%&67 ;;??7+;;-#PQ--s3mmK($UZZ1A1ABS!;;??7+;;-#PQ))&1C59r2   c                 n   t        d      }t        d      }| j                  j                  t	        d|g            }| j                  |j                  d       |j                  t        j                         t              }| j                  j                  t	        d|g            }| j                  |j                  d   |g       |j                  t        j                         t        d       | j                  j                  t	        d|g            }| j                  |j                  d       y)	z/Ensure that scheduled jobs page works properly.r$   rq_scheduled_jobsr6   rE   r8   zjob-!@#$%^&*()_=+[]{};',.<>?|`~)r   N)r   r   r+   r:   r   r;   rJ   
enqueue_atr   nowr   r<   )r/   r=   r?   r@   r>   s        r0   test_scheduled_jobszViewTest.test_scheduled_jobs   s    *+%&67 ;;??7+>k]#ST--s3x||~{;;;??7+>k]#ST))&1C59 	=^_;;??7+>k]#ST--s3r2   c                    t        d      }t        d      }t        |j                  |j                        }|j                  t        j                         t              }| j                  t        |      d       |j                  j                  |j                         | j                  j                  t        d|g            }| j                  |j                   d   g        | j                  t        |      d       y)zCEnsure that non existing job is being deleted from registry by viewr$   r   r   r6   r8   r   N)r   r   r   r   r-   r   r   r   r   r;   rn   r\   rI   r+   r:   r   r<   )r/   r=   r?   r   r>   r@   s         r0   $test_scheduled_jobs_registry_removalz-ViewTest.test_scheduled_jobs_registry_removal  s    *+%&67'

E4D4DEx||~{;X*(;;??7+>k]#ST))&126X*r2   c                     t        d      }t        d      }t        d      }|j                  t              }|j                  |       | j                  j                  t        d|g            }| j                  |j                  d   |g       y),Ensure that active jobs page works properly.r$   rq_started_jobsr6   r8   N)r   r   r   r9   r   prepare_executionr+   r:   r   r;   r<   )r/   r=   r?   rV   r>   r@   s         r0   test_started_jobszViewTest.test_started_jobs   sx    *+%&67,-mmK(  %;;??7+<K=#QR))&1C59r2   c                 L   t        d      }t        d      }|j                  t              }t	        |j
                  |j                        }|j                  |d       | j                  j                  t        d|g            }| j                  |j                  d   |g       y)r   r$   rm   rq_deferred_jobsr6   r8   N)r   r   r9   r   r   r   r-   r   r+   r:   r   r;   r<   r   s         r0   test_deferred_jobszViewTest.test_deferred_jobs+  r   r2   c                 P   t        d      }t        dt        j                         j                        }|j                          t        d      }|j                          | j                  j                  t        d|g            }| j                  |j                  d   |g       y):Worker index page should show workers for a specific queuer$   r   test3
rq_workersr6   workersN)r   r   uuiduuid4hexregister_birthr+   r:   r   r;   r<   )r/   r?   worker1worker2r@   s        r0   test_workerszViewTest.test_workers6  s    %&67-DJJL4D4DE W% ;;??7<{m#LM)))4wi@r2   c                 .   t        d      }t        dt        j                         j                        }|j                          | j                  j                  t        d||j                  g            }| j                  |j                  d   |       y)r   r$   r   rq_worker_detailsr6   rV   N)r   r   r   r   r   r   r+   r:   r   rI   r;   r<   )r/   r?   rV   r@   s       r0   test_worker_detailszViewTest.test_worker_detailsC  ss    %&67,4::<3C3CD;;??7+>kSYS]S]E^#_`))(3V<r2   c                    ddddddg}t        dt        |      	      5  | j                  j                  t	        d
            }| j                  |j                  d       | j                  j                  t	        d            }| j                  |j                  d       d| j                  _        | j                  j                          | j                  j                  t	        d
            }| j                  |j                  d       | j                  j                  t	        d            }| j                  |j                  d       | j                  d|j                  j                  d             d}t        dt        |      	      5  | j                  j                  t	        d|g            }| j                  |j                  d       | j                  d|j                  j                  d             | j                  d|j                  j                  d             | j                  j                  t	        ddg            }| j                  |j                  d       | j                  d|j                  j                  d             | j                  d|j                  j                  d             ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)zX
        Django-RQ's statistic as JSON only viewable by staff or with API_TOKEN
        r   	localhosti  )DBHOSTPORTr4   )connection_configr   zdjango_rq.utils.QUEUES_LIST)return_value)new_callablerq_homerE   rq_home_jsonFi.  errorzutf-8
12345abcdezdjango_rq.stats_views.API_TOKENr6   r   z"error": truewrong_tokenN)r   r   r+   r:   r   r;   rJ   r'   r(   r*   rK   rL   rM   rx   )r/   queuesr@   tokens       r0   test_statistics_json_viewz"ViewTest.test_statistics_json_viewM  s[    ' &
 "	
 0|Y_?`a 	Q{{wy'9:HX1137{{w~'>?HX1137 "'DIIIINN{{wy'9:HX1137 {{w~'>?HX1137MM'8#3#3#:#:7#CD !E8|afGgh 
Q;;??7>+PQ  !5!5s;fh&6&6&=&=g&FG  (2B2B2I2I'2RS  ;;??7>+XY  !5!5s;  )9)9)@)@)IJox/?/?/F/Fw/OP
Q+	Q 	Q*
Q 
Q+	Q 	Qs%   E0K"D3KK"K	K""K+c                    t        d      }t        d      }g g }}t        d      }t        d      D ]e  }|j	                  t
              }|j                  |j                         |j                  |       |j                  |       |j                  |       g |D ]Q  }t        j                  ||j                        }| j                  |j                         t        j                          S t#        |j$                  |j                        }	| j                  t'        |	      t'        |             | j(                  j+                  t-        d|g      d|d       |D ]  }|j/                  ||        | j                  t'        |	      d       t1        |j$                  |j                        }
| j                  t'        |
      t'        |             |D ]  }| j3                  ||
v         y )	Nr$   r   ru   r~   r6   stopr   r   )r   r   r   r   r9   r   r   rG   prepare_job_executionr   r   fetchr-   r;   r   r   STARTEDr   r   rn   r+   rg   r   monitor_work_horser   re   )r/   r=   r?   ry   r8   rV   r   r>   r   started_job_registrycanceled_job_registrys              r0   test_action_stop_jobszViewTest.test_action_stop_jobs~  s   *+%&67 B,- q 	*A--,CNN366"KK((-$$S)	*  	BF))Fu/?/?@CS^^-y/@/@A	B
  2%**IYIYZ12CLA[MBvbiDjk 	2C%%c51	212A6 1%**IYIY Z23S\B 	=FOOF&;;<	=r2   N)__name__
__module____qualname__r1   rA   rO   rX   r_   rh   ro   rq   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r2   r0   r   r      sz    ::I 1L("(&
04$30,60	::4$+	:	:A=/Qb!=r2   r   )%r   r   r   r   unittest.mockr   r   django.contrib.auth.modelsr   django.testr	   r
   django.test.clientr   django.urlsr   rq.jobr   r   rq.registryr   r   r   r   r   	django_rqr   django_rq.queuesr   django_rq.workersr   fixturesr   r   utilsr   r   r   r2   r0   <module>r      se     2 2 - , 3 %  !    * ( . " |T*+C=x C= ,C=r2   