Ë
    _¸?imK  ã                   óÖ   — d Z ddlm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mZmZmZmZ ddl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 notifications.
é    )Údate)ÚpatchÚ	MagicMock)ÚTestCaseÚoverride_settings)Úmail)ÚNotificationBackendÚEmailBackendÚSlackBackendÚTelegramBackendÚNotificationManager)ÚCronExecutionc                   ó   — e Zd ZdZd„ Zd„ Zy)ÚNotificationBackendTestsz)Tests for NotificationBackend base class.c           	      óê   — t        «       }t        j                  j                  ddt	        ddd«      ¬«      }| j                  t        «      5  |j                  |d«       ddd«       y# 1 sw Y   yxY w)	z-Test base backend raises NotImplementedError.ÚA001ú	Test Taskéè  é   é   ©Ú	task_codeÚ	task_nameÚexecution_datezError messageN)r	   r   ÚobjectsÚcreater   ÚassertRaisesÚNotImplementedErrorÚnotify_failure©ÚselfÚbackendÚ	executions      úH/home/cursorai/projects/django-cronjob-utils/tests/test_notifications.pyÚ#test_notify_failure_not_implementedz<NotificationBackendTests.test_notify_failure_not_implemented   sd   € ä%Ó'ˆä!×)Ñ)×0Ñ0ØØ!Ü  a¨Ó,ð 1ó 
ˆ	ð ×ÑÔ2Õ3Ø×"Ñ" 9¨oÔ>÷ 4×3Ñ3ús   ÁA)Á)A2c           	      ó–   — t        «       }t        j                  j                  ddt	        ddd«      ¬«      }|j                  |d«       y)	z9Test base backend notify_success does nothing by default.r   r   r   r   r   r   úSuccess messageN)r	   r   r   r   r   Únotify_successr    s      r$   Útest_notify_success_defaultz4NotificationBackendTests.test_notify_success_default"   sJ   € ä%Ó'ˆä!×)Ñ)×0Ñ0ØØ!Ü  a¨Ó,ð 1ó 
ˆ	ð 	×Ñ˜yÐ*;Õ<ó    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r%   r)   © r*   r$   r   r      s   „ Ù3ò?ó=r*   r   c                   óv   — e Zd ZdZd„ Z eddgdgddœdœi¬	«      d
„ «       Zd„ Zd„ Zd„ Z	 e
d«      d„ «       Zy)ÚEmailBackendTestszTests for EmailBackend.c           	      ón   — t         j                  j                  ddt        ddd«      ddd¬	«      | _        y
©úSet up test fixtures.r   r   r   r   r   TFÚ	ERROR_001)r   r   r   Ú	completedÚsuccessÚ
error_codeN©r   r   r   r   r#   ©r!   s    r$   ÚsetUpzEmailBackendTests.setUp3   ó:   € ä&×.Ñ.×5Ñ5ØØ!Ü  a¨Ó,ØØØ"ð 6ó 
ˆ�r*   ÚNOTIFICATIONSÚemailútest@example.comúcronjobs@example.com©Ú
recipientsÚ
from_email©Ú
on_failurer>   ©ÚCRONJOB_UTILSc                 ó$  — t        dgddœ«      }|j                  | j                  d«       | j                  t	        t
        j                  «      d«       t
        j                  d   }| j                  |j                  d«       | j                  |j                  d«       | j                  |j                  dg«       | j                  d|j                  «       | j                  d	|j                  «       | j                  d|j                  «       y
)z.Test email backend sends failure notification.r?   r@   rA   úTest error messager   r   zCronjob Failed: Test Taskr   r   N)r
   r   r#   ÚassertEqualÚlenr   ÚoutboxÚsubjectrC   ÚtoÚassertInÚbody©r!   r"   r>   s      r$   Ú!test_email_backend_notify_failurez3EmailBackendTests.test_email_backend_notify_failure>   sÖ   € ô Ø-Ð.Ø0ñ 
