Merge pull request #2796 from bblommers/feature/1054
DynamoDB - Improve error handling for put_item without keys
This commit is contained in:
commit
6b97a4ab96
@ -792,6 +792,12 @@ class Table(BaseModel):
|
||||
expression_attribute_values=None,
|
||||
overwrite=False,
|
||||
):
|
||||
if self.hash_key_attr not in item_attrs.keys():
|
||||
raise ValueError(
|
||||
"One or more parameter values were invalid: Missing the key "
|
||||
+ self.hash_key_attr
|
||||
+ " in the item"
|
||||
)
|
||||
hash_value = DynamoType(item_attrs.get(self.hash_key_attr))
|
||||
if self.has_range_key:
|
||||
range_value = DynamoType(item_attrs.get(self.range_key_attr))
|
||||
@ -808,7 +814,6 @@ class Table(BaseModel):
|
||||
else:
|
||||
lookup_range_value = DynamoType(expected_range_value)
|
||||
current = self.get_item(hash_value, lookup_range_value)
|
||||
|
||||
item = Item(
|
||||
hash_value, self.hash_key_type, range_value, self.range_key_type, item_attrs
|
||||
)
|
||||
|
@ -293,11 +293,9 @@ class DynamoHandler(BaseResponse):
|
||||
except ItemSizeTooLarge:
|
||||
er = "com.amazonaws.dynamodb.v20111205#ValidationException"
|
||||
return self.error(er, ItemSizeTooLarge.message)
|
||||
except ValueError:
|
||||
except ValueError as ve:
|
||||
er = "com.amazonaws.dynamodb.v20111205#ConditionalCheckFailedException"
|
||||
return self.error(
|
||||
er, "A condition specified in the operation could not be evaluated."
|
||||
)
|
||||
return self.error(er, str(ve))
|
||||
|
||||
if result:
|
||||
item_dict = result.to_json()
|
||||
|
@ -1344,6 +1344,24 @@ def test_get_item_returns_consumed_capacity():
|
||||
assert "TableName" in response["ConsumedCapacity"]
|
||||
|
||||
|
||||
@mock_dynamodb2
|
||||
def test_put_item_nonexisting_hash_key():
|
||||
dynamodb = boto3.resource("dynamodb", region_name="us-east-1")
|
||||
dynamodb.create_table(
|
||||
AttributeDefinitions=[{"AttributeName": "structure_id", "AttributeType": "S"},],
|
||||
TableName="test",
|
||||
KeySchema=[{"AttributeName": "structure_id", "KeyType": "HASH"},],
|
||||
ProvisionedThroughput={"ReadCapacityUnits": 123, "WriteCapacityUnits": 123},
|
||||
)
|
||||
table = dynamodb.Table("test")
|
||||
|
||||
with assert_raises(ClientError) as ex:
|
||||
table.put_item(Item={"a_terribly_misguided_id_attribute": "abcdef"})
|
||||
ex.exception.response["Error"]["Message"].should.equal(
|
||||
"One or more parameter values were invalid: Missing the key structure_id in the item"
|
||||
)
|
||||
|
||||
|
||||
def test_filter_expression():
|
||||
row1 = moto.dynamodb2.models.Item(
|
||||
None,
|
||||
|
Loading…
Reference in New Issue
Block a user