Ë
    0¸?i‡C  ã                   óæ   — d Z ddlmZmZ ddlmZmZ ddlmZ ddl	m
Z
 ddlmZmZ ddlmZ ddlmZ dd	lmZmZ  G d
„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Zy)z.
Tests for django_cronjob_utils base classes.
é    )ÚdateÚ	timedelta)ÚpatchÚ	MagicMock)ÚTestCase)Útimezone)ÚCronTaskÚExecutionResult)ÚExecutionPattern)ÚCronExecution)ÚValidationErrorÚConcurrentExecutionErrorc                   ó(   — e Zd ZdZdZdZdedefd„Zy)ÚTestTaskzTest task for base class tests.ú	test-taskÚA001r   Úreturnc                 ó   — dddœS )NFÚSuccess)ÚerrorÚmessage© ©Úselfr   s     ú?/home/cursorai/projects/django-cronjob-utils/tests/test_base.pyÚexecutezTestTask.execute   s   € Ø¨9Ñ5Ð5ó    N©	Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	task_nameÚ	task_coder   Údictr   r   r   r   r   r      s"   „ Ù)à€IØ€Ið6˜Dð 6 Tô 6r   r   c                   ó(   — e Zd ZdZdZdZdedefd„Zy)ÚFailingTaskzTask that always fails.zfailing-taskÚA002r   r   c                 ó   — ddddœS )NTúTask failedÚFAIL)r   r   Ú
error_coder   r   s     r   r   zFailingTask.execute   s   € Ø¨-ÀvÑNÐNr   Nr   r   r   r   r'   r'      s%   „ Ù!à€IØ€IðO˜Dð O Tô Or   r'   c                   ó(   — e Zd ZdZdZdZdedefd„Zy)ÚExceptionTaskzTask that raises exception.zexception-taskÚA003r   r   c                 ó   — t        d«      ‚)NúTest exception)Ú
ValueErrorr   s     r   r   zExceptionTask.execute(   s   € ÜÐ)Ó*Ð*r   Nr   r   r   r   r.   r.   "   s"   „ Ù%à €IØ€Ið+˜Dð + Tô +r   r.   c                   ó(   — e Zd ZdZdZdZdedefd„Zy)ÚSkippedTaskz!Task that returns skipped result.zskipped-taskÚA004r   r   c                 ó   — t        dd¬«      S )NTúAlready processed)ÚskippedÚreason)r
   r   s     r   r   zSkippedTask.execute2   s   € Ü tÐ4GÔHÐHr   N)	r   r    r!   r"   r#   r$   r   r
   r   r   r   r   r4   r4   ,   s%   „ Ù+à€IØ€IðI˜Dð I _ô Ir   r4   c                   óè   — 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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&)'ÚCronTaskBaseTestszTests for CronTask base class.c                 ó(   — t        ddd«      | _        y)zSet up test fixtures.iè  é   é   N)r   Úexecution_date)r   s    r   ÚsetUpzCronTaskBaseTests.setUp9   s   € ä" 4¨¨BÓ/ˆÕr   c                 óê   — t        | j                  ¬«      }| j                  |j                  | j                  «       | j                  |j                  i «       | j	                  |j
                  «       y)zTest task initialization.©r?   N)r   r?   ÚassertEqualÚoptionsÚassertIsNoneÚ	execution©r   Útasks     r   Útest_task_initializationz*CronTaskBaseTests.test_task_initialization=   sT   € ä t×':Ñ':Ô;ˆà×Ñ˜×,Ñ,¨d×.AÑ.AÔBØ×Ñ˜Ÿ™ rÔ*Ø×Ñ˜$Ÿ.™.Õ)r   c                 óÜ   — t        | j                  dd¬«      }| j                  |j                  j	                  d«      «       | j                  |j                  j	                  d«      «       y)z&Test task initialization with options.T)r?   ÚforceÚrerunrK   rL   N)r   r?   Ú
