示例#1
0
def test_sends_log_in_email_to_expected_users(mock_task, settings):
    suppliers = SupplierFactory.create_batch(4)
    mocked_json = [
        {
            'id': suppliers[0].sso_id,
            'last_login': '******'
        },
        {
            'id': suppliers[1].sso_id,
            'last_login': '******'
        },
        {
            'id': suppliers[2].sso_id,
            'last_login': '******'
        },
    ]
    mocked_api = MagicMock(return_value=MagicMock(json=MagicMock(
        return_value=mocked_json)))
    SupplierEmailNotificationFactory(supplier=suppliers[1],
                                     category='no_case_studies')
    SupplierEmailNotificationFactory(supplier=suppliers[0],
                                     category='hasnt_logged_in')

    with patch(LAST_LOGIN_API_METHOD, mocked_api):
        notifications.hasnt_logged_in()

    assert mock_task.delay.call_count == 2
    call_args = mock_task.delay.call_args_list
    assert len(call_args) == 2
    assert call_args[0][1]['recipient_email'] == suppliers[1].company_email
    assert call_args[1][1]['recipient_email'] == suppliers[2].company_email
    expected_url = settings.FAB_NOTIFICATIONS_UNSUBSCRIBE_URL
    assert expected_url in call_args[0][1]['text_body']
    objs = SupplierEmailNotification.objects.all()
    assert objs.count() == 4
示例#2
0
def test_log_in_email_uses_settings_for_no_of_days_and_subject(
        mock_task, settings):
    settings.HASNT_LOGGED_IN_DAYS = 1
    expected_subject = email.HasNotLoggedInRecentlyNotification.subject
    supplier = SupplierFactory()
    mocked_json = [
        {
            'id': supplier.sso_id,
            'last_login': '******'
        },
    ]
    mocked_api = MagicMock(return_value=MagicMock(json=MagicMock(
        return_value=mocked_json)))

    with patch(LAST_LOGIN_API_METHOD, mocked_api):
        notifications.hasnt_logged_in()

    mocked_api.assert_called_once_with(
        start=datetime(2017, 3, 31, 0, 0, 0, 0),
        end=datetime(2017, 3, 31, 23, 59, 59, 999999),
    )

    call_args = mock_task.delay.call_args_list
    assert len(call_args) == 1
    assert call_args[0][1]['subject'] == expected_subject
示例#3
0
def test_doesnt_send_log_in_email_if_log_in_email_already_sent(mock_task):
    suppliers = SupplierFactory.create_batch(2)
    SupplierEmailNotificationFactory(supplier=suppliers[0],
                                     category='no_case_studies')
    SupplierEmailNotificationFactory(supplier=suppliers[1],
                                     category='hasnt_logged_in')
    mocked_json = [
        {
            'id': suppliers[0].sso_id,
            'last_login': '******'
        },
        {
            'id': suppliers[1].sso_id,
            'last_login': '******'
        },
    ]
    mocked_api = MagicMock(return_value=MagicMock(json=MagicMock(
        return_value=mocked_json)))

    with patch(LAST_LOGIN_API_METHOD, mocked_api):
        notifications.hasnt_logged_in()

    assert mock_task.delay.call_count == 1
    call_args = mock_task.delay.call_args_list
    assert len(call_args) == 1
    assert call_args[0][1]['recipient_email'] == suppliers[0].company_email

    assert SupplierEmailNotification.objects.all().count() == 3
示例#4
0
def test_log_in_email_has_expected_vars_in_template(mock_task, settings):
    settings.HASNT_LOGGED_IN_URL = 'http://great.gov.uk/looooogin?next=a'
    settings.HASNT_LOGGED_IN_UTM = 'utm=1'
    expected_url = 'http://great.gov.uk/looooogin?next=a&utm=1'
    supplier = SupplierFactory()
    mocked_json = [
        {
            'id': supplier.sso_id,
            'last_login': '******'
        },
    ]
    mocked_api = MagicMock(return_value=MagicMock(json=MagicMock(
        return_value=mocked_json)))
    mail.outbox = []  # reset after emails sent by signals

    with patch(LAST_LOGIN_API_METHOD, mocked_api):
        notifications.hasnt_logged_in()

    assert len(mock_task.delay.call_args_list) == 1
    call_args = mock_task.delay.call_args[1]
    assert call_args['from_email'] == settings.FAB_FROM_EMAIL
    assert supplier.name in call_args['text_body']
    assert supplier.name in call_args['html_body']
    assert expected_url in call_args['text_body']
    assert expected_url in call_args['html_body']
    assert 'http://help.zendesk.com' in call_args['text_body']
    assert 'http://help.zendesk.com' in call_args['html_body']
