From 414b672e2245a67a4f628ecaa2af143a2f76f033 Mon Sep 17 00:00:00 2001 From: Nadav Har'El Date: Sun, 3 Oct 2021 15:28:42 +0300 Subject: [PATCH] test/alternator: verify that empty-string keys are NOT allowed Since May 2020 empty strings are allowed in DynamoDB as attribute values (see announcment in [1]). However, they are still not allowed as keys. We had tests that they are not allowed in keys of LSI or GSI, but missed tests that they are not allowed as keys (partition or sort key) of base tables. This patch add these missing tests. These tests pass - we already had code that checked for empty keys and generated an appropriate error. Note that for compatibility with DynamoDB, Alternator will forbid empty strings as keys even though Scylla *does* support this possibility (Scylla always supported empty strings as clustering key, and empty partition keys will become possible with issue #9352). [1] https://aws.amazon.com/about-aws/whats-new/2020/05/amazon-dynamodb-now-supports-empty-values-for-non-key-string-and-binary-attributes-in-dynamodb-tables/ Signed-off-by: Nadav Har'El Message-Id: <20211003122842.471001-1-nyh@scylladb.com> --- test/alternator/test_item.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/test/alternator/test_item.py b/test/alternator/test_item.py index b2a5cae981..f70f96e4f4 100644 --- a/test/alternator/test_item.py +++ b/test/alternator/test_item.py @@ -707,3 +707,29 @@ def test_null_in_bytes(test_table_b): assert 0 in val test_table_b.put_item(Item={'p': p, 'val': val}) assert test_table_b.get_item(Key={'p': p}, ConsistentRead=True)['Item'] == {'p': p, 'val': val} + +# Test that empty string or binary keys (either partition or sort key) are *not* +# allowed - DynamoDB complains that "The AttributeValue for a key attribute cannot +# contain an empty string value. Key: p." +# Since May 2020, DynamoDB does allow to use empty strings or blobs for attributes +# (see https://aws.amazon.com/about-aws/whats-new/2020/05/amazon-dynamodb-now-supports-empty-values-for-non-key-string-and-binary-attributes-in-dynamodb-tables/ +# but they are still not allowed for keys. +# Note that also for GSI and LSI keys empty strings are not allowed - this is +# checked in separate tests - test_lsi.py::test_lsi_empty_value and +# test_gsi.py::test_gsi_empty_value. +def test_key_empty_string_value(test_table): + p = random_string() + c = random_string() + with pytest.raises(ClientError, match='ValidationException.*empty string'): + test_table.put_item(Item={'p': '', 'c': c}) + with pytest.raises(ClientError, match='ValidationException.*empty string'): + test_table.put_item(Item={'p': p, 'c': ''}) +def test_key_empty_bytes_value(test_table_b, test_table_sb): + p = random_string() + # Interestingly, Scylla reports an "empty string" in the bytes case as well, + # while DynamoDB complains more accurately about an "empty binary value". + # Let's just accept both. + with pytest.raises(ClientError, match='ValidationException.*empty'): + test_table_b.put_item(Item={'p': b''}) + with pytest.raises(ClientError, match='ValidationException.*empty'): + test_table_sb.put_item(Item={'p': p, 'c': b''})