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
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
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
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']
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]
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()
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
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
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']
def hasnt_logged_in(): if lock_acquired('hasnt_logged_in'): notifications.hasnt_logged_in()
def run_daily(self): notifications.no_case_studies() notifications.hasnt_logged_in() notifications.verification_code_not_given()