assertTruerD   ÚgetrG   s     r   Ú%test_task_initialization_with_optionsz7CronTaskBaseTests.test_task_initialization_with_optionsE   sS   € äØ×.Ñ.ØØô
ˆð 	�‰˜Ÿ™×(Ñ(¨Ó1Ô2Ø�‰˜Ÿ™×(Ñ(¨Ó1Õ2r   c                 óP   — t        | j                  ¬«      }|j                  «        y)z Test validation with valid date.rB   N)r   r?   ÚvalidaterG   s     r   Útest_validate_successz'CronTaskBaseTests.test_validate_successP   s   € ä t×':Ñ':Ô;ˆØ�‰�r   c                 óÚ   — t        d¬«      }| j                  t        «      5 }|j                  «        ddd«       | j	                  dt        j                  «      «       y# 1 sw Y   Œ/xY w)z'Test validation with invalid date type.z
2024-01-15rB   Nzdate object)r   ÚassertRaisesr   rQ   ÚassertInÚstrÚ	exception)r   rH   Úcms      r   Útest_validate_invalid_datez,CronTaskBaseTests.test_validate_invalid_dateU   sL   € ä |Ô4ˆà×ÑœÔ/°2Ø�M‰MŒO÷ 0ð 	�‰�m¤S¨¯©Ó%6Õ7÷ 0Ð/ús   ¢A!Á!A*c                 ó˜   — t        | j                  ¬«      }t        j                  |_        | j                  |j                  «       «       y)z8Test should_run with STANDARD pattern when not executed.rB   N)r   r?   r   ÚSTANDARDÚexecution_patternrM   Ú
should_runrG   s     r   Ú-test_should_run_standard_pattern_not_executedz?CronTaskBaseTests.test_should_run_standard_pattern_not_executed^   s3   € ä t×':Ñ':Ô;ˆÜ!1×!:Ñ!:ˆÔà�‰˜Ÿ™Ó)Õ*r   c                 óò   — t         j                  j                  dd| j                  d¬«       t	        | j                  ¬«      }t
        j                  |_        | j                  |j                  «       «       y)z<Test should_run with STANDARD pattern when already executed.r   r   T©r$   r#   r?   Ú	completedrB   N)
r   ÚobjectsÚcreater?   r   r   r[   r\   ÚassertFalser]   rG   s     r   Ú1test_should_run_standard_pattern_already_executedzCCronTaskBaseTests.test_should_run_standard_pattern_already_executede   sb   € ä×Ñ×$Ñ$ØØ!Ø×.Ñ.Øð	 	%ô 	
ô  t×':Ñ':Ô;ˆÜ!1×!:Ñ!:ˆÔà×Ñ˜Ÿ™Ó*Õ+r   c                 óò   — t         j                  j                  dd| j                  d¬«       t	        | j                  ¬«      }t
        j                  |_        | j                  |j                  «       «       y)z$Test should_run with ALWAYS pattern.r   r   Tr`   rB   N)
r   rb   rc   r?   r   r   ÚALWAYSr\   rM   r]   rG   s     r   Útest_should_run_always_patternz0CronTaskBaseTests.test_should_run_always_patterns   sb   € ô 	×Ñ×$Ñ$ØØ!Ø×.Ñ.Øð	 	%ô 	
ô  t×':Ñ':Ô;ˆÜ!1×!8Ñ!8ˆÔà�‰˜Ÿ™Ó)Õ*r   c                 ó˜   — t        | j                  ¬«      }t        j                  |_        | j                  |j                  «       «       y)zITest should_run with RERUN_ON_FAILURE pattern when no previous execution.rB   N)r   r?   r   ÚRERUN_ON_FAILUREr\   rM   r]   rG   s     r   Ú,test_should_run_rerun_on_failure_no_previousz>CronTaskBaseTests.test_should_run_rerun_on_failure_no_previous‚   s3   € ä t×':Ñ':Ô;ˆÜ!1×!BÑ!BˆÔà�‰˜Ÿ™Ó)Õ*r   c                 óô   — t         j                  j                  dd| j                  dd¬«       t	        | j                  ¬«      }t
        j                  |_        | j                  |j                  «       «       y)zFTest should_run with RERUN_ON_FAILURE pattern when previous succeeded.r   r   T©r$   r#   r?   ra   ÚsuccessrB   N)
r   rb   rc   r?   r   r   rj   r\   rd   r]   rG   s     r   Ú1test_should_run_rerun_on_failure_previous_successzCCronTaskBaseTests.test_should_run_rerun_on_failure_previous_success‰   se   € ä×Ñ×$Ñ$ØØ!Ø×.Ñ.ØØð 	%ô 	
ô  t×':Ñ':Ô;ˆÜ!1×!BÑ!BˆÔà×Ñ˜Ÿ™Ó*Õ+r   c                 óô   — t         j                  j                  dd| j                  dd¬«       t	        | j                  ¬«      }t
        j                  |_        | j                  |j                  «       «       y)zCTest should_run with RERUN_ON_FAILURE pattern when previous failed.r   r   TFrm   rB   N©
r   rb   rc   r?   r   r   rj   r\   rM   r]   rG   s     r   Ú1test_should_run_rerun_on_failure_previous_failurezCCronTaskBaseTests.test_should_run_rerun_on_failure_previous_failure˜   sc   € ä×Ñ×$Ñ$ØØ!Ø×.Ñ.ØØð 	%ô 	
ô  t×':Ñ':Ô;ˆÜ!1×!BÑ!BˆÔà�‰˜Ÿ™Ó)Õ*r   c                 ó˜   — t        | j                  ¬«      }t        j                  |_        | j                  |j                  «       «       y)z*Test should_run with RATE_LIMITED pattern.rB   N)r   r?   r   ÚRATE_LIMITEDr\   rM   r]   rG   s     r   Ú$test_should_run_rate_limited_patternz6CronTaskBaseTests.test_should_run_rate_limited_pattern§   s5   € ä t×':Ñ':Ô;ˆÜ!1×!>Ñ!>ˆÔð 	�‰˜Ÿ™Ó)Õ*r   c                 óô   — t         j                  j                  dd| j                  d¬«       t	        | j                  d¬«      }t
        j                  |_        | j                  |j                  «       «       y)z"Test should_run with force option.r   r   Tr`   )r?   rK   N)
