"""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',
)