ó ˆð
 	×Ñ˜tŸ~™~Ð/CÔDð 	×ÑœœTŸ[™[Ó)¨1Ô-Ü—‘˜A‘ˆØ×Ñ˜Ÿ™Ð(CÔDØ×Ñ˜×)Ñ)Ð+AÔBØ×Ñ˜Ÿ™Ð$6Ð#7Ô8Ø�‰�k 5§:¡:Ô.Ø�‰�f˜eŸj™jÔ)Ø�‰Ð*¨E¯J©JÕ7r*   c                 óª   — t        g ddœ«      }|j                  | j                  d«       | j                  t	        t
        j                  «      d«       y)z&Test email backend with no recipients.r@   rA   ú
Test errorr   N)r
   r   r#   rJ   rK   r   rL   ©r!   r"   s     r$   Ú test_email_backend_no_recipientsz2EmailBackendTests.test_email_backend_no_recipients\   sF   € äØØ0ñ 
ó ˆð 	×Ñ˜tŸ~™~¨|Ô<Ø×ÑœœTŸ[™[Ó)¨1Õ-r*   c                 ó  — t        dgdddœ«      }|j                  | j                  d«       | j                  t	        t
        j                  «      d«       t
        j                  d   }| j                  |j                  d«       y	)
z0Test email backend with custom subject template.r?   r@   z+[CRITICAL] {task_name} ({task_code}) Failed)rB   rC   Úsubject_templaterT   r   r   z"[CRITICAL] Test Task (A001) FailedN)r
   r   r#   rJ   rK   r   rL   rM   rQ   s      r$   Ú*test_email_backend_custom_subject_templatez<EmailBackendTests.test_email_backend_custom_subject_templateg   sn   € äØ-Ð.Ø0Ø Mñ 
ó ˆð 	×Ñ˜tŸ~™~¨|Ô<à×ÑœœTŸ[™[Ó)¨1Ô-Ü—‘˜A‘ˆØ×Ñ˜Ÿ™Ð(LÕMr*   c                 óŽ  — t        ddgddœ«      }|j                  | j                  d«       | j                  t	        t
        j                  «      d«       t
        j                  d   }| j                  t	        |j                  «      d«       | j                  d|j                  «       | j                  d|j                  «       y	)
z,Test email backend with multiple recipients.ztest1@example.comztest2@example.comr@   rA   rT   r   r   é   N)	r
   r   r#   rJ   rK   r   rL   rN   rO   rQ   s      r$   Ú&test_email_backend_multiple_recipientsz8EmailBackendTests.test_email_backend_multiple_recipientsu   s—   € äØ.Ð0CÐDØ0ñ 
ó ˆð
 	×Ñ˜tŸ~™~¨|Ô<à×ÑœœTŸ[™[Ó)¨1Ô-Ü—‘˜A‘ˆØ×Ñœ˜UŸX™X›¨Ô*Ø�‰Ð)¨5¯8©8Ô4Ø�‰Ð)¨5¯8©8Õ4r*   z,django_cronjob_utils.notifications.send_mailc                 óz   — t        d«      |_        t        dgddœ«      }|j                  | j                  d«       y)z3Test email backend handles send failure gracefully.z
SMTP errorr?   r@   rA   rT   N)Ú	ExceptionÚside_effectr
   r   r#   )r!   Úmock_send_mailr"   s      r$   Útest_email_backend_send_failurez1EmailBackendTests.test_email_backend_send_failure„   s?   € ô &/¨|Ó%<ˆÔ"äØ-Ð.Ø0ñ 