r   rb   rc   r?   r   r   r[   r\   rM   r]   rG   s     r   Útest_should_run_force_optionz.CronTaskBaseTests.test_should_run_force_option¯   sb   € ä×Ñ×$Ñ$ØØ!Ø×.Ñ.Øð	 	%ô 	
ô  t×':Ñ':À$ÔGˆÜ!1×!:Ñ!:ˆÔà�‰˜Ÿ™Ó)Õ*r   c                 óö   — t         j                  j                  dd| j                  dd¬«       t	        | j                  d¬«      }t
        j                  |_        | j                  |j                  «       «       y)z"Test should_run with rerun option.r   r   Trm   )r?   rL   Nrq   rG   s     r   Útest_should_run_rerun_optionz.CronTaskBaseTests.test_should_run_rerun_option½   se   € ä×Ñ×$Ñ$ØØ!Ø×.Ñ.ØØð 	%ô 	
ô  t×':Ñ':À$ÔGˆÜ!1×!BÑ!BˆÔà�‰˜Ÿ™Ó)Õ*r   c                 óæ  — t        | j                  ¬«      }|j                  «       }| j                  |j                  «       | j                  |j                  d«       | j                  |j                  d«       | j                  |j                  | j                  «       | j                  |j                  «       | j                  |j                  «       | j                  |j                  |«       y)zTest creating execution record.rB   r   r   N)r   r?   Úcreate_execution_recordÚassertIsNotNoneÚidrC   r$   r#   rd   ra   rn   rF   ©r   rH   rF   s      r   Útest_create_execution_recordz.CronTaskBaseTests.test_create_execution_recordÌ   s¶   € ä t×':Ñ':Ô;ˆØ×0Ñ0Ó2ˆ	à×Ñ˜YŸ\™\Ô*Ø×Ñ˜×,Ñ,¨fÔ5Ø×Ñ˜×,Ñ,¨kÔ:Ø×Ñ˜×1Ñ1°4×3FÑ3FÔGØ×Ñ˜×,Ñ,Ô-Ø×Ñ˜×*Ñ*Ô+Ø×Ñ˜Ÿ™¨Õ3r   c                 ó¾   — t        | j                  ¬«      }|j                  «       }| j                  |j                  «       | j                  |j                  d«       y)z*Test execute_with_timeout without timeout.rB   r   N)r   r?   Úexecute_with_timeoutrM   rn   rC   r   ©r   rH   Úresults      r   Ú$test_execute_with_timeout_no_timeoutz6CronTaskBaseTests.test_execute_with_timeout_no_timeoutÙ   sD   € ä t×':Ñ':Ô;ˆØ×*Ñ*Ó,ˆà�‰˜Ÿ™Ô'Ø×Ñ˜Ÿ™¨Õ3r   c                 ó
  — t        | j                  ¬«      }d|_        t        d«      5 }t	        |d«      r:t        «       |_        |j                  «       }| j                  |j                  «       ddd«       y# 1 sw Y   yxY w)z'Test execute_with_timeout with timeout.rB   é<   z django_cronjob_utils.base.signalÚSIGALRMN)
