Ë
    ø@i§7  ã                   óR   — d Z ddlmZ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 models.
é    )ÚdateÚ	timedelta)ÚTestCase)Útimezone)ÚCronExecutionc                   ó    — 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y)ÚCronExecutionModelTestszTests for CronExecution model.c           	      ó0  — t         j                  j                  ddt        ddd«      dd¬«      }| j	                  |j
                  «       | j                  |j                  d«       | j                  |j                  d«       | j                  |j                  t        ddd«      «       | j                  |j                  «       | j                  |j                  «       | j                  |j                  d«       | j	                  |j                  «       y	)
z"Test creating an execution record.ÚA001ú	Test Taskéè  é   é   F©Ú	task_codeÚ	task_nameÚexecution_dateÚ	completedÚsuccessr   N)r   ÚobjectsÚcreater   ÚassertIsNotNoneÚidÚassertEqualr   r   r   ÚassertFalser   r   Úretry_countÚstarted©ÚselfÚ	executions     úA/home/cursorai/projects/django-cronjob-utils/tests/test_models.pyÚtest_create_executionz-CronExecutionModelTests.test_create_execution   sæ   € ä!×)Ñ)×0Ñ0ØØ!Ü  a¨Ó,ØØð 1ó 
ˆ	ð 	×Ñ˜YŸ\™\Ô*Ø×Ñ˜×,Ñ,¨fÔ5Ø×Ñ˜×,Ñ,¨kÔ:Ø×Ñ˜×1Ñ1´4¸¸aÀÓ3DÔEØ×Ñ˜×,Ñ,Ô-Ø×Ñ˜×*Ñ*Ô+Ø×Ñ˜×.Ñ.°Ô2Ø×Ñ˜Y×.Ñ.Õ/ó    c           	      ó¨  — t         j                  j                  ddt        ddd«      ¬«      }| j	                  |j
                  «       | j	                  |j                  «       | j                  |j                  d«       | j                  |j                  d«       | j                  |j                  d«       | j                  |j                  «       y	)
z%Test execution record default values.r   r   r   r   r   ©r   r   r   r   Ú N)r   r   r   r   r   r   r   r   r   ÚmessageÚ
error_codeÚassertIsNoneÚendedr   s     r!   Útest_execution_defaultsz/CronExecutionModelTests.test_execution_defaults    s­   € ä!×)Ñ)×0Ñ0ØØ!Ü  a¨Ó,ð 1ó 
ˆ	ð 	×Ñ˜×,Ñ,Ô-Ø×Ñ˜×*Ñ*Ô+Ø×Ñ˜×.Ñ.°Ô2Ø×Ñ˜×*Ñ*¨BÔ/Ø×Ñ˜×-Ñ-¨rÔ2Ø×Ñ˜)Ÿ/™/Õ*r#   c           	      óò  — t         j                  j                  ddt        ddd«      d¬«      }| j	                  dt        |«      «       | j	                  dt        |«      «       | j	                  dt        |«      «       |j                  d	d
¬«       | j	                  dt        |«      «       t         j                  j                  ddt        ddd«      d	d¬«      }| j	                  dt        |«      «       y)z%Test execution string representation.r   r   r   r   r   F©r   r   r   r   u   â†’TÚSuccess)r   r'   u   âœ“ÚA002zFailed Taskr   u   âœ—N)r   r   r   r   ÚassertInÚstrÚmark_completed)r   r    Ú
execution2s      r!   Ú$test_execution_string_representationz<CronExecutionModelTests.test_execution_string_representation/   sÜ   € ô "×)Ñ)×0Ñ0ØØ!Ü  a¨Ó,Øð	 1ó 
ˆ	ð 	�‰�eœS ›^Ô,Ø�‰�k¤3 y£>Ô2Ø�‰�fœc )›nÔ-ð 	× Ñ ¨°yÐ ÔAØ�‰�eœS ›^Ô,ô #×*Ñ*×1Ñ1ØØ#Ü  a¨Ó,ØØð 2ó 
ˆ
ð 	�‰�eœS ›_Õ-r#   c           	      ót  — t         j                  j                  ddt        ddd«      ¬«      }t	        j
                  «       t        d¬«      z
  }||_        |j                  «        |j                  d	¬