ó ˆð 	×Ñ˜tŸ~™~¨|Õ<r*   N)r+   r,   r-   r.   r;   r   rR   rV   rY   r\   r   ra   r/   r*   r$   r1   r1   0   sm   „ Ù!ò	
ñ àØ&˜ià#5Ð"6Ø"8ññð
ô
ñ8ó
ð8ò&	.òNò5ñ Ð9Ó:ñ
=ó ;ñ
=r*   r1   c                   óf   — e Zd ZdZd„ Zd„ Zd„ Zd„ Z ed«      d„ «       Z	 ed«      d„ «       Z
d	„ Zy
)ÚSlackBackendTestszTests for SlackBackend.c           	      ón   — t         j                  j                  ddt        ddd«      ddd¬	«      | _        y
r3   r9   r:   s    r$   r;   zSlackBackendTests.setUp•   r<   r*   c                 óÊ   — t        ddddœ«      }| j                  |j                  d«       | j                  |j                  d«       | j                  |j                  d«       y)z!Test SlackBackend initialization.úhttps://hooks.slack.com/testú	#cronjobsÚCronbot)Úwebhook_urlÚchannelÚusernameN)r   rJ   ri   rj   rk   rU   s     r$   Útest_slack_backend_initz)SlackBackendTests.test_slack_backend_init    s]   € äØ9Ø"Ø!ñ 
ó ˆð 	×Ñ˜×,Ñ,Ð.LÔMØ×Ñ˜Ÿ™¨+Ô6Ø×Ñ˜×)Ñ)¨9Õ5r*   c                 ó¼   — | j                  t        «      5 }t        ddi«       ddd«       | j                  dt	        j
                  «      «       y# 1 sw Y   Œ/xY w)z>Test SlackBackend initialization without webhook raises error.rj   rg   Nri   )r   Ú
ValueErrorr   rO   ÚstrÚ	exception©r!   Úcms     r$   Ú"test_slack_backend_init_no_webhookz4SlackBackendTests.test_slack_backend_init_no_webhook¬   sK   € à×ÑœzÔ*¨bÜØ˜;ðô ÷ +ð
 	�‰�m¤S¨¯©Ó%6Õ7÷ +Ð*úó   –AÁAc                 óŽ   — t        ddi«      }| j                  |j                  d«       | j                  |j                  d«       y)z!Test SlackBackend default values.ri   rf   rg   rh   N)r   rJ   rj   rk   rU   s     r$   Útest_slack_backend_defaultsz-SlackBackendTests.test_slack_backend_defaultsµ   sC   € äØÐ9ð 
ó ˆð 	×Ñ˜Ÿ™¨+Ô6Ø×Ñ˜×)Ñ)¨9Õ5r*   ú+django_cronjob_utils.notifications.requestsc                 ó:  — t        «       }t        «       |_        ||j                  _        t	        ddi«      }|j                  | j                  d«       |j                  j                  «        |j                  j                  }| j                  |d   d   d«       |d   d   }| j                  |d   d«       | j                  |d	   d
«       | j                  d|d   «       | j                  t        |d   «      d«       | j                  |d   d   d   d«       y)z-Test SlackBackend sends failure notification.ri   rf   rI   r   r   Újsonrj   rg   rk   rh   r   ÚtextÚattachmentsÚcolorÚdangerN)r   Úraise_for_statusÚpostÚreturn_valuer   r   r#   Úassert_called_onceÚ	call_argsrJ   rO   rK   ©r!   Úmock_requestsÚmock_responser"   r‚   Úpayloads         r$   Ú!test_slack_backend_notify_failurez3SlackBackendTests.test_slack_backend_notify_failure¾   s  € ô "›ˆÜ)2«ˆÔ&Ø*7ˆ×ÑÔ'äØÐ9ð 
ó ˆð 	×Ñ˜tŸ~™~Ð/CÔDð 	×Ñ×-Ñ-Ô/Ø!×&Ñ&×0Ñ0ˆ	à×Ñ˜ 1™ a™Ð*HÔIØ˜A‘,˜vÑ&ˆØ×Ñ˜ Ñ+¨[Ô9Ø×Ñ˜ Ñ,¨iÔ8Ø�‰�k 7¨6¡?Ô3Ø×Ñœ˜W ]Ñ3Ó4°aÔ8Ø×Ñ˜ Ñ/°Ñ2°7Ñ;¸XÕFr*   c                 óŠ   — t        d«      |j                  _        t        ddi«      }|j	                  | j
                  d«       y)z5Test SlackBackend handles request failure gracefully.úNetwork errorri   rf   rT   N)r^   r   r_   r   r   r#   ©r!   r„   r"   s      r$   Ú"test_slack_backend_request_failurez4SlackBackendTests.test_slack_backend_request_failure×   sB   € ô *3°?Ó)Cˆ×ÑÔ&äØÐ9ð 
