"""Tests for Alooma CodeEngine code.""" import json import pytest from codeengine import awsconfig from codeengine import main @pytest.fixture def track_event(): """Mock track table event.""" return { 'id': 123, 'name': 'Under The Bridge', '_metadata': { 'event_type': 'track', 'type': 'update-insert', 'deleted': False, 'table': 'track' } } @pytest.fixture def other_event(): """Mock other table event.""" return { 'id': 222, 'product_name': 'Californication', '_metadata': { 'event_type': 'product', 'type': 'update-insert', 'deleted': False, 'table': 'track' } } @pytest.fixture def update_delete_event(track_event): """Mock update-delete fixture.""" event = track_event.copy() event['_metadata']['type'] = 'update-delete' return event @pytest.fixture def converted_track_event(): """Mock converted track table event.""" return { 'data': { 'id': 123, 'name': 'Under The Bridge' }, 'table': 'track', 'type': 'update' } @pytest.fixture def mock_aws_client(mocker): """Patch lambda client.""" client_mock = mocker.patch.object(main, 'client') return client_mock @pytest.fixture() def mock_aws_client_success(mock_aws_client): """Mock successful response from AWS client.""" mock_aws_client.invoke.return_value = {'StatusCode': 200} return mock_aws_client @pytest.fixture() def mock_aws_client_failed(mock_aws_client): """Mock failed response from AWS client.""" mock_aws_client.invoke.return_value = {'StatusCode': 500} return mock_aws_client def test_send_to_cloudsearch(track_event, mock_aws_client_success): """Test successful submit of an event to CloudSearch.""" result = main.send_to_cloudsearch(track_event) assert result == 200 def test_send_to_cloudsearch_failed(track_event, mock_aws_client_failed): """Test failed submit of an event to CloudSearch.""" result = main.send_to_cloudsearch(track_event) assert result == 500 def test_transform_track( mocker, track_event, converted_track_event, mock_aws_client_success): """Test successful invocation of transform function with track event.""" mocker.spy(main, 'send_to_cloudsearch') mocker.spy(main, 'convert_event') result = main.transform(track_event) main.send_to_cloudsearch.assert_called_with(track_event) main.convert_event.assert_called_with(track_event) mock_aws_client_success.invoke.assert_called() invoke_args = mock_aws_client_success.invoke.call_args[1] payload = json.loads(invoke_args['Payload']) assert payload == converted_track_event assert result is None def test_transform_track_failed(mocker, track_event, mock_aws_client_failed): """Test failed invocation of transform function with track event.""" mocker.spy(main, 'send_to_cloudsearch') with pytest.raises(Exception, match=main.ERROR_MESSAGE): main.transform(track_event) main.send_to_cloudsearch.assert_called_with(track_event) def test_transform_other_event(mocker, other_event, mock_aws_client_success): """Test the invocation of transform function with other event.""" mocker.spy(main, 'send_to_cloudsearch') result = main.transform(other_event) main.send_to_cloudsearch.assert_not_called() assert result is None def test_transform_update_delete_event(mocker, update_delete_event): """Test the invocation of transform function with update-delete event.""" mocker.spy(main, 'send_to_cloudsearch') result = main.transform(update_delete_event) main.send_to_cloudsearch.assert_not_called() assert result is None def test_convert_event(track_event, converted_track_event): """Test convert event.""" res = main.convert_event(track_event) assert res == converted_track_event @pytest.mark.parametrize('source_type, deleted, converted_type', [ ('insert', False, 'insert'), ('update-insert', False, 'update'), ('update', False, 'update'), ('deleted', True, 'delete') ]) def test_convert_event_type(source_type, deleted, converted_type): """Test convert alooma event type to maxwell event type.""" event_metadata = {'type': source_type, 'deleted': deleted} converted = main.convert_event_type(event_metadata) assert converted == converted_type