dynamodb: fix deleting last set element (w/attr name) (#3708)

* dynamodb: deleting last set element

* add user-facing test
This commit is contained in:
Ilya Konstantinov 2021-02-19 02:47:51 -05:00 committed by GitHub
commit 0912abe5f6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 49 additions and 9 deletions

View file

@ -282,24 +282,26 @@ def test_execution_of_remove_in_list(table):
assert expected_item == item
def test_execution_of_delete_element_from_set(table):
update_expression = "delete s :value"
@pytest.mark.parametrize("attr_name", ["s", "#placeholder"])
def test_execution_of_delete_element_from_set(table, attr_name):
expression_attribute_names = {"#placeholder": "s"}
update_expression = "delete {} :value".format(attr_name)
update_expression_ast = UpdateExpressionParser.make(update_expression)
item = Item(
hash_key=DynamoType({"S": "id"}),
hash_key_type="TYPE",
range_key=None,
range_key_type=None,
attrs={"id": {"S": "foo2"}, "s": {"SS": ["value1", "value2", "value3"]},},
attrs={"id": {"S": "foo2"}, "s": {"SS": ["value1", "value2", "value3"]}},
)
validated_ast = UpdateExpressionValidator(
update_expression_ast,
expression_attribute_names=None,
expression_attribute_names=expression_attribute_names,
expression_attribute_values={":value": {"SS": ["value2", "value5"]}},
item=item,
table=table,
).validate()
UpdateExpressionExecutor(validated_ast, item, None).execute()
UpdateExpressionExecutor(validated_ast, item, expression_attribute_names).execute()
expected_item = Item(
hash_key=DynamoType({"S": "id"}),
hash_key_type="TYPE",
@ -309,6 +311,26 @@ def test_execution_of_delete_element_from_set(table):
)
assert expected_item == item
# delete last elements
update_expression = "delete {} :value".format(attr_name)
update_expression_ast = UpdateExpressionParser.make(update_expression)
validated_ast = UpdateExpressionValidator(
update_expression_ast,
expression_attribute_names=expression_attribute_names,
expression_attribute_values={":value": {"SS": ["value1", "value3"]}},
item=item,
table=table,
).validate()
UpdateExpressionExecutor(validated_ast, item, expression_attribute_names).execute()
expected_item = Item(
hash_key=DynamoType({"S": "id"}),
hash_key_type="TYPE",
range_key=None,
range_key_type=None,
attrs={"id": {"S": "foo2"}},
)
assert expected_item == item
def test_execution_of_add_number(table):
update_expression = "add s :value"