class TestApplicationBuilder_build_function(TestCase): def setUp(self): self.builder = ApplicationBuilder(Mock(), "/build/dir", "/base/dir") @patch("samcli.lib.build.app_builder._get_workflow_config") @patch("samcli.lib.build.app_builder.osutils") def test_must_build_in_process(self, osutils_mock, get_workflow_config_mock): function_name = "function_name" codeuri = "path/to/source" runtime = "runtime" scratch_dir = "scratch" config_mock = get_workflow_config_mock.return_value = Mock() config_mock.manifest_name = "manifest_name" osutils_mock.mkdir_temp.return_value.__enter__ = Mock( return_value=scratch_dir) osutils_mock.mkdir_temp.return_value.__exit__ = Mock() self.builder._build_function_in_process = Mock() code_dir = "/base/dir/path/to/source" artifacts_dir = "/build/dir/function_name" manifest_path = os.path.join(code_dir, config_mock.manifest_name) self.builder._build_function(function_name, codeuri, runtime) self.builder._build_function_in_process.assert_called_with( config_mock, code_dir, artifacts_dir, scratch_dir, manifest_path, runtime) @patch("samcli.lib.build.app_builder._get_workflow_config") @patch("samcli.lib.build.app_builder.osutils") def test_must_build_in_container(self, osutils_mock, get_workflow_config_mock): function_name = "function_name" codeuri = "path/to/source" runtime = "runtime" scratch_dir = "scratch" config_mock = get_workflow_config_mock.return_value = Mock() config_mock.manifest_name = "manifest_name" osutils_mock.mkdir_temp.return_value.__enter__ = Mock( return_value=scratch_dir) osutils_mock.mkdir_temp.return_value.__exit__ = Mock() self.builder._build_function_on_container = Mock() code_dir = "/base/dir/path/to/source" artifacts_dir = "/build/dir/function_name" manifest_path = os.path.join(code_dir, config_mock.manifest_name) # Settting the container manager will make us use the container self.builder._container_manager = Mock() self.builder._build_function(function_name, codeuri, runtime) self.builder._build_function_on_container.assert_called_with( config_mock, code_dir, artifacts_dir, scratch_dir, manifest_path, runtime)
def test_should_run_build_for_only_unique_builds(self, persist_mock, read_mock, osutils_mock): build_function_mock = Mock() # create 3 function resources where 2 of them would have same codeuri, runtime and metadata function1_1 = generate_function("function1_1") function1_2 = generate_function("function1_2") function2 = generate_function("function2", runtime="different_runtime") resources_to_build_collector = ResourcesToBuildCollector() resources_to_build_collector.add_functions( [function1_1, function1_2, function2]) build_dir = "builddir" # instantiate the builder and run build method builder = ApplicationBuilder(resources_to_build_collector, "builddir", "basedir", "cachedir") builder._build_function = build_function_mock build_function_mock.side_effect = [ os.path.join(build_dir, function1_1.name), os.path.join(build_dir, function1_2.name), os.path.join(build_dir, function1_2.name), ] result = builder.build() # result should contain all 3 functions as expected self.assertEqual( result, { function1_1.name: os.path.join(build_dir, function1_1.name), function1_2.name: os.path.join(build_dir, function1_2.name), function2.name: os.path.join(build_dir, function1_2.name), }, ) # actual build should only be called twice since only 2 of the functions have unique build build_function_mock.assert_has_calls( [ call( function1_1.name, function1_1.codeuri, ZIP, function1_1.runtime, function1_1.handler, ANY, function1_1.metadata, ), call( function2.name, function2.codeuri, ZIP, function2.runtime, function2.handler, ANY, function2.metadata, ), ], any_order=True, )
class TestApplicationBuilder_build_function(TestCase): def setUp(self): self.builder = ApplicationBuilder(Mock(), "/build/dir", "/base/dir", "cachedir") @patch("samcli.lib.build.app_builder.get_workflow_config") @patch("samcli.lib.build.app_builder.osutils") def test_must_build_in_process(self, osutils_mock, get_workflow_config_mock): function_name = "function_name" codeuri = "path/to/source" packagetype = ZIP runtime = "runtime" scratch_dir = "scratch" handler = "handler.handle" config_mock = get_workflow_config_mock.return_value = Mock() config_mock.manifest_name = "manifest_name" osutils_mock.mkdir_temp.return_value.__enter__ = Mock( return_value=scratch_dir) osutils_mock.mkdir_temp.return_value.__exit__ = Mock() self.builder._build_function_in_process = Mock() code_dir = str(Path("/base/dir/path/to/source").resolve()) artifacts_dir = str(Path("/build/dir/function_name")) manifest_path = str( Path(os.path.join(code_dir, config_mock.manifest_name)).resolve()) self.builder._build_function(function_name, codeuri, ZIP, runtime, handler, artifacts_dir) self.builder._build_function_in_process.assert_called_with( config_mock, code_dir, artifacts_dir, scratch_dir, manifest_path, runtime, None) @patch("samcli.lib.build.app_builder.get_workflow_config") @patch("samcli.lib.build.app_builder.osutils") def test_must_build_in_process_with_metadata(self, osutils_mock, get_workflow_config_mock): function_name = "function_name" codeuri = "path/to/source" runtime = "runtime" packagetype = ZIP scratch_dir = "scratch" handler = "handler.handle" config_mock = get_workflow_config_mock.return_value = Mock() config_mock.manifest_name = "manifest_name" osutils_mock.mkdir_temp.return_value.__enter__ = Mock( return_value=scratch_dir) osutils_mock.mkdir_temp.return_value.__exit__ = Mock() self.builder._build_function_in_process = Mock() code_dir = str(Path("/base/dir/path/to/source").resolve()) artifacts_dir = str(Path("/build/dir/function_name")) manifest_path = str( Path(os.path.join(code_dir, config_mock.manifest_name)).resolve()) self.builder._build_function(function_name, codeuri, packagetype, runtime, handler, artifacts_dir, metadata={"BuildMethod": "Workflow"}) get_workflow_config_mock.assert_called_with( runtime, code_dir, self.builder._base_dir, specified_workflow="Workflow") self.builder._build_function_in_process.assert_called_with( config_mock, code_dir, artifacts_dir, scratch_dir, manifest_path, runtime, None) @patch("samcli.lib.build.app_builder.get_workflow_config") @patch("samcli.lib.build.app_builder.osutils") def test_must_build_in_container(self, osutils_mock, get_workflow_config_mock): function_name = "function_name" codeuri = "path/to/source" runtime = "runtime" packagetype = ZIP scratch_dir = "scratch" handler = "handler.handle" config_mock = get_workflow_config_mock.return_value = Mock() config_mock.manifest_name = "manifest_name" osutils_mock.mkdir_temp.return_value.__enter__ = Mock( return_value=scratch_dir) osutils_mock.mkdir_temp.return_value.__exit__ = Mock() self.builder._build_function_on_container = Mock() code_dir = str(Path("/base/dir/path/to/source").resolve()) artifacts_dir = str(Path("/build/dir/function_name")) manifest_path = str( Path(os.path.join(code_dir, config_mock.manifest_name)).resolve()) # Settting the container manager will make us use the container self.builder._container_manager = Mock() self.builder._build_function(function_name, codeuri, packagetype, runtime, handler, artifacts_dir) self.builder._build_function_on_container.assert_called_with( config_mock, code_dir, artifacts_dir, scratch_dir, manifest_path, runtime, None)
class TestApplicationBuilder_build_function(TestCase): def setUp(self): self.builder = ApplicationBuilder(Mock(), "/build/dir", "/base/dir") @patch("samcli.lib.build.app_builder.get_workflow_config") @patch("samcli.lib.build.app_builder.osutils") def test_must_build_in_process(self, osutils_mock, get_workflow_config_mock): function_name = "function_name" codeuri = "path/to/source" runtime = "runtime" scratch_dir = "scratch" config_mock = get_workflow_config_mock.return_value = Mock() config_mock.manifest_name = "manifest_name" osutils_mock.mkdir_temp.return_value.__enter__ = Mock(return_value=scratch_dir) osutils_mock.mkdir_temp.return_value.__exit__ = Mock() self.builder._build_function_in_process = Mock() code_dir = "/base/dir/path/to/source" artifacts_dir = "/build/dir/function_name" manifest_path = os.path.join(code_dir, config_mock.manifest_name) self.builder._build_function(function_name, codeuri, runtime) self.builder._build_function_in_process.assert_called_with(config_mock, code_dir, artifacts_dir, scratch_dir, manifest_path, runtime) @patch("samcli.lib.build.app_builder.get_workflow_config") @patch("samcli.lib.build.app_builder.osutils") def test_must_build_in_container(self, osutils_mock, get_workflow_config_mock): function_name = "function_name" codeuri = "path/to/source" runtime = "runtime" scratch_dir = "scratch" config_mock = get_workflow_config_mock.return_value = Mock() config_mock.manifest_name = "manifest_name" osutils_mock.mkdir_temp.return_value.__enter__ = Mock(return_value=scratch_dir) osutils_mock.mkdir_temp.return_value.__exit__ = Mock() self.builder._build_function_on_container = Mock() code_dir = "/base/dir/path/to/source" artifacts_dir = "/build/dir/function_name" manifest_path = os.path.join(code_dir, config_mock.manifest_name) # Settting the container manager will make us use the container self.builder._container_manager = Mock() self.builder._build_function(function_name, codeuri, runtime) self.builder._build_function_on_container.assert_called_with(config_mock, code_dir, artifacts_dir, scratch_dir, manifest_path, runtime)