bb3cbd0bb4
* DynamoDB (V1) - UpdateItem implementation * DynamoDB (V1) - negative tests for UpdateItem
188 lines
5.6 KiB
Python
188 lines
5.6 KiB
Python
from __future__ import unicode_literals
|
|
import json
|
|
import sure # noqa
|
|
|
|
import moto.server as server
|
|
|
|
"""
|
|
Test the different server responses
|
|
"""
|
|
|
|
|
|
def test_table_list():
|
|
backend = server.create_backend_app("dynamodb")
|
|
test_client = backend.test_client()
|
|
|
|
res = test_client.get("/")
|
|
res.status_code.should.equal(404)
|
|
|
|
headers = {"X-Amz-Target": "TestTable.ListTables"}
|
|
res = test_client.get("/", headers=headers)
|
|
res.data.should.contain(b"TableNames")
|
|
|
|
|
|
def test_update_item():
|
|
backend = server.create_backend_app("dynamodb")
|
|
test_client = backend.test_client()
|
|
|
|
create_table(test_client)
|
|
|
|
headers, res = put_item(test_client)
|
|
|
|
# UpdateItem
|
|
headers["X-Amz-Target"] = "DynamoDB_20111205.UpdateItem"
|
|
request_body = {
|
|
"TableName": "Table1",
|
|
"Key": {
|
|
"HashKeyElement": {"S": "customer"},
|
|
"RangeKeyElement": {"N": "12341234"},
|
|
},
|
|
"AttributeUpdates": {"new_att": {"Value": {"SS": ["val"]}, "Action": "PUT"}},
|
|
}
|
|
res = test_client.post("/", headers=headers, json=request_body)
|
|
|
|
# UpdateItem
|
|
headers["X-Amz-Target"] = "DynamoDB_20111205.UpdateItem"
|
|
request_body = {
|
|
"TableName": "Table1",
|
|
"Key": {
|
|
"HashKeyElement": {"S": "customer"},
|
|
"RangeKeyElement": {"N": "12341234"},
|
|
},
|
|
"AttributeUpdates": {"new_n": {"Value": {"N": "42"}, "Action": "PUT"}},
|
|
}
|
|
res = test_client.post("/", headers=headers, json=request_body)
|
|
res = json.loads(res.data)
|
|
|
|
res["ConsumedCapacityUnits"].should.equal(0.5)
|
|
res["Attributes"].should.equal(
|
|
{
|
|
"hkey": "customer",
|
|
"name": "myname",
|
|
"rkey": "12341234",
|
|
"new_att": ["val"],
|
|
"new_n": "42",
|
|
}
|
|
)
|
|
|
|
# UpdateItem - multiples
|
|
headers["X-Amz-Target"] = "DynamoDB_20111205.UpdateItem"
|
|
request_body = {
|
|
"TableName": "Table1",
|
|
"Key": {
|
|
"HashKeyElement": {"S": "customer"},
|
|
"RangeKeyElement": {"N": "12341234"},
|
|
},
|
|
"AttributeUpdates": {
|
|
"new_n": {"Value": {"N": 7}, "Action": "ADD"},
|
|
"new_att": {"Value": {"S": "val2"}, "Action": "ADD"},
|
|
"name": {"Action": "DELETE"},
|
|
},
|
|
}
|
|
res = test_client.post("/", headers=headers, json=request_body)
|
|
res = json.loads(res.data)
|
|
|
|
res["ConsumedCapacityUnits"].should.equal(0.5)
|
|
res["Attributes"].should.equal(
|
|
{
|
|
"hkey": "customer",
|
|
"rkey": "12341234",
|
|
"new_att": ["val", "val2"],
|
|
"new_n": "49",
|
|
}
|
|
)
|
|
|
|
# GetItem
|
|
headers["X-Amz-Target"] = "DynamoDB_20111205.GetItem"
|
|
request_body = {
|
|
"TableName": "Table1",
|
|
"Key": {
|
|
"HashKeyElement": {"S": "customer"},
|
|
"RangeKeyElement": {"N": "12341234"},
|
|
},
|
|
}
|
|
res = test_client.post("/", headers=headers, json=request_body)
|
|
res = json.loads(res.data)
|
|
res["Item"].should.have.key("new_att").equal({"SS": ["val", "val2"]})
|
|
res["Item"].should.have.key("new_n").equal({"N": "49"})
|
|
res["Item"].shouldnt.have.key("name")
|
|
|
|
|
|
def test_update_item_that_doesnt_exist():
|
|
backend = server.create_backend_app("dynamodb")
|
|
test_client = backend.test_client()
|
|
|
|
create_table(test_client)
|
|
|
|
# UpdateItem
|
|
headers = {"X-Amz-Target": "DynamoDB_20111205.UpdateItem"}
|
|
request_body = {
|
|
"TableName": "Table1",
|
|
"Key": {
|
|
"HashKeyElement": {"S": "customer"},
|
|
"RangeKeyElement": {"N": "12341234"},
|
|
},
|
|
"AttributeUpdates": {"new_att": {"Value": {"SS": ["val"]}, "Action": "PUT"}},
|
|
}
|
|
res = test_client.post("/", headers=headers, json=request_body)
|
|
res.status_code.should.equal(400)
|
|
json.loads(res.data).should.equal(
|
|
{"__type": "com.amazonaws.dynamodb.v20111205#ResourceNotFoundException"}
|
|
)
|
|
|
|
|
|
def test_update_item_in_nonexisting_table():
|
|
backend = server.create_backend_app("dynamodb")
|
|
test_client = backend.test_client()
|
|
|
|
# UpdateItem
|
|
headers = {"X-Amz-Target": "DynamoDB_20111205.UpdateItem"}
|
|
request_body = {
|
|
"TableName": "nonexistent",
|
|
"Key": {
|
|
"HashKeyElement": {"S": "customer"},
|
|
"RangeKeyElement": {"N": "12341234"},
|
|
},
|
|
"AttributeUpdates": {"new_att": {"Value": {"SS": ["val"]}, "Action": "PUT"}},
|
|
}
|
|
res = test_client.post("/", headers=headers, json=request_body)
|
|
res.status_code.should.equal(400)
|
|
json.loads(res.data).should.equal(
|
|
{"__type": "com.amazonaws.dynamodb.v20111205#ResourceNotFoundException"}
|
|
)
|
|
|
|
|
|
def put_item(test_client, rkey="12341234"):
|
|
headers = {
|
|
"X-Amz-Target": "DynamoDB_20111205.PutItem",
|
|
"Content-Type": "application/x-amz-json-1.0",
|
|
}
|
|
request_body = {
|
|
"TableName": "Table1",
|
|
"Item": {
|
|
"hkey": {"S": "customer"},
|
|
"rkey": {"N": rkey},
|
|
"name": {"S": "myname"},
|
|
},
|
|
"ReturnValues": "ALL_OLD",
|
|
}
|
|
res = test_client.post("/", headers=headers, json=request_body)
|
|
res = json.loads(res.data)
|
|
return headers, res
|
|
|
|
|
|
def create_table(test_client):
|
|
headers = {
|
|
"X-Amz-Target": "DynamoDB_20111205.CreateTable",
|
|
"Content-Type": "application/x-amz-json-1.0",
|
|
}
|
|
request_body = {
|
|
"TableName": "Table1",
|
|
"KeySchema": {
|
|
"HashKeyElement": {"AttributeName": "hkey", "AttributeType": "S"},
|
|
"RangeKeyElement": {"AttributeName": "rkey", "AttributeType": "N"},
|
|
},
|
|
"ProvisionedThroughput": {"ReadCapacityUnits": 5, "WriteCapacityUnits": 10},
|
|
}
|
|
return test_client.post("/", headers=headers, json=request_body)
|