Skip to content

Commit 7c5b6e9

Browse files
author
Michael Brewer
committed
feat(data-classes): Include include_event and include_context
1 parent 6137896 commit 7c5b6e9

File tree

2 files changed

+67
-8
lines changed

2 files changed

+67
-8
lines changed

aws_lambda_powertools/utilities/data_classes/appsync_resolver_utils.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,14 @@ class AppSyncResolver:
4242
def __init__(self):
4343
self._resolvers: dict = {}
4444

45-
def resolver(self, type_name: str = "*", field_name: str = None, **kwargs):
45+
def resolver(
46+
self,
47+
type_name: str = "*",
48+
field_name: str = None,
49+
include_event: bool = False,
50+
include_context: bool = False,
51+
**kwargs,
52+
):
4653
"""Registers the resolver for field_name
4754
4855
Parameters
@@ -51,11 +58,17 @@ def resolver(self, type_name: str = "*", field_name: str = None, **kwargs):
5158
Type name
5259
field_name : str
5360
Field name
61+
include_event: bool
62+
Whether to include the lambda event
63+
include_context: bool
64+
Whether to include the lambda context
5465
kwargs :
55-
Keyword arguments
66+
Extra options via kwargs
5667
"""
5768

5869
def register_resolver(func):
70+
kwargs["include_event"] = include_event
71+
kwargs["include_context"] = include_context
5972
self._resolvers[f"{type_name}.{field_name}"] = {
6073
"func": func,
6174
"config": kwargs,

tests/functional/appsync/test_appsync_resolver_utils.py

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
aws_timestamp,
1414
make_id,
1515
)
16+
from aws_lambda_powertools.utilities.typing import LambdaContext
1617

1718

1819
def load_event(file_name: str) -> dict:
@@ -22,7 +23,8 @@ def load_event(file_name: str) -> dict:
2223

2324

2425
def test_direct_resolver():
25-
_event = load_event("appSyncDirectResolver.json")
26+
# Check whether we can handle an example appsync direct resolver
27+
mock_event = load_event("appSyncDirectResolver.json")
2628

2729
app = AppSyncResolver()
2830

@@ -34,12 +36,13 @@ def create_something(context, id: str): # noqa AA03 VNE003
3436
def handler(event, context):
3537
return app.resolve(event, context)
3638

37-
result = handler(_event, {})
39+
result = handler(mock_event, {})
3840
assert result == "my identifier"
3941

4042

4143
def test_amplify_resolver():
42-
_event = load_event("appSyncResolverEvent.json")
44+
# Check whether we can handle an example appsync resolver
45+
mock_event = load_event("appSyncResolverEvent.json")
4346

4447
app = AppSyncResolver()
4548

@@ -53,30 +56,73 @@ def get_location(event: AppSyncResolverEvent, page: int, size: int, name: str):
5356
def handler(event, context):
5457
return app.resolve(event, context)
5558

56-
result = handler(_event, {})
59+
result = handler(mock_event, {})
5760
assert result == "value"
5861

5962

6063
def test_resolver_no_params():
64+
# GIVEN
6165
app = AppSyncResolver()
6266

6367
@app.resolver(type_name="Query", field_name="noParams")
6468
def no_params():
6569
return "no_params has no params"
6670

6771
event = {"typeName": "Query", "fieldName": "noParams", "arguments": {}}
68-
result = app.resolve(event, None)
6972

73+
# WHEN
74+
result = app.resolve(event, LambdaContext())
75+
76+
# THEN
7077
assert result == "no_params has no params"
7178

7279

80+
def test_resolver_include_event():
81+
# GIVEN
82+
app = AppSyncResolver()
83+
84+
mock_event = {"typeName": "Query", "fieldName": "field", "arguments": {}}
85+
86+
@app.resolver(field_name="field", include_event=True)
87+
def get_value(event: AppSyncResolverEvent):
88+
return event
89+
90+
# WHEN
91+
result = app.resolve(mock_event, LambdaContext())
92+
93+
# THEN
94+
assert result._data == mock_event
95+
assert isinstance(result, AppSyncResolverEvent)
96+
97+
98+
def test_resolver_include_context():
99+
# GIVEN
100+
app = AppSyncResolver()
101+
102+
mock_event = {"typeName": "Query", "fieldName": "field", "arguments": {}}
103+
104+
@app.resolver(field_name="field", include_context=True)
105+
def get_value(context: LambdaContext):
106+
return context
107+
108+
# WHEN
109+
mock_context = LambdaContext()
110+
result = app.resolve(mock_event, mock_context)
111+
112+
# THEN
113+
assert result == mock_context
114+
115+
73116
def test_resolver_value_error():
117+
# GIVEN no defined field resolver
74118
app = AppSyncResolver()
75119

120+
# WHEN
76121
with pytest.raises(ValueError) as exp:
77122
event = {"typeName": "type", "fieldName": "field", "arguments": {}}
78-
app.resolve(event, None)
123+
app.resolve(event, LambdaContext())
79124

125+
# THEN
80126
assert exp.value.args[0] == "No resolver found for 'type.field'"
81127

82128

0 commit comments

Comments
 (0)