from mock import patch, MagicMock
from django.test import TestCase

from fondo_api.services.mail import MailService
from fondo_api.enums import EmailTemplate

class MailServiceTest(TestCase):

  @patch('boto3.client')
  def test_send_mail_exception(self, mock):
    SES = MagicMock()
    SES.send_email.side_effect = Exception('there was an error')
    mock.return_value = SES
    
    mail_service = MailService()
    mail_params = {
      'user_full_name': '<NAME>',
      'user_id': 1,
      'user_key': '<KEY>',
      'host_url': 'http://localhost:3000'
    }
    result = mail_service.send_mail(EmailTemplate.USER_ACTIVATION, ['<EMAIL>'], mail_params)
    self.assertEqual(result, False)

  @patch('boto3.client')
  def test_send_mail_user_activation(self, mock):
    SES = MagicMock()
    SES.send_email.return_value = None
    mock.return_value = SES
    
    mail_service = MailService()
    mail_params = {
      'user_full_name': '<NAME>',
      'user_id': 1,
      'user_key': '<KEY>',
      'host_url': 'http://localhost:3000'
    }
    result = mail_service.send_mail(EmailTemplate.USER_ACTIVATION, ['<EMAIL>'], mail_params)
    self.assertEqual(result, True)
    SES.send_email.assert_called_once_with(
      Destination={
        'ToAddresses': ['<EMAIL>'],
        'BccAddresses': []
      },
      Message={
        'Body': {
          'Html': {
            'Charset': 'UTF-8',
            'Data': '\nHola <NAME>,\n<br /><br />\nSe te ha creado una cuenta en el Fondo Montañez, para activarla es necesario que entres al siguiente link:<br /><br />\n<a href="http://localhost:3000/activate/1/ik3u24kh53kj5hk">http://localhost:3000/activate/1/ik3u24kh53kj5hk</a>\n<br /><br />\nSi dando clic al link no funciona, por favor copiarlo y pegarlo en una nueva ventana de su navegador.\n<br /><br />\nGracias,<br />\n<NAME><br />\n\n',
          },
        },
        'Subject': {
          'Charset': 'UTF-8',
          'Data': '[Fondo Montañez] Activación de cuenta',
        },
      },
      Source='<NAME> <<EMAIL>>',
    )

  @patch('boto3.client')
  def test_send_mail_change_state_loan_approved(self, mock):
    SES = MagicMock()
    SES.send_email.return_value = None
    mock.return_value = SES
    
    mail_service = MailService()
    mail_params = {
      'loan_table': 'some html table',
      'loan_id': 1,
    }
    result = mail_service.send_mail(EmailTemplate.CHANGE_STATE_LOAN_APPROVED, ['<EMAIL>'], mail_params)
    self.assertEqual(result, True)
    SES.send_email.assert_called_once_with(
      Destination={
        'ToAddresses': ['<EMAIL>'],
        'BccAddresses': []
      },
      Message={
        'Body': {
          'Html': {
            'Charset': 'UTF-8',
            'Data': '\nApreciado afiliado,\n<br /><br />\nSe le informa que su solicitud de crédito número: 1, ha sido <strong>APROBADA</strong> por el valor requerido, los cuales serán abonados a la respectiva cuenta.\n<br /><br />\nA continuación, se le envía la proyección de pagos. Por favor, si va a realizar el pago antes de la fecha estipulada, deberá comunicarse con la Tesorería para que le sean re-calculados los intereses.\n<br /><br />\nsome html table\n<br /><br />\nGracias,<br />\n<NAME>ñez<br />\n\n',
          },
        },
        'Subject': {
          'Charset': 'UTF-8',
          'Data': '[Fondo Montañez] Solicitud de crédito',
        },
      },
      Source='<NAME> <<EMAIL>>',
    )

  @patch('boto3.client')
  def test_send_mail_change_state_loan_denied(self, mock):
    SES = MagicMock()
    SES.send_email.return_value = None
    mock.return_value = SES
    
    mail_service = MailService()
    mail_params = {
      'loan_table': 'some html table',
      'loan_id': 1,
    }
    result = mail_service.send_mail(EmailTemplate.CHANGE_STATE_LOAN_DENIED, ['<EMAIL>'], mail_params)
    self.assertEqual(result, True)
    SES.send_email.assert_called_once_with(
      Destination={
        'ToAddresses': ['<EMAIL>'],
        'BccAddresses': []
      },
      Message={
        'Body': {
          'Html': {
            'Charset': 'UTF-8',
            'Data': '\nApreciado afiliado,\n<br /><br />\nSe le informa que su solicitud de crédito número: 1, ha sido <strong>RECHAZADA</strong>. Favor comuníquese con la tesorería.\n<br /><br />\nGracias,<br />\n<NAME><br />\n\n',
          },
        },
        'Subject': {
          'Charset': 'UTF-8',
          'Data': '[Fondo Montañez] Solicitud de crédito',
        },
      },
      Source='<NAME> <<EMAIL>>',
    )

  @patch('boto3.client')
  def test_send_mail_power_approved(self, mock):
    SES = MagicMock()
    SES.send_email.return_value = None
    mock.return_value = SES
    
    mail_service = MailService()
    mail_params = {
      'requester_full_name': '<NAME>',
      'requester_identification': 123,
      'requestee_full_name': '<NAME>',
      'requestee_identification': 456,
      'meeting_date': '26 sept. 2021',
    }
    result = mail_service.send_mail(EmailTemplate.POWER_APPROVED, ['<EMAIL>'], mail_params)
    self.assertEqual(result, True)
    SES.send_email.assert_called_once_with(
      Destination={
        'ToAddresses': ['<EMAIL>'],
        'BccAddresses': []
      },
      Message={
        'Body': {
          'Html': {
            'Charset': 'UTF-8',
            'Data': '\nSeñores:<br />\nASAMBLEA GENERAL FONDO FAMILIAR<br />\nAtn: Presidente<br />\nBogotá<br /><br />\nYo, requester full name, con número de identificación 123, en mi calidad de afiliado al fondo, manifiesto de manera libre y espontánea que confiero poder amplio y suficiente a requestee full name, con número de identificación 456, para que en mi nombre me represente en la asamblea, convocada para la fecha: 26 sept. 2021, quien participará con voz y voto en todas y cada una de las deliberaciones y decisiones tomadas en la asamblea.<br /><br />\nAtentamente,<br />\n<NAME><br />\n\n',
          },
        },
        'Subject': {
          'Charset': 'UTF-8',
          'Data': '[Fondo Montañez] Poder asamblea',
        },
      },
      Source='<NAME> <<EMAIL>>',
    )

  @patch('boto3.client')
  def test_send_mail_repeated_emails(self, mock):
    SES = MagicMock()
    SES.send_email.return_value = None
    mock.return_value = SES
    
    mail_service = MailService()
    mail_params = {
      'loan_table': 'some html table',
      'loan_id': 1,
    }
    result = mail_service.send_mail(EmailTemplate.CHANGE_STATE_LOAN_APPROVED, ['<EMAIL>'], mail_params, ['<EMAIL>', '<EMAIL>'])
    self.assertEqual(result, True)
    SES.send_email.assert_called_once_with(
      Destination={
        'ToAddresses': ['<EMAIL>'],
        'BccAddresses': ['<EMAIL>']
      },
      Message={
        'Body': {
          'Html': {
            'Charset': 'UTF-8',
            'Data': '\nApreciado afiliado,\n<br /><br />\nSe le informa que su solicitud de crédito número: 1, ha sido <strong>APROBADA</strong> por el valor requerido, los cuales serán abonados a la respectiva cuenta.\n<br /><br />\nA continuación, se le envía la proyección de pagos. Por favor, si va a realizar el pago antes de la fecha estipulada, deberá comunicarse con la Tesorería para que le sean re-calculados los intereses.\n<br /><br />\nsome html table\n<br /><br />\nGracias,<br />\n<NAME><br />\n\n',
          },
        },
        'Subject': {
          'Charset': 'UTF-8',
          'Data': '[Fondo Montañez] Solicitud de crédito',
        },
      },
      Source='<NAME> <<EMAIL>>',
    )
