"""Unit tests for the release approval tasks.""" import asyncio from unittest.mock import MagicMock, patch from freezegun import freeze_time from activity_detector.flows.release_approval import config from activity_detector.flows.release_approval import tasks mock_releases = [ { 'release_id': 101, 'upc': 101, 'display_upc': '101', 'release_name': 'Release 101', 'artist_name': 'Artist 101', 'vendor_id': 1, 'subaccount_id': None }, { 'release_id': 102, 'upc': 102, 'display_upc': '102', 'release_name': 'Release 102', 'artist_name': 'Artist 102', 'vendor_id': 1, 'subaccount_id': None }, { 'release_id': 111, 'upc': 111, 'display_upc': '111', 'release_name': 'Release 111', 'artist_name': 'Artist 111', 'vendor_id': 1, 'subaccount_id': 1 }, { 'release_id': 112, 'upc': 112, 'display_upc': '112', 'release_name': 'Release 112', 'artist_name': 'Artist 112', 'vendor_id': 1, 'subaccount_id': 1 }, { 'release_id': 201, 'upc': 201, 'display_upc': '201', 'release_name': 'Release 201', 'artist_name': 'Artist 201', 'vendor_id': 2, 'subaccount_id': None }, { 'release_id': 221, 'upc': 221, 'display_upc': '221', 'release_name': 'Release 221', 'artist_name': 'Artist 221', 'vendor_id': 2, 'subaccount_id': 2 } ] mock_releases_by_label = { 'vendor_1': [ { 'release_id': 101, 'upc': 101, 'display_upc': '101', 'release_name': 'Release 101', 'artist_name': 'Artist 101', 'vendor_id': 1, 'subaccount_id': None }, { 'release_id': 102, 'upc': 102, 'display_upc': '102', 'release_name': 'Release 102', 'artist_name': 'Artist 102', 'vendor_id': 1, 'subaccount_id': None } ], 'subaccount_1': [ { 'release_id': 111, 'upc': 111, 'display_upc': '111', 'release_name': 'Release 111', 'artist_name': 'Artist 111', 'vendor_id': 1, 'subaccount_id': 1 }, { 'release_id': 112, 'upc': 112, 'display_upc': '112', 'release_name': 'Release 112', 'artist_name': 'Artist 112', 'vendor_id': 1, 'subaccount_id': 1 } ], 'vendor_2': [ { 'release_id': 201, 'upc': 201, 'display_upc': '201', 'release_name': 'Release 201', 'artist_name': 'Artist 201', 'vendor_id': 2, 'subaccount_id': None } ], 'subaccount_2': [ { 'release_id': 221, 'upc': 221, 'display_upc': '221', 'release_name': 'Release 221', 'artist_name': 'Artist 221', 'vendor_id': 2, 'subaccount_id': 2 } ] } mock_notifications = [ { 'feed_name': config.FEED_NAME, 'feed_id': 'vendor_1', 'payload': { 'actor': 'The Orchard Activity Detector', 'verb': 'Detected', 'object': 'Approved Releases', 'approved_releases': mock_releases_by_label['vendor_1'] } }, { 'feed_name': config.FEED_NAME, 'feed_id': 'subaccount_1', 'payload': { 'actor': 'The Orchard Activity Detector', 'verb': 'Detected', 'object': 'Approved Releases', 'approved_releases': mock_releases_by_label['subaccount_1'] } }, { 'feed_name': config.FEED_NAME, 'feed_id': 'vendor_2', 'payload': { 'actor': 'The Orchard Activity Detector', 'verb': 'Detected', 'object': 'Approved Releases', 'approved_releases': mock_releases_by_label['vendor_2'] } }, { 'feed_name': config.FEED_NAME, 'feed_id': 'subaccount_2', 'payload': { 'actor': 'The Orchard Activity Detector', 'verb': 'Detected', 'object': 'Approved Releases', 'approved_releases': mock_releases_by_label['subaccount_2'] } } ] def test_detect_ingest_releases(monkeypatch): """Test detect_ingested_releases.""" mock_create_notifications = MagicMock() monkeypatch.setattr( tasks, 'get_ingested_releases', MagicMock(return_value=mock_releases) ) monkeypatch.setattr( tasks, 'group_releases', MagicMock(return_value=mock_releases_by_label) ) monkeypatch.setattr( tasks, 'create_notifications', mock_create_notifications ) # Patch asyncio.new_event_loop() with a MagicMock with patch('asyncio.new_event_loop', return_value=MagicMock()): tasks.detect_ingested_releases(None) tasks.get_ingested_releases.assert_called_once() tasks.group_releases.assert_called_once_with(mock_releases) mock_create_notifications.assert_called_once_with(mock_releases_by_label) @freeze_time('2020-01-01') @patch('activity_detector.flows.release_approval.tasks.ar_db_session') def test_get_ingested_releases(mock_session): """Test get_ingested_releases.""" mock_session.return_value.__enter__.return_value.execute.\ return_value.fetchall.return_value = mock_releases result = tasks.get_ingested_releases() mock_session.return_value.__enter__.return_value.execute.\ assert_called_once_with( tasks.GET_INGESTED_RELEASES.format(day='2019-12-31')) assert result == mock_releases def test_group_releases(): """Test group_releases.""" result = tasks.group_releases(mock_releases) assert result == mock_releases_by_label def test_create_notifications(monkeypatch): """Test create_notifications.""" mock_create_ows_notification = MagicMock() monkeypatch.setattr( tasks.ows_notifications, 'create_notification', mock_create_ows_notification ) multiplied_data = dict(mock_releases_by_label) # Generate more data to test a batch of two (more than 15 labels) for i in range(3, 10): multiplied_data[f'vendor_{i}'] = multiplied_data[f'vendor_{i % 2 + 1}'] multiplied_data[f'subaccount_{i}'] = multiplied_data[f'subaccount_{i % 2 + 1}'] def mock_create_batched_notifications(notifications): for notification in notifications: tasks.ows_notifications.create_notification(notification) monkeypatch.setattr( tasks, 'create_batched_notifications', mock_create_batched_notifications ) loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) loop.run_until_complete(tasks.create_notifications(multiplied_data)) loop.close() # Check the number of notifications in mock_create_ows_notification assert mock_create_ows_notification.call_count == 18