Ë
    ¸?iM  ã                   óf   — d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ  G d„ d	e«      Zy
)z'
Tests for django_cronjob_utils locks.
é    )Údate)ÚTestCase)Útransaction)ÚDatabaseLock)ÚCronExecution)ÚConcurrentExecutionErrorc                   ód   — 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y)ÚDatabaseLockTestszTests for DatabaseLock.c                 ób   — t        dt        ddd«      «      }|5  	 ddd«       y# 1 sw Y   yxY w)z4Test lock acquires when no running execution exists.ÚA001éè  é   é   N)r   r   ©ÚselfÚlocks     ú@/home/cursorai/projects/django-cronjob-utils/tests/test_locks.pyÚtest_lock_acquires_successfullyz1DatabaseLockTests.test_lock_acquires_successfully   s)   € ä˜F¤D¨¨q°"Ó$5Ó6ˆò Ø÷ �T‰Tús   š%¥.c           	      ó¦  — t         j                  j                  ddt        ddd«      d¬«       t	        dt        ddd«      «      }| j                  t        «      5 }|5  	 ddd«       ddd«       | j                  dt        j                  «      «       | j                  d	t        |j                  «      «       y# 1 sw Y   Œ\xY w# 1 sw Y   Œ`xY w)
z(Test lock prevents concurrent execution.r   ú	Test Taskr   r   r   F©Ú	task_codeÚ	task_nameÚexecution_dateÚ	completedNz
2024-01-15)
r   ÚobjectsÚcreater   r   ÚassertRaisesr   ÚassertInÚstrÚ	exception)r   r   Úcms      r   Ú'test_lock_prevents_concurrent_executionz9DatabaseLockTests.test_lock_prevents_concurrent_execution   s­   € ô 	×Ñ×$Ñ$ØØ!Ü  a¨Ó,Øð	 	%ô 	
ô ˜F¤D¨¨q°"Ó$5Ó6ˆð ×ÑÔ7Ô8¸BÚØ÷ ÷ 9ð 	�‰�fœc "§,¡,Ó/Ô0Ø�‰�l¤C¨¯©Ó$5Õ6÷	 �ú÷ 9Ð8ús$   ÁCÁB;Á CÂ;C	Ã CÃCc           	      ó¾   — t         j                  j                  ddt        ddd«      d¬«       t	        dt        ddd«      «      }|5  	 d	d	d	«       y	# 1 sw Y   y	xY w)
z3Test lock allows execution for different task code.r   r   r   r   r   Fr   ÚA002N©r   r   r   r   r   r   s     r   Ú$test_lock_allows_different_task_codez6DatabaseLockTests.test_lock_allows_different_task_code+   óY   € ô 	×Ñ×$Ñ$ØØ!Ü  a¨Ó,Øð	 	%ô 	
ô ˜F¤D¨¨q°"Ó$5Ó6ˆÚØ÷ �T‰Túó   ÁAÁAc           	      ó¾   — t         j                  j                  ddt        ddd«      d¬«       t	        dt        ddd«      «      }|5  	 d	d	d	«       y	# 1 sw Y   y	xY w)
z8Test lock allows execution for different execution date.r   r   r   r   r   Fr   é   Nr&   r   s     r   Ú)test_lock_allows_different_execution_datez;DatabaseLockTests.test_lock_allows_different_execution_date:   r(   r)   c           	      ó¾   — t         j                  j                  ddt        ddd«      d¬«      }t	        dt        ddd«      «      }|5  	 ddd«       y# 1 sw Y   yxY w)	z@Test lock allows execution when previous execution is completed.r   r   r   r   r   Tr   Nr&   ©r   Ú	executionr   s      r   Ú$test_lock_allows_completed_executionz6DatabaseLockTests.test_lock_allows_completed_executionI   s[   € ô "×)Ñ)×0Ñ0ØØ!Ü  a¨Ó,Øð	 1ó 
ˆ	ô ˜F¤D¨¨q°"Ó$5Ó6ˆÚØ÷ �T‰Túr)   c           	      óÀ   — t         j                  j                  ddt        ddd«      dd¬«      }t	        dt        ddd«      «      }|5  	 ddd«       y# 1 sw Y   yxY w)	z=Test lock allows execution when previous execution succeeded.r   r   r   r   r   T©r   r   r   r   ÚsuccessNr&   r.   s      r   Ú%test_lock_allows_successful_executionz7DatabaseLockTests.test_lock_allows_successful_executionX   s\   € ä!×)Ñ)×0Ñ0ØØ!Ü  a¨Ó,ØØð 1ó 
ˆ	ô ˜F¤D¨¨q°"Ó$5Ó6ˆÚØ÷ �T‰Túó   Á	AÁAc           	      óÀ   — t         j                  j                  ddt        ddd«      dd¬«      }t	        dt        ddd«      «      }|5  	 d	d	d	«       y	# 1 sw Y   y	xY w)
z:Test lock allows execution when previous execution failed.r   r   r   r   r   TFr2   Nr&   r.   s      r   Ú!test_lock_allows_failed_executionz3DatabaseLockTests.test_lock_allows_failed_executionf   s\   € ä!×)Ñ)×0Ñ0ØØ!Ü  a¨Ó,ØØð 1ó 
ˆ	ô ˜F¤D¨¨q°"Ó$5Ó6ˆÚØ÷ �T‰Túr5   c           	      ón  — t         j                  j                  ddt        ddd«      d¬«       t         j                  j                  ddt        ddd«      d¬«       t	        dt        ddd«      «      }| j                  t        «      5  |5  	 ddd«       ddd«       y# 1 sw Y   ŒxY w# 1 sw Y   yxY w)	z.Test lock detects multiple running executions.r   r   r   r   r   Fr   N©r   r   r   r   r   r   r   r   s     r   Ú%test_lock_multiple_running_executionsz7DatabaseLockTests.test_lock_multiple_running_executionst   sª   € ô 	×Ñ×$Ñ$ØØ!Ü  a¨Ó,Øð	 	%ô 	
ô 	×Ñ×$Ñ$ØØ!Ü  a¨Ó,Øð	 	%ô 	
ô ˜F¤D¨¨q°"Ó$5Ó6ˆà×ÑÔ7Õ8ÚØ÷ ÷ 9Ð8ß�ú÷ 9Ð8ús$   Â	B+ÂBÂB+ÂB(	Â$B+Â+B4c           
      ó–  — t        dt        ddd«      «      }|5  t        j                  j	                  ddt        ddd«      d¬«       ddd«       t        j                  j                  dt        ddd«      ¬	«      }|j                  d
