def test_add_service_setting(self, mock_add_permitted_arns): interface = { 'InterfaceId': 'gem_test-interface_1_0_0', 'InterfaceUrl': 'test-interface-url', 'InterfaceSwagger': 'test-interface-swagger' } stack = mock.MagicMock(name='stack') service_directory = mock.MagicMock(name='ServiceDirectory') service_directory.get_interface_services.return_value = [interface] props = properties.load( self.event, LambdaConfigurationResourceHandler.PROPERTIES_SCHEMA) services = props.Services service = services[0] service_settings = {} permitted_arns = [] LambdaConfigurationResourceHandler._add_service_settings( stack, service_directory, service, service_settings, permitted_arns) service_directory.get_interface_services.assert_not_called() # If the interface is not from CloudGemFramework it should not be added here # Non-project interface references live in the lambda environment variables self.assertEquals(service_settings, {})
def test_add_service_setting(self, mock_add_permitted_arns): interface = { 'InterfaceId': 'gem_test-interface_1_0_0', 'InterfaceUrl': 'test-interface-url', 'InterfaceSwagger': 'test-interface-swagger' } stack = mock.MagicMock(name='stack') service_directory = mock.MagicMock(name='ServiceDirectory') service_directory.get_interface_services.return_value = [interface] props = properties.load( self.event, LambdaConfigurationResourceHandler.PROPERTIES_SCHEMA) services = props.Services service = services[0] service_settings = {} permitted_arns = [] LambdaConfigurationResourceHandler._add_service_settings( stack, service_directory, service, service_settings, permitted_arns) service_directory.get_interface_services.assert_called_once_with( stack.deployment.deployment_name, service.InterfaceId) self.assertEquals(service_settings[service.InterfaceId], interface) mock_add_permitted_arns.assert_called_once_with( stack, interface, permitted_arns)
def test_add_permitted_arns(self, mock_parse_interface_url): stack = mock.MagicMock(name='stack') stack.account_id = 'test-account-id' valid_operations = [ 'get', 'put', 'delete', 'post', 'head', 'options', 'patch', 'trace' ] invalid_operations = ['foo', 'bar'] all_operations = [] all_operations.extend(valid_operations) all_operations.extend(invalid_operations) paths = ['/path/a', '/path/b'] swagger = { 'paths': { path: {operation: {} for operation in all_operations} for path in paths } } interface = { 'InterfaceId': 'test-interface-id', 'InterfaceUrl': 'test-interface-url', 'InterfaceSwagger': json.dumps(swagger) } actual_permitted_arns = [] interface_url_parts = LambdaConfigurationResourceHandler.InterfaceUrlParts( api_id='test-app-id', region='test-region', stage_name='test-stage', path='test-interface-path') mock_parse_interface_url.return_value = interface_url_parts LambdaConfigurationResourceHandler._add_permitted_arns( stack, interface, actual_permitted_arns) expected_permitted_arns = [ 'arn:aws:execute-api:{region}:{account_id}:{api_id}/{stage_name}/{HTTP_VERB}/{interface_path}/*' .format(region=interface_url_parts.region, account_id=stack.account_id, api_id=interface_url_parts.api_id, stage_name=interface_url_parts.stage_name, HTTP_VERB=operation.upper(), interface_path=interface_url_parts.path) for operation in valid_operations for path in paths ] self.assertEquals(actual_permitted_arns, AnyOrderListMatcher(expected_permitted_arns))
def test_handler_update(self): self.event['RequestType'] = 'Update' self.event['PhysicalResourceId'] = 'TestStack-TestLogicalResourceId' expected_data = { 'ConfigurationBucket': 'TestBucket', 'ConfigurationKey': 'TestKey/lambda-function-code.zip', 'Runtime': 'TestRuntime', 'Role': 'TestRole' } expected_physical_id = self.event['PhysicalResourceId'] + "::{}" with mock.patch.object( custom_resource_response, 'succeed') as mock_custom_resource_handler_response_succeed: with mock.patch.object(role_utils, 'get_access_control_role_arn' ) as mock_get_access_control_role_arn: mock_get_access_control_role_arn.return_value = expected_data[ 'Role'] with mock.patch.object( LambdaConfigurationResourceHandler, '_inject_settings') as mock_inject_settings: with mock.patch.object(LambdaConfigurationResourceHandler, '_add_built_in_settings' ) as mock_add_built_in_settings: with mock.patch.object( LambdaConfigurationResourceHandler, '_get_input_key') as mock_get_input_key: mock_get_input_key.return_value = '{}/lambda-function-code.zip'.format( self.event['ResourceProperties'] ['ConfigurationKey']) mock_inject_settings.return_value = expected_data[ 'ConfigurationKey'] LambdaConfigurationResourceHandler.handler( self.event, self.context) mock_custom_resource_handler_response_succeed.assert_called_once_with( self.event, self.context, expected_data, expected_physical_id) mock_get_access_control_role_arn.assert_called_once_with( {}, self.event['ResourceProperties'] ['FunctionName']) mock_inject_settings.assert_called_once_with( self.event['ResourceProperties']['Settings'], self.event['ResourceProperties']['Runtime'], self.event['ResourceProperties'] ['ConfigurationBucket'], '{}/lambda-function-code.zip'.format( self.event['ResourceProperties'] ['ConfigurationKey']), 'TestFunction') mock_add_built_in_settings.assert_called_once_with( self.event['ResourceProperties']['Settings'], self.event['StackId'])
def test_add_cgf_service_setting(self, mock_add_permitted_arns): interface = { 'InterfaceId': 'CloudGemFramework_test_1_0_0', 'InterfaceUrl': 'test-interface-url', 'InterfaceSwagger': 'test-interface-swagger' } event = { 'ResourceProperties': { 'ConfigurationBucket': 'TestBucket', 'ConfigurationKey': 'TestInputKey', 'FunctionName': 'TestFunction', 'Runtime': 'TestRuntime', 'Settings': { 'TestSettingKey1': 'TestSettingValue1', 'TestSettingKey2': 'TestSettingValue2' }, 'Services': [{ "InterfaceId": "CloudGemFramework_test_1_0_0", "Optional": True }, { "InterfaceId": "Gem_TestInterface2_1_0_0", "Optional": True }] }, 'StackId': 'arn:aws:cloudformation:TestRegion:TestAccount:stack/TestStack/TestUUID', 'LogicalResourceId': 'TestLogicalResourceId' } stack = mock.MagicMock(name='stack') service_directory = mock.MagicMock(name='ServiceDirectory') service_directory.get_interface_services.return_value = [interface] props = properties.load( event, LambdaConfigurationResourceHandler.PROPERTIES_SCHEMA) services = props.Services service = services[0] service_settings = {} permitted_arns = [] LambdaConfigurationResourceHandler._add_service_settings( stack, service_directory, service, service_settings, permitted_arns) # For CloudGemFramework_* interfaces this should be called and service_settings should be populated service_directory.get_interface_services.assert_called_once() self.assertEquals(service_settings[service.InterfaceId], interface)
def test_inject_settings_python(self): expected_settings = self.event['ResourceProperties']['Settings'] expected_zip_name = 'cgf_lambda_settings/settings.json' zip_file = zipfile.ZipFile(StringIO.StringIO(), 'w') LambdaConfigurationResourceHandler._inject_settings_python( zip_file, expected_settings) with zip_file.open(expected_zip_name, 'r') as zip_content_file: actual_settings = json.load(zip_content_file) self.assertEquals(expected_settings, actual_settings)
def test_inject_settings_python(self): expected_settings = self.event['ResourceProperties']['Settings'] expected_zip_name = 'CloudCanvas/settings.py' zip_file = zipfile.ZipFile(StringIO.StringIO(), 'w') LambdaConfigurationResourceHandler._inject_settings_python(zip_file, expected_settings) with zip_file.open(expected_zip_name, 'r') as zip_content_file: globals = {} exec(zip_content_file.read(), globals) actual_settings = globals['settings'] self.assertEquals(expected_settings, actual_settings)
def test_inject_settings_nodejs(self): expected_settings = self.event['ResourceProperties']['Settings'] expected_zip_name = 'CloudCanvas/settings.js' zip_file = zipfile.ZipFile(StringIO.StringIO(), 'w') LambdaConfigurationResourceHandler._inject_settings_nodejs(zip_file, expected_settings) with zip_file.open(expected_zip_name, 'r') as zip_content_file: content = zip_content_file.read() print content self.assertTrue('TestSettingKey1' in content) self.assertTrue('TestSettingValue1' in content) self.assertTrue('TestSettingKey2' in content) self.assertTrue('TestSettingValue2' in content)
def test_inject_settings(self): with mock.patch.object(boto3, 'client') as mock_boto3_client: zip_content = StringIO.StringIO() zip_file = zipfile.ZipFile(zip_content, 'w') zip_file.close() mock_body = mock.MagicMock() mock_body.read = mock.MagicMock(return_value=zip_content.getvalue()) mock_s3_client = mock_boto3_client.return_value mock_s3_client.get_object = mock.MagicMock(return_value={'Body': mock_body}) mock_s3_client.put_object = mock.MagicMock() reload(LambdaConfigurationResourceHandler) # so it uses mocked methods settings = self.event['ResourceProperties']['Settings'] runtime = self.event['ResourceProperties']['Runtime'] bucket = self.event['ResourceProperties']['ConfigurationBucket'] input_key = self.event['ResourceProperties']['ConfigurationKey'] function_name = self.event['ResourceProperties']['FunctionName'] mock_injector = mock.MagicMock() LambdaConfigurationResourceHandler._SETTINGS_INJECTORS[runtime] = mock_injector output_key = LambdaConfigurationResourceHandler._inject_settings(settings, runtime, bucket, input_key, function_name) mock_boto3_client.assert_called_with('s3') mock_s3_client.get_object.assert_called_once_with(Bucket=bucket, Key=input_key) mock_injector.assert_called_once_with(AnyZipFileObject(), settings) mock_s3_client.put_object.assert_called_once_with(Bucket='TestBucket', Key=output_key, Body=AnyValidZipFileContent())
def test_handler_delete(self, mock_delete_role, mock_custom_resource_handler_response_succeed): self.event['RequestType'] = 'Delete' self.event['PhysicalResourceId'] = 'TestStack-TestLogicalResourceId' expected_data = {} expected_physical_id = self.event['PhysicalResourceId'] + "::{}" LambdaConfigurationResourceHandler.handler(self.event, self.context) mock_custom_resource_handler_response_succeed.assert_called_once_with( self.event, self.context, expected_data, expected_physical_id) mock_delete_role.assert_called_once_with( {}, self.event['ResourceProperties']['FunctionName'])
def test_handler_delete(self): self.event['RequestType'] = 'Delete' self.event['PhysicalResourceId'] = 'TestStack-TestLogicalResourceId' expected_data = {} expected_physical_id = self.event['PhysicalResourceId'] with mock.patch.object(custom_resource_response, 'succeed') as mock_custom_resource_response_succeed: with mock.patch.object(role_utils, 'delete_role') as mock_delete_role: LambdaConfigurationResourceHandler.handler(self.event, self.context) mock_custom_resource_response_succeed.assert_called_once_with(self.event, self.context, expected_data, expected_physical_id) mock_delete_role.assert_called_once_with( self.event['StackId'], self.event['LogicalResourceId'], LambdaConfigurationResourceHandler.POLICY_NAME)
def test_get_settings_injector(self): python_injector = LambdaConfigurationResourceHandler._SETTINGS_INJECTORS.get( 'python') self.assertIsNotNone(python_injector) nodejs_injector = LambdaConfigurationResourceHandler._SETTINGS_INJECTORS.get( 'nodejs') self.assertIsNotNone(nodejs_injector) self.assertIs( python_injector, LambdaConfigurationResourceHandler._get_settings_injector( 'python2.7')) self.assertIs( nodejs_injector, LambdaConfigurationResourceHandler._get_settings_injector( 'nodejs4.3')) self.assertIs( nodejs_injector, LambdaConfigurationResourceHandler._get_settings_injector( 'nodejs')) # legacy support self.assertIs( python_injector, LambdaConfigurationResourceHandler._get_settings_injector( 'python999')) self.assertIs( nodejs_injector, LambdaConfigurationResourceHandler._get_settings_injector( 'nodejs999')) with self.assertRaises(RuntimeError): LambdaConfigurationResourceHandler._get_settings_injector( 'something')
def test_handler_create(self): self.event['RequestType'] = 'Create' expected_data = { 'ConfigurationBucket': 'TestBucket', 'ConfigurationKey': 'TestOutputKey', 'Runtime': 'TestRuntime', 'Role': 'TestRole' } expected_physical_id = 'TestStack-TestLogicalResourceId' with mock.patch.object( custom_resource_response, 'succeed') as mock_custom_resource_response_succeed: with mock.patch.object(role_utils, 'create_role') as mock_create_role: mock_create_role.return_value = expected_data['Role'] with mock.patch.object( LambdaConfigurationResourceHandler, '_inject_settings') as mock_inject_settings: mock_inject_settings.return_value = expected_data[ 'ConfigurationKey'] LambdaConfigurationResourceHandler.handler( self.event, self.context) mock_custom_resource_response_succeed.assert_called_once_with( self.event, self.context, expected_data, expected_physical_id) mock_create_role.assert_called_once_with( self.event['StackId'], self.event['LogicalResourceId'], LambdaConfigurationResourceHandler.POLICY_NAME, 'lambda.amazonaws.com', LambdaConfigurationResourceHandler. DEFAULT_POLICY_STATEMENTS, AnyFunction()) mock_inject_settings.assert_called_once_with( self.event['ResourceProperties']['Settings'], self.event['ResourceProperties']['Runtime'], self.event['ResourceProperties'] ['ConfigurationBucket'], '{}/lambda-function-code.zip'.format( self.event['ResourceProperties'] ['ConfigurationKey']), 'TestFunction')
def test_handler_delete(self): self.event['RequestType'] = 'Delete' self.event['PhysicalResourceId'] = 'TestStack-TestLogicalResourceId' expected_data = {} expected_physical_id = self.event['PhysicalResourceId'] + "::{}" with mock.patch.object( custom_resource_response, 'succeed') as mock_custom_resource_handler_response_succeed: with mock.patch.object( role_utils, 'delete_access_control_role') as mock_delete_role: LambdaConfigurationResourceHandler.handler( self.event, self.context) mock_custom_resource_handler_response_succeed.assert_called_once_with( self.event, self.context, expected_data, expected_physical_id) mock_delete_role.assert_called_once_with( {}, self.event['ResourceProperties']['FunctionName'])
def test_add_services_setting_with_no_services(self): del self.event['ResourceProperties']['Services'] props = properties.load( self.event, LambdaConfigurationResourceHandler.PROPERTIES_SCHEMA) settings = props.Settings.__dict__ services = props.Services stack = mock.MagicMock('stack') actual_permittd_arns = LambdaConfigurationResourceHandler._add_services_settings( settings, services, stack) self.assertEquals(actual_permittd_arns, [])
def test_add_services_settings(self, mock_ServiceDirectory, mock_add_service_settings): props = properties.load( self.event, LambdaConfigurationResourceHandler.PROPERTIES_SCHEMA) settings = props.Settings.__dict__ services = props.Services stack = mock.MagicMock(name='stack') actual_permitted_arns = LambdaConfigurationResourceHandler._add_services_settings( stack, settings, services) self.assertEquals(actual_permitted_arns, []) mock_ServiceDirectory.assert_called_once_with( stack.project.configuration_bucket) mock_add_service_settings.assert_has_calls([ mock.call(stack, mock_ServiceDirectory.return_value, service, settings['Services'], actual_permitted_arns) for service in services ])
def test_handler_create(self, mock_StackInfoManager, mock_add_service_access_policy_to_role, mock_add_services_settings, mock_get_input_key, mock_get_project_service_lambda_arn, mock_add_built_in_settings, mock_inject_settings, mock_get_access_control_role_name, mock_create_role, mock_custom_resource_handler_response_succeed): mock_get_stack_info = mock_StackInfoManager.return_value.get_stack_info self.event['RequestType'] = 'Create' expected_data = { 'ConfigurationBucket': 'TestBucket', 'ConfigurationKey': 'TestOutputKey', 'Runtime': 'TestRuntime', 'Role': 'TestRole', 'RoleName': 'TestRoleName', 'ComposedLambdaConfiguration': { 'Code': { 'S3Bucket': 'TestBucket', 'S3Key': 'TestOutputKey' }, 'Role': 'TestRole', 'Runtime': 'TestRuntime' } } expected_physical_id = 'TestStack-TestLogicalResourceId::{}' mock_create_role.return_value = expected_data['Role'] mock_get_access_control_role_name.return_value = expected_data[ 'RoleName'] mock_get_input_key.return_value = '{}/lambda-function-code.zip'.format( self.event['ResourceProperties']['ConfigurationKey']) mock_inject_settings.return_value = expected_data['ConfigurationKey'] mock_get_project_service_lambda_arn.return_value = None LambdaConfigurationResourceHandler.handler(self.event, self.context) mock_custom_resource_handler_response_succeed.assert_called_once_with( self.event, self.context, expected_data, expected_physical_id) mock_create_role.assert_called_once_with( mock_StackInfoManager.return_value, {}, self.event['StackId'], self.event['ResourceProperties']['FunctionName'], 'lambda.amazonaws.com', default_policy=LambdaConfigurationResourceHandler. get_default_policy(None)) mock_inject_settings.assert_called_once_with( self.event['ResourceProperties']['Settings'], self.event['ResourceProperties']['Runtime'], self.event['ResourceProperties']['ConfigurationBucket'], '{}/lambda-function-code.zip'.format( self.event['ResourceProperties']['ConfigurationKey']), 'TestFunction') mock_add_built_in_settings.assert_called_once_with( self.event['ResourceProperties']['Settings'], mock_get_stack_info.return_value) mock_get_project_service_lambda_arn.assert_called_once_with( mock_get_stack_info.return_value) mock_get_stack_info.assert_called_once_with(self.event['StackId']) mock_add_services_settings.assert_called_once_with( mock_get_stack_info.return_value, self.event['ResourceProperties']['Settings'], [ PropertiesMatcher(i) for i in self.event['ResourceProperties']['Services'] ]) mock_add_service_access_policy_to_role.assert_called_once_with( expected_data['Role'], mock_add_services_settings.return_value)
def test_integration_inject_settings_python(self): # we need both the s3 client below and the one created by the # custom resource handler to use this region boto3.setup_default_session(region_name=TEST_REGION) reload(LambdaConfigurationResourceHandler) # reset global s3 client object s3 = boto3.client('s3') bucket = 'lmbr_aws_settings_test_' + str(int(time() * 1000)) input_key = 'TestKey/lambda-function-code.zip' output_key = None s3.create_bucket(Bucket=bucket) try: zip_content = StringIO.StringIO() with zipfile.ZipFile(zip_content, 'w') as zip_file: zip_file.writestr('InitialName', 'InitialContent') body = zip_content.getvalue() s3.put_object(Bucket=bucket, Key=input_key, Body=body) zip_content.close() sleep(10) # seconds expected_settings = self.event['ResourceProperties']['Settings'] runtime = 'python2.7' function_name = 'TestFunction' output_key = LambdaConfigurationResourceHandler._inject_settings(expected_settings, runtime, bucket, input_key, function_name) expected_zip_name = 'CloudCanvas/settings.py' sleep(10) # seconds print 'output_key', output_key print 'bucket', bucket res = s3.get_object(Bucket=bucket, Key=output_key) body = res['Body'].read() zip_content = StringIO.StringIO(body) with zipfile.ZipFile(zip_content, 'r') as zip_file: with zip_file.open('InitialName', 'r') as zip_content_file: actual_zip_content = zip_content_file.read() self.assertEquals('InitialContent', actual_zip_content) with zip_file.open(expected_zip_name, 'r') as zip_content_file: globals = {} exec(zip_content_file.read(), globals) actual_settings = globals['settings'] self.assertEquals(expected_settings, actual_settings) zip_content.close() finally: try: s3.delete_object(Bucket=bucket, Key=input_key) except Exception as e: print 'Error when deleting object {} from bucket {}: {}'.format(input_key, bucket, e) if output_key is not None: try: s3.delete_object(Bucket=bucket, Key=output_key) except Exception as e: print 'Error when deleting object {} from bucket {}: {}'.format(output_key, bucket, e) try: s3.delete_bucket(Bucket=bucket) except Exception as e: print 'Error when deleting bucket {}: {}'.format(bucket, e)
def test_integration_create_update_delete_role(self): with mock.patch.object(discovery_utils,'ResourceGroupInfo') as mock_ResourceGroupInfo: mock_ResourceGroupInfo.return_value.resource_group_name = 'TestGroup' mock_ResourceGroupInfo.return_value.deployment = mock.MagicMock() mock_ResourceGroupInfo.return_value.deployment.deployment_name = 'TestDeployment' mock_ResourceGroupInfo.return_value.deployment.project = mock.MagicMock() mock_ResourceGroupInfo.return_value.deployment.project.project_name = 'TestProject' with mock.patch.object(custom_resource_response, 'succeed') as mock_custom_resource_response_succeed: with mock.patch.object(LambdaConfigurationResourceHandler, '_inject_settings') as mock_inject_settings: mock_inject_settings.return_value = 'TestOutputConfigurationKey' stack_arn = self._create_role_test_stack() self.event['StackId'] = stack_arn try: capture_data = CaptureValue() capture_physical_resource_id = CaptureValue() # test create self.event['RequestType'] = 'Create' LambdaConfigurationResourceHandler.handler(self.event, self.context) mock_custom_resource_response_succeed.assert_called_once_with( self.event, self.context, capture_data, capture_physical_resource_id) created_role_arn = capture_data.value['Role'] self._validate_role(created_role_arn, stack_arn) # test update mock_custom_resource_response_succeed.reset_mock() self.event['RequestType'] = 'Update' self.event['PhysicalResourceId'] = capture_physical_resource_id.value LambdaConfigurationResourceHandler.handler(self.event, self.context) mock_custom_resource_response_succeed.assert_called_once_with( self.event, self.context, capture_data, capture_physical_resource_id) updated_role_arn = capture_data.value['Role'] self.assertEquals(created_role_arn, updated_role_arn) self._validate_role(updated_role_arn, stack_arn) # rest delete mock_custom_resource_response_succeed.reset_mock() self.event['RequestType'] = 'Delete' self.event['PhysicalResourceId'] = capture_physical_resource_id.value LambdaConfigurationResourceHandler.handler(self.event, self.context) mock_custom_resource_response_succeed.assert_called_once_with( self.event, self.context, capture_data, capture_physical_resource_id) self._validate_role_deleted(created_role_arn) finally: # self._delete_role_test_stack(stack_arn) pass
def test_handler_create(self): self.event['RequestType'] = 'Create' expected_data = { 'ConfigurationBucket': 'TestBucket', 'ConfigurationKey': 'TestOutputKey', 'Runtime': 'TestRuntime', 'Role': 'TestRole' } expected_physical_id = 'TestStack-TestLogicalResourceId::{}' with mock.patch.object( custom_resource_response, 'succeed') as mock_custom_resource_handler_response_succeed: with mock.patch.object( role_utils, 'create_access_control_role') as mock_create_role: mock_create_role.return_value = expected_data['Role'] with mock.patch.object( LambdaConfigurationResourceHandler, '_inject_settings') as mock_inject_settings: with mock.patch.object(LambdaConfigurationResourceHandler, '_add_built_in_settings' ) as mock_add_built_in_settings: with mock.patch.object( LambdaConfigurationResourceHandler, '_get_project_service_lambda_arn' ) as mock_get_project_service_lambda_arn: with mock.patch.object( LambdaConfigurationResourceHandler, '_get_input_key') as mock_get_input_key: mock_get_input_key.return_value = '{}/lambda-function-code.zip'.format( self.event['ResourceProperties'] ['ConfigurationKey']) mock_inject_settings.return_value = expected_data[ 'ConfigurationKey'] mock_get_project_service_lambda_arn.return_value = None LambdaConfigurationResourceHandler.handler( self.event, self.context) mock_custom_resource_handler_response_succeed.assert_called_once_with( self.event, self.context, expected_data, expected_physical_id) mock_create_role.assert_called_once_with( {}, self.event['StackId'], self.event['ResourceProperties'] ['FunctionName'], 'lambda.amazonaws.com', default_policy= LambdaConfigurationResourceHandler. get_default_policy(None)) mock_inject_settings.assert_called_once_with( self.event['ResourceProperties'] ['Settings'], self.event['ResourceProperties'] ['Runtime'], self.event['ResourceProperties'] ['ConfigurationBucket'], '{}/lambda-function-code.zip'.format( self.event['ResourceProperties'] ['ConfigurationKey']), 'TestFunction') mock_add_built_in_settings.assert_called_once_with( self.event['ResourceProperties'] ['Settings'], self.event['StackId']) mock_get_project_service_lambda_arn.assert_called_once_with( self.event['StackId'])
def test_handler_update(self, mock_StackInfoManager, mock_get_input_key, mock_add_built_in_settings, mock_inject_settings, mock_get_access_control_role_name, mock_get_access_control_role_arn, mock_custom_resource_handler_response_succeed): mock_get_stack_info = mock_StackInfoManager.return_value.get_stack_info self.event['RequestType'] = 'Update' self.event['PhysicalResourceId'] = 'TestStack-TestLogicalResourceId' expected_data = { 'CCSettings': { 'TestSettingKey1': 'TestSettingValue1', 'TestSettingKey2': 'TestSettingValue2' }, 'ConfigurationBucket': 'TestBucket', 'ConfigurationKey': 'TestKey/lambda-function-code.zip', 'Runtime': 'TestRuntime', 'Role': 'TestRole', 'RoleName': 'TestRoleName', 'ComposedLambdaConfiguration': { 'Environment': { 'Variables': { 'TestSettingKey1': 'TestSettingValue1', 'TestSettingKey2': 'TestSettingValue2' } }, 'Code': { 'S3Bucket': 'TestBucket', 'S3Key': 'TestKey/lambda-function-code.zip' }, 'Role': 'TestRole', 'Runtime': 'TestRuntime' } } expected_physical_id = self.event['PhysicalResourceId'] + "::{}" mock_get_access_control_role_arn.return_value = expected_data['Role'] mock_get_access_control_role_name.return_value = expected_data[ 'RoleName'] mock_get_input_key.return_value = '{}/lambda-function-code.zip'.format( self.event['ResourceProperties']['ConfigurationKey']) mock_inject_settings.return_value = expected_data['ConfigurationKey'] LambdaConfigurationResourceHandler.handler(self.event, self.context) mock_custom_resource_handler_response_succeed.assert_called_once_with( self.event, self.context, expected_data, expected_physical_id) mock_get_access_control_role_arn.assert_called_once_with( {}, self.event['ResourceProperties']['FunctionName']) mock_inject_settings.assert_called_once_with( self.event['ResourceProperties']['Settings'], self.event['ResourceProperties']['Runtime'], self.event['ResourceProperties']['ConfigurationBucket'], '{}/lambda-function-code.zip'.format( self.event['ResourceProperties']['ConfigurationKey']), 'TestFunction') mock_add_built_in_settings.assert_called_once_with( self.event['ResourceProperties']['Settings'], mock_get_stack_info.return_value) mock_get_stack_info.assert_called_once_with(self.event['StackId'])