"""Lambda test module.""" from unittest.mock import MagicMock from unittest.mock import patch from kafka.errors import UnknownTopicOrPartitionError import marshmallow.exceptions import pytest from owsresponse import response from src import app from src import constants @pytest.mark.parametrize( 'test_event,expected_result', [ ([{'test_id': 1, 'test_name': 'testname'}], {'test_id': 1, 'test_name': 'testname'}), ([{'test_id': 1, 'test_name': 'testname'}, {'test_id': None, 'test_name': None}], {'test_id': 1, 'test_name': 'testname'}), ([{'test_id': None, 'test_name': 'testname'}, {'test_id': 1, 'test_name': None}], {'test_id': 1, 'test_name': 'testname'}) ]) def test__merge_dicts_from_parallel_branches(test_event, expected_result): """Test _merge_dicts_from_parallel_branches.""" assert app._merge_dicts_from_parallel_branches(test_event) == expected_result @pytest.mark.parametrize( 'input_dict,expected_result', [ ({'spotify_followers': 5000, 'spotify_monthly_listeners': 5000}, {'score': 'Review', # TODO TEMPORARY for PLATFORM-3390 'message': None}), ({'spotify_followers': 1000000, 'spotify_monthly_listeners': 1000000}, {'score': 'Review', 'message': constants.COMMENTS_EXCEEDED_UPPER_BOUND}), ({'spotify_followers': 10, 'spotify_monthly_listeners': 10000}, {'score': 'Review', 'message': None}), ({'spotify_followers': 1000000, 'spotify_monthly_listeners': None}, {'score': 'Review', 'message': constants.COMMENTS_EXCEEDED_UPPER_BOUND}), ({'spotify_followers': 15, 'spotify_monthly_listeners': 25000}, {'score': 'Review', 'message': None}), ({'spotify_followers': 100, 'spotify_monthly_listeners': 75000, 'country': 'TUR'}, {'score': 'Reject', 'message': 'Access has been rejected.'}), ({'spotify_followers': 100, 'spotify_monthly_listeners': 75000, 'country': 'NOR'}, {'score': 'Review', # TODO TEMPORARY for PLATFORM-3719 'message': constants.COMMENTS_NON_REFERRAL}), ({'spotify_followers': 1000000, 'spotify_monthly_listeners': 10000, 'label_participants': 'some_id'}, {'score': 'Review', 'message': constants.COMMENTS_EXISTING_LABEL}), ({'spotify_followers': 100, 'spotify_monthly_listeners': 75000, 'country': 'NOR', 'comment': 'test'}, {'score': 'Review', 'message': 'There is an existing comment for this artist'}), ] ) @patch('src.app.ows_blacklist_manager') def test__calculate_score(mock_ows_blacklist, input_dict, expected_result): """Test _calculate_score.""" mock_ows_blacklist.validate_blacklist.return_value = response.Response() assert app._calculate_score(**input_dict)['score'] == expected_result['score'] assert app._calculate_score(**input_dict)['message'] == expected_result['message'] @pytest.mark.parametrize( 'input_dict,blacklist_result,expected_result', [ ( { 'spotify_followers': 5000, 'spotify_monthly_listeners': 5000 }, response.Response(), { 'score': 'Review', # TODO TEMPORARY for PLATFORM-3390 'message': None } ), ( { 'spotify_followers': 5000, 'spotify_monthly_listeners': 5000 }, response.Response(status=400), { 'score': 'Review', 'message': constants.COMMENTS_BLOCKED_ARTIST } ), ( { 'spotify_followers': 100000, 'spotify_monthly_listeners': 10000 }, response.Response(status=500), { 'score': 'Review', 'message': None } ), ]) @patch('src.app.ows_blacklist_manager') def test__calculate_score_blacklist( mock_ows_blacklist, input_dict, blacklist_result, expected_result): """Test _calculate_score with blacklist check.""" mock_ows_blacklist.validate_blacklist.return_value = blacklist_result assert app._calculate_score(**input_dict)['score'] == expected_result['score'] assert app._calculate_score(**input_dict)['message'] == expected_result['message'] @patch('src.app.ows_blacklist_manager') @patch('src.app.KafkaProducer') @patch('src.app.logger') def test__send_message(mock_logger, mock_producer, mock_ows_blacklist, mock_processed_event): """Test _send_message.""" producer_instance = MagicMock() mock_producer.return_value = producer_instance mock_ows_blacklist.validate_blacklist.return_value = response.Response() app._send_message( mock_processed_event, 'test_sf_id', 'test_correlation_id') mock_producer.assert_called_with( bootstrap_servers=None, security_protocol='SSL', client_id='test-lambda-gda-calculate-score', linger_ms=0, api_version='2.6.0' ) assert producer_instance.send.call_count == 1 assert producer_instance.flush.call_count == 1 @patch('src.app.ows_blacklist_manager') @patch('src.app.KafkaProducer') @patch('src.app.logger') def test__send_message_corrupted_event( mock_logger, mock_producer, mock_ows_blacklist, mock_processed_event): """Test _send_message.""" mock_processed_event.update({'UnexpectedField': 'error!s'}) producer_instance = MagicMock() mock_producer.return_value = producer_instance mock_ows_blacklist.validate_blacklist.return_value = response.Response() with pytest.raises(marshmallow.exceptions.ValidationError): app._send_message( mock_processed_event, 'test_sf_id', 'test_correlation_id') producer_instance.send.assert_not_called() mock_logger.error.assert_called_with( "Schema validation in gda_calculate_score lambda has failed" "with the following errors: {'UnexpectedField': ['Unknown field.']}") @patch('src.app.ows_blacklist_manager') @patch('src.app.KafkaProducer') @patch('src.app.logger') def test_handler_success( mock_logger, mock_producer, mock_ows_blacklist, mock_event, mock_processed_event): """Test handler function successful.""" producer_instance = MagicMock() mock_producer.return_value = producer_instance mock_ows_blacklist.validate_blacklist.return_value = response.Response() assert mock_processed_event == app.handler(mock_event, None) expected_headers = [ (constants.ID_HEADER, "bahsdfj23412k4jkasdfhk124".encode()), (constants.CORRELATION_ID_HEADER, "3f3ef5f5-9b52-4e19-81d5-db56b9c55a65".encode()) ] actual_topic, actual_data = producer_instance.send.call_args.args actual_headers = producer_instance.send.call_args.kwargs['headers'] producer_instance.send.assert_called() assert actual_topic == 'event.gdaSignup' assert actual_headers == expected_headers producer_instance.flush.assert_called() @patch('src.app.ows_blacklist_manager') @patch('src.app.KafkaProducer') @patch('src.app.logger') def test_handler_failure( mock_logger, mock_producer, mock_ows_blacklist, mock_event, mock_processed_event): """Test handler function failure.""" producer_instance = MagicMock() mock_producer.return_value = producer_instance producer_instance.send.side_effect = UnknownTopicOrPartitionError mock_ows_blacklist.validate_blacklist.return_value = response.Response() with pytest.raises(UnknownTopicOrPartitionError): app.handler(mock_event, None) mock_logger.exception.assert_called_with('[Error 3] UnknownTopicOrPartitionError') @patch('src.app.ows_blacklist_manager') @patch('src.app.voucherify_manager') @patch('src.app.KafkaProducer') @patch('src.app.logger') def test_handler_success_voucherify( mock_logger, mock_producer, mock_voucherify, mock_ows_blacklist, mock_event_voucherify, mock_processed_event_voucherify): """Test handler function successful.""" producer_instance = MagicMock() mock_producer.return_value = producer_instance mock_ows_blacklist.validate_blacklist.return_value = response.Response() validate_value = { 'valid': True, 'voucher_code_owner': 'voucher_code_owner@theorchard.com' } mock_voucherify.validate_voucher = MagicMock(return_value=validate_value) assert mock_processed_event_voucherify == app.handler(mock_event_voucherify, None)