¬«       t        dt        ddd«      «      }|5  	 ddd«       y# 1 sw Y   ŒkxY w# 1 sw Y   yxY w)z2Test lock is released after context manager exits.r   r   r   r   r   Fr   N)r   r   T)r3   )r   r   r   r   r   ÚgetÚmark_completed)r   r   r/   Úlock2s       r   Ú test_lock_released_after_contextz2DatabaseLockTests.test_lock_released_after_contextŠ   sÀ   € ä˜F¤D¨¨q°"Ó$5Ó6ˆâä×!Ñ!×(Ñ(Ø Ø%Ü# D¨!¨RÓ0Øð	 )ô ÷ ô "×)Ñ)×-Ñ-ØÜ  a¨Ó,ð .ó 
ˆ	ð 	× Ñ ¨Ð Ô.ô ˜V¤T¨$°°2Ó%6Ó7ˆÚØ÷ ˆU÷' ˆTú÷& ˆUús   š/B3Â(B?Â3B<Â?Cc                 ó  — t        j                  «       5  t        dt        ddd«      «      }|5  t        j
                  j                  ddt        ddd«      d¬«       ddd«       ddd«       y# 1 sw Y   ŒxY w# 1 sw Y   yxY w)	z,Test lock works within database transaction.r   r   r   r   r   Fr   N)r   Úatomicr   r   r   r   r   r   s     r   Útest_lock_within_transactionz.DatabaseLockTests.test_lock_within_transaction¤   sp   € ä×ÑÕ!Ü ¬¨T°1°bÓ(9Ó:ˆDÚä×%Ñ%×,Ñ,Ø$Ø)Ü#'¨¨a°Ó#4Ø#ð	 -ô ÷ ÷ "Ð!ç�ú÷ "Ð!ús"   •A;¯/A/ÁA;Á/A8	Á4A;Á;Bc           	      ó  — t         j                  j                  ddt        ddd«      d¬«       t	        dt        ddd«      «      }| j                  t        «      5  |5  	 ddd«       ddd«       y# 1 sw Y   ŒxY w# 1 sw Y   yxY w)	z1Test lock uses SELECT FOR UPDATE (indirect test).r   r   r   r   r   Fr   Nr9   r   s     r   Útest_lock_select_for_updatez-DatabaseLockTests.test_lock_select_for_update±   s|   € ô 	×Ñ×$Ñ$ØØ!Ü  a¨Ó,Øð	 	%ô 	