ó ˆð
 	×Ñ˜tŸ~™~¨|Õ<r*   c                 ó˜   — t        dd«      5  t        ddi«      }|j                  | j                  d«       ddd«       y# 1 sw Y   yxY w)z9Test SlackBackend when requests library is not available.rw   Nri   rf   rT   )r   r   r   r#   rU   s     r$   Ú&test_slack_backend_no_requests_libraryz8SlackBackendTests.test_slack_backend_no_requests_libraryã   sE   € äÐ@À$ÕGÜ"ØÐ=ð$ó ˆGð
 ×"Ñ" 4§>¡>°<Ô@÷ H×GÑGús   �*A Á A	N)r+   r,   r-   r.   r;   rl   rs   rv   r   r‡   r‹   r�   r/   r*   r$   rc   rc   ’   sU   „ Ù!ò	
ò
6ò8ò6ñ Ð8Ó9ñGó :ðGñ0 Ð8Ó9ñ	=ó :ð	=óAr*   rc   c                   ó‚   — e Zd ZdZd„ Zd„ Zd„ Zd„ Z ed«      d„ «       Z	 ed«      d„ «       Z
 ed«      d	„ «       Zd
„ Zy)ÚTelegramBackendTestszTests for TelegramBackend.c           	      ón   — t         j                  j                  ddt        ddd«      ddd¬	«      | _        y
r3   r9   r:   s    r$   r;   zTelegramBackendTests.setUpñ   r<   r*   c                 óÈ   — t        dddœ«      }| j                  |j                  d«       | j                  |j                  d«       | j	                  d|j
                  «       y)z$Test TelegramBackend initialization.ú123456:ABC-DEFÚ	123456789©Ú	bot_tokenÚchat_idN)r   rJ   r•   r–   rO   Úapi_urlrU   s     r$   Útest_telegram_backend_initz/TelegramBackendTests.test_telegram_backend_initü   sW   € ä!Ø)Ø"ñ#
ó ˆð
 	×Ñ˜×*Ñ*Ð,<Ô=Ø×Ñ˜Ÿ™¨+Ô6Ø�‰Ð&¨¯©Õ8r*   c                 ó¼   — | j                  t        «      5 }t        ddi«       ddd«       | j                  dt	        j
                  «      «       y# 1 sw Y   Œ/xY w)z?Test TelegramBackend initialization without token raises error.r–   r“   Nr•   ©r   rn   r   rO   ro   rp   rq   s     r$   Ú#test_telegram_backend_init_no_tokenz8TelegramBackendTests.test_telegram_backend_init_no_token  sK   € à×ÑœzÔ*¨bÜØ˜;ðô ÷ +ð
 	�‰�k¤3 r§|¡|Ó#4Õ5÷ +Ð*úrt   c                 ó¼   — | j                  t        «      5 }t        ddi«       ddd«       | j                  dt	        j
                  «      «       y# 1 sw Y   Œ/xY w)zATest TelegramBackend initialization without chat_id raises error.r•   r’   Nr–   rš   rq   s     r$   Ú%test_telegram_backend_init_no_chat_idz:TelegramBackendTests.test_telegram_backend_init_no_chat_id  sL   € à×ÑœzÔ*¨bÜØÐ-ðô ÷ +ð
 	�‰�i¤ R§\¡\Ó!2Õ3÷ +Ð*úrt   rw   c                 ó  — t        «       }t        «       |_        ||j                  _        t	        dddœ«      }|j                  | j                  d«       |j                  j                  «        |j                  j                  }| j                  d|d   d   «       |d   d   }| j                  |d   d«       | j                  |d	   d