«       |j                  }| j                  |«       | j                  |d«       | j                  |d«       y)z2Test duration calculation for completed execution.r   r   r   r   r   r%   éd   ©ÚsecondsT)r   én   N)r   r   r   r   r   Únowr   r   Úsaver2   Údurationr   ÚassertGreaterEqualÚ
assertLess©r   r    Ústarted_timer<   s       r!   Ú test_duration_property_completedz8CronExecutionModelTests.test_duration_property_completedJ   s¢   € ä!×)Ñ)×0Ñ0ØØ!Ü  a¨Ó,ð 1ó 
ˆ	ô  —|‘|“~¬	¸#Ô(>Ñ>ˆØ(ˆ	ÔØ�‰Ôð 	× Ñ ¨Ð Ô.à×%Ñ%ˆØ×Ñ˜XÔ&Ø×Ñ ¨#Ô.Ø�‰˜ #Õ&r#   c           	      óR  — t         j                  j                  ddt        ddd«      d¬«      }t	        j
                  «       t        d¬	«      z
  }||_        |j                  «        |j                  }| j                  |«       | j                  |d«       | j                  |d
«       y)z0Test duration calculation for running execution.r   r   r   r   r   Fr-   é2   r7   é<   N)r   r   r   r   r   r:   r   r   r;   r<   r   r=   r>   r?   s       r!   Útest_duration_property_runningz6CronExecutionModelTests.test_duration_property_running_   s’   € ä!×)Ñ)×0Ñ0ØØ!Ü  a¨Ó,Øð	 1ó 
ˆ	ô  —|‘|“~¬	¸"Ô(=Ñ=ˆØ(ˆ	ÔØ�‰Ôà×%Ñ%ˆØ×Ñ˜XÔ&Ø×Ñ ¨"Ô-Ø�‰˜ "Õ%r#   c           	      óò   — t         j                  j                  ddt        ddd«      ¬«      }| j	                  |j
                  «       |j                  }| j	                  |«       | j                  |d«       y)	a=  Test duration calculation when started is None (edge case).
        
        Note: Since started has auto_now_add=True, it cannot actually be None.
        This test verifies that the duration property handles the theoretical
        case where started might be None (though it shouldn't happen in practice).
        r   r   r   r   r   r%   r   N)r   r   r   r   r   r   r<   r=   )r   r    r<   s      r!   Ú!test_duration_property_no_startedz9CronExecutionModelTests.test_duration_property_no_startedr   sr   € ô "×)Ñ)×0Ñ0ØØ!Ü  a¨Ó,ð 1ó 
