"""Lambda test module.""" import pytest from src import app import fixtures @pytest.fixture def transform_spy(mocker): """Create a spy for the transform function.""" return mocker.spy(app, 'transform') def test_handler(kafka_mock, transform_spy): """Test handler function.""" message1 = {'message': '1'} message2 = {'message': '2'} result = app.handler({'Records': [message1, message2]}, None) kafka_mock.assert_call_count('produce', 2) assert transform_spy.called assert result == {'status': 'OK'} @pytest.mark.parametrize('lambda_message, camel_connector_message, ignored_keys', [ ( fixtures.LAMBDA_INSERT_MESSAGE, fixtures.CAMEL_CONNECTOR_INSERT_MESSAGE, {'oldImage'} ), ( fixtures.LAMBDA_MODIFY_MESSAGE, fixtures.CAMEL_CONNECTOR_MODIFY_MESSAGE, {} ), ( fixtures.LAMBDA_REMOVE_MESSAGE, fixtures.CAMEL_CONNECTOR_REMOVE_MESSAGE, {'newImage'} ), ]) def test_transform(lambda_message, camel_connector_message, ignored_keys): """Test transform function. The test uses real messages generated by the DynamoDB Streams. The lambda messages is the input of this lambda function, and the camel connector message is the way how Camel connector produce messages to Kafka. """ transformed_lambda_message = app.transform(lambda_message) result = is_subset( camel_connector_message, transformed_lambda_message, ignore_keys=ignored_keys) assert result def is_subset(dict1, dict2, ignore_keys): """Recursively check that all keys and values in dict1 exist in dict2 (except the ignore keys).""" if isinstance(dict1, dict) and isinstance(dict2, dict): for key in dict1: if key in ignore_keys: continue if key not in dict2 or not is_subset(dict1[key], dict2[key], ignore_keys): return False return True elif isinstance(dict1, list) and isinstance(dict2, list): # Ensure all elements in dict1 exist in dict2 (order-independent) return all(any(is_subset(v1, v2, ignore_keys) for v2 in dict2) for v1 in dict1) else: return dict1 == dict2