DynamoDB - Add tests to verify Atomic Counter functionality

This commit is contained in:
Bert Blommers 2020-05-01 14:19:20 +01:00
parent c39924501b
commit 2e737a6102

View File

@ -4946,3 +4946,86 @@ def test_multiple_updates():
"id": {"S": "1"},
}
assert result == expected_result
@mock_dynamodb2
def test_update_item_atomic_counter():
table = "table_t"
ddb_mock = boto3.client("dynamodb", region_name="eu-west-3")
ddb_mock.create_table(
TableName=table,
KeySchema=[{"AttributeName": "t_id", "KeyType": "HASH"}],
AttributeDefinitions=[{"AttributeName": "t_id", "AttributeType": "S"}],
BillingMode="PAY_PER_REQUEST",
)
key = {"t_id": {"S": "item1"}}
ddb_mock.put_item(
TableName=table,
Item={"t_id": {"S": "item1"}, "n_i": {"N": "5"}, "n_f": {"N": "5.3"}},
)
ddb_mock.update_item(
TableName=table,
Key=key,
UpdateExpression="set n_i = n_i + :inc1, n_f = n_f + :inc2",
ExpressionAttributeValues={":inc1": {"N": "1.2"}, ":inc2": {"N": "0.05"}},
)
updated_item = ddb_mock.get_item(TableName=table, Key=key)["Item"]
updated_item["n_i"]["N"].should.equal("6.2")
updated_item["n_f"]["N"].should.equal("5.35")
@mock_dynamodb2
def test_update_item_atomic_counter_return_values():
table = "table_t"
ddb_mock = boto3.client("dynamodb", region_name="eu-west-3")
ddb_mock.create_table(
TableName=table,
KeySchema=[{"AttributeName": "t_id", "KeyType": "HASH"}],
AttributeDefinitions=[{"AttributeName": "t_id", "AttributeType": "S"}],
BillingMode="PAY_PER_REQUEST",
)
key = {"t_id": {"S": "item1"}}
ddb_mock.put_item(TableName=table, Item={"t_id": {"S": "item1"}, "v": {"N": "5"}})
response = ddb_mock.update_item(
TableName=table,
Key=key,
UpdateExpression="set v = v + :inc",
ExpressionAttributeValues={":inc": {"N": "1"}},
ReturnValues="UPDATED_OLD",
)
assert (
"v" in response["Attributes"]
), "v has been updated, and should be returned here"
response["Attributes"]["v"]["N"].should.equal("5")
# second update
response = ddb_mock.update_item(
TableName=table,
Key=key,
UpdateExpression="set v = v + :inc",
ExpressionAttributeValues={":inc": {"N": "1"}},
ReturnValues="UPDATED_OLD",
)
assert (
"v" in response["Attributes"]
), "v has been updated, and should be returned here"
response["Attributes"]["v"]["N"].should.equal("6")
# third update
response = ddb_mock.update_item(
TableName=table,
Key=key,
UpdateExpression="set v = v + :inc",
ExpressionAttributeValues={":inc": {"N": "1"}},
ReturnValues="UPDATED_NEW",
)
assert (
"v" in response["Attributes"]
), "v has been updated, and should be returned here"
response["Attributes"]["v"]["N"].should.equal("8")