r   r?   Útimeoutr   Úhasattrr   r‡   r�   rM   rn   )r   rH   Úmock_signalrƒ   s       r   Ú&test_execute_with_timeout_with_timeoutz8CronTaskBaseTests.test_execute_with_timeout_with_timeoutá   sd   € ä t×':Ñ':Ô;ˆØˆŒô Ð5Ô6¸+Ü�{ IÔ.Ü&/£k�Ô#Ø×2Ñ2Ó4�Ø—‘ §¡Ô/÷	 7×6Ñ6ús   ©AA9Á9Bc                 óô   — t        | j                  ¬«      }|j                  «       }| j                  |j                  «       | j                  |j                  d«       | j                  |j                  «       y)z$Test execute with dict return value.rB   r   N)	r   r?   Ú_executerM   rn   rC   r   rd   r8   r‚   s      r   Útest_execute_dict_returnz*CronTaskBaseTests.test_execute_dict_returní   sS   € ä t×':Ñ':Ô;ˆØ—‘“ˆà�‰˜Ÿ™Ô'Ø×Ñ˜Ÿ™¨Ô3Ø×Ñ˜Ÿ™Õ(r   c                 ó¾   — t        | j                  ¬«      }|j                  «       }| j                  |j                  «       | j                  |j                  d«       y)z/Test execute with ExecutionResult return value.rB   r7   N)r4   r?   r�   rM   r8   rC   r9   r‚   s      r   Ú$test_execute_execution_result_returnz6CronTaskBaseTests.test_execute_execution_result_returnö   sB   € ä¨$×*=Ñ*=Ô>ˆØ—‘“ˆà�‰˜Ÿ™Ô'Ø×Ñ˜Ÿ™Ð(;Õ<r   c                 óö   — t        | j                  ¬«      }|j                  «       }| j                  |j                  «       | j                  d|j                  «       | j                  |j                  d«       y)z Test execute exception handling.rB   r1   r2   N)	r.   r?   r�   rd   rn   rU   r   rC   r,   r‚   s      r   Útest_execute_exception_handlingz1CronTaskBaseTests.test_execute_exception_handlingþ   sX   € ä¨D×,?Ñ,?Ô@ˆØ—‘“ˆà×Ñ˜Ÿ™Ô(Ø�‰Ð&¨¯©Ô7Ø×Ñ˜×*Ñ*¨LÕ9r   c                 óà   — t        | j                  ¬«      }|j                  t        d«      «      }| j	                  |d«       |j                  t        d«      «      }| j	                  |d«       y)zTest get_error_code method.rB   ÚTestr2   ÚRuntimeErrorN)r   r?   Úget_error_coder2   rC   r•   )r   rH   r,   s      r   Útest_get_error_codez%CronTaskBaseTests.test_get_error_code  s\   € ä t×':Ñ':Ô;ˆà×(Ñ(¬°FÓ);Ó<ˆ
Ø×Ñ˜ \Ô2à×(Ñ(¬°fÓ)=Ó>ˆ
Ø×Ñ˜ ^Õ4r   c                 óœ   — t        | j                  ¬«      }d|_        |j                  «        | j	                  |j                  «       «       y)z)Test should_retry when retry is disabled.rB   FN)r   r?   Úretry_on_failurer{   rd   Úshould_retryrG   s     r   Ú"test_should_retry_no_retry_enabledz4CronTaskBaseTests.test_should_retry_no_retry_enabled  s=   € ä t×':Ñ':Ô;ˆØ %ˆÔØ×$Ñ$Ô&à×Ñ˜×*Ñ*Ó,Õ-r   c                 óÌ   — t        | j                  ¬«      }d|_        d|_        |j	                  «        d|j
                  _        | j                  |j                  «       «       y)z+Test should_retry when max retries reached.rB   Té   N)	r   r?   r™   Úmax_retriesr{   rF   Úretry_countrd   rš   rG   s     r   Ú%test_should_retry_max_retries_reachedz7CronTaskBaseTests.test_should_retry_max_retries_reached  sQ   € ä t×':Ñ':Ô;ˆØ $ˆÔØˆÔØ×$Ñ$Ô&Ø%&ˆ�‰Ô"à×Ñ˜×*Ñ*Ó,Õ-r   c                 óÌ   — t        | j                  ¬«      }d|_        d|_        |j	                  «        d|j
                  _        | j                  |j                  «       «       y)z*Test should_retry when within retry limit.rB   Tr�   r=   N)	r   r?   r™   rž   r{   rF   rŸ   rM   rš   rG   s     r   Útest_should_retry_within_limitz0CronTaskBaseTests.test_should_retry_within_limit#  sO   € ä t×':Ñ':Ô;ˆØ $ˆÔØˆÔØ×$Ñ$Ô&Ø%&ˆ�‰Ô"à�‰˜×)Ñ)Ó+Õ,r   c                 ó|   — t        | j                  ¬«      }d|_        | j                  |j	                  «       «       y)z2Test should_retry when no execution record exists.rB   TN)r   r?   r™   rd   rš   rG   s     r   Ú%test_should_retry_no_execution_recordz7CronTaskBaseTests.test_should_retry_no_execution_record-  s1   € ä t×':Ñ':Ô;ˆØ $ˆÔà×Ñ˜×*Ñ*Ó,Õ-r   c                 ó"  — t        | j                  ¬«      }|j                  «        |j                  j                  }|j                  «        |j                  j                  «        | j                  |j                  j                  |dz   «       y)zTest schedule_retry method.rB   r=   N)r   r?   r{   rF   rŸ   Úschedule_retryÚrefresh_from_dbrC   )r   rH   Úinitial_counts      r   Útest_schedule_retryz%CronTaskBaseTests.test_schedule_retry4  sh   € ä t×':Ñ':Ô;ˆØ×$Ñ$Ô&àŸ™×2Ñ2ˆØ×ÑÔà�‰×&Ñ&Ô(Ø×Ñ˜Ÿ™×3Ñ3°]ÀQÑ5FÕGr   c                 ó¶  — t        | j                  ¬«      }|j                  «       }| j                  |j                  «       | j                  |j                  d«       | j                  |j                  «       t        j                  j                  d| j                  ¬«      }| j                  |j                  «       | j                  |j                  «       y)z*Test run method with successful execution.rB   r   r   ©r$   r?   N)r   r?   ÚrunrM   rn   rC   r   rd   r8   r   rb   rN   ra   ©r   rH   rƒ   rF   s       r   Útest_run_successful_executionz/CronTaskBaseTests.test_run_successful_execution?  s¢   € ä t×':Ñ':Ô;ˆØ—‘“ˆà�‰˜Ÿ™Ô'Ø×Ñ˜Ÿ™¨Ô3Ø×Ñ˜Ÿ™Ô(ô "×)Ñ)×-Ñ-ØØ×.Ñ.ð .ó 
ˆ	ð 	�‰˜	×+Ñ+Ô,Ø�‰˜	×)Ñ)Õ*r   c                 óB  — t         j                  j                  dd| j                  d¬«       t	        | j                  ¬«      }t
        j                  |_        |j                  «       }| j                  |j                  «       | j                  |j                  d«       y)z*Test run method when execution is skipped.r   r   Tr`   rB   zAlready executedN)r   rb   rc   r?   r   r   r[   r\   r¬   rM   r8   rC   r9   r‚   s      r   Útest_run_skipped_executionz,CronTaskBaseTests.test_run_skipped_executionP  s}   € ä×Ñ×$Ñ$ØØ!Ø×.Ñ.Øð	 	%ô 	
ô  t×':Ñ':Ô;ˆÜ!1×!:Ñ!:ˆÔØ—‘“ˆà�‰˜Ÿ™Ô'Ø×Ñ˜Ÿ™Ð(:Õ;r   c                 ó¸  — t        | j                  ¬«      }|j                  «       }| j                  |j                  «       | j                  |j                  d«       | j                  |j                  d«       t        j                  j                  d| j                  ¬«      }| j                  |j                  «       | j                  |j                  «       y)z&Test run method with failed execution.rB   r*   r+   r(   r«   N)r'   r?   r¬   rd   rn   rC   r   r,   r   rb   rN   rM   ra   r­   s       r   Útest_run_failed_executionz+CronTaskBaseTests.test_run_failed_execution`  sª   € ä¨$×*=Ñ*=Ô>ˆØ—‘“ˆà×Ñ˜Ÿ™Ô(Ø×Ñ˜Ÿ™¨Ô7Ø×Ñ˜×*Ñ*¨FÔ3ô "×)Ñ)×-Ñ-ØØ×.Ñ.ð .ó 
ˆ	ð 	�‰˜	×+Ñ+Ô,Ø×Ñ˜×*Ñ*Õ+r   c                 óž  — t        | j                  ¬«      }| j                  t        «      5  |j	                  «        ddd«       t
        j                  j                  d| j                  ¬«      }| j                  |j                  «       | j                  |j                  «       | j                  |j                  d«       y# 1 sw Y   Œ‡xY w)z#Test run method exception handling.rB   Nr/   r«   r2   )r.   r?   rT   r2   r¬   r   rb   rN   rM   ra   rd   rn   rC   r,   r~   s      r   Útest_run_exception_handlingz-CronTaskBaseTests.test_run_exception_handlingq  sž   € ä¨D×,?Ñ,?Ô@ˆà×ÑœzÕ*Ø�H‰HŒJ÷ +ô "×)Ñ)×-Ñ-ØØ×.Ñ.ð .ó 
