def send_email(_, request): check_and_send_email( request.dbsession, request.ldapsource, request.registry.settings, template_key=request.json_body["templateKey"], force=True, ) return {"success": True}
def test_hostname_override_works(ldap_mocked_app_with_users, ldapsource, with_envvar): app = ldap_mocked_app_with_users dbsession = get_dbsession(app) add_test_data_for_stats(dbsession, current_subperiod=Period.ENROLLMENT_SUBPERIOD) displayed_hostname = "notfoobar.com" assert displayed_hostname != TEST_PRODUCTION_HOSTNAME settings = { "adaero.talent_manager_usernames": [TEST_OTHER_MANAGER_USERNAME], "adaero.served_on_https": True, "adaero.homebase_location": "London", "adaero.production_hostname": TEST_PRODUCTION_HOSTNAME, "adaero.production_user": TEST_PRODUCTION_USER, "adaero.enable_send_email": True, } if with_envvar: os.environ["DISPLAYED_HOSTNAME"] = displayed_hostname else: settings[DISPLAYED_HOSTNAME_KEY] = displayed_hostname with patch("smtplib.SMTP") as smtp_mock, patch( "socket.gethostname") as gethostname_mock, patch( "getpass.getuser") as getuser_mock: sendmail_mock = smtp_mock().sendmail gethostname_mock.return_value = TEST_PRODUCTION_HOSTNAME getuser_mock.return_value = TEST_PRODUCTION_USER mail.check_and_send_email(dbsession, ldapsource, settings, template_key=ENROL_START, force=True) generated_raw_message = sendmail_mock.call_args_list[0][0][2] normal_app_link = "https://%s" % TEST_PRODUCTION_HOSTNAME overridden_app_link = "https://%s" % displayed_hostname parser = Parser() message_root = parser.parsestr(generated_raw_message) messages = message_root.get_payload() plain = b64decode(messages[0].get_payload()).decode("utf-8") assert plain.count(normal_app_link) == 0 assert plain.count(overridden_app_link) > 0
def test_do_not_send_emails_when_not_in_production(ldap_mocked_app_with_users, ldapsource): app = ldap_mocked_app_with_users dbsession = get_dbsession(app) add_test_data_for_stats(dbsession) settings = { "adaero.talent_manager_usernames": [TEST_TALENT_MANAGER_USERNAME], "adaero.homebase_location": "London", } with patch("smtplib.SMTP") as smtp_mock, patch( "socket.gethostname") as gethostname_mock, patch( "getpass.getuser") as getuser_mock: sendmail_mock = smtp_mock().sendmail gethostname_mock.return_value = "foo" getuser_mock.return_value = "bar" mail.check_and_send_email(dbsession, ldapsource, settings, delay_s=0, delay_between_s=0) assert 0 == len(sendmail_mock.call_args_list)
def test_emailing_works_with_different_tm_username_config( ldap_mocked_app_with_users, ldapsource): # noqa: E501 app = ldap_mocked_app_with_users dbsession = get_dbsession(app) add_test_data_for_stats(dbsession) json_str = '["%s"]' % TEST_OTHER_MANAGER_USERNAME settings = { "adaero.talent_manager_usernames": json_str, "adaero.homebase_location": "London", } with patch("smtplib.SMTP") as smtp_mock, patch( "socket.gethostname") as gethostname_mock, patch( "getpass.getuser") as getuser_mock: sendmail_mock = smtp_mock().sendmail gethostname_mock.return_value = "foo" getuser_mock.return_value = "bar" mail.check_and_send_email(dbsession, ldapsource, settings, delay_s=0, delay_between_s=0) assert 0 == len(sendmail_mock.call_args_list)
def test_send_emails_according_to_configured_location( ldap_mocked_app_with_users, # noqa: E501 ldapsource, subperiod, location, utc_offset_tuples, ): app = ldap_mocked_app_with_users dbsession = get_dbsession(app) # so date saved in database is TEST_UTCNOW freezer = freeze_time(TEST_UTCNOW) freezer.start() add_test_data_for_stats(dbsession, current_subperiod=subperiod, days_in=0) freezer.stop() # needs to be outside configured employees at a minimum settings = { "adaero.talent_manager_usernames": [TEST_OTHER_MANAGER_USERNAME], "adaero.served_on_https": True, "adaero.homebase_location": location, "adaero.enable_send_email": True, } with patch("smtplib.SMTP") as smtp_mock, patch( "socket.gethostname") as gethostname_mock, patch( "getpass.getuser") as getuser_mock: gethostname_mock.return_value = TEST_PRODUCTION_HOSTNAME sendmail_mock = smtp_mock().sendmail getuser_mock.return_value = TEST_PRODUCTION_USER date_ = TEST_UTCNOW.date() def check_sent(num, t): assert num == sendmail_mock.call_count, ( "Incorrect number of emails sent for time %s" % t) for time_, num_sent in utc_offset_tuples: new_dt = datetime.combine(date_, time_) freezer = freeze_time(new_dt) freezer.start() mail.check_and_send_email( dbsession, ldapsource, settings, force=False, delay_s=0, delay_between_s=0, ) check_sent(num_sent, time_) # email has already sent, won't send again mail.check_and_send_email( dbsession, ldapsource, settings, force=False, delay_s=0, delay_between_s=0, ) check_sent(num_sent, time_) freezer.stop() sendmail_mock.reset_mock() period = Period.get_current_period(dbsession) period.enrol_email_last_sent = None period.enrol_reminder_email_last_sent = None period.entry_email_last_sent = None period.entry_reminder_email_last_sent = None period.review_email_last_sent = None period.feedback_available_mail_last_sent = None with transaction.manager: dbsession.merge(period)
def test_send_correct_emails_are_sent_during_subperiods( ldap_mocked_app_with_users, # noqa: E501 ldapsource, subperiod, num_times, last_sent_email_code, last_sent_template_key, force, last_users, ): app = ldap_mocked_app_with_users dbsession = get_dbsession(app) add_test_data_for_stats(dbsession, current_subperiod=subperiod) settings = { "adaero.load_talent_managers_on_app_start": False, "adaero.talent_manager_usernames": [TEST_TALENT_MANAGER_USERNAME], "adaero.served_on_https": True, "adaero.homebase_location": "London", "adaero.production_hostname": TEST_PRODUCTION_HOSTNAME, "adaero.production_user": TEST_PRODUCTION_USER, "adaero.enable_send_email": True, } with patch("smtplib.SMTP") as smtp_mock, patch( "socket.gethostname") as gethostname_mock, patch( "getpass.getuser") as getuser_mock: sendmail_mock = smtp_mock().sendmail gethostname_mock.return_value = TEST_PRODUCTION_HOSTNAME getuser_mock.return_value = TEST_PRODUCTION_USER for i in range(num_times): kwargs = {"force": force, "delay_s": 0, "delay_between_s": 0} if force: kwargs["template_key"] = last_sent_template_key mail.check_and_send_email(dbsession, ldapsource, settings, **kwargs) if i < num_times - 1: sendmail_mock.reset_mock() with transaction.manager: period = Period.get_current_period(dbsession) assert period.get_email_flag_by_code( last_sent_email_code) == TEST_UTCNOW for code in EMAIL_CODES.difference({last_sent_email_code}): assert period.get_email_flag_by_code(code) != TEST_UTCNOW if not len(last_users): assert 0 == len(sendmail_mock.call_args_list) return # TODO: why is email a list now? confirm_email_call = sendmail_mock.call_args_list.pop(-1) normal_emails_calls = sorted(sendmail_mock.call_args_list, key=lambda c: c[0][1][0]) sorted_by_email_users = sorted(last_users, key=lambda v: v["mail"]) app_link = "https://%s" % TEST_PRODUCTION_HOSTNAME assert len(normal_emails_calls) == len( normal_emails_calls), "Incorrect number of normal emails sent" parser = Parser() # normal_emails_calls = sorted_by_email_calls[:-1] # confirm_email_call = sorted_by_email_calls[-1] for u, c in zip(sorted_by_email_users, normal_emails_calls): args = c[0] assert u["mail"] == args[1][0] generated_raw_message = args[2] message_root = parser.parsestr(generated_raw_message) messages = message_root.get_payload() assert len(messages) == 2 plain = b64decode(messages[0].get_payload()).decode("utf-8") html = b64decode(messages[1].get_payload()).decode("utf-8") # assert no non interpolated variables assert plain.count("{") == 0 assert plain.count(u["givenName"]) > 0 assert plain.count(app_link) > 0 assert html.count("{") == 0 assert html.count(u["givenName"]) > 0 assert html.count(app_link) > 1 assert html.count(app_link) % 2 == 0 assert html.count("</html>") == 1 num_normal_emails = len(normal_emails_calls) tm_details = TEST_LDAP_FULL_DETAILS[TEST_TALENT_MANAGER_USERNAME] assert tm_details["mail"] == confirm_email_call[0][1][0] # Deal with confirm email sent to talent managers confirm_raw_message = confirm_email_call[0][2] confirm_root = parser.parsestr(confirm_raw_message) confirm_messages = confirm_root.get_payload() assert len(confirm_messages) == 2 confirm_plain = b64decode( confirm_messages[0].get_payload()).decode("utf-8") confirm_html = b64decode( confirm_messages[1].get_payload()).decode("utf-8") for m in [confirm_plain, confirm_html]: assert m.count( EMAIL_TEMPLATE_MAP[last_sent_template_key]["summary"]) == 1 # exclude confirmation email from count assert m.count("%s email addresses" % num_normal_emails) == 1 assert confirm_html.count("</html>") == 1