ˆ	ð 	×Ñ˜Y×.Ñ.Ô/ð ×%Ñ%ˆØ×Ñ˜XÔ&Ø×Ñ ¨!Õ,r#   c           	      ó¸  — t         j                  j                  ddt        ddd«      ¬«      }|j	                  ddd	¬
«       |j                  «        | j                  |j                  «       | j                  |j                  «       | j                  |j                  d«       | j                  |j                  d	«       | j                  |j                  «       y)z1Test marking execution as completed successfully.r   r   r   r   r   r%   TzTask completedr&   ©r   r'   r(   N)r   r   r   r   r2   Úrefresh_from_dbÚ
assertTruer   r   r   r'   r(   r   r*   r   s     r!   Útest_mark_completed_successz3CronExecutionModelTests.test_mark_completed_successŠ   s·   € ä!×)Ñ)×0Ñ0ØØ!Ü  a¨Ó,ð 1ó 
ˆ	ð 	× Ñ ¨Ð7GÐTVÐ ÔWà×!Ñ!Ô#Ø�‰˜	×+Ñ+Ô,Ø�‰˜	×)Ñ)Ô*Ø×Ñ˜×*Ñ*Ð,<Ô=Ø×Ñ˜×-Ñ-¨rÔ2Ø×Ñ˜YŸ_™_Õ-r#   c           	      ó¸  — t         j                  j                  ddt        ddd«      ¬«      }|j	                  ddd	¬
«       |j                  «        | j                  |j                  «       | j                  |j                  «       | j                  |j                  d«       | j                  |j                  d	«       | j                  |j                  «       y)z1Test marking execution as completed with failure.r   r   r   r   r   r%   FzTask failedÚ	ERROR_001rI   N)r   r   r   r   r2   rJ   rK   r   r   r   r   r'   r(   r   r*   r   s     r!   Útest_mark_completed_failurez3CronExecutionModelTests.test_mark_completed_failure›   s·   € ä!×)Ñ)×0Ñ0ØØ!Ü  a¨Ó,ð 1ó 
ˆ	ð 	× Ñ ¨¸ÐR]Ð Ô^à×!Ñ!Ô#Ø�‰˜	×+Ñ+Ô,Ø×Ñ˜×*Ñ*Ô+Ø×Ñ˜×*Ñ*¨MÔ:Ø×Ñ˜×-Ñ-¨{Ô;Ø×Ñ˜YŸ_™_Õ-r#   c           	      óN  — t         j                  j                  ddt        ddd«      dd¬«      }|j	                  d	d
d
¬«       |j                  «        | j                  |j                  «       | j                  |j                  «       | j                  |j                  d
«       y)z7Test marking completed with partial message/error_code.r   r   r   r   r   zOriginal messageÚORIGINAL_ERROR)r   r   r   r'   r(   Tr&   rI   N)r   r   r   r   r2   rJ   rK   r   r   r   r'   r   s     r!   Ú"test_mark_completed_partial_updatez:CronExecutionModelTests.test_mark_completed_partial_update¬   s’   € ä!×)Ñ)×0Ñ0ØØ!Ü  a¨Ó,Ø&Ø'ð 1ó 
ˆ	ð 	× Ñ ¨°rÀbÐ ÔIà×!Ñ!Ô#Ø�‰˜	×+Ñ+Ô,Ø�‰˜	×)Ñ)Ô*à×Ñ˜×*Ñ*¨BÕ/r#   c           	      ó€  — t         j                  j                  ddt        ddd«      ¬«      }|j	                  dd¬	«       |j                  «        | j                  |j                  «       | j                  |j                  «       | j                  |j                  d«       | j                  |j                  d«       y
)z$Test mark_failed convenience method.r   r   r   r   r   r%   ÚFailedÚFAIL)r'   r(   N)r   r   r   r   Úmark_failedrJ   rK   r   r   r   r   r'   r(   r   s     r!   Útest_mark_failedz(CronExecutionModelTests.test_mark_failed¿   s¢   € ä!×)Ñ)×0Ñ0ØØ!Ü  a¨Ó,ð 1ó 
ˆ	ð 	×Ñ h¸6ÐÔBà×!Ñ!Ô#Ø�‰˜	×+Ñ+Ô,Ø×Ñ˜×*Ñ*Ô+Ø×Ñ˜×*Ñ*¨HÔ5Ø×Ñ˜×-Ñ-¨vÕ6r#   c           	      óP  — t         j                  j                  ddt        ddd«      d¬«      }|j	                  «        |j                  «        | j                  |j                  d«       |j	                  «        |j                  «        | j                  |j                  d«       y	)
zTest incrementing retry count.r   r   r   r   r   r   ©r   r   r   r   é   N)r   r   r   r   Úincrement_retryrJ   r   r   r   s     r!   Útest_increment_retryz,CronExecutionModelTests.test_increment_retryÏ   s�   € ä!×)Ñ)×0Ñ0ØØ!Ü  a¨Ó,Øð	 1ó 
ˆ	ð 	×!Ñ!Ô#Ø×!Ñ!Ô#Ø×Ñ˜×.Ñ.°Ô2à×!Ñ!Ô#Ø×!Ñ!Ô#Ø×Ñ˜×.Ñ.°Õ2r#   c           	      óþ   — t         j                  j                  ddt        ddd«      d¬«      }t	        d«      D ]A  }|j                  «        |j                  «        | j                  |j                  |dz   «       ŒC y	)
z-Test incrementing retry count multiple times.r   r   r   r   r   r   rY   é   N)	r   r   r   r   Úranger[   rJ   r   r   )r   r    Úis      r!   Ú#test_increment_retry_multiple_timesz;CronExecutionModelTests.test_increment_retry_multiple_timesà   st   € ä!×)Ñ)×0Ñ0ØØ!Ü  a¨Ó,Øð	 1ó 
ˆ	ô �q–ˆAØ×%Ñ%Ô'Ø×%Ñ%Ô'Ø×Ñ˜Y×2Ñ2°A¸±EÕ:ñ r#   c           	      óØ   — ddl }t        j                  j                  ddt	        ddd«      |j                  «       ¬«      }| j                  |j                  |j                  «       «       y)	z$Test PID field for timeout handling.r   Nr   r   r   r   r   ©r   r   r   Úpid)Úosr   r   r   r   Úgetpidr   rd   )r   re   r    s      r!   Útest_pid_fieldz&CronExecutionModelTests.test_pid_fieldî   sW   € ãÜ!×)Ñ)×0Ñ0ØØ!Ü  a¨Ó,Ø—	‘	“ð	 1ó 
ˆ	ð 	×Ñ˜Ÿ™¨¯	©	«Õ4r#   c           	      ó–   — t         j                  j                  ddt        ddd«      d¬«      }| j	                  |j
                  «       y)zTest PID field can be null.r   r   r   r   r   Nrc   )r   r   r   r   r)   rd   r   s     r!   Útest_pid_field_nullz+CronExecutionModelTests.test_pid_field_nullú   sF   € ä!×)Ñ)×0Ñ0ØØ!Ü  a¨Ó,Øð	 1ó 
