def test_must_pass_custom_region(self, get_stacks_mock): invoke_context = InvokeContext("template_file", aws_region="my-custom-region") invoke_context._get_stacks() get_stacks_mock.assert_called_with( "template_file", parameter_overrides={"AWS::Region": "my-custom-region"})
def test_must_use_log_file_handle(self, StreamWriterMock, SamFunctionProviderMock, ExitMock): stream_writer_mock = Mock() StreamWriterMock.return_value = stream_writer_mock context = InvokeContext(template_file="template") context._get_stacks = Mock() context._get_stacks.return_value = [Mock()] context._get_env_vars_value = Mock() log_file_handle_mock = Mock() context._setup_log_file = Mock(return_value=log_file_handle_mock) container_manager_mock = Mock() context._get_container_manager = Mock( return_value=container_manager_mock) with patch.object(type(container_manager_mock), "is_docker_reachable", create=True, return_value=True): with context: stderr = context.stderr StreamWriterMock.assert_called_once_with( log_file_handle_mock, ANY) self.assertEqual(stream_writer_mock, stderr)
def test_must_not_enable_auto_flush_if_not_debug(self, SamFunctionProviderMock, StreamWriterMock, osutils_stderr_mock, ExitMock): context = InvokeContext(template_file="template") context._get_stacks = Mock() context._get_stacks.return_value = [Mock()] context._get_env_vars_value = Mock() context._setup_log_file = Mock() container_manager_mock = Mock() context._get_container_manager = Mock( return_value=container_manager_mock) with patch.object(type(container_manager_mock), "is_docker_reachable", create=True, return_value=True): with context: context.stderr StreamWriterMock.assert_called_once_with(ANY, False)
def test_must_raise_if_docker_is_not_reachable(self, SamFunctionProviderMock): invoke_context = InvokeContext("template-file") invoke_context._get_stacks = Mock() invoke_context._get_stacks.return_value = [Mock()] invoke_context._get_env_vars_value = Mock() invoke_context._setup_log_file = Mock() invoke_context._get_debug_context = Mock() container_manager_mock = Mock() with patch.object( type(container_manager_mock), "is_docker_reachable", create=True, new_callable=PropertyMock, return_value=False, ): invoke_context._get_container_manager = Mock() invoke_context._get_container_manager.return_value = container_manager_mock with self.assertRaises(InvokeContextException) as ex_ctx: invoke_context.__enter__() self.assertEqual( "Running AWS SAM projects locally requires Docker. Have you got it installed and running?", str(ex_ctx.exception), )
def test_must_use_container_manager_to_check_docker_connectivity( self, SamFunctionProviderMock): invoke_context = InvokeContext("template-file") invoke_context._get_stacks = Mock() invoke_context._get_stacks.return_value = [Mock()] invoke_context._get_env_vars_value = Mock() invoke_context._setup_log_file = Mock() invoke_context._get_debug_context = Mock() container_manager_mock = Mock() with patch.object( type(container_manager_mock), "is_docker_reachable", create=True, new_callable=PropertyMock, return_value=True, ) as is_docker_reachable_mock: invoke_context._get_container_manager = Mock() invoke_context._get_container_manager.return_value = container_manager_mock invoke_context.__enter__() is_docker_reachable_mock.assert_called_once_with()
def test_no_container_will_be_initialized_if_lazy_containers_is_enabled( self, SamFunctionProviderMock, ContainerManagerMock): function_provider = Mock() SamFunctionProviderMock.return_value = function_provider template_file = "template_file" env_vars_file = "env_vars_file" log_file = "log_file" invoke_context = InvokeContext( template_file=template_file, function_identifier="id", env_vars_file=env_vars_file, docker_volume_basedir="volumedir", docker_network="network", log_file=log_file, skip_pull_image=True, debug_ports=[1111], debugger_path="path-to-debugger", debug_args="args", parameter_overrides={}, aws_region="region", aws_profile="profile", warm_container_initialization_mode=ContainersInitializationMode. LAZY.value, debug_function="debug_function", shutdown=True, ) template_dict = "template_dict" stacks = [Stack("", "", template_file, Mock(), template_dict)] invoke_context._get_stacks = Mock() invoke_context._get_stacks.return_value = stacks env_vars_value = "env_vars_value" invoke_context._get_env_vars_value = Mock() invoke_context._get_env_vars_value.return_value = env_vars_value log_file_handle = "handle" invoke_context._setup_log_file = Mock() invoke_context._setup_log_file.return_value = log_file_handle debug_context_mock = Mock() invoke_context._get_debug_context = Mock() invoke_context._get_debug_context.return_value = debug_context_mock container_manager_mock = Mock() container_manager_mock.is_docker_reachable = True ContainerManagerMock.return_value = container_manager_mock # Call Enter method manually for testing purposes result = invoke_context.__enter__() self.assertTrue(result is invoke_context, "__enter__() must return self") self.assertEqual(invoke_context._function_provider, function_provider) self.assertEqual(invoke_context._env_vars_value, env_vars_value) self.assertEqual(invoke_context._log_file_handle, log_file_handle) self.assertEqual(invoke_context._debug_context, debug_context_mock) self.assertEqual(invoke_context._container_manager, container_manager_mock) self.assertEqual(invoke_context._containers_mode, ContainersMode.WARM) self.assertEqual(invoke_context._containers_initializing_mode, ContainersInitializationMode.LAZY) invoke_context._get_stacks.assert_called_once() SamFunctionProviderMock.assert_called_with(stacks) self.assertEqual(invoke_context._global_parameter_overrides, {"AWS::Region": "region"}) self.assertEqual(invoke_context._get_env_vars_value.call_count, 2) self.assertEqual(invoke_context._get_env_vars_value.call_args_list, [call(env_vars_file), call(None)]) invoke_context._setup_log_file.assert_called_with(log_file) invoke_context._get_debug_context.assert_called_once_with( [1111], "args", "path-to-debugger", "env_vars_value", "debug_function") ContainerManagerMock.assert_called_once_with( docker_network_id="network", skip_pull_image=True, do_shutdown_event=True)
def test_must_set_debug_function_if_warm_containers_enabled_no_debug_function_provided_and_template_contains_one_function( self, SamFunctionProviderMock, ContainerManagerMock): function_provider = Mock() function_provider.functions = {"function_name": ANY} SamFunctionProviderMock.return_value = function_provider template_file = "template_file" env_vars_file = "env_vars_file" container_env_vars_file = "container_env_vars_file" log_file = "log_file" invoke_context = InvokeContext( template_file=template_file, function_identifier="id", env_vars_file=env_vars_file, docker_volume_basedir="volumedir", docker_network="network", log_file=log_file, skip_pull_image=True, debug_ports=[1111], debugger_path="path-to-debugger", container_env_vars_file=container_env_vars_file, debug_args="args", parameter_overrides={}, aws_region="region", aws_profile="profile", warm_container_initialization_mode=ContainersInitializationMode. EAGER.value, debug_function="", shutdown=True, ) _initialize_all_functions_containers_mock = Mock() invoke_context._initialize_all_functions_containers = _initialize_all_functions_containers_mock template_dict = "template_dict" stacks = [ Stack("", "", template_file, invoke_context.parameter_overrides, template_dict) ] invoke_context._get_stacks = Mock() invoke_context._get_stacks.return_value = stacks invoke_context._get_env_vars_value = Mock( side_effect=["Env var value", "Debug env var value"]) log_file_handle = "handle" invoke_context._setup_log_file = Mock() invoke_context._setup_log_file.return_value = log_file_handle debug_context_mock = Mock() invoke_context._get_debug_context = Mock() invoke_context._get_debug_context.return_value = debug_context_mock container_manager_mock = Mock() container_manager_mock.is_docker_reachable = True ContainerManagerMock.return_value = container_manager_mock # Call Enter method manually for testing purposes result = invoke_context.__enter__() self.assertTrue(result is invoke_context, "__enter__() must return self") self.assertEqual(invoke_context._template_dict, template_dict) self.assertEqual(invoke_context._function_provider, function_provider) self.assertEqual(invoke_context._env_vars_value, "Env var value") self.assertEqual(invoke_context._container_env_vars_value, "Debug env var value") self.assertEqual(invoke_context._log_file_handle, log_file_handle) self.assertEqual(invoke_context._debug_context, debug_context_mock) self.assertEqual(invoke_context._container_manager, container_manager_mock) self.assertEqual(invoke_context._containers_mode, ContainersMode.WARM) self.assertEqual(invoke_context._containers_initializing_mode, ContainersInitializationMode.EAGER) invoke_context._get_stacks.assert_called_once() SamFunctionProviderMock.assert_called_with(stacks) self.assertEqual(invoke_context.parameter_overrides, {"AWS::Region": "region"}) self.assertEqual(invoke_context._get_env_vars_value.call_count, 2) self.assertEqual( invoke_context._get_env_vars_value.call_args_list, [call("env_vars_file"), call("container_env_vars_file")]) invoke_context._setup_log_file.assert_called_with(log_file) invoke_context._get_debug_context.assert_called_once_with( [1111], "args", "path-to-debugger", "Debug env var value", "function_name") ContainerManagerMock.assert_called_once_with( docker_network_id="network", skip_pull_image=True, do_shutdown_event=True) _initialize_all_functions_containers_mock.assert_called_once_with()