import unittest
from unittest.mock import patch
from aiva.alerts.email_sending_rate import EmailSendingRateAlert

class TestEmailSendingRateAlert(unittest.TestCase):

    @patch('aiva.alerts.email_sending_rate.EmailSendingRateAlert.get_sending_rate')
    @patch('aiva.alerts.email_sending_rate.AlertSuppressor.is_suppressed')
    @patch('aiva.alerts.email_sending_rate.send_alert')
    def test_exceeds_threshold(self, mock_send_alert, mock_is_suppressed, mock_get_sending_rate):
        mock_get_sending_rate.return_value = 101
        mock_is_suppressed.return_value = False
        alert = EmailSendingRateAlert(threshold=100)
        alert.check_and_alert()
        mock_send_alert.assert_called_once()

    @patch('aiva.alerts.email_sending_rate.EmailSendingRateAlert.get_sending_rate')
    @patch('aiva.alerts.email_sending_rate.AlertSuppressor.is_suppressed')
    @patch('aiva.alerts.email_sending_rate.send_alert')
    def test_does_not_exceed_threshold(self, mock_send_alert, mock_is_suppressed, mock_get_sending_rate):
        mock_get_sending_rate.return_value = 99
        mock_is_suppressed.return_value = False
        alert = EmailSendingRateAlert(threshold=100)
        alert.check_and_alert()
        mock_send_alert.assert_not_called()

    @patch('aiva.alerts.email_sending_rate.EmailSendingRateAlert.get_sending_rate')
    @patch('aiva.alerts.email_sending_rate.AlertSuppressor.is_suppressed')
    @patch('aiva.alerts.email_sending_rate.send_alert')
    def test_edge_case_zero(self, mock_send_alert, mock_is_suppressed, mock_get_sending_rate):
        mock_get_sending_rate.return_value = 0
        mock_is_suppressed.return_value = False
        alert = EmailSendingRateAlert(threshold=100)
        alert.check_and_alert()
        mock_send_alert.assert_not_called()

    @patch('aiva.alerts.email_sending_rate.EmailSendingRateAlert.get_sending_rate')
    @patch('aiva.alerts.email_sending_rate.AlertSuppressor.is_suppressed')
    @patch('aiva.alerts.email_sending_rate.send_alert')
    def test_edge_case_very_high(self, mock_send_alert, mock_is_suppressed, mock_get_sending_rate):
        mock_get_sending_rate.return_value = 10000
        mock_is_suppressed.return_value = False
        alert = EmailSendingRateAlert(threshold=100)
        alert.check_and_alert()
        mock_send_alert.assert_called_once()

    @patch('aiva.alerts.email_sending_rate.EmailSendingRateAlert.get_sending_rate')
    @patch('aiva.alerts.email_sending_rate.AlertSuppressor.is_suppressed')
    @patch('aiva.alerts.email_sending_rate.send_alert')
    def test_alert_suppression(self, mock_send_alert, mock_is_suppressed, mock_get_sending_rate):
        mock_get_sending_rate.return_value = 101
        mock_is_suppressed.return_value = True
        alert = EmailSendingRateAlert(threshold=100)
        alert.check_and_alert()
        mock_send_alert.assert_not_called()

if __name__ == '__main__':
    unittest.main()