"""Lambda test module.""" import datetime from unittest.mock import call from unittest.mock import patch from owsrequest.utils import mock_request import pytz from .data import trending_track_message from .data import playlist_placement_message from .data import social_spike_message with patch('src.models.getstream.GetStream._init_client'): from src import app @patch('src.models.getstream.GetStream.add_activity') @patch('src.models.getstream.GetStream.filter_activities') @patch('src.app.access_granted') @patch('src.app.format_messages') def test_handler( mock_messages, mock_access, mock_getstream_filter, mock_getstream_add, ): """Test handler data flow control.""" # add six messages to start submitted_messages = [ trending_track_message(x, 'InsightsProfile', x * 100) for x in range(0, 6) ] mock_messages.return_value = submitted_messages # return first 4 messages on GetStream filter processed_messages = submitted_messages[:4] mock_getstream_filter.return_value = processed_messages # add first 2 messages due to access check added_messages = submitted_messages[:2] mock_access.side_effect = [True, True, False, False] result = app.handler(None, None) assert result == { 'submitted': 6, 'processed': 4, 'added': 2, 'failed': 0 } assert mock_getstream_filter.call_args_list == [ call(submitted_messages) ] assert mock_access.call_args_list == [ call(processed_messages[0]), call(processed_messages[1]), call(processed_messages[2]), call(processed_messages[3]) ] assert mock_getstream_add.call_args_list == [ call(added_messages[0]), call(added_messages[1]) ] def test_format_messages(): """Test extract raw SQS records.""" event = { 'Records': [ { 'body': '{"event": {"id": 123, "time": "2019-06-15T17:00:09"}}' } ] } results = app.format_messages(event) assert results == [ { 'event': { 'id': 123, 'time': datetime.datetime( 2019, 6, 15, 17, 0, 9, tzinfo=pytz.utc ) } } ] @patch( 'src.models.graphql_router.profile_can_access_track', return_value='mock-result' ) def test_access_granted_trending_tracks(mock_check): """Test access check for trending track.""" message = trending_track_message(123, 'InsightsProfile', 456) isrc = message['event']['object']['track']['isrc'] track_id = message['event']['object']['track']['id'] mock_request.get( 'ows-users', '/profile/profile_id/456/profile_type/InsightsProfile/identity', {'id': 'uuid', 'email': 'foo@bar.com'} ) result = app.access_granted(message) assert mock_check.call_args_list == [ call('456', 'InsightsProfile', 'uuid', isrc, track_id) ] assert result == 'mock-result' @patch( 'src.models.graphql_router.profile_can_access_sound_recording', return_value='mock-result' ) def test_access_granted_playlist_placements(mock_check): """Test access check for playlist placement.""" message = playlist_placement_message(123, 'InsightsProfile', 456) isrc = message['event']['object']['sound_recording']['isrc'] mock_request.get( 'ows-users', '/profile/profile_id/456/profile_type/InsightsProfile/identity', {'id': 'uuid', 'email': 'foo@bar.com'} ) result = app.access_granted(message) assert mock_check.call_args_list == [ call('456', 'InsightsProfile', 'uuid', isrc) ] assert result == 'mock-result' def test_access_granted_social_spikes(): """Test access check social spike.""" mock_request.get( 'ows-users', '/profile/profile_id/456/profile_type/InsightsProfile/identity', {'id': 'uuid', 'email': 'foo@bar.com'} ) message = social_spike_message('twitter', 123, 'InsightsProfile', 456) result = app.access_granted(message) assert result message = social_spike_message('youtube', 123, 'InsightsProfile', 456) result = app.access_granted(message) assert result message = social_spike_message('instagram', 123, 'InsightsProfile', 456) result = app.access_granted(message) assert result