def test_ver_code_email_uses_settings_for_no_of_days_and_subject_for_email2( settings): expected_subject = email.VerificationStillWaitingNotification.subject settings.VERIFICATION_CODE_NOT_GIVEN_DAYS_2ND_EMAIL = 1 settings.VERIFICATION_CODE_NOT_GIVEN_SUBJECT_2ND_EMAIL = 'bla bla' one_day_ago = timezone.now() - timedelta(days=1) sixteen_days_ago = timezone.now() - timedelta(days=16) SupplierFactory(company__verified_with_code=False, company__date_verification_letter_sent=sixteen_days_ago) supplier = SupplierFactory( company__verified_with_code=False, company__date_verification_letter_sent=one_day_ago) SupplierEmailNotificationFactory(supplier=supplier, category='verification_code_not_given', date_sent=(timezone.now() - timedelta(days=8))) mail.outbox = [] # reset after emails sent by signals notifications.verification_code_not_given() assert len(mail.outbox) == 1 assert mail.outbox[0].to == [supplier.company_email] assert mail.outbox[0].subject == expected_subject # 1 created + 1 in set up assert SupplierEmailNotification.objects.all().count() == 2
def test_sends_ver_code_email_when_16_days_passed_but_not_to_the_minute( settings): supplier2_verification_sent = datetime(2016, 11, 30, 23, 59, 59) supplier1 = SupplierFactory( company__verified_with_code=False, company__date_verification_letter_sent=datetime(2016, 11, 30, 0, 0, 1)) supplier2 = SupplierFactory( company__verified_with_code=False, company__date_verification_letter_sent=supplier2_verification_sent) SupplierEmailNotificationFactory(supplier=supplier1, category='verification_code_not_given', date_sent=datetime( 2016, 11, 8, 23, 59, 59)) SupplierEmailNotificationFactory(supplier=supplier2, category='verification_code_not_given', date_sent=datetime( 2016, 11, 8, 23, 59, 59)) mail.outbox = [] # reset after emails sent by signals notifications.verification_code_not_given() assert len(mail.outbox) == 2 assert mail.outbox[0].to == [supplier1.company_email] assert mail.outbox[1].to == [supplier2.company_email] # 2 created + 2 in set up assert SupplierEmailNotification.objects.all().count() == 4
def test_sends_ver_code_email_when_not_input_for_8_days(mock_task, settings): expected_subject = email.VerificationWaitingNotification.subject seven_days_ago = timezone.now() - timedelta(days=7) eight_days_ago = timezone.now() - timedelta(days=8) nine_days_ago = timezone.now() - timedelta(days=9) SupplierFactory(company__verified_with_code=False, company__date_verification_letter_sent=seven_days_ago) supplier = SupplierFactory( company__verified_with_code=False, company__date_verification_letter_sent=eight_days_ago) supplier_with_reminder = SupplierFactory( company__verified_with_code=False, company__date_verification_letter_sent=nine_days_ago) SupplierEmailNotificationFactory(supplier=supplier_with_reminder, category='verification_code_not_given', date_sent=(timezone.now() - timedelta(days=1))) notifications.verification_code_not_given() assert mock_task.delay.call_count == 1 assert len(mock_task.delay.call_args_list) == 1 call_args = mock_task.delay.call_args[1] assert call_args['recipient_email'] == supplier.company_email assert call_args['subject'] == expected_subject assert call_args['from_email'] == settings.FAB_FROM_EMAIL assert SupplierEmailNotification.objects.all().count() == 2
def test_sends_ver_code_email_when_16_days_passed_but_not_to_the_minute( mock_task, settings): supplier2_verification_sent = datetime(2016, 11, 30, 23, 59, 59) supplier1 = SupplierFactory( company__verified_with_code=False, company__date_verification_letter_sent=datetime(2016, 11, 30, 0, 0, 1)) supplier2 = SupplierFactory( company__verified_with_code=False, company__date_verification_letter_sent=supplier2_verification_sent) SupplierEmailNotificationFactory(supplier=supplier1, category='verification_code_not_given', date_sent=datetime( 2016, 11, 8, 23, 59, 59)) SupplierEmailNotificationFactory(supplier=supplier2, category='verification_code_not_given', date_sent=datetime( 2016, 11, 8, 23, 59, 59)) notifications.verification_code_not_given() assert mock_task.delay.call_count == 2 assert len(mock_task.delay.call_args_list) == 2 call_args = mock_task.delay.call_args_list assert call_args[0][1]['recipient_email'] == supplier1.company_email assert call_args[1][1]['recipient_email'] == supplier2.company_email assert SupplierEmailNotification.objects.all().count() == 4
def test_sends_ver_code_email_when_not_input_for_8_days(settings): expected_subject = email.VerificationWaitingNotification.subject seven_days_ago = timezone.now() - timedelta(days=7) eight_days_ago = timezone.now() - timedelta(days=8) nine_days_ago = timezone.now() - timedelta(days=9) SupplierFactory(company__verified_with_code=False, company__date_verification_letter_sent=seven_days_ago) supplier = SupplierFactory( company__verified_with_code=False, company__date_verification_letter_sent=eight_days_ago) supplier_with_reminder = SupplierFactory( company__verified_with_code=False, company__date_verification_letter_sent=nine_days_ago) SupplierEmailNotificationFactory(supplier=supplier_with_reminder, category='verification_code_not_given', date_sent=(timezone.now() - timedelta(days=1))) mail.outbox = [] # reset after emails sent by signals notifications.verification_code_not_given() assert len(mail.outbox) == 1 assert mail.outbox[0].to == [supplier.company_email] assert mail.outbox[0].subject == expected_subject assert mail.outbox[0].from_email == settings.FAB_FROM_EMAIL # 1 created + 1 from setup assert SupplierEmailNotification.objects.all().count() == 2 instance = SupplierEmailNotification.objects.get(supplier=supplier) assert instance.category == 'verification_code_not_given' assert instance.date_sent == timezone.now()
def test_if_ver_code_email_send_fails_previous_info_still_written_to_db_16(): sixteen_days_ago = timezone.now() - timedelta(days=16) suppliers = SupplierFactory.create_batch( 3, company__verified_with_code=False, company__date_verification_letter_sent=sixteen_days_ago) for supplier in suppliers: SupplierEmailNotificationFactory( supplier=supplier, category='verification_code_not_given', date_sent=(timezone.now() - timedelta(days=8))) 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[0].company_email]: raise Exception with patch(send_method, mocked_send): try: notifications.verification_code_not_given() except: pass # 2 created (before email exception on 3rd) + 3 in set up assert SupplierEmailNotification.objects.all().count() == 5
def test_sends_ver_code_email_to_expected_users(mock_task): eight_days_ago = timezone.now() - timedelta(days=8) twelve_days_ago = timezone.now() - timedelta(days=12) sixteen_days_ago = timezone.now() - timedelta(days=16) SupplierFactory.create_batch( 3, company__verified_with_code=True, company__date_verification_letter_sent=eight_days_ago) suppliers8 = SupplierFactory.create_batch( 3, company__verified_with_code=False, company__date_verification_letter_sent=eight_days_ago) SupplierFactory.create_batch( 3, company__verified_with_code=False, company__date_verification_letter_sent=twelve_days_ago) suppliers16 = SupplierFactory.create_batch( 3, company__verified_with_code=False, company__date_verification_letter_sent=sixteen_days_ago) SupplierFactory.create_batch( 3, company__verified_with_code=True, company__date_verification_letter_sent=sixteen_days_ago) SupplierEmailNotificationFactory(supplier=suppliers8[2], category='verification_code_not_given') SupplierEmailNotificationFactory(supplier=suppliers16[2], category='verification_code_2nd_email') for supplier in suppliers16: SupplierEmailNotificationFactory( supplier=supplier, category='verification_code_not_given', date_sent=eight_days_ago) SupplierEmailNotificationFactory(supplier=suppliers8[1], category='hasnt_logged_in') SupplierEmailNotificationFactory(supplier=suppliers16[1], category='hasnt_logged_in') notifications.verification_code_not_given() assert mock_task.delay.call_count == 4 call_args = mock_task.delay.call_args_list assert len(call_args) == 4 assert call_args[0][1]['recipient_email'] == suppliers8[1].company_email assert call_args[1][1]['recipient_email'] == suppliers8[0].company_email assert call_args[2][1]['recipient_email'] == suppliers16[1].company_email assert call_args[3][1]['recipient_email'] == suppliers16[0].company_email objs = SupplierEmailNotification.objects.all() assert objs.count() == 11
def test_sends_ver_code_email_to_expected_users(): eight_days_ago = timezone.now() - timedelta(days=8) twelve_days_ago = timezone.now() - timedelta(days=12) sixteen_days_ago = timezone.now() - timedelta(days=16) SupplierFactory.create_batch( 3, company__verified_with_code=True, company__date_verification_letter_sent=eight_days_ago) suppliers8 = SupplierFactory.create_batch( 3, company__verified_with_code=False, company__date_verification_letter_sent=eight_days_ago) SupplierFactory.create_batch( 3, company__verified_with_code=False, company__date_verification_letter_sent=twelve_days_ago) suppliers16 = SupplierFactory.create_batch( 3, company__verified_with_code=False, company__date_verification_letter_sent=sixteen_days_ago) SupplierFactory.create_batch( 3, company__verified_with_code=True, company__date_verification_letter_sent=sixteen_days_ago) SupplierEmailNotificationFactory(supplier=suppliers8[2], category='verification_code_not_given') SupplierEmailNotificationFactory(supplier=suppliers16[2], category='verification_code_2nd_email') for supplier in suppliers16: SupplierEmailNotificationFactory( supplier=supplier, category='verification_code_not_given', date_sent=eight_days_ago) SupplierEmailNotificationFactory(supplier=suppliers8[1], category='hasnt_logged_in') SupplierEmailNotificationFactory(supplier=suppliers16[1], category='hasnt_logged_in') mail.outbox = [] # reset after emails sent by signals notifications.verification_code_not_given() assert len(mail.outbox) == 4 assert mail.outbox[0].to == [suppliers8[1].company_email] assert mail.outbox[1].to == [suppliers8[0].company_email] assert mail.outbox[2].to == [suppliers16[1].company_email] assert mail.outbox[3].to == [suppliers16[0].company_email] objs = SupplierEmailNotification.objects.all() assert objs.count() == 11 # 4 + 7 created in setup
def test_sends_ver_code_email_when_8_days_passed_but_not_to_the_minute( mock_task, settings): supplier2_verification_sent = datetime(2016, 12, 8, 23, 59, 59) supplier1 = SupplierFactory( company__verified_with_code=False, company__date_verification_letter_sent=datetime(2016, 12, 8, 0, 0, 1)) supplier2 = SupplierFactory( company__verified_with_code=False, company__date_verification_letter_sent=supplier2_verification_sent) notifications.verification_code_not_given() assert len(mock_task.delay.call_args_list) == 2 call_args = mock_task.delay.call_args_list assert call_args[0][1]['recipient_email'] == supplier1.company_email assert call_args[1][1]['recipient_email'] == supplier2.company_email
def test_doesnt_send_ver_code_email_when_user_has_input_ver_code(mock_task): eight_days_ago = timezone.now() - timedelta(days=8) sixteen_days_ago = timezone.now() - timedelta(days=16) SupplierFactory(company__verified_with_code=True, company__date_verification_letter_sent=eight_days_ago) SupplierFactory(company__verified_with_code=True, company__date_verification_letter_sent=sixteen_days_ago) supplier_with_reminder = SupplierFactory( company__verified_with_code=True, company__date_verification_letter_sent=sixteen_days_ago) SupplierEmailNotificationFactory(supplier=supplier_with_reminder, category='verification_code_not_given', date_sent=eight_days_ago) notifications.verification_code_not_given() assert mock_task.delay.called is False # just the one created in setup assert SupplierEmailNotification.objects.all().count() == 1
def test_sends_ver_code_email_when_not_input_for_16_days(settings): expected_subject = email.VerificationStillWaitingNotification.subject fifteen_days_ago = timezone.now() - timedelta(days=15) sixteen_days_ago = timezone.now() - timedelta(days=16) seventeen_days_ago = timezone.now() - timedelta(days=17) supplier15 = SupplierFactory( company__verified_with_code=False, company__date_verification_letter_sent=fifteen_days_ago) supplier16 = SupplierFactory( company__verified_with_code=False, company__date_verification_letter_sent=sixteen_days_ago) supplier17 = SupplierFactory( company__verified_with_code=False, company__date_verification_letter_sent=seventeen_days_ago) SupplierEmailNotificationFactory(supplier=supplier15, category='verification_code_not_given', date_sent=(timezone.now() - timedelta(days=7))) email_notification = SupplierEmailNotificationFactory( supplier=supplier16, category='verification_code_not_given', date_sent=(timezone.now() - timedelta(days=8))) SupplierEmailNotificationFactory(supplier=supplier17, category='verification_code_not_given', date_sent=(timezone.now() - timedelta(days=9))) SupplierEmailNotificationFactory(supplier=supplier17, category='verification_code_2nd_email', date_sent=(timezone.now() - timedelta(days=1))) mail.outbox = [] # reset after emails sent by signals notifications.verification_code_not_given() assert len(mail.outbox) == 1 assert mail.outbox[0].from_email == settings.FAB_FROM_EMAIL assert mail.outbox[0].to == [supplier16.company_email] assert mail.outbox[0].subject == expected_subject # 1 created + 4 in set up assert SupplierEmailNotification.objects.all().count() == 5 instance = SupplierEmailNotification.objects.exclude( pk=email_notification.pk).get(supplier=supplier16) assert instance.category == 'verification_code_2nd_email' assert instance.date_sent == timezone.now()
def test_ver_code_email_uses_settings_for_no_of_days_and_subject_for_email1( mock_task, settings): expected_subject = email.VerificationWaitingNotification.subject settings.VERIFICATION_CODE_NOT_GIVEN_DAYS = 1 settings.VERIFICATION_CODE_NOT_GIVEN_SUBJECT = 'bla bla' one_day_ago = timezone.now() - timedelta(days=1) eight_days_ago = timezone.now() - timedelta(days=8) SupplierFactory(company__verified_with_code=False, company__date_verification_letter_sent=eight_days_ago) supplier = SupplierFactory( company__verified_with_code=False, company__date_verification_letter_sent=one_day_ago) notifications.verification_code_not_given() assert len(mock_task.delay.call_args_list) == 1 call_args = mock_task.delay.call_args[1] assert call_args['recipient_email'] == supplier.company_email assert call_args['subject'] == expected_subject
def test_ver_code_email2_has_expected_vars_in_template(settings): settings.VERIFICATION_CODE_URL = 'http://great.gov.uk/verrrrify' sixteen_days_ago = timezone.now() - timedelta(days=16) supplier = SupplierFactory( company__date_verification_letter_sent=sixteen_days_ago, company__verified_with_code=False, date_joined=sixteen_days_ago) mail.outbox = [] # reset after emails sent by signals notifications.verification_code_not_given() assert len(mail.outbox) == 1 assert mail.outbox[0].from_email == settings.FAB_FROM_EMAIL assert supplier.name in mail.outbox[0].body assert supplier.name in mail.outbox[0].alternatives[0][0] assert 'http://great.gov.uk/verrrrify' in mail.outbox[0].body assert 'http://great.gov.uk/verrrrify' 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_ver_code_email2_has_expected_vars_in_template(mock_task, settings): settings.VERIFICATION_CODE_URL = 'http://great.gov.uk/verrrrify' sixteen_days_ago = timezone.now() - timedelta(days=16) supplier = SupplierFactory( company__date_verification_letter_sent=sixteen_days_ago, company__verified_with_code=False, date_joined=sixteen_days_ago) notifications.verification_code_not_given() 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 'http://great.gov.uk/verrrrify' in call_args['text_body'] assert 'http://great.gov.uk/verrrrify' 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_ver_code_email_uses_settings_for_no_of_days_and_subject_for_email1( settings): expected_subject = email.VerificationWaitingNotification.subject settings.VERIFICATION_CODE_NOT_GIVEN_DAYS = 1 settings.VERIFICATION_CODE_NOT_GIVEN_SUBJECT = 'bla bla' one_day_ago = timezone.now() - timedelta(days=1) eight_days_ago = timezone.now() - timedelta(days=8) SupplierFactory(company__verified_with_code=False, company__date_verification_letter_sent=eight_days_ago) supplier = SupplierFactory( company__verified_with_code=False, company__date_verification_letter_sent=one_day_ago) mail.outbox = [] # reset after emails sent by signals notifications.verification_code_not_given() assert len(mail.outbox) == 1 assert mail.outbox[0].to == [supplier.company_email] assert mail.outbox[0].subject == expected_subject assert SupplierEmailNotification.objects.all().count() == 1
def test_doesnt_send_ver_code_email_when_user_has_input_ver_code(): eight_days_ago = timezone.now() - timedelta(days=8) sixteen_days_ago = timezone.now() - timedelta(days=16) SupplierFactory(company__verified_with_code=True, company__date_verification_letter_sent=eight_days_ago) SupplierFactory(company__verified_with_code=True, company__date_verification_letter_sent=sixteen_days_ago) supplier_with_reminder = SupplierFactory( company__verified_with_code=True, company__date_verification_letter_sent=sixteen_days_ago) SupplierEmailNotificationFactory(supplier=supplier_with_reminder, category='verification_code_not_given', date_sent=eight_days_ago) mail.outbox = [] # reset after emails sent by signals notifications.verification_code_not_given() assert len(mail.outbox) == 0 # just the one created in setup assert SupplierEmailNotification.objects.all().count() == 1
def test_sends_ver_code_email_when_not_input_for_16_days(mock_task, settings): expected_subject = email.VerificationStillWaitingNotification.subject fifteen_days_ago = timezone.now() - timedelta(days=15) sixteen_days_ago = timezone.now() - timedelta(days=16) seventeen_days_ago = timezone.now() - timedelta(days=17) supplier15 = SupplierFactory( company__verified_with_code=False, company__date_verification_letter_sent=fifteen_days_ago) supplier16 = SupplierFactory( company__verified_with_code=False, company__date_verification_letter_sent=sixteen_days_ago) supplier17 = SupplierFactory( company__verified_with_code=False, company__date_verification_letter_sent=seventeen_days_ago) SupplierEmailNotificationFactory(supplier=supplier15, category='verification_code_not_given', date_sent=(timezone.now() - timedelta(days=7))) SupplierEmailNotificationFactory(supplier=supplier16, category='verification_code_not_given', date_sent=(timezone.now() - timedelta(days=8))) SupplierEmailNotificationFactory(supplier=supplier17, category='verification_code_not_given', date_sent=(timezone.now() - timedelta(days=9))) SupplierEmailNotificationFactory(supplier=supplier17, category='verification_code_2nd_email', date_sent=(timezone.now() - timedelta(days=1))) notifications.verification_code_not_given() assert mock_task.delay.call_count == 1 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 call_args['recipient_email'] == supplier16.company_email assert call_args['subject'] == expected_subject assert SupplierEmailNotification.objects.all().count() == 5
def test_if_ver_code_email_send_fails_previous_info_still_written_to_db_8(): eight_days_ago = timezone.now() - timedelta(days=8) suppliers = SupplierFactory.create_batch( 3, company__verified_with_code=False, company__date_verification_letter_sent=eight_days_ago) 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[0].company_email]: raise Exception with patch(send_method, mocked_send): try: notifications.verification_code_not_given() except: pass # should have created the two objects before the email exception assert SupplierEmailNotification.objects.all().count() == 2
def test_doesnt_send_ver_code_email_if_email_already_sent(mock_task): eight_days_ago = timezone.now() - timedelta(days=8) sixteen_days_ago = timezone.now() - timedelta(days=16) supplier1 = SupplierFactory( company__verified_with_code=False, company__date_verification_letter_sent=eight_days_ago) supplier2 = SupplierFactory( company__verified_with_code=False, company__date_verification_letter_sent=sixteen_days_ago) SupplierEmailNotificationFactory(supplier=supplier1, category='verification_code_not_given') SupplierEmailNotificationFactory(supplier=supplier2, category='verification_code_2nd_email') SupplierEmailNotificationFactory(supplier=supplier2, category='verification_code_not_given', date_sent=eight_days_ago) notifications.verification_code_not_given() assert mock_task.delay.called is False # what we created in data setup, no new obj created assert SupplierEmailNotification.objects.all().count() == 3
def test_ver_code_email_uses_settings_for_no_of_days_and_subject_for_email2( mock_task, settings): expected_subject = email.VerificationStillWaitingNotification.subject settings.VERIFICATION_CODE_NOT_GIVEN_DAYS_2ND_EMAIL = 1 settings.VERIFICATION_CODE_NOT_GIVEN_SUBJECT_2ND_EMAIL = 'bla bla' one_day_ago = timezone.now() - timedelta(days=1) sixteen_days_ago = timezone.now() - timedelta(days=16) SupplierFactory(company__verified_with_code=False, company__date_verification_letter_sent=sixteen_days_ago) supplier = SupplierFactory( company__verified_with_code=False, company__date_verification_letter_sent=one_day_ago) SupplierEmailNotificationFactory(supplier=supplier, category='verification_code_not_given', date_sent=(timezone.now() - timedelta(days=8))) mail.outbox = [] # reset after emails sent by signals notifications.verification_code_not_given() assert len(mock_task.delay.call_args_list) == 1 call_args = mock_task.delay.call_args[1] assert call_args['recipient_email'] == supplier.company_email assert call_args['subject'] == expected_subject
def verification_code_not_given(): if lock_acquired('verification_code_not_given'): notifications.verification_code_not_given()
def run_daily(self): notifications.no_case_studies() notifications.hasnt_logged_in() notifications.verification_code_not_given()