diff --git a/license_manager/apps/api/tasks.py b/license_manager/apps/api/tasks.py index 1a491797..eb108de9 100644 --- a/license_manager/apps/api/tasks.py +++ b/license_manager/apps/api/tasks.py @@ -180,6 +180,7 @@ def _batch_notify_or_remind_assigned_emails( enterprise_name = enterprise_customer.get('name') enterprise_sender_alias = get_enterprise_sender_alias(enterprise_customer) enterprise_contact_email = enterprise_customer.get('contact_email') + enterprise_default_language = enterprise_customer.get('default_language') or '' pending_license_by_email = {} emails_for_aliasing = [] @@ -198,6 +199,7 @@ def _batch_notify_or_remind_assigned_emails( 'enterprise_customer_name': enterprise_name, 'enterprise_sender_alias': enterprise_sender_alias, 'enterprise_contact_email': enterprise_contact_email, + 'enterprise_default_language': enterprise_default_language, } recipient = _aliased_recipient_object_from_email(user_email) recipient['attributes'].update(get_license_tracking_properties(pending_license)) @@ -292,6 +294,7 @@ def send_post_activation_email_task(enterprise_customer_uuid, user_email): enterprise_slug = enterprise_customer.get('slug') enterprise_sender_alias = get_enterprise_sender_alias(enterprise_customer) enterprise_contact_email = enterprise_customer.get('contact_email') + enterprise_default_language = enterprise_customer.get('default_language') or '' braze_campaign_id = settings.BRAZE_ACTIVATION_EMAIL_CAMPAIGN braze_trigger_properties = { @@ -299,6 +302,7 @@ def send_post_activation_email_task(enterprise_customer_uuid, user_email): 'enterprise_customer_name': enterprise_name, 'enterprise_sender_alias': enterprise_sender_alias, 'enterprise_contact_email': enterprise_contact_email, + 'enterprise_default_language': enterprise_default_language, } recipient = _aliased_recipient_object_from_email(user_email) diff --git a/license_manager/apps/api/tests/test_tasks.py b/license_manager/apps/api/tests/test_tasks.py index 49bb540e..0b1c29a1 100644 --- a/license_manager/apps/api/tests/test_tasks.py +++ b/license_manager/apps/api/tests/test_tasks.py @@ -106,6 +106,7 @@ def test_assignment_email_task(self, mock_braze_client, mock_enterprise_client): 'name': self.enterprise_name, 'sender_alias': self.enterprise_sender_alias, 'contact_email': self.contact_email, + 'default_language': 'en', } # Add an extra recipient with no associated license @@ -142,6 +143,7 @@ def test_assignment_email_task(self, mock_braze_client, mock_enterprise_client): 'enterprise_customer_name': self.enterprise_name, 'enterprise_sender_alias': self.enterprise_sender_alias, 'enterprise_contact_email': self.contact_email, + 'enterprise_default_language': 'en', } expected_recipient = { 'attributes': {'email': user_email}, @@ -182,6 +184,7 @@ def test_assignment_task_send_email_failure_logged(self, mock_enterprise_client, 'name': self.enterprise_name, 'sender_alias': self.enterprise_sender_alias, 'contact_email': self.contact_email, + 'default_language': 'en', } tasks.send_assignment_email_task( @@ -203,6 +206,7 @@ def test_send_reminder_email_task(self, mock_enterprise_client, mock_braze_clien 'name': self.enterprise_name, 'sender_alias': self.enterprise_sender_alias, 'contact_email': self.contact_email, + 'default_language': 'en', } with freeze_time(localized_utcnow()): # Add an extra recipient with no associated license @@ -239,6 +243,7 @@ def test_send_reminder_email_task(self, mock_enterprise_client, mock_braze_clien 'enterprise_customer_name': self.enterprise_name, 'enterprise_sender_alias': self.enterprise_sender_alias, 'enterprise_contact_email': self.contact_email, + 'enterprise_default_language': 'en', } expected_recipient = { 'attributes': {'email': user_email}, @@ -282,6 +287,7 @@ def test_send_reminder_email_failure_no_remind_date_update(self, mock_enterprise 'name': self.enterprise_name, 'sender_alias': self.enterprise_sender_alias, 'contact_email': self.contact_email, + 'default_language': 'en', } with self.assertRaises(BrazeClientError): @@ -297,6 +303,58 @@ def test_send_reminder_email_failure_no_remind_date_update(self, mock_enterprise False ) + @mock.patch('license_manager.apps.api.tasks.BrazeApiClient', autospec=True, return_value=mock.MagicMock()) + @mock.patch('license_manager.apps.api.tasks.EnterpriseApiClient', return_value=mock.MagicMock()) + def test_assignment_email_task_with_null_default_language(self, mock_enterprise_client, mock_braze_client): + """ + Assert the assignment email task handles None default_language by using empty string. + """ + mock_enterprise_client().get_enterprise_customer_data.return_value = { + 'slug': self.enterprise_slug, + 'name': self.enterprise_name, + 'sender_alias': self.enterprise_sender_alias, + 'contact_email': self.contact_email, + 'default_language': None, # Explicitly None + } + + tasks.send_assignment_email_task( + self.custom_template_text, + self.email_recipient_list, + self.subscription_plan.uuid + ) + + # Verify that enterprise_default_language is empty string when source is None + mock_send_message = mock_braze_client.return_value.send_campaign_message + actual_recipients = mock_send_message.call_args_list[0][1]['recipients'] + for recipient in actual_recipients: + assert recipient['trigger_properties']['enterprise_default_language'] == '' + + @mock.patch('license_manager.apps.api.tasks.BrazeApiClient', autospec=True, return_value=mock.MagicMock()) + @mock.patch('license_manager.apps.api.tasks.EnterpriseApiClient', return_value=mock.MagicMock()) + def test_send_reminder_email_task_with_null_default_language(self, mock_enterprise_client, mock_braze_client): + """ + Assert the reminder email task handles None default_language by using empty string. + """ + mock_enterprise_client().get_enterprise_customer_data.return_value = { + 'slug': self.enterprise_slug, + 'name': self.enterprise_name, + 'sender_alias': self.enterprise_sender_alias, + 'contact_email': self.contact_email, + 'default_language': None, # Explicitly None + } + + tasks.send_reminder_email_task( + self.custom_template_text, + self.email_recipient_list, + self.subscription_plan.uuid + ) + + # Verify that enterprise_default_language is empty string when source is None + mock_send_message = mock_braze_client.return_value.send_campaign_message + actual_recipients = mock_send_message.call_args_list[0][1]['recipients'] + for recipient in actual_recipients: + assert recipient['trigger_properties']['enterprise_default_language'] == '' + def _verify_mock_send_email_arguments(self, send_email_args): """ Verifies that the arguments passed into send_activation_emails is correct @@ -328,6 +386,7 @@ def test_send_post_activation_email_task(self, mock_braze_client, mock_enterpris 'name': self.enterprise_name, 'sender_alias': self.enterprise_sender_alias, 'contact_email': self.contact_email, + 'default_language': 'en', } tasks.send_post_activation_email_task(self.enterprise_uuid, self.user_email) @@ -342,6 +401,7 @@ def test_send_post_activation_email_task(self, mock_braze_client, mock_enterpris 'enterprise_customer_name': self.enterprise_name, 'enterprise_sender_alias': self.enterprise_sender_alias, 'enterprise_contact_email': self.contact_email, + 'enterprise_default_language': 'en', } expected_recipient = { 'attributes': {'email': self.user_email}, @@ -367,11 +427,34 @@ def test_send_post_activation_email_task_reraises_braze_exceptions(self, _, mock 'name': self.enterprise_name, 'sender_alias': self.enterprise_sender_alias, 'contact_email': self.contact_email, + 'default_language': 'en', } with self.assertRaises(BrazeClientError): tasks.send_post_activation_email_task(self.enterprise_uuid, self.user_email) + @mock.patch('license_manager.apps.api.tasks.EnterpriseApiClient', return_value=mock.MagicMock()) + @mock.patch('license_manager.apps.api.tasks.BrazeApiClient', return_value=mock.MagicMock()) + def test_send_post_activation_email_task_with_null_default_language( + self, mock_braze_client, mock_enterprise_client + ): + """ + Assert the activation email task handles None default_language by using empty string. + """ + mock_enterprise_client().get_enterprise_customer_data.return_value = { + 'slug': self.enterprise_slug, + 'name': self.enterprise_name, + 'sender_alias': self.enterprise_sender_alias, + 'contact_email': self.contact_email, + 'default_language': None, # Explicitly None + } + + tasks.send_post_activation_email_task(self.enterprise_uuid, self.user_email) + + # Verify that enterprise_default_language is empty string when source is None + actual_trigger_properties = mock_braze_client().send_campaign_message.call_args[1]['trigger_properties'] + assert actual_trigger_properties['enterprise_default_language'] == '' + @mock.patch('license_manager.apps.api.tasks.EnterpriseApiClient', return_value=mock.MagicMock()) @mock.patch('license_manager.apps.api.tasks.BrazeApiClient', return_value=mock.MagicMock()) def test_revocation_cap_email_task(self, mock_braze_client, mock_enterprise_client):