Skip to content

Commit 9dc4ce6

Browse files
committed
chore(tests): add end-to-end test
1 parent e13bbef commit 9dc4ce6

File tree

4 files changed

+88
-9
lines changed

4 files changed

+88
-9
lines changed

Diff for: aws_lambda_powertools/utilities/parameters/ssm.py

+3-5
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,7 @@ def get_parameters_by_name(
403403
decrypt: bool = False,
404404
force_fetch: bool = False,
405405
max_age: int = DEFAULT_MAX_AGE_SECS,
406-
parallel: bool = True,
406+
parallel: bool = False,
407407
) -> Union[Dict[str, str], Dict[str, bytes], Dict[str, dict]]:
408408
"""
409409
Retrieve multiple parameter values by name from AWS Systems Manager (SSM) Parameter Store
@@ -432,10 +432,8 @@ def get_parameters_by_name(
432432
When the parameter provider fails to transform a parameter value.
433433
"""
434434

435-
# NOTE: Need a param for hard failure mode on parameter retrieval
436-
# by default, we should return an empty string on failure (ask customer for desired behaviour)
437-
438-
# NOTE: Decide whether to leave multi-threaded option or not due to slower results (throttling+fork cost)
435+
# NOTE: Need a param for hard failure mode on parameter retrieval (asked feature request author)
436+
# NOTE: Decide whether to leave multi-threaded option or not due to slower results (throttling+LWP cost)
439437

440438
ret: Dict[str, Any] = {}
441439
future_to_param: Dict[Future, str] = {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import json
2+
import os
3+
from typing import Any, Dict, List, cast
4+
5+
from aws_lambda_powertools.utilities.parameters.ssm import get_parameters_by_name
6+
from aws_lambda_powertools.utilities.typing import LambdaContext
7+
8+
parameters_list: List[str] = cast(List, json.loads(os.getenv("parameters", "")))
9+
10+
11+
def lambda_handler(event: dict, context: LambdaContext) -> Dict[str, Any]:
12+
parameters_to_fetch: Dict[str, Any] = {param: {} for param in parameters_list}
13+
14+
# response`{parameter:value}`
15+
return get_parameters_by_name(parameters=parameters_to_fetch, max_age=0, parallel=True)

Diff for: tests/e2e/parameters/infrastructure.py

+37-4
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,38 @@
1-
from pyclbr import Function
1+
import json
2+
from typing import List
23

3-
from aws_cdk import CfnOutput
4+
from aws_cdk import CfnOutput, Duration
45
from aws_cdk import aws_appconfig as appconfig
56
from aws_cdk import aws_iam as iam
7+
from aws_cdk import aws_ssm as ssm
8+
from aws_cdk.aws_lambda import Function
69

7-
from tests.e2e.utils.data_builder import build_service_name
10+
from tests.e2e.utils.data_builder import build_random_value, build_service_name
811
from tests.e2e.utils.infrastructure import BaseInfrastructure
912

1013

1114
class ParametersStack(BaseInfrastructure):
1215
def create_resources(self):
13-
functions = self.create_lambda_functions()
16+
parameters = self._create_ssm_parameters()
17+
18+
env_vars = {"parameters": json.dumps(parameters)}
19+
functions = self.create_lambda_functions(
20+
function_props={"environment": env_vars, "timeout": Duration.seconds(30)}
21+
)
22+
1423
self._create_app_config(function=functions["ParameterAppconfigFreeformHandler"])
1524

25+
# NOTE: Enforce least-privilege for our param tests only
26+
functions["ParameterSsmGetParametersByName"].add_to_role_policy(
27+
iam.PolicyStatement(
28+
effect=iam.Effect.ALLOW,
29+
actions=[
30+
"ssm:GetParameter",
31+
],
32+
resources=[f"arn:aws:ssm:{self.region}:{self.account_id}:parameter/powertools/e2e/parameters/*"],
33+
)
34+
)
35+
1636
def _create_app_config(self, function: Function):
1737

1838
service_name = build_service_name()
@@ -106,3 +126,16 @@ def _create_app_config_freeform(
106126
resources=["*"],
107127
)
108128
)
129+
130+
def _create_ssm_parameters(self) -> List[str]:
131+
parameters: List[str] = []
132+
133+
for _ in range(10):
134+
param = f"/powertools/e2e/parameters/{build_random_value()}"
135+
rand = build_random_value()
136+
ssm.StringParameter(self.stack, f"param-{rand}", parameter_name=param, string_value=rand)
137+
parameters.append(param)
138+
139+
CfnOutput(self.stack, "ParametersNameList", value=json.dumps(parameters))
140+
141+
return parameters

Diff for: tests/e2e/parameters/test_ssm.py

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import json
2+
from typing import Any, Dict, List
3+
4+
import pytest
5+
6+
from tests.e2e.utils import data_fetcher
7+
8+
9+
@pytest.fixture
10+
def ssm_get_parameters_by_name_fn_arn(infrastructure: dict) -> str:
11+
return infrastructure.get("ParameterSsmGetParametersByNameArn", "")
12+
13+
14+
@pytest.fixture
15+
def parameters_list(infrastructure: dict) -> List[str]:
16+
param_list = infrastructure.get("ParametersNameList", "[]")
17+
return json.loads(param_list)
18+
19+
20+
def test_get_parameter_appconfig_freeform(
21+
ssm_get_parameters_by_name_fn_arn: str,
22+
parameters_list: str,
23+
):
24+
# GIVEN/WHEN
25+
function_response, _ = data_fetcher.get_lambda_response(lambda_arn=ssm_get_parameters_by_name_fn_arn)
26+
parameter_values: Dict[str, Any] = json.loads(function_response["Payload"].read().decode("utf-8"))
27+
28+
# THEN
29+
for param in parameters_list:
30+
try:
31+
assert parameter_values[param] is not None
32+
except (KeyError, TypeError):
33+
pytest.fail(f"Parameter {param} not found in response")

0 commit comments

Comments
 (0)