ˆ	ð 	�‰˜	×+Ñ+Ô,Ø×Ñ˜×*Ñ*Ô+Ø×Ñ˜×-Ñ-¨|Õ<÷ +Ð*ús   ¬CÃCc                 óþ   — t         j                  j                  dd| j                  d¬«       t	        | j                  ¬«      }| j                  t        «      5  |j                  «        ddd«       y# 1 sw Y   yxY w)z0Test run method with concurrent execution error.r   r   Fr`   rB   N)r   rb   rc   r?   r   rT   r   r¬   rG   s     r   Ú#test_run_concurrent_execution_errorz5CronTaskBaseTests.test_run_concurrent_execution_error�  se   € ô 	×Ñ×$Ñ$ØØ!Ø×.Ñ.Øð	 	%ô 	
ô  t×':Ñ':Ô;ˆà×ÑÔ7Õ8Ø�H‰HŒJ÷ 9×8Ñ8ús   ÁA3Á3A<c                 ó0  — t        | j                  ¬«      }d|_        d|_        |j	                  «       }| j                  |j                  «       t        j                  j                  d| j                  ¬«      }| j                  |j                  d«       y)z.Test run method with retry on failure enabled.rB   Tr�   r(   r«   r=   N)r'   r?   r™   rž   r¬   rd   rn   r   rb   rN   rC   rŸ   r­   s       r   Útest_run_with_retry_on_failurez0CronTaskBaseTests.test_run_with_retry_on_failure�  s~   € ä¨$×*=Ñ*=Ô>ˆØ $ˆÔØˆÔà—‘“ˆà×Ñ˜Ÿ™Ô(ä!×)Ñ)×-Ñ-ØØ×.Ñ.ð .ó 
ˆ	ð 	×Ñ˜×.Ñ.°Õ2r   c                 ó®  — t        | j                  ¬«      }d|_        d„ }||_        	 |j	                  «       }| j                  |«       y# t        $ r€ t        j                  j                  d| j                  ¬«      }| j                  |j                  «       | j                  |j                  «       | j                  |j                  d«       Y yw xY w)zTest run method with timeout.rB   r=   c                 ó4   — dd l }|j                  d«       ddiS )Nr   é   r   F)ÚtimeÚsleep)r   r¼   s     r   Úslow_executez=CronTaskBaseTests.test_run_with_timeout.<locals>.slow_execute¦  s   € ÛØ�J‰J�qŒMØ˜UÐ#Ð#r   r   r«   ÚTIMEOUTN)r   r?   rˆ   r   r¬   r|   ÚTimeoutErrorr   rb   rN   rM   ra   rd   rn   rC   r,   )r   rH   r¾   rƒ   rF   s        r   Útest_run_with_timeoutz'CronTaskBaseTests.test_run_with_timeout   s¹   € ä t×':Ñ':Ô;ˆØˆŒò	$ð
 $ˆŒð	>Ø—X‘X“ZˆFà× Ñ  Õ(øÜò 	>ä%×-Ñ-×1Ñ1Ø Ø#×2Ñ2ð 2ó ˆIð �O‰O˜I×/Ñ/Ô0Ø×Ñ˜Y×.Ñ.Ô/Ø×Ñ˜Y×1Ñ1°9Ö=ð	>ús   ©!A ÁBCÃCc                 ó  — t        | j                  ¬«      }|j                  «        t        dd¬«      }t	        j
                  |d«      5 }|j                  |«       |j                  j                  «        ddd«       y# 1 sw Y   yxY w)zTest notify_failure method.rB   FzTest failure)rn   r   Ú_notification_managerN)r'   r?   r{   r
   r   ÚobjectÚnotify_failureÚassert_called_once)r   rH   rƒ   Úmock_notifiers       r   Útest_notify_failurez%CronTaskBaseTests.test_notify_failure½  si   € ä¨$×*=Ñ*=Ô>ˆØ×$Ñ$Ô&ä ¨¸ÔGˆô �\‰\˜$Ð 7Ô8¸MØ×Ñ Ô'Ø×(Ñ(×;Ñ;Ô=÷ 9×8Ñ8ús   Á
