add extra test for ProjectionExpression using scan with ExpressionAttributes
This commit is contained in:
parent
949637a14c
commit
4ce0e6bbcb
@ -985,6 +985,9 @@ class DynamoDBBackend(BaseBackend):
|
|||||||
else:
|
else:
|
||||||
filter_expression = Op(None, None) # Will always eval to true
|
filter_expression = Op(None, None) # Will always eval to true
|
||||||
|
|
||||||
|
projection_expression = ','.join([expr_names[attr] if attr in expr_names else attr
|
||||||
|
for attr in projection_expression.replace(' ', '').split(',')])
|
||||||
|
|
||||||
return table.scan(scan_filters, limit, exclusive_start_key, filter_expression, index_name, projection_expression)
|
return table.scan(scan_filters, limit, exclusive_start_key, filter_expression, index_name, projection_expression)
|
||||||
|
|
||||||
def update_item(self, table_name, key, update_expression, attribute_updates, expression_attribute_names,
|
def update_item(self, table_name, key, update_expression, attribute_updates, expression_attribute_names,
|
||||||
|
@ -558,7 +558,7 @@ class DynamoHandler(BaseResponse):
|
|||||||
filter_expression = self.body.get('FilterExpression')
|
filter_expression = self.body.get('FilterExpression')
|
||||||
expression_attribute_values = self.body.get('ExpressionAttributeValues', {})
|
expression_attribute_values = self.body.get('ExpressionAttributeValues', {})
|
||||||
expression_attribute_names = self.body.get('ExpressionAttributeNames', {})
|
expression_attribute_names = self.body.get('ExpressionAttributeNames', {})
|
||||||
projection_expression = self.body.get('ProjectionExpression')
|
projection_expression = self.body.get('ProjectionExpression', '')
|
||||||
exclusive_start_key = self.body.get('ExclusiveStartKey')
|
exclusive_start_key = self.body.get('ExclusiveStartKey')
|
||||||
limit = self.body.get("Limit")
|
limit = self.body.get("Limit")
|
||||||
index_name = self.body.get('IndexName')
|
index_name = self.body.get('IndexName')
|
||||||
|
@ -497,7 +497,7 @@ def test_basic_projection_expressions_using_scan():
|
|||||||
'subject': '123',
|
'subject': '123',
|
||||||
'body': 'some other test message'
|
'body': 'some other test message'
|
||||||
})
|
})
|
||||||
# Test a query returning all items
|
# Test a scan returning all items
|
||||||
results = table.scan(
|
results = table.scan(
|
||||||
FilterExpression=Key('forum_name').eq(
|
FilterExpression=Key('forum_name').eq(
|
||||||
'the-key'),
|
'the-key'),
|
||||||
@ -603,6 +603,84 @@ def test_basic_projection_expressions_with_attr_expression_names():
|
|||||||
assert 'attachment' in results['Items'][0]
|
assert 'attachment' in results['Items'][0]
|
||||||
assert results['Items'][0]['attachment'] == 'something'
|
assert results['Items'][0]['attachment'] == 'something'
|
||||||
|
|
||||||
|
@mock_dynamodb2
|
||||||
|
def test_basic_projection_expressions_using_scan_with_attr_expression_names():
|
||||||
|
dynamodb = boto3.resource('dynamodb', region_name='us-east-1')
|
||||||
|
|
||||||
|
# Create the DynamoDB table.
|
||||||
|
table = dynamodb.create_table(
|
||||||
|
TableName='users',
|
||||||
|
KeySchema=[
|
||||||
|
{
|
||||||
|
'AttributeName': 'forum_name',
|
||||||
|
'KeyType': 'HASH'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'AttributeName': 'subject',
|
||||||
|
'KeyType': 'RANGE'
|
||||||
|
},
|
||||||
|
],
|
||||||
|
AttributeDefinitions=[
|
||||||
|
{
|
||||||
|
'AttributeName': 'forum_name',
|
||||||
|
'AttributeType': 'S'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'AttributeName': 'subject',
|
||||||
|
'AttributeType': 'S'
|
||||||
|
},
|
||||||
|
],
|
||||||
|
ProvisionedThroughput={
|
||||||
|
'ReadCapacityUnits': 5,
|
||||||
|
'WriteCapacityUnits': 5
|
||||||
|
}
|
||||||
|
)
|
||||||
|
table = dynamodb.Table('users')
|
||||||
|
|
||||||
|
table.put_item(Item={
|
||||||
|
'forum_name': 'the-key',
|
||||||
|
'subject': '123',
|
||||||
|
'body': 'some test message',
|
||||||
|
'attachment': 'something'
|
||||||
|
})
|
||||||
|
|
||||||
|
table.put_item(Item={
|
||||||
|
'forum_name': 'not-the-key',
|
||||||
|
'subject': '123',
|
||||||
|
'body': 'some other test message',
|
||||||
|
'attachment': 'something'
|
||||||
|
})
|
||||||
|
# Test a scan returning all items
|
||||||
|
|
||||||
|
results = table.scan(
|
||||||
|
FilterExpression=Key('forum_name').eq(
|
||||||
|
'the-key'),
|
||||||
|
ProjectionExpression='#rl, #rt, subject',
|
||||||
|
ExpressionAttributeNames={
|
||||||
|
'#rl': 'body',
|
||||||
|
'#rt': 'attachment'
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
assert 'body' in results['Items'][0]
|
||||||
|
assert 'attachment' in results['Items'][0]
|
||||||
|
assert 'subject' in results['Items'][0]
|
||||||
|
assert 'form_name' not in results['Items'][0]
|
||||||
|
|
||||||
|
# Test without a FilterExpression
|
||||||
|
results = table.scan(
|
||||||
|
ProjectionExpression='#rl, #rt, subject',
|
||||||
|
ExpressionAttributeNames={
|
||||||
|
'#rl': 'body',
|
||||||
|
'#rt': 'attachment'
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
assert 'body' in results['Items'][0]
|
||||||
|
assert 'attachment' in results['Items'][0]
|
||||||
|
assert 'subject' in results['Items'][0]
|
||||||
|
assert 'form_name' not in results['Items'][0]
|
||||||
|
|
||||||
|
|
||||||
@mock_dynamodb2
|
@mock_dynamodb2
|
||||||
def test_put_item_returns_consumed_capacity():
|
def test_put_item_returns_consumed_capacity():
|
||||||
|
Loading…
x
Reference in New Issue
Block a user