«       | j                  d|d   «       | j                  d|d   «       | j                  d|d   «       y)z0Test TelegramBackend sends failure notification.r’   r“   r”   rI   r   r   ry   r–   Ú
parse_modeÚHTMLr   rz   r   N)r   r~   r   r€   r   r   r#   r�   r‚   rO   rJ   rƒ   s         r$   Ú$test_telegram_backend_notify_failurez9TelegramBackendTests.test_telegram_backend_notify_failure  sú   € ô "›ˆÜ)2«ˆÔ&Ø*7ˆ×ÑÔ'ä!Ø)Ø"ñ#
ó ˆð
 	×Ñ˜tŸ~™~Ð/CÔDð 	×Ñ×-Ñ-Ô/Ø!×&Ñ&×0Ñ0ˆ	à�‰Ð&¨	°!©°Q©Ô8Ø˜A‘,˜vÑ&ˆØ×Ñ˜ Ñ+¨[Ô9Ø×Ñ˜ Ñ.°Ô7Ø�‰�k 7¨6¡?Ô3Ø�‰�f˜g f™oÔ.Ø�‰Ð*¨G°F©OÕ<r*   c                 ó(  — t        «       }t        «       |_        ||j                  _        t	        dddœ«      }d}|j                  | j                  |«       |j                  j                  }|d   d   }| j                  t        |d   «      d«       y	)
z2Test TelegramBackend truncates very long messages.r’   r“   r”   ÁÐ  AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr   ry   rz   i°  N)
r   r~   r   r€   r   r   r#   r‚   ÚassertLessEqualrK   )r!   r„   r…   r"   Úlong_messager‚   r†   s          r$   Ú"test_telegram_backend_long_messagez7TelegramBackendTests.test_telegram_backend_long_message3  s‹   € ô "›ˆÜ)2«ˆÔ&Ø*7ˆ×ÑÔ'ä!Ø)Ø"ñ#
ó ˆð
 "ˆØ×Ñ˜tŸ~™~¨|Ô<à!×&Ñ&×0Ñ0ˆ	Ø˜A‘,˜vÑ&ˆà×ÑœS ¨¡Ó1°4Õ8r*   c                 óŒ   — t        d«      |j                  _        t        dddœ«      }|j	                  | j
                  d«       y)z8Test TelegramBackend handles request failure gracefully.r‰   r’   r“   r”   rT   N)r^   r   r_   r   r   r#   rŠ   s      r$   Ú%test_telegram_backend_request_failurez:TelegramBackendTests.test_telegram_backend_request_failureG  sB   € ô *3°?Ó)Cˆ×ÑÔ&ä!Ø)Ø"ñ#
ó ˆð 	×Ñ˜tŸ~™~¨|Õ<r*   c                 óš   — t        dd«      5  t        dddœ«      }|j                  | j                  d«       ddd«       y# 1 sw Y   yxY w)z<Test TelegramBackend when requests library is not available.rw   Nr’   r“   r”   rT   )r   r   r   r#   rU   s     r$   Ú)test_telegram_backend_no_requests_libraryz>TelegramBackendTests.test_telegram_backend_no_requests_libraryT  sE   € äÐ@À$ÕGÜ%Ø-Ø&ñ'ó ˆGð ×"Ñ" 4§>¡>°<Ô@÷ H×GÑGús   �+AÁA
N)r+   r,   r-   r.   r;   r˜   r›   r�   r   r¡   r¦   r¨   rª   r/   r*   r$   r�   r�   î   sm   „ Ù$ò	
ò	9ò6ò4ñ Ð8Ó9ñ=ó :ð=ñ2 Ð8Ó9ñ9ó :ð9ñ& Ð8Ó9ñ
=ó :ð
=ó	Ar*   r�   c            	       óÚ  — e Zd ZdZd„ Z eddgdgddœdœi¬	«      d
„ «       Z edddgddgiddidœi¬	«       ed«      d„ «       «       Z eddgdgddœdœi¬	«      d„ «       Z	 edg d¢ddgiddidddœdœi¬	«       ed«      d„ «       «       Z
 eddgddgidœi¬	«      d„ «       Z eddg ii¬	«      d„ «       Z eddgdgddgidœi¬	«      d„ «       Z eddgg ddgidœi¬	«      d„ «       Zy) ÚNotificationManagerTestszTests for NotificationManager.c           	      ól   — t         j                  j                  ddt        ddd«      dd¬«      | _        y	)
