Skip to content

Commit c2d54bb

Browse files
author
Lucas McDonald
committed
wip
1 parent 1fc0f77 commit c2d54bb

File tree

5 files changed

+174
-9
lines changed

5 files changed

+174
-9
lines changed

DynamoDbEncryption/runtimes/python/src/aws_database_encryption_sdk/internal/boto3_conversions.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from boto3.dynamodb.conditions import (
33
BuiltConditionExpression,
44
)
5+
from copy import deepcopy
56

67
class BotoInterfaceShapeConverter(ABC):
78
"""
@@ -98,6 +99,7 @@ def attributes(self, attributes):
9899
return self.item(attributes)
99100

100101
def item_collection_metrics(self, item_collection_metrics):
102+
print(f"{item_collection_metrics=}")
101103
if "ItemCollectionKey" in item_collection_metrics:
102104
item_collection_metrics["ItemCollectionKey"] = self.item(item_collection_metrics["ItemCollectionKey"])
103105
return item_collection_metrics

DynamoDbEncryption/runtimes/python/test/ddb_formatted_requests.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@ def exhaustive_put_item_request_ddb(item):
1717
# Expected is legacy, but still in the boto3 docs.
1818
"Expected": {
1919
"partition_key": {
20-
"Value": item["partition_key"]
20+
"Value": item["partition_key"],
2121
},
2222
"sort_key": {
23-
"Value": item["sort_key"]
23+
"AttributeValueList": [item["sort_key"]],
24+
"ComparisonOperator": "EQ"
2425
}
2526
},
2627
"ConditionExpression": "attribute_not_exists(#pk) AND attribute_not_exists(#sk)",
@@ -152,6 +153,10 @@ def exhaustive_scan_request_ddb(item):
152153
},
153154
"ExpressionAttributeValues": {
154155
":a1": item["attribute1"]
156+
},
157+
"ExclusiveStartKey": {
158+
"partition_key": item["partition_key"],
159+
"sort_key": item["sort_key"]
155160
}
156161
}
157162
return {**base, **additional_keys}
@@ -165,14 +170,14 @@ def basic_batch_write_item_request_ddb(actions_with_items):
165170
}
166171
}
167172

168-
def basic_batch_put_item_request_ddb(items):
173+
def basic_batch_write_item_put_request_ddb(items):
169174
actions_with_items = [
170175
{"PutRequest": {"Item": item}}
171176
for item in items
172177
]
173178
return basic_batch_write_item_request_ddb(actions_with_items)
174179

175-
def basic_batch_delete_item_request_ddb(keys):
180+
def basic_batch_write_item_delete_request_ddb(keys):
176181
actions_with_keys = [
177182
{"DeleteRequest": {"Key": key}}
178183
for key in keys

DynamoDbEncryption/runtimes/python/test/dict_formatted_requests.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ def exhaustive_put_item_request_dict(item):
2121
"Value": item["partition_key"]
2222
},
2323
"sort_key": {
24-
"Value": item["sort_key"]
24+
"AttributeValueList": [item["sort_key"]],
25+
"ComparisonOperator": "EQ"
2526
}
2627
},
2728
"ConditionExpression": Attr("pk").not_exists() & Attr("sk").not_exists(),
@@ -155,6 +156,10 @@ def exhaustive_scan_request_dict(item):
155156
},
156157
"ExpressionAttributeValues": {
157158
":a1": item["attribute1"]
159+
},
160+
"ExclusiveStartKey": {
161+
"partition_key": item["partition_key"],
162+
"sort_key": item["sort_key"]
158163
}
159164
}
160165
return {**base, **additional_keys}

DynamoDbEncryption/runtimes/python/test/integ/encrypted/test_client.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
from ...ddb_formatted_requests import (
2323
basic_put_item_request_ddb,
2424
basic_get_item_request_ddb,
25-
basic_batch_put_item_request_ddb,
26-
basic_batch_delete_item_request_ddb,
25+
basic_batch_write_item_put_request_ddb,
26+
basic_batch_write_item_delete_request_ddb,
2727
basic_batch_get_item_request_ddb,
2828
basic_query_request_ddb,
2929
basic_transact_write_item_put_request_ddb,
@@ -163,13 +163,13 @@ def test_GIVEN_valid_put_and_get_requests_WHEN_put_and_get_THEN_round_trip_passe
163163
def batch_write_item_put_request(expect_standard_dictionaries, multiple_test_items):
164164
if expect_standard_dictionaries:
165165
return basic_batch_write_item_put_request_dict(multiple_test_items)
166-
return basic_batch_put_item_request_ddb(multiple_test_items)
166+
return basic_batch_write_item_put_request_ddb(multiple_test_items)
167167

168168
@pytest.fixture
169169
def batch_write_item_delete_request(expect_standard_dictionaries, multiple_test_keys):
170170
if expect_standard_dictionaries:
171171
return basic_batch_write_item_delete_request_dict(multiple_test_keys)
172-
return basic_batch_delete_item_request_ddb(multiple_test_keys)
172+
return basic_batch_write_item_delete_request_ddb(multiple_test_keys)
173173

174174
@pytest.fixture
175175
def batch_get_item_request(expect_standard_dictionaries, multiple_test_keys):

DynamoDbEncryption/runtimes/python/test/unit/internal/test_client_to_resource.py

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
exhaustive_query_request_ddb,
88
basic_scan_request_ddb,
99
exhaustive_scan_request_ddb,
10+
basic_batch_get_item_request_ddb,
11+
basic_batch_write_item_put_request_ddb,
12+
basic_batch_write_item_delete_request_ddb,
1013
)
1114
from ...dict_formatted_requests import (
1215
basic_put_item_request_dict,
@@ -17,6 +20,23 @@
1720
exhaustive_query_request_dict,
1821
basic_scan_request_dict,
1922
exhaustive_scan_request_dict,
23+
basic_batch_get_item_request_dict,
24+
basic_batch_write_item_put_request_dict,
25+
basic_batch_write_item_delete_request_dict,
26+
)
27+
from ...responses import (
28+
basic_query_response,
29+
basic_scan_response,
30+
exhaustive_scan_response,
31+
basic_put_item_response,
32+
exhaustive_put_item_response,
33+
basic_get_item_response,
34+
exhaustive_get_item_response,
35+
exhaustive_query_response,
36+
basic_batch_get_item_response,
37+
exhaustive_batch_get_item_response,
38+
basic_batch_write_item_put_response,
39+
exhaustive_batch_write_item_put_response,
2040
)
2141
from ...items import *
2242
from aws_database_encryption_sdk.internal.client_to_resource import ClientShapeToResourceShapeConverter
@@ -86,6 +106,22 @@ def test_GIVEN_test_put_item_request_WHEN_client_to_resource_THEN_returns_dict_v
86106
if key != "ConditionExpression":
87107
assert dict_item[key] == expected_dict_request[key]
88108

109+
110+
@pytest.fixture
111+
def test_put_item_response(use_exhaustive_request):
112+
if use_exhaustive_request:
113+
return exhaustive_put_item_response
114+
return basic_put_item_response
115+
116+
def test_GIVEN_test_put_item_response_WHEN_client_to_resource_THEN_returns_dict_value(test_put_item_response, test_ddb_key, test_dict_key):
117+
# Given: Put item response
118+
response = test_put_item_response(test_ddb_key)
119+
# When: Converting to resource format
120+
print(f"{response=}")
121+
dict_item = client_to_resource_converter.put_item_response(response)
122+
# Then: Returns dict value
123+
assert dict_item == test_put_item_response(test_dict_key)
124+
89125
@pytest.fixture
90126
def test_get_item_request_ddb(use_exhaustive_request):
91127
if use_exhaustive_request:
@@ -106,6 +142,20 @@ def test_GIVEN_test_get_item_request_WHEN_client_to_resource_THEN_returns_dict_v
106142
# Then: Returns dict value
107143
assert dict_item == test_get_item_request_dict(test_dict_item)
108144

145+
@pytest.fixture
146+
def test_get_item_response(use_exhaustive_request):
147+
if use_exhaustive_request:
148+
return exhaustive_get_item_response
149+
return basic_get_item_response
150+
151+
def test_GIVEN_test_get_item_response_WHEN_client_to_resource_THEN_returns_dict_value(test_get_item_response, test_ddb_item, test_dict_item):
152+
# Given: Get item response
153+
response = test_get_item_response(test_ddb_item)
154+
# When: Converting to resource format
155+
dict_item = client_to_resource_converter.get_item_response(response)
156+
# Then: Returns dict value
157+
assert dict_item == test_get_item_response(test_dict_item)
158+
109159
@pytest.fixture
110160
def test_query_request_ddb(use_exhaustive_request):
111161
if use_exhaustive_request:
@@ -130,6 +180,20 @@ def test_GIVEN_test_query_request_WHEN_client_to_resource_THEN_returns_dict_valu
130180
else:
131181
assert dict_item[key] == test_query_request_dict(test_dict_item)[key]
132182

183+
@pytest.fixture
184+
def test_query_response(use_exhaustive_request):
185+
if use_exhaustive_request:
186+
return exhaustive_query_response
187+
return basic_query_response
188+
189+
def test_GIVEN_test_query_response_WHEN_client_to_resource_THEN_returns_dict_value(test_query_response, test_ddb_item, test_dict_item):
190+
# Given: Query response
191+
response = test_query_response([test_ddb_item])
192+
# When: Converting to resource format
193+
dict_item = client_to_resource_converter.query_response(response)
194+
# Then: Returns dict value
195+
assert dict_item == test_query_response([test_dict_item])
196+
133197
def get_string_for_key_condition_expression(key_condition_expression, expression_attribute_names, expression_attribute_values):
134198
"""Get the string for the key condition expression."""
135199
if not isinstance(key_condition_expression, str):
@@ -176,3 +240,92 @@ def test_GIVEN_test_scan_request_WHEN_client_to_resource_THEN_returns_dict_value
176240
# Then: Returns dict value
177241
assert dict_item == test_scan_request_dict(test_dict_item)
178242

243+
@pytest.fixture
244+
def test_scan_response(use_exhaustive_request):
245+
if use_exhaustive_request:
246+
return exhaustive_scan_response
247+
return basic_scan_response
248+
249+
def test_GIVEN_test_scan_response_WHEN_client_to_resource_THEN_returns_dict_value(test_scan_response, test_ddb_item, test_dict_item, test_ddb_key, test_dict_key):
250+
# Given: Scan response
251+
response = test_scan_response([test_ddb_item], [test_ddb_key])
252+
# When: Converting to resource format
253+
dict_item = client_to_resource_converter.scan_response(response)
254+
# Then: Returns dict value
255+
assert dict_item == test_scan_response([test_dict_item], [test_dict_key])
256+
257+
@pytest.fixture
258+
def test_batch_get_item_request_ddb():
259+
return basic_batch_get_item_request_ddb
260+
261+
@pytest.fixture
262+
def test_batch_get_item_request_dict():
263+
return basic_batch_get_item_request_dict
264+
265+
def test_GIVEN_test_batch_get_item_request_WHEN_client_to_resource_THEN_returns_dict_value(test_batch_get_item_request_ddb, test_batch_get_item_request_dict, test_ddb_item, test_dict_item):
266+
# Given: Batch get item request
267+
request = test_batch_get_item_request_ddb([test_ddb_item])
268+
# When: Converting to resource format
269+
dict_item = client_to_resource_converter.batch_get_item_request(request)
270+
# Then: Returns dict value
271+
assert dict_item == test_batch_get_item_request_dict([test_dict_item])
272+
273+
@pytest.fixture
274+
def test_batch_get_item_response(use_exhaustive_request):
275+
if use_exhaustive_request:
276+
return exhaustive_batch_get_item_response
277+
return basic_batch_get_item_response
278+
279+
def test_GIVEN_test_batch_get_item_response_WHEN_client_to_resource_THEN_returns_dict_value(test_batch_get_item_response, test_ddb_item, test_dict_item):
280+
# Given: Batch get item response
281+
response = test_batch_get_item_response([test_ddb_item])
282+
# When: Converting to resource format
283+
dict_item = client_to_resource_converter.batch_get_item_response(response)
284+
# Then: Returns dict value
285+
assert dict_item == test_batch_get_item_response([test_dict_item])
286+
287+
@pytest.fixture
288+
def test_batch_write_item_put_request_ddb():
289+
return basic_batch_write_item_put_request_ddb
290+
291+
@pytest.fixture
292+
def test_batch_write_item_put_request_dict():
293+
return basic_batch_write_item_put_request_dict
294+
295+
def test_GIVEN_test_batch_write_item_put_request_WHEN_client_to_resource_THEN_returns_dict_value(test_batch_write_item_put_request_ddb, test_batch_write_item_put_request_dict, test_ddb_item, test_dict_item):
296+
# Given: Batch write item request
297+
request = test_batch_write_item_put_request_ddb([test_ddb_item])
298+
# When: Converting to resource format
299+
dict_item = client_to_resource_converter.batch_write_item_request(request)
300+
# Then: Returns dict value
301+
assert dict_item == test_batch_write_item_put_request_dict([test_dict_item])
302+
303+
@pytest.fixture
304+
def test_batch_write_item_delete_request_ddb():
305+
return basic_batch_write_item_delete_request_ddb
306+
307+
@pytest.fixture
308+
def test_batch_write_item_delete_request_dict():
309+
return basic_batch_write_item_delete_request_dict
310+
311+
def test_GIVEN_test_batch_write_item_delete_request_WHEN_client_to_resource_THEN_returns_dict_value(test_batch_write_item_delete_request_ddb, test_batch_write_item_delete_request_dict, test_ddb_key, test_dict_key):
312+
# Given: Batch write item delete request
313+
request = test_batch_write_item_delete_request_ddb([test_ddb_key])
314+
# When: Converting to resource format
315+
dict_item = client_to_resource_converter.batch_write_item_request(request)
316+
# Then: Returns dict value
317+
assert dict_item == test_batch_write_item_delete_request_dict([test_dict_key])
318+
319+
@pytest.fixture
320+
def test_batch_write_item_put_response(use_exhaustive_request):
321+
if use_exhaustive_request:
322+
return exhaustive_batch_write_item_put_response
323+
return basic_batch_write_item_put_response
324+
325+
def test_GIVEN_test_batch_write_item_put_response_WHEN_client_to_resource_THEN_returns_dict_value(test_batch_write_item_put_response, test_ddb_item, test_dict_item):
326+
# Given: Batch write item put response
327+
response = test_batch_write_item_put_response([test_ddb_item])
328+
# When: Converting to resource format
329+
dict_item = client_to_resource_converter.batch_write_item_response(response)
330+
# Then: Returns dict value
331+
assert dict_item == test_batch_write_item_put_response([test_dict_item])

0 commit comments

Comments
 (0)