,A?Á?Bc                 óÈ   — t        ddddd¬«      }| j                  |j                  «       | j                  |j                  d«       | j                  |j                  «       y)zTest ExecutionResult creation.Tr   Ú F)rn   r   r,   r8   r9   N)r
   rM   rn   rC   r   rd   r8   ©r   rƒ   s     r   Útest_execution_result_creationz0CronTaskBaseTests.test_execution_result_creationÉ  sS   € ä ØØØØØô
ˆð 	�‰˜Ÿ™Ô'Ø×Ñ˜Ÿ™¨Ô3Ø×Ñ˜Ÿ™Õ(r   c                 ó,  — t        «       }| j                  |j                  «       | j                  |j                  d«       | j                  |j
                  d«       | j                  |j                  «       | j                  |j                  d«       y)z$Test ExecutionResult default values.rÊ   N)	r
   rM   rn   rC   r   r,   rd   r8   r9   rË   s     r   Útest_execution_result_defaultsz0CronTaskBaseTests.test_execution_result_defaults×  sj   € ä Ó"ˆà�‰˜Ÿ™Ô'Ø×Ñ˜Ÿ™¨Ô,Ø×Ñ˜×*Ñ*¨BÔ/Ø×Ñ˜Ÿ™Ô(Ø×Ñ˜Ÿ™¨Õ+r   N)(r   r    r!   r"   r@   rI   rO   rR   rY   r^   re   rh   rk   ro   rr   ru   rw   ry   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;   r;   6   sº   „ Ù(ò0ò*ò	3òò
8ò+ò,ò+ò+ò,ò+ò+ò+ò+ò4ò4ò
0ò)ò=ò:ò5ò.ò.ò-ò.ò	Hò+ò"<ò ,ò"=ò ò3ò >ò:
>ò)ó,r   r;   N)r"   Údatetimer   r   Úunittest.mockr   r   Údjango.testr   Údjango.utilsr   Údjango_cronjob_utils.baser	   r
   Údjango_cronjob_utils.registryr   Údjango_cronjob_utils.modelsr   Údjango_cronjob_utils.exceptionsr   r   r   r'   r.   r4   r;   r   r   r   Ú<module>r×      sf   ðñ÷ %ß *Ý  Ý !ß ?Ý :Ý 5ß Uô6ˆxô 6ôO�(ô Oô+�Hô +ôI�(ô Iôi,˜õ i,r   