示例#5
0
def test_doesnt_send_log_in_email_when_api_returns_no_users(mock_task):
    mocked_api = MagicMock(return_value=MagicMock(json=MagicMock(
        return_value=[])))
    with patch(LAST_LOGIN_API_METHOD, mocked_api):
        notifications.hasnt_logged_in()

    assert mock_task.delay.called is False
def test_sends_log_in_email_to_expected_users(settings):
    suppliers = SupplierFactory.create_batch(4)
    mocked_json = [
        {
            'id': suppliers[0].sso_id,
            'last_login': '******'
        },
        {
            'id': suppliers[1].sso_id,
            'last_login': '******'
        },
        {
            'id': suppliers[2].sso_id,
            'last_login': '******'
        },
    ]
    mocked_api = MagicMock(return_value=MagicMock(json=MagicMock(
        return_value=mocked_json)))
    SupplierEmailNotificationFactory(supplier=suppliers[1],
                                     category='no_case_studies')
    SupplierEmailNotificationFactory(supplier=suppliers[0],
                                     category='hasnt_logged_in')
    mail.outbox = []  # reset after emails sent by signals

    with patch(LAST_LOGIN_API_METHOD, mocked_api):
        notifications.hasnt_logged_in()

    assert len(mail.outbox) == 2
    assert mail.outbox[0].to == [suppliers[1].company_email]
    assert mail.outbox[1].to == [suppliers[2].company_email]
    objs = SupplierEmailNotification.objects.all()
    assert objs.count() == 4  # 2 + 2 created in setup
    assert settings.FAB_NOTIFICATIONS_UNSUBSCRIBE_URL in mail.outbox[0].body
def test_doesnt_send_log_in_email_if_log_in_email_already_sent():
    suppliers = SupplierFactory.create_batch(2)
    SupplierEmailNotificationFactory(supplier=suppliers[0],
                                     category='no_case_studies')
    SupplierEmailNotificationFactory(supplier=suppliers[1],
                                     category='hasnt_logged_in')
    mocked_json = [
        {
            'id': suppliers[0].sso_id,
            'last_login': '******'
        },
        {
            'id': suppliers[1].sso_id,
            'last_login': '******'
        },
    ]
    mocked_api = MagicMock(return_value=MagicMock(json=MagicMock(
        return_value=mocked_json)))
    mail.outbox = []  # reset after emails sent by signals

    with patch(LAST_LOGIN_API_METHOD, mocked_api):
        notifications.hasnt_logged_in()

    assert len(mail.outbox) == 1
    assert mail.outbox[0].to == [suppliers[0].company_email]
    # 2 in data setup + 1 new
    assert SupplierEmailNotification.objects.all().count() == 3
def test_if_log_in_email_send_fails_previous_info_still_written_to_db():
    suppliers = SupplierFactory.create_batch(3)
    mocked_json = [
        {
            'id': suppliers[0].sso_id,
            'last_login': '******'
        },
        {
            'id': suppliers[1].sso_id,
            'last_login': '******'
        },
        {
            'id': suppliers[2].sso_id,
            'last_login': '******'
        },
    ]
    mocked_api = MagicMock(return_value=MagicMock(json=MagicMock(
        return_value=mocked_json)))
    send_method = 'django.core.mail.EmailMultiAlternatives.send'

    def mocked_send(self):
        # This will be the last email that will be sent to
        if self.to == [suppliers[2].company_email]:
            raise Exception

    with patch(send_method, mocked_send):
        try:
            with patch(LAST_LOGIN_API_METHOD, mocked_api):
                notifications.hasnt_logged_in()
        except:
            pass

    # should have created the two objects before the email exception
    assert SupplierEmailNotification.objects.all().count() == 2
def test_log_in_email_has_expected_vars_in_template(settings):
    settings.HASNT_LOGGED_IN_URL = 'http://great.gov.uk/looooogin?next=a'
    settings.HASNT_LOGGED_IN_UTM = 'utm=1'
    expected_url = 'http://great.gov.uk/looooogin?next=a&utm=1'
    supplier = SupplierFactory()
    mocked_json = [
        {
            'id': supplier.sso_id,
            'last_login': '******'
        },
    ]
    mocked_api = MagicMock(return_value=MagicMock(json=MagicMock(
        return_value=mocked_json)))
    mail.outbox = []  # reset after emails sent by signals

    with patch(LAST_LOGIN_API_METHOD, mocked_api):
        notifications.hasnt_logged_in()

    assert len(mail.outbox) == 1
    assert supplier.name in mail.outbox[0].body
    assert supplier.name in mail.outbox[0].alternatives[0][0]
    assert expected_url in mail.outbox[0].body
    assert expected_url in mail.outbox[0].alternatives[0][0]
    assert 'http://help.zendesk.com' in mail.outbox[0].body
    assert 'http://help.zendesk.com' in mail.outbox[0].alternatives[0][0]
