Skip to content

Commit 77a3e2e

Browse files
committed
test: add unit tests for docker build extra params
1 parent b39a050 commit 77a3e2e

File tree

3 files changed

+58
-0
lines changed

3 files changed

+58
-0
lines changed

tests/unit/lib/build_module/test_app_builder.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1774,6 +1774,24 @@ def test_build_lambda_image_raises_for_non_dict_docker_build_args(self):
17741774
with self.assertRaises(DockerBuildFailed):
17751775
self.builder._build_lambda_image("Name", metadata, X86_64)
17761776

1777+
def test_can_build_image_function_with_extra_params(self):
1778+
metadata = {
1779+
"Dockerfile": "Dockerfile",
1780+
"DockerContext": "context",
1781+
"DockerTag": "Tag",
1782+
"DockerBuildArgs": {"a": "b"},
1783+
"DockerBuildExtraParams": ["--ssh", "default"],
1784+
}
1785+
1786+
mock_build_client = Mock()
1787+
mock_build_client.build_image.return_value = iter([])
1788+
self.builder._image_build_client = mock_build_client
1789+
1790+
self.builder._build_lambda_image("Name", metadata, X86_64)
1791+
1792+
call_kwargs = mock_build_client.build_image.call_args[1]
1793+
self.assertEqual(call_kwargs["extra_params"], ["--ssh", "default"])
1794+
17771795
def test_build_lambda_image_uses_latest_tag_when_not_specified(self):
17781796
metadata = {
17791797
"Dockerfile": "Dockerfile",

tests/unit/lib/samlib/test_resource_metadata_normalizer.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ def test_replace_all_resources_that_contain_metadata(self):
8080

8181
def test_replace_all_resources_that_contain_image_metadata(self):
8282
docker_build_args = {"arg1": "val1", "arg2": "val2"}
83+
docker_build_extra_params = ["--param1", "value1"]
8384
asset_path = pathlib.Path("/path", "to", "asset")
8485
dockerfile_path = pathlib.Path("path", "to", "Dockerfile")
8586
template_data = {
@@ -97,6 +98,7 @@ def test_replace_all_resources_that_contain_image_metadata(self):
9798
"aws:asset:property": "Code.ImageUri",
9899
"aws:asset:dockerfile-path": dockerfile_path,
99100
"aws:asset:docker-build-args": docker_build_args,
101+
"aws:asset:docker-build-extra-params": docker_build_extra_params,
100102
},
101103
},
102104
}
@@ -112,6 +114,9 @@ def test_replace_all_resources_that_contain_image_metadata(self):
112114
expected_dockerfile_path = str(pathlib.Path("path", "to", "Dockerfile").as_posix())
113115
self.assertEqual(expected_dockerfile_path, template_data["Resources"]["Function1"]["Metadata"]["Dockerfile"])
114116
self.assertEqual(docker_build_args, template_data["Resources"]["Function1"]["Metadata"]["DockerBuildArgs"])
117+
self.assertEqual(
118+
docker_build_extra_params, template_data["Resources"]["Function1"]["Metadata"]["DockerBuildExtraParams"]
119+
)
115120
self.assertEqual("Function1", template_data["Resources"]["Function1"]["Metadata"]["SamResourceId"])
116121

117122
def test_replace_all_resources_that_contain_image_metadata_dockerfile_extensions(self):

tests/unit/local/docker/test_image_build_client.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,19 @@ def test_build_image_minimal(self):
5656
rm=True,
5757
)
5858

59+
@patch("samcli.local.docker.image_build_client.LOG")
60+
def test_build_image_extra_params_logs_warning(self, mock_log):
61+
"""Test that extra_params triggers a warning and is not passed to SDK"""
62+
mock_image = Mock()
63+
mock_logs = iter([])
64+
65+
self.mock_container_client.images.build.return_value = (mock_image, mock_logs)
66+
self.client.build_image(**self.base_build_args, extra_params=["--ssh", "default"])
67+
mock_log.warning.assert_called_once()
68+
self.assertIn("DockerBuildExtraParams", mock_log.warning.call_args[0][0])
69+
70+
self.mock_container_client.images.build.assert_called_once_with(**self.base_build_args, rm=True)
71+
5972
def test_is_available_returns_true(self):
6073
"""Test that is_available always returns True for SDK"""
6174
result = SDKBuildClient.is_available("docker")
@@ -202,6 +215,28 @@ def test_build_image_handles_failure(self, mock_popen):
202215
self.assertIn("Build failed with exit code 1", str(context.exception))
203216
self.assertEqual(context.exception.build_log, [{"stream": "Step 1/5\n"}, {"stream": "Error: build failed\n"}])
204217

218+
@patch("samcli.local.docker.image_build_client.subprocess.Popen")
219+
def test_build_image_docker_with_extra_params(self, mock_popen):
220+
"""Test that extra_params are appended to the docker command"""
221+
mock_process = Mock()
222+
mock_process.stdout = iter(["Done\n"])
223+
mock_process.returncode = 0
224+
mock_popen.return_value = mock_process
225+
226+
list(
227+
self.docker_client.build_image(
228+
**self.base_build_args,
229+
extra_params=["--ssh", "default", "--secret", "id=mysecret,src=secret.txt"],
230+
)
231+
)
232+
233+
actual_cmd = mock_popen.call_args[0][0]
234+
self.assertEqual(actual_cmd[-1], self.base_build_args["path"])
235+
self.assertIn("--ssh", actual_cmd)
236+
self.assertIn("default", actual_cmd)
237+
self.assertIn("--secret", actual_cmd)
238+
self.assertIn("id=mysecret,src=secret.txt", actual_cmd)
239+
205240
@patch("samcli.local.docker.image_build_client.shutil.which")
206241
@patch("samcli.local.docker.image_build_client.subprocess.run")
207242
def test_is_available_docker_success(self, mock_run, mock_which):

0 commit comments

Comments
 (0)