class ConditionExpressionTestCase(TestCase): def setUp(self): self.attribute = UnicodeAttribute(attr_name='foo') def test_equal(self): condition = self.attribute == 'bar' placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0 = :0" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}} def test_not_equal(self): condition = self.attribute != 'bar' placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0 <> :0" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}} def test_less_than(self): condition = self.attribute < 'bar' placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0 < :0" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}} def test_less_than_or_equal(self): condition = self.attribute <= 'bar' placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0 <= :0" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}} def test_greater_than(self): condition = self.attribute > 'bar' placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0 > :0" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}} def test_greater_than_or_equal(self): condition = self.attribute >= 'bar' placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0 >= :0" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}} def test_between(self): condition = self.attribute.between('bar', 'baz') placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0 BETWEEN :0 AND :1" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == { ':0': { 'S': 'bar' }, ':1': { 'S': 'baz' } } def test_in(self): condition = self.attribute.is_in('bar', 'baz') placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0 IN (:0, :1)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == { ':0': { 'S': 'bar' }, ':1': { 'S': 'baz' } } def test_exists(self): condition = self.attribute.exists() placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "attribute_exists (#0)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {} def test_does_not_exist(self): condition = self.attribute.does_not_exist() placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "attribute_not_exists (#0)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {} def test_is_type(self): condition = self.attribute.is_type() placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "attribute_type (#0, :0)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'S'}} def test_begins_with(self): condition = self.attribute.startswith('bar') placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "begins_with (#0, :0)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}} def test_contains(self): condition = self.attribute.contains('bar') placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "contains (#0, :0)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}} def test_contains_string_set(self): condition = UnicodeSetAttribute(attr_name='foo').contains('bar') placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "contains (#0, :0)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}} def test_contains_number_set(self): condition = NumberSetAttribute(attr_name='foo').contains(1) placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "contains (#0, :0)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'N': '1'}} def test_contains_list(self): condition = ListAttribute(attr_name='foo').contains('bar') placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "contains (#0, :0)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}} def test_size(self): condition = size(self.attribute) == 3 placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "size (#0) = :0" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'N': '3'}} def test_and(self): condition = (self.attribute < 'bar') & (self.attribute > 'baz') placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "(#0 < :0 AND #0 > :1)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == { ':0': { 'S': 'bar' }, ':1': { 'S': 'baz' } } def test_or(self): condition = (self.attribute < 'bar') | (self.attribute > 'baz') placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "(#0 < :0 OR #0 > :1)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == { ':0': { 'S': 'bar' }, ':1': { 'S': 'baz' } } def test_not(self): condition = ~(self.attribute < 'bar') placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "(NOT #0 < :0)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}} def test_compound_logic(self): condition = (~(self.attribute < 'bar') & (self.attribute > 'baz')) | (self.attribute == 'foo') placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "(((NOT #0 < :0) AND #0 > :1) OR #0 = :2)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == { ':0': { 'S': 'bar' }, ':1': { 'S': 'baz' }, ':2': { 'S': 'foo' } } def test_indexing(self): condition = ListAttribute(attr_name='foo')[0] == 'bar' placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0[0] = :0" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}} def test_invalid_indexing(self): with self.assertRaises(TypeError): self.attribute[0] def test_double_indexing(self): condition = ListAttribute(attr_name='foo')[0][1] == 'bar' placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0[0][1] = :0" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}} def test_list_comparison(self): condition = ListAttribute(attr_name='foo') == ['bar', 'baz'] placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0 = :0" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == { ':0': { 'L': [{ 'S': 'bar' }, { 'S': 'baz' }] } } def test_dotted_attribute_name(self): self.attribute.attr_name = 'foo.bar' condition = self.attribute == 'baz' placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0 = :0" assert placeholder_names == {'foo.bar': '#0'} assert expression_attribute_values == {':0': {'S': 'baz'}}
class ConditionExpressionTestCase(TestCase): def setUp(self): self.attribute = UnicodeAttribute(attr_name='foo') def test_equal(self): condition = self.attribute == 'bar' placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0 = :0" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}} def test_not_equal(self): condition = self.attribute != 'bar' placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0 <> :0" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}} def test_less_than(self): condition = self.attribute < 'bar' placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0 < :0" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}} def test_less_than_or_equal(self): condition = self.attribute <= 'bar' placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0 <= :0" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}} def test_greater_than(self): condition = self.attribute > 'bar' placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0 > :0" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}} def test_greater_than_or_equal(self): condition = self.attribute >= 'bar' placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0 >= :0" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}} def test_between(self): condition = self.attribute.between('bar', 'baz') placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0 BETWEEN :0 AND :1" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}, ':1': {'S': 'baz'}} def test_in(self): condition = self.attribute.is_in('bar', 'baz') placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0 IN (:0, :1)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}, ':1': {'S': 'baz'}} def test_exists(self): condition = self.attribute.exists() placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "attribute_exists (#0)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {} def test_does_not_exist(self): condition = self.attribute.does_not_exist() placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "attribute_not_exists (#0)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {} def test_is_type(self): condition = self.attribute.is_type() placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "attribute_type (#0, :0)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S' : 'S'}} def test_begins_with(self): condition = self.attribute.startswith('bar') placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "begins_with (#0, :0)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S' : 'bar'}} def test_contains(self): condition = self.attribute.contains('bar') placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "contains (#0, :0)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S' : 'bar'}} def test_contains_string_set(self): condition = UnicodeSetAttribute(attr_name='foo').contains('bar') placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "contains (#0, :0)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S' : 'bar'}} def test_contains_number_set(self): condition = NumberSetAttribute(attr_name='foo').contains(1) placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "contains (#0, :0)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'N' : '1'}} def test_contains_list(self): condition = ListAttribute(attr_name='foo').contains('bar') placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "contains (#0, :0)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S' : 'bar'}} def test_contains_attribute(self): condition = ListAttribute(attr_name='foo').contains(Path('bar')) placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "contains (#0, #1)" assert placeholder_names == {'foo': '#0', 'bar': '#1'} assert expression_attribute_values == {} def test_size(self): condition = size(self.attribute) == 3 placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "size (#0) = :0" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'N' : '3'}} def test_sizes(self): condition = size(self.attribute) == size(Path('bar')) placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "size (#0) = size (#1)" assert placeholder_names == {'foo': '#0', 'bar': '#1'} assert expression_attribute_values == {} def test_and(self): condition = (self.attribute < 'bar') & (self.attribute > 'baz') placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "(#0 < :0 AND #0 > :1)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}, ':1': {'S': 'baz'}} def test_invalid_and(self): condition = self.attribute < 'bar' with self.assertRaises(TypeError): condition &= None def test_rand(self): condition = None condition &= self.attribute < 'bar' placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0 < :0" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}} def test_invalid_rand(self): condition = 42 with self.assertRaises(TypeError): condition &= self.attribute < 'bar' def test_or(self): condition = (self.attribute < 'bar') | (self.attribute > 'baz') placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "(#0 < :0 OR #0 > :1)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}, ':1': {'S': 'baz'}} def test_invalid_or(self): condition = self.attribute < 'bar' with self.assertRaises(TypeError): condition |= None def test_not(self): condition = ~(self.attribute < 'bar') placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "(NOT #0 < :0)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}} def test_compound_logic(self): condition = (~(self.attribute < 'bar') & (self.attribute > 'baz')) | (self.attribute == 'foo') placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "(((NOT #0 < :0) AND #0 > :1) OR #0 = :2)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}, ':1': {'S': 'baz'}, ':2': {'S': 'foo'}} def test_indexing(self): condition = ListAttribute(attr_name='foo')[0] == 'bar' placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0[0] = :0" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S' : 'bar'}} def test_invalid_indexing(self): with self.assertRaises(TypeError): self.attribute[0] def test_double_indexing(self): condition = ListAttribute(attr_name='foo')[0][1] == 'bar' placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0[0][1] = :0" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S' : 'bar'}} def test_map_comparison(self): # Simulate initialization from inside an AttributeContainer my_map_attribute = MapAttribute(attr_name='foo') my_map_attribute._make_attribute() my_map_attribute._update_attribute_paths(my_map_attribute.attr_name) condition = my_map_attribute == MapAttribute(bar='baz') placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0 = :0" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'M': {'bar': {'S': 'baz'}}}} def test_list_comparison(self): condition = ListAttribute(attr_name='foo') == ['bar', 'baz'] placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0 = :0" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'L': [{'S' : 'bar'}, {'S': 'baz'}]}} def test_dotted_attribute_name(self): self.attribute.attr_name = 'foo.bar' condition = self.attribute == 'baz' placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0 = :0" assert placeholder_names == {'foo.bar': '#0'} assert expression_attribute_values == {':0': {'S': 'baz'}} def test_map_attribute_indexing(self): # Simulate initialization from inside an AttributeContainer my_map_attribute = MapAttribute(attr_name='foo.bar') my_map_attribute._make_attribute() my_map_attribute._update_attribute_paths(my_map_attribute.attr_name) condition = my_map_attribute['foo'] == 'baz' placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0.#1 = :0" assert placeholder_names == {'foo.bar': '#0', 'foo': '#1'} assert expression_attribute_values == {':0': {'S': 'baz'}} def test_map_attribute_dereference(self): class MyMapAttribute(MapAttribute): nested_string = self.attribute # Simulate initialization from inside an AttributeContainer my_map_attribute = MyMapAttribute(attr_name='foo.bar') my_map_attribute._make_attribute() my_map_attribute._update_attribute_paths(my_map_attribute.attr_name) condition = my_map_attribute.nested_string == 'baz' placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0.#1 = :0" assert placeholder_names == {'foo.bar': '#0', 'foo': '#1'} assert expression_attribute_values == {':0': {'S': 'baz'}} def test_map_attribute_dereference_via_indexing(self): class MyMapAttribute(MapAttribute): nested_string = self.attribute # Simulate initialization from inside an AttributeContainer my_map_attribute = MyMapAttribute(attr_name='foo.bar') my_map_attribute._make_attribute() my_map_attribute._update_attribute_paths(my_map_attribute.attr_name) condition = my_map_attribute['nested_string'] == 'baz' placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0.#1 = :0" assert placeholder_names == {'foo.bar': '#0', 'foo': '#1'} assert expression_attribute_values == {':0': {'S': 'baz'}} def test_map_attribute_dereference_via_indexing_missing_attribute(self): class MyMapAttribute(MapAttribute): nested_string = self.attribute # Simulate initialization from inside an AttributeContainer my_map_attribute = MyMapAttribute(attr_name='foo.bar') my_map_attribute._make_attribute() my_map_attribute._update_attribute_paths(my_map_attribute.attr_name) with self.assertRaises(AttributeError): my_map_attribute['missing_attribute'] == 'baz'
class ConditionExpressionTestCase(TestCase): def setUp(self): self.attribute = UnicodeAttribute(attr_name='foo') def test_equal(self): condition = self.attribute == 'bar' placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0 = :0" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}} def test_not_equal(self): condition = self.attribute != 'bar' placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0 <> :0" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}} def test_less_than(self): condition = self.attribute < 'bar' placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0 < :0" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}} def test_less_than_or_equal(self): condition = self.attribute <= 'bar' placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0 <= :0" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}} def test_greater_than(self): condition = self.attribute > 'bar' placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0 > :0" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}} def test_greater_than_or_equal(self): condition = self.attribute >= 'bar' placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0 >= :0" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}} def test_between(self): condition = self.attribute.between('bar', 'baz') placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0 BETWEEN :0 AND :1" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}, ':1': {'S': 'baz'}} def test_in(self): condition = self.attribute.is_in('bar', 'baz') placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0 IN (:0, :1)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}, ':1': {'S': 'baz'}} def test_exists(self): condition = self.attribute.exists() placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "attribute_exists (#0)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {} def test_does_not_exist(self): condition = self.attribute.does_not_exist() placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "attribute_not_exists (#0)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {} def test_is_type(self): condition = self.attribute.is_type() placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "attribute_type (#0, :0)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S' : 'S'}} def test_begins_with(self): condition = self.attribute.startswith('bar') placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "begins_with (#0, :0)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S' : 'bar'}} def test_contains(self): condition = self.attribute.contains('bar') placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "contains (#0, :0)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S' : 'bar'}} def test_contains_string_set(self): condition = UnicodeSetAttribute(attr_name='foo').contains('bar') placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "contains (#0, :0)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S' : 'bar'}} def test_contains_number_set(self): condition = NumberSetAttribute(attr_name='foo').contains(1) placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "contains (#0, :0)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'N' : '1'}} def test_contains_list(self): condition = ListAttribute(attr_name='foo').contains('bar') placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "contains (#0, :0)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S' : 'bar'}} def test_contains_attribute(self): condition = ListAttribute(attr_name='foo').contains(Path('bar')) placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "contains (#0, #1)" assert placeholder_names == {'foo': '#0', 'bar': '#1'} assert expression_attribute_values == {} def test_size(self): condition = size(self.attribute) == 3 placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "size (#0) = :0" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'N' : '3'}} def test_sizes(self): condition = size(self.attribute) == size(Path('bar')) placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "size (#0) = size (#1)" assert placeholder_names == {'foo': '#0', 'bar': '#1'} assert expression_attribute_values == {} def test_and(self): condition = (self.attribute < 'bar') & (self.attribute > 'baz') placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "(#0 < :0 AND #0 > :1)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}, ':1': {'S': 'baz'}} def test_or(self): condition = (self.attribute < 'bar') | (self.attribute > 'baz') placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "(#0 < :0 OR #0 > :1)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}, ':1': {'S': 'baz'}} def test_not(self): condition = ~(self.attribute < 'bar') placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "(NOT #0 < :0)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}} def test_compound_logic(self): condition = (~(self.attribute < 'bar') & (self.attribute > 'baz')) | (self.attribute == 'foo') placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "(((NOT #0 < :0) AND #0 > :1) OR #0 = :2)" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S': 'bar'}, ':1': {'S': 'baz'}, ':2': {'S': 'foo'}} def test_indexing(self): condition = ListAttribute(attr_name='foo')[0] == 'bar' placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0[0] = :0" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S' : 'bar'}} def test_invalid_indexing(self): with self.assertRaises(TypeError): self.attribute[0] def test_double_indexing(self): condition = ListAttribute(attr_name='foo')[0][1] == 'bar' placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0[0][1] = :0" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'S' : 'bar'}} def test_list_comparison(self): condition = ListAttribute(attr_name='foo') == ['bar', 'baz'] placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0 = :0" assert placeholder_names == {'foo': '#0'} assert expression_attribute_values == {':0': {'L': [{'S' : 'bar'}, {'S': 'baz'}]}} def test_dotted_attribute_name(self): self.attribute.attr_name = 'foo.bar' condition = self.attribute == 'baz' placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0 = :0" assert placeholder_names == {'foo.bar': '#0'} assert expression_attribute_values == {':0': {'S': 'baz'}} def test_map_attribute_dereference(self): class MyMapAttribute(MapAttribute): nested_string = self.attribute # Simulate initialization from inside an AttributeContainer my_map_attribute = MyMapAttribute(attr_name='foo.bar') my_map_attribute._make_attribute() my_map_attribute._update_attribute_paths(my_map_attribute.attr_name) condition = my_map_attribute.nested_string == 'baz' placeholder_names, expression_attribute_values = {}, {} expression = condition.serialize(placeholder_names, expression_attribute_values) assert expression == "#0.#1 = :0" assert placeholder_names == {'foo.bar': '#0', 'foo': '#1'} assert expression_attribute_values == {':0': {'S': 'baz'}}