ô ˜F¤D¨¨q°"Ó$5Ó6ˆð ×ÑÔ7Õ8ÚØ÷ ÷ 9Ð8ß�ú÷ 9Ð8úó$   ÁA=ÁA1Á A=Á1A:	Á6A=Á=Bc           	      ó  — t         j                  j                  ddt        ddd«      d¬«       t	        dt        ddd«      «      }| j                  t        «      5  |5  	 ddd«       ddd«       y# 1 sw Y   ŒxY w# 1 sw Y   yxY w)	z+Test lock with empty task code (edge case).Ú r   r   r   r   Fr   Nr9   r   s     r   Ú#test_lock_edge_case_empty_task_codez5DatabaseLockTests.test_lock_edge_case_empty_task_codeÂ   sx   € ä×Ñ×$Ñ$ØØ!Ü  a¨Ó,Øð	 	%ô 	
ô ˜B¤ T¨1¨bÓ 1Ó2ˆà×ÑÔ7Õ8ÚØ÷ ÷ 9Ð8ß�ú÷ 9Ð8úrE   c                 ó   — t        ddd«      }t        j                  j                  dd|d¬«       t	        d|«      }| j                  t        «      5  |5  	 ddd«       ddd«       y# 1 sw Y   ŒxY w# 1 sw Y   yxY w)	z'Test lock with future date (edge case).iî  é   é   r   r   Fr   N©r   r   r   r   r   r   r   )r   Úfuture_dater   s      r   Útest_lock_edge_case_future_datez1DatabaseLockTests.test_lock_edge_case_future_dateÑ   st   € ä˜4  RÓ(ˆä×Ñ×$Ñ$ØØ!Ø&Øð	 	%ô 	
ô ˜F KÓ0ˆà×ÑÔ7Õ8ÚØ÷ ÷ 9Ð8ß�ú÷ 9Ð8úó$   ÁA4ÁA(ÁA4Á(A1	Á-A4Á4A=c                 ó   — t        ddd«      }t        j                  j                  dd|d¬«       t	        d|«      }| j                  t        «      5  |5  	 ddd«       ddd«       y# 1 sw Y   ŒxY w# 1 sw Y   yxY w)z%Test lock with past date (edge case).iä  r   r   r   Fr   NrL   )r   Ú	past_dater   s      r   Útest_lock_edge_case_past_datez/DatabaseLockTests.test_lock_edge_case_past_dateâ   st   € ä˜˜q !Ó$ˆ	ä×Ñ×$Ñ$ØØ!Ø$Øð	 	%ô 	
ô ˜F IÓ.ˆà×ÑÔ7Õ8ÚØ÷ ÷ 9Ð8ß�ú÷ 9Ð8úrO   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r#   r'   r,   r0   r4   r7   r:   r?   rB   rD   rH   rN   rR   © ó    r   r
   r
      sK   „ Ù!òò7ò(òòòòòò,ò4òò"òó"rX   r
   N)rV   Údatetimer   Údjango.testr   Ú	django.dbr   Údjango_cronjob_utils.locksr   Údjango_cronjob_utils.modelsr   Údjango_cronjob_utils.exceptionsr   r
   rW   rX   r   Ú<module>r_      s,   ðñõ Ý  Ý !Ý 3Ý 5Ý Dôe˜õ erX   