r4   r   r   r   r   r   TF)r   r   r   r6   r7   Nr9   r:   s    r$   r;   zNotificationManagerTests.setUpc  s7   € ä&×.Ñ.×5Ñ5ØØ!Ü  a¨Ó,ØØð 6ó 
ˆ�r*   r=   r>   r?   r@   rA   rD   rF   c                 ó¨   — t        «       }| j                  t        |j                  «      d«       | j	                  |j                  d   t
        «       y)z-Test NotificationManager loads email backend.r   r   N)r   rJ   rK   ÚbackendsÚassertIsInstancer
   ©r!   Úmanagers     r$   Ú-test_notification_manager_loads_email_backendzFNotificationManagerTests.test_notification_manager_loads_email_backendm  sB   € ô &Ó'ˆà×Ñœ˜W×-Ñ-Ó.°Ô2Ø×Ñ˜g×.Ñ.¨qÑ1´<Õ@r*   ÚslackrB   ri   rf   )rE   r>   r´   rw   c                 ó`  — t        «       }t        «       |_        ||j                  _        t	        «       }| j                  t        |j                  «      d«       |j                  D �cg c]  }t        |«      j                  ‘Œ }}| j                  d|«       | j                  d|«       yc c}w )z1Test NotificationManager loads multiple backends.r[   r
   r   N)r   r~   r   r€   r   rJ   rK   r¯   Útyper+   rO   )r!   r„   r…   r²   ÚbÚbackend_typess         r$   Ú1test_notification_manager_loads_multiple_backendszJNotificationManagerTests.test_notification_manager_loads_multiple_backends  sŽ   € ô  "›ˆÜ)2«ˆÔ&Ø*7ˆ×ÑÔ'ä%Ó'ˆà×Ñœ˜W×-Ñ-Ó.°Ô2Ø3:×3CÒ3CÓDÑ3C¨aœ˜a›×)Ó)Ð3CˆÐDØ�‰�n mÔ4Ø�‰�n mÕ4ùò Es   Á(B+c                 ó¢   — t        «       }|j                  | j                  d«       | j                  t	        t
        j                  «      d«       y)z*Test NotificationManager notifies failure.rT   r   N)r   r   r#   rJ   rK   r   rL   r±   s     r$   Ú(test_notification_manager_notify_failurezANotificationManagerTests.test_notification_manager_notify_failureš  s;   € ô &Ó'ˆØ×Ñ˜tŸ~™~¨|Ô<ð 	×ÑœœTŸ[™[Ó)¨1Õ-r*   )r>   r´   Útelegramr’   r“   r”   )rE   r>   r´   r¼   c                 óB  — t        «       }t        «       |_        ||j                  _        t	        «       }|j                  | j                  d«       | j                  t        t        j                  «      d«       | j                  |j                  j                  d«       y)z+Test NotificationManager with all backends.rT   r   r[   N)r   r~   r   r€   r   r   r#   rJ   rK   r   rL   Ú
call_count)r!   r„   r…   r²   s       r$   Ú&test_notification_manager_all_backendsz?NotificationManagerTests.test_notification_manager_all_backends­  sv   € ô( "›ˆÜ)2«ˆÔ&Ø*7ˆ×ÑÔ'ä%Ó'ˆØ×Ñ˜tŸ~™~¨|Ô<ð 	×ÑœœTŸ[™[Ó)¨1Ô-à×Ñ˜×+Ñ+×6Ñ6¸Õ:r*   c                 óž   — t        «       }t        t        d«      ¬«      |j                  d   _        |j	                  | j
                  d«       y)z=Test NotificationManager handles backend failures gracefully.zBackend error)r_   r   rT   N)r   r   r^   r¯   r   r#   r±   s     r$   Ú2test_notification_manager_backend_failure_handlingzKNotificationManagerTests.test_notification_manager_backend_failure_handlingÍ  sA   € ô &Ó'ˆô .7Ä9È_ÓC]Ô-^ˆ×Ñ˜ÑÔ*ð 	×Ñ˜tŸ~™~¨|Õ<r*   rE   c                 óš   — t        «       }| j                  t        |j                  «      d«       |j	                  | j
                  d«       y)z5Test NotificationManager with no backends configured.r   rT   N)r   rJ   rK   r¯   r   r#   r±   s     r$   Ú%test_notification_manager_no_backendsz>NotificationManagerTests.test_notification_manager_no_backendsá  s;   € ô &Ó'ˆà×Ñœ˜W×-Ñ-Ó.°Ô2Ø×Ñ˜tŸ~™~¨|Õ<r*   )rE   Ú
on_successr>   c                 óî   — t        «       }t        «       |j                  d   _        |j                  | j                  d«       |j                  d   j                  j                  | j                  d«       y)z:Test NotificationManager notifies success when configured.r   r'   N)r   r   r¯   r(   r#   Úassert_called_once_withr±   s     r$   Ú(test_notification_manager_notify_successzANotificationManagerTests.test_notification_manager_notify_successï  sa   € ô &Ó'ˆô .7«[ˆ×Ñ˜ÑÔ*à×Ñ˜tŸ~™~Ð/@ÔAà×Ñ˜Ñ×*Ñ*×BÑBØ�N‰NØõ	
r*   c                 óP   — t        «       }|j                  | j                  d«       y)zHTest NotificationManager skips success notification when not configured.r'   N)r   r(   r#   r±   s     r$   Ú7test_notification_manager_notify_success_not_configuredzPNotificationManagerTests.test_notification_manager_notify_success_not_configured  s#   € ô &Ó'ˆð 	×Ñ˜tŸ~™~Ð/@ÕAr*   N)r+   r,   r-   r.   r;   r   r³   r   r¹   r»   r¿   rÁ   rÃ   rÇ   rÉ   r/   r*   r$   r¬   r¬   `  s  „ Ù(ò
ñ àØ&˜ià#5Ð"6Ø"8ññð
ô
ñAó
ðAñ àØ&¨Ð0à Ð#5Ð"6ðð "Ð#Aðñð

ôñ Ð8Ó9ñ5ó :óð5ñ àØ&˜ià#5Ð"6Ø"8ññð
ô
ñ.ó
ð.ñ àÚ<à Ð#5Ð"6ðð "Ð#Aðð "2Ø*ññð
ôñ" Ð8Ó9ñ;ó :ó#ð$;ñ àØ&˜ià Ð#5Ð"6ðñð
ô	ñ=ó	ð=ñ àØ˜bðð
ôñ=óð=ñ àØ&˜iØ&˜ià Ð#5Ð"6ðñð
ô
ñ
ó
ð
ñ àØ&˜iØ à Ð#5Ð"6ðñð
ô
ñBó
ñBr*   r¬   N)r.   Údatetimer   Úunittest.mockr   r   Údjango.testr   r   Údjango.corer   Ú"django_cronjob_utils.notificationsr	   r
   r   r   r   Údjango_cronjob_utils.modelsr   r   r1   rc   r�   r¬   r/   r*   r$   Ú<module>rÐ      st   ðñõ ß *ß 3Ý ÷õ õ 6ô=˜xô =ô<_=˜ô _=ôDYA˜ô YAôxoA˜8ô oAôdxB˜xõ xBr*   