from mock import patch, MagicMock
from django.test import TestCase

from fondo_api.services.mail import MailService
from fondo_api.enums import EmailTemplate

class MailServiceTest(TestCase):

  @patch('boto3.client')
  def test_send_mail_exception(self, mock):
    SES = MagicMock()
    SES.send_email.side_effect = Exception('there was an error')
    mock.return_value = SES
    
    mail_service = MailService()
    mail_params = {
      'user_full_name': '<NAME>',
      'user_id': 1,
      'user_key': '<KEY>',
      'host_url': 'http://localhost:3000'
    }
    result = mail_service.send_mail(EmailTemplate.USER_ACTIVATION, ['<EMAIL>'], mail_params)
    self.assertEqual(result, False)

  @patch('boto3.client')
  def test_send_mail_user_activation(self, mock):
    SES = MagicMock()
    SES.send_email.return_value = None
    mock.return_value = SES
    
    mail_service = MailService()
    mail_params = {
      'user_full_name': '<NAME>',
      'user_id': 1,
      'user_key': '<KEY>',
      'host_url': 'http://localhost:3000'
    }
    result = mail_service.send_mail(EmailTemplate.USER_ACTIVATION, ['<EMAIL>'], mail_params)
    self.assertEqual(result, True)
    SES.send_email.assert_called_once_with(
      Destination={
        'ToAddresses': ['<EMAIL>'],
        'BccAddresses': []
      },
      Message={
        'Body': {
          'Html': {
            'Charset': 'UTF-8',
            'Data': '\nHola <NAME>,\n<br /><br />\nSe te ha creado una cuenta en el Fondo Montañez, para activarla es necesario que entres al siguiente link:<br /><br />\n<a href="http://localhost:3000/activate/1/ik3u24kh53kj5hk">http://localhost:3000/activate/1/ik3u24kh53kj5hk</a>\n<br /><br />\nSi dando clic al link no funciona, por favor copiarlo y pegarlo en una nueva ventana de su navegador.\n<br /><br />\nGracias,<br />\n<NAME><br />\n\n',
          },
        },
        'Subject': {
          'Charset': 'UTF-8',
          'Data': '[Fondo Montañez] Activación de cuenta',
        },
      },
      Source='<NAME> <<EMAIL>>',
    )

  @patch('boto3.client')
  def test_send_mail_change_state_loan_approved(self, mock):
    SES = MagicMock()
    SES.send_email.return_value = None
    mock.return_value = SES
    
    mail_service = MailService()
    mail_params = {
      'loan_table': 'some html table',
      'loan_id': 1,
    }
    result = mail_service.send_mail(EmailTemplate.CHANGE_STATE_LOAN_APPROVED, ['<EMAIL>'], mail_params)
    self.assertEqual(result, True)
    SES.send_email.assert_called_once_with(
      Destination={
        'ToAddresses': ['<EMAIL>'],
        'BccAddresses': []
      },
      Message={
        'Body': {
          'Html': {
            'Charset': 'UTF-8',
            'Data': '\nApreciado afiliado,\n<br /><br />\nSe le informa que su solicitud de crédito número: 1, ha sido <strong>APROBADA</strong> por el valor requerido, los cuales serán abonados a la respectiva cuenta.\n<br /><br />\nA continuación, se le envía la proyección de pagos. Por favor, si va a realizar el pago antes de la fecha estipulada, deberá comunicarse con la Tesorería para que le sean re-calculados los intereses.\n<br /><br />\nsome html table\n<br /><br />\nGracias,<br />\n<NAME>ñez<br />\n\n',
          },
        },
        'Subject': {
          'Charset': 'UTF-8',
          'Data': '[Fondo Montañez] Solicitud de crédito',
        },
      },
      Source='<NAME> <<EMAIL>>',
    )

  @patch('boto3.client')
  def test_send_mail_change_state_loan_denied(self, mock):
    SES = MagicMock()
    SES.send_email.return_value = None
    mock.return_value = SES
    
    mail_service = MailService()
    mail_params = {
      'loan_table': 'some html table',
      'loan_id': 1,
    }
    result = mail_service.send_mail(EmailTemplate.CHANGE_STATE_LOAN_DENIED, ['<EMAIL>'], mail_params)
    self.assertEqual(result, True)
    SES.send_email.assert_called_once_with(
      Destination={
        'ToAddresses': ['<EMAIL>'],
        'BccAddresses': []
      },
      Message={
        'Body': {
          'Html': {
            'Charset': 'UTF-8',
            'Data': '\nApreciado afiliado,\n<br /><br />\nSe le informa que su solicitud de crédito número: 1, ha sido <strong>RECHAZADA</strong>. Favor comuníquese con la tesorería.\n<br /><br />\nGracias,<br />\n<NAME><br />\n\n',
          },
        },
        'Subject': {
          'Charset': 'UTF-8',
          'Data': '[Fondo Montañez] Solicitud de crédito',
        },
      },
      Source='<NAME> <<EMAIL>>',
    )

  @patch('boto3.client')
  def test_send_mail_power_approved(self, mock):
    SES = MagicMock()
    SES.send_email.return_value = None
    mock.return_value = SES
    
    mail_service = MailService()
    mail_params = {
      'requester_full_name': '<NAME>',
      'requester_identification': 123,
      'requestee_full_name': '<NAME>',
      'requestee_identification': 456,
      'meeting_date': '26 sept. 2021',
    }
    result = mail_service.send_mail(EmailTemplate.POWER_APPROVED, ['<EMAIL>'], mail_params)
    self.assertEqual(result, True)
    SES.send_email.assert_called_once_with(
      Destination={
        'ToAddresses': ['<EMAIL>'],
        'BccAddresses': []
      },
      Message={
        'Body': {
          'Html': {
            'Charset': 'UTF-8',
            'Data': '\nSeñores:<br />\nASAMBLEA GENERAL FONDO FAMILIAR<br />\nAtn: Presidente<br />\nBogotá<br /><br />\nYo, requester full name, con número de identificación 123, en mi calidad de afiliado al fondo, manifiesto de manera libre y espontánea que confiero poder amplio y suficiente a requestee full name, con número de identificación 456, para que en mi nombre me represente en la asamblea, convocada para la fecha: 26 sept. 2021, quien participará con voz y voto en todas y cada una de las deliberaciones y decisiones tomadas en la asamblea.<br /><br />\nAtentamente,<br />\n<NAME><br />\n\n',
          },
        },
        'Subject': {
          'Charset': 'UTF-8',
          'Data': '[Fondo Montañez] Poder asamblea',
        },
      },
      Source='<NAME> <<EMAIL>>',
    )

  @patch('boto3.client')
  def test_send_mail_repeated_emails(self, mock):
    SES = MagicMock()
    SES.send_email.return_value = None
    mock.return_value = SES
    
    mail_service = MailService()
    mail_params = {
      'loan_table': 'some html table',
      'loan_id': 1,
    }
    result = mail_service.send_mail(EmailTemplate.CHANGE_STATE_LOAN_APPROVED, ['<EMAIL>'], mail_params, ['<EMAIL>', '<EMAIL>'])
    self.assertEqual(result, True)
    SES.send_email.assert_called_once_with(
      Destination={
        'ToAddresses': ['<EMAIL>'],
        'BccAddresses': ['<EMAIL>']
      },
      Message={
        'Body': {
          'Html': {
            'Charset': 'UTF-8',
            'Data': '\nApreciado afiliado,\n<br /><br />\nSe le informa que su solicitud de crédito número: 1, ha sido <strong>APROBADA</strong> por el valor requerido, los cuales serán abonados a la respectiva cuenta.\n<br /><br />\nA continuación, se le envía la proyección de pagos. Por favor, si va a realizar el pago antes de la fecha estipulada, deberá comunicarse con la Tesorería para que le sean re-calculados los intereses.\n<br /><br />\nsome html table\n<br /><br />\nGracias,<br />\n<NAME><br />\n\n',
          },
        },
        'Subject': {
          'Charset': 'UTF-8',
          'Data': '[Fondo Montañez] Solicitud de crédito',
        },
      },
      Source='<NAME> <<EMAIL>>',
    )