ˆ	ð 	×Ñ˜)Ÿ-™-Õ(r#   c                 ó(  — t        d«      D ]8  }t        j                  j                  d|› �d|› �t	        ddd|z   «      ¬«       Œ: t        j                  j                  dt	        ddd	«      ¬
«      }| j                  |j                  «       d«       y)z7Test that database indexes are created (indirect test).r^   ÚA00zTask r   r   r   r%   r   é   )r   r   N)r_   r   r   r   r   Úfilterr   Úcount)r   r`   Ú
executionss      r!   Útest_indexes_existz*CronExecutionModelTests.test_indexes_exist  s”   € ô �q–ˆAÜ×!Ñ!×(Ñ(Ø ˜s˜)Ø! ! ˜+Ü# D¨!¨R°!©VÓ4ð )õ ð ô #×*Ñ*×1Ñ1ØÜ  a¨Ó,ð 2ó 
ˆ
ð 	×Ñ˜×)Ñ)Ó+¨QÕ/r#   c                 óH  — t        ddd«      t        ddd«      t        ddd«      g}|D ]$  }t        j                  j                  dd|¬«       Œ& t	        t        j                  j                  «       «      }| j                  |d	   j                  |d   j                  «       y
)z*Test default ordering (most recent first).r   r   r   rl   é   r   r   r%   r   N)r   r   r   r   ÚlistÚallr=   r   )r   ÚdatesÚdro   s       r!   Útest_orderingz%CronExecutionModelTests.test_ordering  s”   € ä�d˜A˜rÓ"¤D¨¨q°"Ó$5´t¸DÀ!ÀRÓ7HÐIˆãˆAÜ×!Ñ!×(Ñ(Ø Ø%Ø ð )õ ð ô œ-×/Ñ/×3Ñ3Ó5Ó6ˆ
à×Ñ 
¨1¡× 5Ñ 5°zÀ!±}×7LÑ7LÕMr#   c           	      óœ  — t         j                  j                  ddt        ddd«      ¬«      }t         j                  j                  ddt        ddd«      ¬«      }| j	                  |j
                  |j
                  «       | j                  |j                  |j                  «       | j                  |j                  |j                  «       y)z0Test multiple executions for same task and date.r   r   r   r   r   r%   N)	r   r   r   r   ÚassertNotEqualr   r   r   r   )r   Ú
execution1r3   s      r!   Ú'test_multiple_executions_same_task_datez?CronExecutionModelTests.test_multiple_executions_same_task_date%  s°   € ä"×*Ñ*×1Ñ1ØØ!Ü  a¨Ó,ð 2ó 
ˆ
ô #×*Ñ*×1Ñ1ØØ!Ü  a¨Ó,ð 2ó 
ˆ
ð 	×Ñ˜JŸM™M¨:¯=©=Ô9Ø×Ñ˜×-Ñ-¨z×/CÑ/CÔDØ×Ñ˜×2Ñ2°J×4MÑ4MÕNr#   c           	      óÔ   — ddz  }t         j                  j                  ddt        ddd«      |¬«      }|j	                  «        | j                  t        |j                  «      d«       y	)
z2Test execution with very long message (edge case).ÚAi'  r   r   r   r   r   ©r   r   r   r'   N)r   r   r   r   rJ   r   Úlenr'   )r   Úlong_messager    s      r!   Útest_long_messagez)CronExecutionModelTests.test_long_message7  sd   € à˜U‘{ˆÜ!×)Ñ)×0Ñ0ØØ!Ü  a¨Ó,Ø ð	 1ó 
ˆ	ð 	×!Ñ!Ô#Ø×Ñœ˜Y×.Ñ.Ó/°Õ7r#   c           	      ó¼   — d}t         j                  j                  ddt        ddd«      |¬«      }|j	                  «        | j                  |j                  |«       y)	z2Test execution with special characters in message.z4Error: "Test" <test@example.com> & more
New line	Tabr   r   r   r   r   r~   N)r   r   r   r   rJ   r   r'   )r   Úspecial_messager    s      r!   Ú"test_special_characters_in_messagez:CronExecutionModelTests.test_special_characters_in_messageD  s[   € àRˆÜ!×)Ñ)×0Ñ0ØØ!Ü  a¨Ó,Ø#ð	 1ó 
ˆ	ð 	×!Ñ!Ô#Ø×Ñ˜×*Ñ*¨OÕ<r#   c                 óš   — t        ddd«      }t        j                  j                  dd|¬«      }| j	                  |j
                  |«       y)z,Test execution with future date (edge case).iî  é   é   r   r   r%   N©r   r   r   r   r   r   )r   Úfuture_dater    s      r!   Útest_future_execution_datez2CronExecutionModelTests.test_future_execution_dateQ  sL   € ä˜4  RÓ(ˆÜ!×)Ñ)×0Ñ0ØØ!Ø&ð 1ó 
ˆ	ð 	×Ñ˜×1Ñ1°;Õ?r#   c                 óš   — t        ddd«      }t        j                  j                  dd|¬«      }| j	                  |j
                  |«       y)zTest execution with past date.iä  r   r   r   r%   Nrˆ   )r   Ú	past_dater    s      r!   Útest_past_execution_datez0CronExecutionModelTests.test_past_execution_date\  sL   € ä˜˜q !Ó$ˆ	Ü!×)Ñ)×0Ñ0ØØ!Ø$ð 1ó 
ˆ	ð 	×Ñ˜×1Ñ1°9Õ=r#   c           	      ó–   — t         j                  j                  ddt        ddd«      ¬«      }| j	                  |j
                  d«       y)zBTest execution with empty task code (edge case - should validate).r&   r   r   r   r   r%   N©r   r   r   r   r   r   r   s     r!   Útest_empty_task_codez,CronExecutionModelTests.test_empty_task_codeg  sI   € ô "×)Ñ)×0Ñ0ØØ!Ü  a¨Ó,ð 1ó 
ˆ	ð 	×Ñ˜×,Ñ,¨bÕ1r#   c           	      óš   — d}t         j                  j                  |dt        ddd«      ¬«      }| j	                  |j
                  |«       y)z4Test execution with very long task code (edge case).Ú2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr   r   r   r   r%   Nr�   )r   Ú	long_coder    s      r!   Útest_very_long_task_codez0CronExecutionModelTests.test_very_long_task_coder  sL   € àˆ	Ü!×)Ñ)×0Ñ0ØØ!Ü  a¨Ó,ð 1ó 
ˆ	ð 	×Ñ˜×,Ñ,¨iÕ8r#   c           	      óš   — d}t         j                  j                  d|t        ddd«      ¬«      }| j	                  |j
                  |«       y)z4Test execution with very long task name (edge case).ÚdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr   r   r   r   r%   N)r   r   r   r   r   r   )r   Ú	long_namer    s      r!   Útest_very_long_task_namez0CronExecutionModelTests.test_very_long_task_name}  sL   € àˆ	Ü!×)Ñ)×0Ñ0ØØÜ  a¨Ó,ð 1ó 
ˆ	ð 	×Ñ˜×,Ñ,¨iÕ8r#   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r"   r+   r4   rA   rE   rG   rL   rO   rR   rW   r\   ra   rg   ri   rp   rw   r{   r�   r„   rŠ   r�   r�   r”   r˜   © r#   r!   r	   r	   
   s€   „ Ù(ò0ò&+ò.ò6'ò*&ò&-ò0.ò".ò"0ò&7ò 3ò";ò
5ò	)ò0ò"NòOò$8ò=ò	@ò	>ò	2ò	9ó	9r#   r	   N)rœ   Údatetimer   r   Údjango.testr   Údjango.utilsr   Údjango_cronjob_utils.modelsr   r	   r�   r#   r!   Ú<module>r¢      s&   ðñ÷ %Ý  Ý !Ý 5ô|9˜hõ |9r#   