mirror of
https://github.com/scylladb/scylladb.git
synced 2026-06-05 06:23:03 +00:00
We need to write more tests for various case of handling nested documents and nested attributes. Let's collect them all in the same test file. This patch mostly moves existing code, but also adds one small test, test_nested_document_attribute_write, which just writes a nested document and reads it back (it's mostly covered by the existing test_put_and_get_attribute_types, but is specifically about a nested document). Signed-off-by: Nadav Har'El <nyh@scylladb.com>
39 lines
1.9 KiB
Python
39 lines
1.9 KiB
Python
# Test for operations on items with *nested* attributes.
|
|
|
|
import random
|
|
import string
|
|
import pytest
|
|
from botocore.exceptions import ClientError
|
|
|
|
def random_string(length=10, chars=string.ascii_uppercase + string.digits):
|
|
return ''.join(random.choice(chars) for x in range(length))
|
|
|
|
# Test that we can write a top-level attribute that is a nested document, and
|
|
# read it back correctly.
|
|
def test_nested_document_attribute_write(test_table_s):
|
|
nested_value = {
|
|
'a': 3,
|
|
'b': {'c': 'hello', 'd': ['hi', 'there', {'x': 'y'}, '42']},
|
|
}
|
|
p = random_string()
|
|
test_table_s.put_item(Item={'p': p, 'a': nested_value})
|
|
assert test_table_s.get_item(Key={'p': p}, ConsistentRead=True)['Item'] == {'p': p, 'a': nested_value}
|
|
|
|
# Test that if we have a top-level attribute that is a nested document (i.e.,
|
|
# a dictionary), updating this attribute will replace it entirely by a new
|
|
# nested document - not merge into the old content with the new content.
|
|
def test_nested_document_attribute_overwrite(test_table_s):
|
|
p = random_string()
|
|
test_table_s.put_item(Item={'p': p, 'a': {'b': 3, 'c': 4}, 'd': 5})
|
|
assert test_table_s.get_item(Key={'p': p}, ConsistentRead=True)['Item'] == {'p': p, 'a': {'b': 3, 'c': 4}, 'd': 5}
|
|
test_table_s.update_item(Key={'p': p}, AttributeUpdates={'a': {'Value': {'c': 5}, 'Action': 'PUT'}})
|
|
assert test_table_s.get_item(Key={'p': p}, ConsistentRead=True)['Item'] == {'p': p, 'a': {'c': 5}, 'd': 5}
|
|
|
|
# Verify that AttributeUpdates cannot be used to update a nested attribute -
|
|
# trying to use a dot in the name of the attribute, will just create one with
|
|
# an actual dot in its name.
|
|
def test_attribute_updates_dot(test_table_s):
|
|
p = random_string()
|
|
test_table_s.update_item(Key={'p': p}, AttributeUpdates={'a.b': {'Value': 3, 'Action': 'PUT'}})
|
|
assert test_table_s.get_item(Key={'p': p}, ConsistentRead=True)['Item'] == {'p': p, 'a.b': 3}
|