import unittest
from unittest.mock import patch
from your_project.email_utils import send_email  # Replace your_project
from your_project.config import enable_email_notifications # Replace your_project
import smtplib


class TestEmailUtils(unittest.TestCase):

    @patch('smtplib.SMTP')
    def test_send_email_success(self, mock_smtp):
        mock_smtp_instance = mock_smtp.return_value
        mock_smtp_instance.starttls.return_value = None
        mock_smtp_instance.login.return_value = None
        mock_smtp_instance.sendmail.return_value = None
        mock_smtp_instance.quit.return_value = None

        send_email("test@example.com", "Test Subject", "Test Body")

        mock_smtp.assert_called_once()
        mock_smtp_instance.starttls.assert_called_once()
        mock_smtp_instance.login.assert_called_once()
        mock_smtp_instance.sendmail.assert_called_once()
        mock_smtp_instance.quit.assert_called_once()

    @patch('smtplib.SMTP')
    def test_send_email_smtp_exception(self, mock_smtp):
        mock_smtp.side_effect = smtplib.SMTPException("SMTP Error")

        with self.assertRaises(smtplib.SMTPException):
            send_email("test@example.com", "Test Subject", "Test Body")

        mock_smtp.assert_called_once()

    @patch('your_project.email_utils.enable_email_notifications', False) # Replace your_project
    @patch('smtplib.SMTP')
    def test_send_email_disabled(self, mock_smtp):
        send_email("test@example.com", "Test Subject", "Test Body")

        mock_smtp.assert_not_called()


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