示例#10
0
def test_sends_log_in_email_when_not_logged_in_for_30_days():
    expected_subject = email.HasNotLoggedInRecentlyNotification.subject
    suppliers = SupplierFactory.create_batch(3)
    mocked_json = [
        {
            'id': suppliers[1].sso_id,
            'last_login': '******'
        },
    ]
    mocked_api = MagicMock(return_value=MagicMock(json=MagicMock(
        return_value=mocked_json)))
    mail.outbox = []  # reset after emails sent by signals

    with patch(LAST_LOGIN_API_METHOD, mocked_api):
        notifications.hasnt_logged_in()

    mocked_api.assert_called_once_with(start=datetime(2017, 1, 1, 0, 0, 0, 0),
                                       end=datetime(2017, 1, 1, 23, 59, 59,
                                                    999999))
    assert len(mail.outbox) == 1
    assert mail.outbox[0].to == [suppliers[1].company_email]
    assert mail.outbox[0].subject == expected_subject
    assert suppliers[1].name in mail.outbox[0].body
    assert suppliers[1].name in mail.outbox[0].alternatives[0][0]
    assert SupplierEmailNotification.objects.all().count() == 1
    instance = SupplierEmailNotification.objects.get()
    assert instance.supplier == suppliers[1]
    assert instance.category == 'hasnt_logged_in'
    assert instance.date_sent == timezone.now()
示例#11
0
def test_doesnt_send_log_in_email_when_api_returns_no_users():
    mocked_api = MagicMock(return_value=MagicMock(json=MagicMock(
        return_value=[])))
    mail.outbox = []  # reset after emails sent by signals

    with patch(LAST_LOGIN_API_METHOD, mocked_api):
        notifications.hasnt_logged_in()

    assert len(mail.outbox) == 0
    assert SupplierEmailNotification.objects.all().count() == 0
示例#12
0
def test_log_in_email_uses_settings_for_no_of_days_and_subject(settings):
    settings.HASNT_LOGGED_IN_DAYS = 1
    expected_subject = email.HasNotLoggedInRecentlyNotification.subject
    supplier = SupplierFactory()
    mocked_json = [
        {
            'id': supplier.sso_id,
            'last_login': '******'
        },
    ]
    mocked_api = MagicMock(return_value=MagicMock(json=MagicMock(
        return_value=mocked_json)))
    mail.outbox = []  # reset after emails sent by signals

    with patch(LAST_LOGIN_API_METHOD, mocked_api):
        notifications.hasnt_logged_in()

    mocked_api.assert_called_once_with(
        start=datetime(2017, 3, 31, 0, 0, 0, 0),
        end=datetime(2017, 3, 31, 23, 59, 59, 999999),
    )
    assert len(mail.outbox) == 1
    assert mail.outbox[0].subject == expected_subject
示例#13
0
def test_sends_log_in_email_when_not_logged_in_for_30_days(mock_task):
    expected_subject = email.HasNotLoggedInRecentlyNotification.subject
    suppliers = SupplierFactory.create_batch(3)
    mocked_json = [
        {
            'id': suppliers[1].sso_id,
            'last_login': '******'
        },
    ]
    mocked_api = MagicMock(return_value=MagicMock(json=MagicMock(
        return_value=mocked_json)))

    with patch(LAST_LOGIN_API_METHOD, mocked_api):
        notifications.hasnt_logged_in()

    mocked_api.assert_called_once_with(start=datetime(2017, 1, 1, 0, 0, 0, 0),
                                       end=datetime(2017, 1, 1, 23, 59, 59,
                                                    999999))
    assert len(mock_task.delay.call_args_list) == 1
    call_args = mock_task.delay.call_args[1]
    assert call_args['recipient_email'] == suppliers[1].company_email
    assert call_args['subject'] == expected_subject
    assert suppliers[1].name in call_args['text_body']
    assert suppliers[1].name in call_args['html_body']
示例#14
0
def hasnt_logged_in():
    if lock_acquired('hasnt_logged_in'):
        notifications.hasnt_logged_in()
示例#15
0
 def run_daily(self):
     notifications.no_case_studies()
     notifications.hasnt_logged_in()
     notifications.verification_code_not_given()