Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion aws_lambda_powertools/utilities/parameters/ssm.py
Original file line number Diff line number Diff line change
Expand Up @@ -654,7 +654,12 @@ def _transform_and_cache_get_parameters_response(

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

_cache_key = (name, transform)
self.add_to_cache(key=_cache_key, value=value, max_age=options["max_age"])
Expand Down
28 changes: 28 additions & 0 deletions tests/functional/parameters/_boto3/test_utilities_parameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -1142,6 +1142,34 @@ def test_ssm_provider_get_parameters_by_name_do_not_raise_on_failure_transform(m
stubber.deactivate()


def test_ssm_provider_get_parameters_by_name_auto_transform_infers_from_parameter_name(mock_name, mock_value, config):
# GIVEN transform="auto" and a parameter name suffixed with ".json"
# (auto-transform must infer the transform method from the parameter name, not its value)
success = f"/dev/{mock_name}.json"
fail = "/does_not_exist" # stub model doesn't support all-success yet
params = {success: {}, fail: {}}
param_names = list(params.keys())
expected_value = {"value": mock_value}
stub_params = {success: json.dumps(expected_value)}

expected_stub_response = build_get_parameters_stub(params=stub_params, invalid_parameters=[fail])
expected_stub_params = {"Names": param_names}

provider = parameters.SSMProvider(boto_config=config)
stubber = stub.Stubber(provider.client)
stubber.add_response("get_parameters", expected_stub_response, expected_stub_params)
stubber.activate()

try:
ret = provider.get_parameters_by_name(parameters=params, transform="auto", raise_on_error=False)

stubber.assert_no_pending_responses()
# THEN the value should be parsed as JSON, not returned as a raw string
assert ret[success] == expected_value
finally:
stubber.deactivate()


def test_ssm_provider_get_parameters_by_name_do_not_raise_on_failure_with_decrypt(mock_name, config):
# GIVEN one parameter requires decryption and an arbitrary SDK error occurs
param = f"/{mock_name}"
Expand Down