parent
b8ba7980a0
commit
9bf8fd3417
6 changed files with 282 additions and 10 deletions
|
|
@ -1531,6 +1531,7 @@ def test_dynamodb_streams_2():
|
|||
}
|
||||
assert 'LatestStreamLabel' in resp['TableDescription']
|
||||
assert 'LatestStreamArn' in resp['TableDescription']
|
||||
|
||||
|
||||
@mock_dynamodb2
|
||||
def test_condition_expressions():
|
||||
|
|
@ -1696,8 +1697,8 @@ def test_query_gsi_with_range_key():
|
|||
res = dynamodb.query(TableName='test', IndexName='test_gsi',
|
||||
KeyConditionExpression='gsi_hash_key = :gsi_hash_key AND gsi_range_key = :gsi_range_key',
|
||||
ExpressionAttributeValues={
|
||||
':gsi_hash_key': {'S': 'key1'},
|
||||
':gsi_range_key': {'S': 'range1'}
|
||||
':gsi_hash_key': {'S': 'key1'},
|
||||
':gsi_range_key': {'S': 'range1'}
|
||||
})
|
||||
res.should.have.key("Count").equal(1)
|
||||
res.should.have.key("Items")
|
||||
|
|
@ -1706,3 +1707,45 @@ def test_query_gsi_with_range_key():
|
|||
'gsi_hash_key': {'S': 'key1'},
|
||||
'gsi_range_key': {'S': 'range1'},
|
||||
})
|
||||
|
||||
|
||||
@mock_dynamodb2
|
||||
def test_scan_by_non_exists_index():
|
||||
dynamodb = boto3.client('dynamodb', region_name='us-east-1')
|
||||
|
||||
dynamodb.create_table(
|
||||
TableName='test',
|
||||
KeySchema=[{'AttributeName': 'id', 'KeyType': 'HASH'}],
|
||||
AttributeDefinitions=[
|
||||
{'AttributeName': 'id', 'AttributeType': 'S'},
|
||||
{'AttributeName': 'gsi_col', 'AttributeType': 'S'}
|
||||
],
|
||||
ProvisionedThroughput={'ReadCapacityUnits': 1, 'WriteCapacityUnits': 1},
|
||||
GlobalSecondaryIndexes=[
|
||||
{
|
||||
'IndexName': 'test_gsi',
|
||||
'KeySchema': [
|
||||
{
|
||||
'AttributeName': 'gsi_col',
|
||||
'KeyType': 'HASH'
|
||||
},
|
||||
],
|
||||
'Projection': {
|
||||
'ProjectionType': 'ALL',
|
||||
},
|
||||
'ProvisionedThroughput': {
|
||||
'ReadCapacityUnits': 1,
|
||||
'WriteCapacityUnits': 1
|
||||
}
|
||||
},
|
||||
]
|
||||
)
|
||||
|
||||
with assert_raises(ClientError) as ex:
|
||||
dynamodb.scan(TableName='test', IndexName='non_exists_index')
|
||||
|
||||
ex.exception.response['Error']['Code'].should.equal('ValidationException')
|
||||
ex.exception.response['ResponseMetadata']['HTTPStatusCode'].should.equal(400)
|
||||
ex.exception.response['Error']['Message'].should.equal(
|
||||
'The table does not have the specified index: non_exists_index'
|
||||
)
|
||||
|
|
|
|||
|
|
@ -1961,3 +1961,113 @@ def test_query_pagination():
|
|||
results = page1['Items'] + page2['Items']
|
||||
subjects = set([int(r['subject']) for r in results])
|
||||
subjects.should.equal(set(range(10)))
|
||||
|
||||
|
||||
@mock_dynamodb2
|
||||
def test_scan_by_index():
|
||||
dynamodb = boto3.client('dynamodb', region_name='us-east-1')
|
||||
|
||||
dynamodb.create_table(
|
||||
TableName='test',
|
||||
KeySchema=[
|
||||
{'AttributeName': 'id', 'KeyType': 'HASH'},
|
||||
{'AttributeName': 'range_key', 'KeyType': 'RANGE'},
|
||||
],
|
||||
AttributeDefinitions=[
|
||||
{'AttributeName': 'id', 'AttributeType': 'S'},
|
||||
{'AttributeName': 'range_key', 'AttributeType': 'S'},
|
||||
{'AttributeName': 'gsi_col', 'AttributeType': 'S'},
|
||||
{'AttributeName': 'gsi_range_key', 'AttributeType': 'S'},
|
||||
{'AttributeName': 'lsi_range_key', 'AttributeType': 'S'},
|
||||
],
|
||||
ProvisionedThroughput={'ReadCapacityUnits': 1, 'WriteCapacityUnits': 1},
|
||||
GlobalSecondaryIndexes=[
|
||||
{
|
||||
'IndexName': 'test_gsi',
|
||||
'KeySchema': [
|
||||
{'AttributeName': 'gsi_col', 'KeyType': 'HASH'},
|
||||
{'AttributeName': 'gsi_range_key', 'KeyType': 'RANGE'},
|
||||
],
|
||||
'Projection': {
|
||||
'ProjectionType': 'ALL',
|
||||
},
|
||||
'ProvisionedThroughput': {
|
||||
'ReadCapacityUnits': 1,
|
||||
'WriteCapacityUnits': 1
|
||||
}
|
||||
},
|
||||
],
|
||||
LocalSecondaryIndexes=[
|
||||
{
|
||||
'IndexName': 'test_lsi',
|
||||
'KeySchema': [
|
||||
{'AttributeName': 'id', 'KeyType': 'HASH'},
|
||||
{'AttributeName': 'lsi_range_key', 'KeyType': 'RANGE'},
|
||||
],
|
||||
'Projection': {
|
||||
'ProjectionType': 'ALL',
|
||||
},
|
||||
},
|
||||
]
|
||||
)
|
||||
|
||||
dynamodb.put_item(
|
||||
TableName='test',
|
||||
Item={
|
||||
'id': {'S': '1'},
|
||||
'range_key': {'S': '1'},
|
||||
'col1': {'S': 'val1'},
|
||||
'gsi_col': {'S': '1'},
|
||||
'gsi_range_key': {'S': '1'},
|
||||
'lsi_range_key': {'S': '1'},
|
||||
}
|
||||
)
|
||||
|
||||
dynamodb.put_item(
|
||||
TableName='test',
|
||||
Item={
|
||||
'id': {'S': '1'},
|
||||
'range_key': {'S': '2'},
|
||||
'col1': {'S': 'val2'},
|
||||
'gsi_col': {'S': '1'},
|
||||
'gsi_range_key': {'S': '2'},
|
||||
'lsi_range_key': {'S': '2'},
|
||||
}
|
||||
)
|
||||
|
||||
dynamodb.put_item(
|
||||
TableName='test',
|
||||
Item={
|
||||
'id': {'S': '3'},
|
||||
'range_key': {'S': '1'},
|
||||
'col1': {'S': 'val3'},
|
||||
}
|
||||
)
|
||||
|
||||
res = dynamodb.scan(TableName='test')
|
||||
assert res['Count'] == 3
|
||||
assert len(res['Items']) == 3
|
||||
|
||||
res = dynamodb.scan(TableName='test', IndexName='test_gsi')
|
||||
assert res['Count'] == 2
|
||||
assert len(res['Items']) == 2
|
||||
|
||||
res = dynamodb.scan(TableName='test', IndexName='test_gsi', Limit=1)
|
||||
assert res['Count'] == 1
|
||||
assert len(res['Items']) == 1
|
||||
last_eval_key = res['LastEvaluatedKey']
|
||||
assert last_eval_key['id']['S'] == '1'
|
||||
assert last_eval_key['gsi_col']['S'] == '1'
|
||||
assert last_eval_key['gsi_range_key']['S'] == '1'
|
||||
|
||||
res = dynamodb.scan(TableName='test', IndexName='test_lsi')
|
||||
assert res['Count'] == 2
|
||||
assert len(res['Items']) == 2
|
||||
|
||||
res = dynamodb.scan(TableName='test', IndexName='test_lsi', Limit=1)
|
||||
assert res['Count'] == 1
|
||||
assert len(res['Items']) == 1
|
||||
last_eval_key = res['LastEvaluatedKey']
|
||||
assert last_eval_key['id']['S'] == '1'
|
||||
assert last_eval_key['range_key']['S'] == '1'
|
||||
assert last_eval_key['lsi_range_key']['S'] == '1'
|
||||
|
|
|
|||
|
|
@ -829,3 +829,77 @@ def test_scan_pagination():
|
|||
results = page1['Items'] + page2['Items']
|
||||
usernames = set([r['username'] for r in results])
|
||||
usernames.should.equal(set(expected_usernames))
|
||||
|
||||
|
||||
@mock_dynamodb2
|
||||
def test_scan_by_index():
|
||||
dynamodb = boto3.client('dynamodb', region_name='us-east-1')
|
||||
|
||||
dynamodb.create_table(
|
||||
TableName='test',
|
||||
KeySchema=[{'AttributeName': 'id', 'KeyType': 'HASH'}],
|
||||
AttributeDefinitions=[
|
||||
{'AttributeName': 'id', 'AttributeType': 'S'},
|
||||
{'AttributeName': 'gsi_col', 'AttributeType': 'S'}
|
||||
],
|
||||
ProvisionedThroughput={'ReadCapacityUnits': 1, 'WriteCapacityUnits': 1},
|
||||
GlobalSecondaryIndexes=[
|
||||
{
|
||||
'IndexName': 'test_gsi',
|
||||
'KeySchema': [
|
||||
{
|
||||
'AttributeName': 'gsi_col',
|
||||
'KeyType': 'HASH'
|
||||
},
|
||||
],
|
||||
'Projection': {
|
||||
'ProjectionType': 'ALL',
|
||||
},
|
||||
'ProvisionedThroughput': {
|
||||
'ReadCapacityUnits': 1,
|
||||
'WriteCapacityUnits': 1
|
||||
}
|
||||
},
|
||||
]
|
||||
)
|
||||
|
||||
dynamodb.put_item(
|
||||
TableName='test',
|
||||
Item={
|
||||
'id': {'S': '1'},
|
||||
'col1': {'S': 'val1'},
|
||||
'gsi_col': {'S': 'gsi_val1'},
|
||||
}
|
||||
)
|
||||
|
||||
dynamodb.put_item(
|
||||
TableName='test',
|
||||
Item={
|
||||
'id': {'S': '2'},
|
||||
'col1': {'S': 'val2'},
|
||||
'gsi_col': {'S': 'gsi_val2'},
|
||||
}
|
||||
)
|
||||
|
||||
dynamodb.put_item(
|
||||
TableName='test',
|
||||
Item={
|
||||
'id': {'S': '3'},
|
||||
'col1': {'S': 'val3'},
|
||||
}
|
||||
)
|
||||
|
||||
res = dynamodb.scan(TableName='test')
|
||||
assert res['Count'] == 3
|
||||
assert len(res['Items']) == 3
|
||||
|
||||
res = dynamodb.scan(TableName='test', IndexName='test_gsi')
|
||||
assert res['Count'] == 2
|
||||
assert len(res['Items']) == 2
|
||||
|
||||
res = dynamodb.scan(TableName='test', IndexName='test_gsi', Limit=1)
|
||||
assert res['Count'] == 1
|
||||
assert len(res['Items']) == 1
|
||||
last_eval_key = res['LastEvaluatedKey']
|
||||
assert last_eval_key['id']['S'] == '1'
|
||||
assert last_eval_key['gsi_col']['S'] == 'gsi_val1'
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue