
    _?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""9o> 433s   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k5::.fejj)*EJJ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UXX*)5884)588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;  +
 	mS%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k76?3W]34a8/27;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Gs   *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;  +
 	k3r||#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k76?3fgfo.*GFO<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14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Gs   +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--.23:3C3CD3Caa))3CDnm4nm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     &' .79_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NN	
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*   