Skip to content

Commit 81f598e

Browse files
committed
fix(parameters): fix _transform_and_cache_get_parameters_response
was passing positional arguments to transform_value in the wrong order, making the latter fail miserably with TransformParameterError: Unable to transform value using "the value" because value was being passed as the expected transform argument. Use keyword arguments instead and cover this with a test.
1 parent 88c309d commit 81f598e

File tree

3 files changed

+34
-4
lines changed

3 files changed

+34
-4
lines changed

aws_lambda_powertools/utilities/parameters/base.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,9 @@ def get_multiple(
187187
raise GetParameterError(str(exc))
188188

189189
if transform:
190-
values.update(transform_value(values, transform, raise_on_transform_error))
190+
values.update(
191+
transform_value(value=values, transform=transform, raise_on_transform_error=raise_on_transform_error),
192+
)
191193

192194
self.add_to_cache(key=key, value=values, max_age=max_age)
193195

aws_lambda_powertools/utilities/parameters/ssm.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -650,13 +650,13 @@ def _transform_and_cache_get_parameters_response(
650650
name = parameter["Name"]
651651
value = parameter["Value"]
652652
options = parameters[name]
653-
transform = options.get("transform")
653+
transform = options["transform"]
654654

655655
# NOTE: If transform is set, we do it before caching to reduce number of operations
656656
if transform:
657-
value = transform_value(name, value, transform, raise_on_error) # type: ignore
657+
value = transform_value(value=value, transform=transform, raise_on_transform_error=raise_on_error) # type: ignore[assignment]
658658

659-
_cache_key = (name, options["transform"])
659+
_cache_key = (name, transform)
660660
self.add_to_cache(key=_cache_key, value=value, max_age=options["max_age"])
661661

662662
response[name] = value

tests/functional/parameters/_boto3/test_utilities_parameters.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1114,6 +1114,34 @@ def test_ssm_provider_get_parameters_by_name_do_not_raise_on_failure(mock_name,
11141114
stubber.deactivate()
11151115

11161116

1117+
def test_ssm_provider_get_parameters_by_name_do_not_raise_on_failure_transform(mock_name, mock_value, config):
1118+
success = f"/dev/{mock_name}"
1119+
fail = f"/prod/{mock_name}"
1120+
params = {success: {}, fail: {}}
1121+
param_names = list(params.keys())
1122+
expected_value = {"value": mock_value}
1123+
stub_params = {success: json.dumps(expected_value)}
1124+
1125+
expected_stub_response = build_get_parameters_stub(params=stub_params, invalid_parameters=[fail])
1126+
expected_stub_params = {"Names": param_names}
1127+
1128+
provider = parameters.SSMProvider(boto_config=config)
1129+
stubber = stub.Stubber(provider.client)
1130+
stubber.add_response("get_parameters", expected_stub_response, expected_stub_params)
1131+
stubber.activate()
1132+
1133+
try:
1134+
ret = provider.get_parameters_by_name(parameters=params, transform="json", raise_on_error=False)
1135+
1136+
stubber.assert_no_pending_responses()
1137+
assert ret[success] == expected_value
1138+
assert ret["_errors"]
1139+
assert len(ret["_errors"]) == 1
1140+
assert fail not in ret
1141+
finally:
1142+
stubber.deactivate()
1143+
1144+
11171145
def test_ssm_provider_get_parameters_by_name_do_not_raise_on_failure_with_decrypt(mock_name, config):
11181146
# GIVEN one parameter requires decryption and an arbitrary SDK error occurs
11191147
param = f"/{mock_name}"

0 commit comments

Comments
 (0)