"""Tests for notification_extractor module.""" import base64 import json import pytest from notifications_delivery.constants.exceptions import IgnoredMessageError from notifications_delivery.utils import notification_extractor def test_parse_message_orchard_valid(): """Test parsing a valid message coming from The Orchard.""" message_body = { 'user_ids': ['alw:123'], 'feed_name': 'label_analytics_digest', 'feed_id': 'vendor_123', 'template': 'analytics_digest', 'payload': {} } result = notification_extractor.parse_message(message_body, 'orchard') assert result == message_body def test_parse_message_orchard_invalid(): """Test parsing a invalid message coming from The Orchard.""" message_body = 'this_is_not_json' result = notification_extractor.parse_message(message_body, 'orchard') assert result is None @pytest.mark.parametrize('message_body', [ { 'feed_name': 'label_analytics_digest', 'feed_id': 'vendor_123', 'template': 'analytics_digest', 'payload': {} }, { 'user_ids': ['alw_123'], 'feed_id': 'vendor_123', 'template': 'analytics_digest', 'payload': {} }, { 'user_ids': ['alw_123'], 'feed_name': 'label_analytics_digest', 'template': 'analytics_digest', 'payload': {} }, { 'user_ids': ['alw_123'], 'feed_name': 'label_analytics_digest', 'feed_id': 'vendor_123', 'payload': {} }, { 'user_ids': ['alw_123'], 'feed_name': 'label_analytics_digest', 'feed_id': 'vendor_123', 'template': 'analytics_digest' } ]) def test_parse_message_orchard_incomplete(message_body): """Test parsing an incomplete message coming from The Orchard.""" result = notification_extractor.parse_message( json.dumps(message_body), 'stream') assert result is None def test_parse_message_stream_valid(): """Test parsing a valid message coming from Stream.""" message_body = [ { 'new': [ { 'origin': 'label_analytics_digest:vendor_123', 'actor': 'The Orchard Activity Detector', 'verb': 'Generated', 'object': 'Digest', 'top_products': [] } ], 'deleted': [], 'feed': 'user_email_notifications:alw_123' } ] encoded_body = base64.b64encode( bytes(json.dumps(message_body), 'utf-8')) result = notification_extractor.parse_message(encoded_body, 'stream') assert result == { 'user_ids': ['alw:123'], 'user_emails': [], 'feed_name': 'label_analytics_digest', 'feed_id': 'vendor_123', 'template': 'analytics_digest', 'payload': { 'origin': 'label_analytics_digest:vendor_123', 'actor': 'The Orchard Activity Detector', 'verb': 'Generated', 'object': 'Digest', 'top_products': [] } } def test_parse_message_stream_valid_multiple_users(): """Test parsing a valid message with multiple users coming from Stream.""" message_body = [ { 'new': [ { 'origin': 'label_analytics_digest:vendor_123', 'actor': 'The Orchard Activity Detector', 'verb': 'Generated', 'object': 'Digest', 'top_products': [] } ], 'deleted': [], 'feed': 'user_email_notifications:alw_123' }, { 'new': [ { 'origin': 'label_analytics_digest:vendor_123', 'actor': 'The Orchard Activity Detector', 'verb': 'Generated', 'object': 'Digest', 'top_products': [] } ], 'deleted': [], 'feed': 'user_email_notifications:alw_456' } ] encoded_body = base64.b64encode( bytes(json.dumps(message_body), 'utf-8')) result = notification_extractor.parse_message(encoded_body, 'stream') assert result == { 'user_ids': ['alw:123', 'alw:456'], 'user_emails': [], 'feed_name': 'label_analytics_digest', 'feed_id': 'vendor_123', 'template': 'analytics_digest', 'payload': { 'origin': 'label_analytics_digest:vendor_123', 'actor': 'The Orchard Activity Detector', 'verb': 'Generated', 'object': 'Digest', 'top_products': [] } } def test_parse_message_stream_with_emails(): """Test parsing a valid message with emails coming from Stream.""" message_body = [ { 'new': [ { 'origin': 'orchard_trending_tracks_united_states:orchard', 'actor': 'The Orchard Activity Detector', 'verb': 'Detected', 'object': 'Trend', 'trending_tracks': [] } ], 'deleted': [], 'feed': 'user_email_notifications:johnATSYMBOLgmailDOTSYMBOLcom' }, { 'new': [ { 'origin': 'orchard_trending_tracks_united_states:orchard', 'actor': 'The Orchard Activity Detector', 'verb': 'Detected', 'object': 'Trend', 'trending_tracks': [] } ], 'deleted': [], 'feed': 'user_email_notifications:janeATSYMBOLgmailDOTSYMBOLcom' } ] encoded_body = base64.b64encode( bytes(json.dumps(message_body), 'utf-8')) result = notification_extractor.parse_message(encoded_body, 'stream') assert result == { 'user_ids': [], 'user_emails': ['john@gmail.com', 'jane@gmail.com'], 'feed_name': 'orchard_trending_tracks_united_states', 'feed_id': 'orchard', 'template': 'trending_tracks', 'payload': { 'origin': 'orchard_trending_tracks_united_states:orchard', 'actor': 'The Orchard Activity Detector', 'verb': 'Detected', 'object': 'Trend', 'trending_tracks': [] } } @pytest.mark.parametrize('message_body', [ [], [ { 'new': [], 'deleted': [], } ], pytest.param([ { 'new': [], 'deleted': [], 'feed': 'user_email_notifications:alw_123' } ], marks=pytest.mark.xfail(raises=IgnoredMessageError)), [ { 'new': [ { 'actor': 'The Orchard Activity Detector', 'verb': 'Generated', 'object': 'Digest', 'top_products': [] } ], 'deleted': [], 'feed': 'user_email_notifications:alw_123' } ] ]) def test_parse_message_stream_incomplete(message_body): """Test parsing an incomplete message coming from Stream.""" encoded_body = base64.b64encode(bytes(json.dumps(message_body), 'utf-8')) result = notification_extractor.parse_message(encoded_body, 'stream') assert result is None def test_parse_message_exception(): """Test parsing a message when an unexpected exception is raised.""" message = None result = notification_extractor.parse_message(message, 'stream') assert result is None @pytest.mark.parametrize(('message_body', 'expected'), [ ( [{ 'new': [{ 'actor': 'The Orchard Activity Detector', 'approved_releases': [{ 'artist_name': 'Tuesday 11', 'display_upc': 195497758310, 'release_id': 3003210, 'release_name': 'Tuesday 11', 'subaccount_id': 0, 'upc': 195497758310, 'vendor_id': 7123}], 'foreign_id': '', 'id': '241d5785-6aa8-11eb-95a1-120f62928039', 'object': 'Approved Releases', 'origin': None, 'original_feed': 'label_release_approval:vendor_7123', 'target': '', 'time': '2021-02-09T07:26:35.788481', 'verb': 'Detected' }], 'deleted': [], 'deleted_foreign_ids': [], 'feed': 'user_email_notifications:alw_55281', 'app_id': 37616, 'published_at': '2021-02-09T07:26:35.797340864Z' }], { 'user_ids': ['alw:55281'], 'user_emails': [], 'feed_name': 'label_release_approval', 'feed_id': 'vendor_7123', 'template': 'release_approval' } ), ( [{ 'new': [{ 'actor': 'The Orchard Activity Detector', 'approved_releases': [{ 'artist_name': 'Tuesday 11', 'display_upc': 195497758310, 'release_id': 3003210, 'release_name': 'Tuesday 11', 'subaccount_id': 0, 'upc': 195497758310, 'vendor_id': 7123}], 'foreign_id': '', 'id': '241d5785-6aa8-11eb-95a1-120f62928039', 'object': 'Approved Releases', 'origin': 'label_release_approval:vendor_7123', 'target': '', 'time': '2021-02-09T07:26:35.788481', 'verb': 'Detected' }], 'deleted': [], 'deleted_foreign_ids': [], 'feed': 'user_email_notifications:alw_55281', 'app_id': 37616, 'published_at': '2021-02-09T07:26:35.797340864Z' }], { 'user_ids': ['alw:55281'], 'user_emails': [], 'feed_name': 'label_release_approval', 'feed_id': 'vendor_7123', 'template': 'release_approval' } ), ( [{ 'new': [{ 'actor': 'OA Rejected', 'verb': 'Rejected', 'object': 'Music Product', 'rejection_reasons': [], 'original_feed': 'email_notification_rejection:vendor_7123' }], 'deleted': [], 'deleted_foreign_ids': [], 'feed': 'user_email_notifications:alw_55281', 'app_id': 37616, 'published_at': '2021-02-09T07:26:35.797340864Z' }], { 'user_ids': ['alw:55281'], 'user_emails': [], 'feed_name': 'email_notification_rejection', 'feed_id': 'vendor_7123', 'template': 'release_rejection' } ), # invalid ( [{ 'new': [{ 'actor': 'The Orchard Activity Detector', 'verb': 'Generated', 'object': 'Digest', 'top_products': [] }], 'deleted': [], 'deleted_foreign_ids': [], 'feed': 'user_email_notifications:alw_55281', 'app_id': 37616, 'published_at': '2021-02-09T07:26:35.797340864Z' }], None ), ]) def test_map_to_notification(message_body, expected): """Test map_to_notification.""" result = notification_extractor.map_to_notification( message_body) if expected: assert 'payload' in result del result['payload'] assert result == expected