Implement Add to List for dynamodb:UpdateItem (#3585)

This handles the add-to-list case using the legacy `AttributeUpdates` parameter.

* Added test coverage.
* Verified against real AWS backend.

Closes #3561
This commit is contained in:
Brian Pandola 2021-01-10 06:20:41 -08:00 committed by GitHub
parent 13252cc4e3
commit 640df04840
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 0 deletions

View File

@ -156,6 +156,10 @@ class Item(BaseModel):
existing = self.attrs.get(attribute_name, DynamoType({"SS": {}}))
new_set = set(existing.value).union(set(new_value))
self.attrs[attribute_name] = DynamoType({"SS": list(new_set)})
elif set(update_action["Value"].keys()) == {"L"}:
existing = self.attrs.get(attribute_name, DynamoType({"L": []}))
new_list = existing.value + new_value
self.attrs[attribute_name] = DynamoType({"L": new_list})
else:
# TODO: implement other data types
raise NotImplementedError(

View File

@ -5704,3 +5704,26 @@ def test_dynamodb_update_item_fails_on_string_sets():
Key={"record_id": {"S": "testrecord"}},
AttributeUpdates=attribute,
)
@moto.mock_dynamodb2
def test_update_item_add_to_list_using_legacy_attribute_updates():
resource = boto3.resource("dynamodb", region_name="us-west-2")
resource.create_table(
AttributeDefinitions=[{"AttributeName": "id", "AttributeType": "S"}],
TableName="TestTable",
KeySchema=[{"AttributeName": "id", "KeyType": "HASH"}],
ProvisionedThroughput={"ReadCapacityUnits": 5, "WriteCapacityUnits": 5},
)
table = resource.Table("TestTable")
table.wait_until_exists()
table.put_item(Item={"id": "list_add", "attr": ["a", "b", "c"]},)
table.update_item(
TableName="TestTable",
Key={"id": "list_add"},
AttributeUpdates={"attr": {"Action": "ADD", "Value": ["d", "e"]}},
)
resp = table.get_item(Key={"id": "list_add"})
resp["Item"]["attr"].should.equal(["a", "b", "c", "d", "e"])