import unittest
from unittest.mock import patch
from aiva.alerts.email_failure_rate import EmailFailureRateAlert

class TestEmailFailureRateAlert(unittest.TestCase):

    @patch('aiva.alerts.email_failure_rate.EmailFailureRateAlert.get_failure_rate')
    @patch('aiva.alerts.email_failure_rate.AlertSuppressor.is_suppressed')
    @patch('aiva.alerts.email_failure_rate.send_alert')
    def test_exceeds_threshold(self, mock_send_alert, mock_is_suppressed, mock_get_failure_rate):
        mock_get_failure_rate.return_value = 0.11
        mock_is_suppressed.return_value = False
        alert = EmailFailureRateAlert(threshold=0.10)
        alert.check_and_alert()
        mock_send_alert.assert_called_once()

    @patch('aiva.alerts.email_failure_rate.EmailFailureRateAlert.get_failure_rate')
    @patch('aiva.alerts.email_failure_rate.AlertSuppressor.is_suppressed')
    @patch('aiva.alerts.email_failure_rate.send_alert')
    def test_does_not_exceed_threshold(self, mock_send_alert, mock_is_suppressed, mock_get_failure_rate):
        mock_get_failure_rate.return_value = 0.09
        mock_is_suppressed.return_value = False
        alert = EmailFailureRateAlert(threshold=0.10)
        alert.check_and_alert()
        mock_send_alert.assert_not_called()

    @patch('aiva.alerts.email_failure_rate.EmailFailureRateAlert.get_failure_rate')
    @patch('aiva.alerts.email_failure_rate.AlertSuppressor.is_suppressed')
    @patch('aiva.alerts.email_failure_rate.send_alert')
    def test_edge_case_zero(self, mock_send_alert, mock_is_suppressed, mock_get_failure_rate):
        mock_get_failure_rate.return_value = 0.0
        mock_is_suppressed.return_value = False
        alert = EmailFailureRateAlert(threshold=0.10)
        alert.check_and_alert()
        mock_send_alert.assert_not_called()

    @patch('aiva.alerts.email_failure_rate.EmailFailureRateAlert.get_failure_rate')
    @patch('aiva.alerts.email_failure_rate.AlertSuppressor.is_suppressed')
    @patch('aiva.alerts.email_failure_rate.send_alert')
    def test_edge_case_very_high(self, mock_send_alert, mock_is_suppressed, mock_get_failure_rate):
        mock_get_failure_rate.return_value = 1.0
        mock_is_suppressed.return_value = False
        alert = EmailFailureRateAlert(threshold=0.10)
        alert.check_and_alert()
        mock_send_alert.assert_called_once()

    @patch('aiva.alerts.email_failure_rate.EmailFailureRateAlert.get_failure_rate')
    @patch('aiva.alerts.email_failure_rate.AlertSuppressor.is_suppressed')
    @patch('aiva.alerts.email_failure_rate.send_alert')
    def test_alert_suppression(self, mock_send_alert, mock_is_suppressed, mock_get_failure_rate):
        mock_get_failure_rate.return_value = 0.11
        mock_is_suppressed.return_value = True
        alert = EmailFailureRateAlert(threshold=0.10)
        alert.check_and_alert()
        mock_send_alert.assert_not_called()

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