"""Tests for content_review_email.""" import uuid from unittest.mock import patch import flask import pytest from owsresponse import response from notifications import config from notifications.constants.email import ( CONTENT_REVIEW_ESCALATION_APPROVAL_TEMPLATE, CONTENT_REVIEW_ESCALATION_REJECTION_TEMPLATE, CONTENT_REVIEW_FAILURE_NOTIFICATION_TEMPLATE, CONTENT_REVIEW_QUEUE_MOVE_DE_ESCALATION_TEMPLATE, CONTENT_REVIEW_QUEUE_MOVE_ESCALATION_TEMPLATE, ) from notifications.logic import content_review_email app = flask.Flask(config.SERVICE_NAME) mock_identity = { 'id': str(uuid.uuid4()), 'email': 'mockuser@example.com', } @patch('flask.render_template', return_value='Mock') @patch('notifications.connectors.ses.send_email', return_value={}) @patch( 'notifications.models.ows_users.get_identity', return_value=response.Response(status=200, message=mock_identity), ) def test_report_product_review_failure(mock_get_identity, mock_send_email, mock_render_template): """Test report_product_review_failure.""" content_review_email.report_product_review_failure( identity_id=mock_identity['id'], upc='697691883793', product_name='some release' ) mock_get_identity.assert_called_once_with(mock_identity['id']) mock_render_template.assert_called_once_with( CONTENT_REVIEW_FAILURE_NOTIFICATION_TEMPLATE, **{ 'upc': '697691883793', 'product_name': 'some release', 'contact': 'contentreview@sonymusic-pde.com', }, ) mock_send_email.assert_called_once_with( subject='Content Review | Issue found with product 697691883793', text_body='Mock', recipient=mock_identity['email'], cc_recipients=None, source='contentreview@theorchard.com', ) @patch( 'notifications.models.ows_users.get_identity', return_value=response.Response(None, status=404) ) def test_report_product_review_failure_identity_not_found(mock_get_identity): """Test report_product_review_failure when identity_not_found.""" result = content_review_email.report_product_review_failure( identity_id=mock_identity['id'], upc='697691883793', product_name='some release' ) assert result.status == 404 mock_get_identity.assert_called_once_with(mock_identity['id']) @pytest.mark.parametrize( ( 'resolution', 'expected_email_template_source', 'expected_email_subject', 'notes', 'escalation_type', 'escalation_note', ), [ ( 'approve', CONTENT_REVIEW_ESCALATION_APPROVAL_TEMPLATE, 'Escalated product {upc} has been approved | Content Review', None, None, None, ), ( 'reject', CONTENT_REVIEW_ESCALATION_REJECTION_TEMPLATE, 'Escalated product {upc} has been rejected | Content Review', None, None, None, ), ( 'approve', CONTENT_REVIEW_ESCALATION_APPROVAL_TEMPLATE, 'Escalated product {upc} has been approved | Content Review', 'Approved after legal review.', 'Carve-outs/Exclusives', 'Product needs special handling.', ), ( 'reject', CONTENT_REVIEW_ESCALATION_REJECTION_TEMPLATE, 'Escalated product {upc} has been rejected | Content Review', 'Artwork does not meet guidelines.', 'Artwork', 'Logo visible in cover art.', ), ], ) @patch('flask.render_template', return_value='Mock') @patch('notifications.connectors.ses.send_html_email', return_value={}) @patch( 'notifications.models.ows_users.get_identity', return_value=response.Response(status=200, message=mock_identity), ) def test_review_escalation_completed( mock_get_identity, mock_send_html_email, mock_render_template, resolution, expected_email_template_source, expected_email_subject, notes, escalation_type, escalation_note, app_context, ): """Test review_escalation_completed success.""" content_review_email.review_escalation_completed( identity_id=mock_identity['id'], upc='697691883793', resolution=resolution, notes=notes, escalation_type=escalation_type, escalation_note=escalation_note, ) mock_get_identity.assert_called_once_with(mock_identity['id']) mock_render_template.assert_called_once_with( expected_email_template_source, **{ 'upc': '697691883793', 'notes': notes, 'escalation_type': escalation_type, 'escalation_note': escalation_note, }, ) mock_send_html_email.assert_called_once_with( subject=expected_email_subject.format(upc='697691883793'), body='Mock', recipient=mock_identity['email'], source='contentreview@theorchard.com', ) @pytest.mark.parametrize( ( 'resolution', 'expected_ows_users_response', 'expected_ows_users_status_code', 'expected_content_review_status_code', ), [ ('', None, 404, 404), ('', mock_identity, 200, 400), ], ) @patch('flask.render_template') @patch('notifications.connectors.ses.send_html_email') @patch('notifications.models.ows_users.get_identity') def test_review_escalation_completed_exception( mock_get_identity, mock_send_email, mock_render_template, resolution, expected_ows_users_response, expected_ows_users_status_code, expected_content_review_status_code, app_context, ): """Test review_escalation_completed exception.""" mock_get_identity.return_value = response.Response( expected_ows_users_response, status=expected_ows_users_status_code ) result = content_review_email.review_escalation_completed( identity_id=mock_identity['id'], upc='697691883793', resolution=resolution ) assert result.status == expected_content_review_status_code mock_get_identity.assert_called_once_with(mock_identity['id']) mock_render_template.assert_not_called() mock_send_email.assert_not_called() @patch('flask.render_template', return_value='Mock') @patch('notifications.connectors.ses.send_html_email', return_value={}) def test_escalate(mock_send_html_email, mock_render_template, app_context): """Test escalate success.""" content_review_email.escalate( moved_to_target_email='abc@test', upc='697691883793', product_name='some name', label_id=123, label_name='some name', moved_by_user_name='Joe Apple', review_queue_id=2, target_group='some support type', move_note='some silly reason', escalation_type='Carve-outs/Exclusives', primary_artist='ABC Artist', sale_start_date='2022-11-08', ) mock_render_template.assert_called_once_with( CONTENT_REVIEW_QUEUE_MOVE_ESCALATION_TEMPLATE, **{ 'upc': '697691883793', 'product_name': 'some name', 'label_id': 123, 'label_name': 'some name', 'moved_by_user_name': 'Joe Apple', 'review_queue_id': 2, 'support_type': 'some support type', 'move_note': 'some silly reason', 'escalation_type': 'Carve-outs/Exclusives', 'primary_artist': 'ABC Artist', 'sale_start_date': '2022-11-08', }, ) mock_send_html_email.assert_called_once_with( subject='Product 697691883793 requires your attention | Content Review', body='Mock', recipient='abc@test', source='contentreview@theorchard.com', ) @patch('flask.render_template', return_value='Mock') @patch('notifications.connectors.ses.send_html_email', return_value={}) def test_de_escalate(mock_send_html_email, mock_render_template, app_context): """Test de-escalate success.""" content_review_email.de_escalate( moved_to_target_email='abc@test', upc='697691883793', review_queue_id=2, product_name='some abc product', label_id=1, label_name='cool kitten records', primary_artist='ABC Artist', sale_start_date='2022-10-08', escalation_type='Carve-outs/Exclusives', move_note='some reason', ) mock_render_template.assert_called_once_with( CONTENT_REVIEW_QUEUE_MOVE_DE_ESCALATION_TEMPLATE, **{ 'upc': '697691883793', 'review_queue_id': 2, 'product_name': 'some abc product', 'label_id': 1, 'label_name': 'cool kitten records', 'move_note': 'some reason', 'escalation_type': 'Carve-outs/Exclusives', 'primary_artist': 'ABC Artist', 'sale_start_date': '2022-10-08', }, ) mock_send_html_email.assert_called_once_with( subject='Escalated product 697691883793 has been reviewed | Content Review', body='Mock', recipient='abc@test', source='contentreview@theorchard.com', )