First pass at cqlengine tuple testing

This commit is contained in:
GregBestland
2016-02-18 12:10:11 -06:00
committed by Adam Holmberg
parent 7c6bdb5e61
commit 4c9dc3e5b7

View File

@@ -537,3 +537,189 @@ class TestCamelMapColumn(BaseCassEngTestCase):
def test_camelcase_column(self):
TestCamelMapModel.create(camelMap={'blah': 1})
class TestTupleModel(Model):
partition = columns.UUID(primary_key=True, default=uuid4)
int_tuple = columns.Tuple(columns.Integer, columns.Integer, columns.Integer, required=False)
text_tuple = columns.Tuple(columns.Text, columns.Text, required=False)
mixed_tuple = columns.Tuple(columns.Text, columns.Integer, columns.Text, required=False)
class TestTupleColumn(BaseCassEngTestCase):
@classmethod
def setUpClass(cls):
drop_table(TestTupleModel)
sync_table(TestTupleModel)
@classmethod
def tearDownClass(cls):
drop_table(TestTupleModel)
def test_initial(self):
tmp = TestTupleModel.create()
tmp.int_tuple = tmp.int_tuple + (1, 2, 3)
def test_initial_retrieve(self):
tmp = TestTupleModel.create()
tmp2 = tmp.get(partition=tmp.partition)
tmp2.int_tuple = tmp2.int_tuple + (1, 2, 3)
def test_io_success(self):
""" Tests that a basic usage works as expected """
m1 = TestTupleModel.create(int_tuple=(1, 2, 3, 5, 6), text_tuple=('kai', 'andreas'), mixed_tuple=('first', 2, 'Third'))
m2 = TestTupleModel.get(partition=m1.partition)
assert isinstance(m2.int_tuple, tuple)
assert isinstance(m2.text_tuple, tuple)
assert isinstance(m2.mixed_tuple, tuple)
assert len(m2.int_tuple) == 3
assert len(m2.text_tuple) == 2
assert len(m2.mixed_tuple) == 3
assert m2.int_tuple[0] == 1
assert m2.int_tuple[1] == 2
assert m2.int_tuple[2] == 3
assert m2.text_tuple[0] == 'kai'
assert m2.text_tuple[1] == 'andreas'
assert m2.mixed_tuple[0] == 'first'
assert m2.mixed_tuple[1] == 2
assert m2.mixed_tuple[2] == 'Third'
def test_type_validation(self):
"""
Tests that attempting to use the wrong types will raise an exception
"""
self.assertRaises(ValidationError, TestTupleModel.create, **{'int_tuple': ('string', True), 'text_tuple': ('test', 'test'), 'mixed_tuple': ('one', 2, 'three')})
self.assertRaises(ValidationError, TestTupleModel.create, **{'int_tuple': ('string', 'string'), 'text_tuple': (1, 3.0), 'mixed_tuple': ('one', 2, 'three')})
self.assertRaises(ValidationError, TestTupleModel.create, **{'int_tuple': ('string', 'string'), 'text_tuple': ('test', 'test'), 'mixed_tuple': (1, "two", 3)})
def test_instantiation_with_column_class(self):
"""
Tests that columns instantiated with a column class work properly
and that the class is instantiated in the constructor
"""
mixed_tuple = columns.Tuple(columns.Text, columns.Integer, columns.Text, required=False)
assert isinstance(mixed_tuple.types[0], columns.Text)
assert isinstance(mixed_tuple.types[1], columns.Integer)
assert isinstance(mixed_tuple.types[2], columns.Text)
self.assertEqual(len(mixed_tuple.types), 3)
def test_default_empty_container_saving(self):
""" tests that the default empty container is not saved if it hasn't been updated """
pkey = uuid4()
# create a row with tuple data
TestTupleModel.create(partition=pkey, int_tuple=(1, 2, 3))
# create another with no tuple data
TestTupleModel.create(partition=pkey)
m = TestTupleModel.get(partition=pkey)
self.assertEqual(m.int_tuple, (1, 2, 3))
def test_partial_updates(self):
"""Truncates on create but not on save"""
""" broken"""
full = tuple(range(10))
initial = full[3:7]
m1 = TestTupleModel.create(int_tuple=initial)
m1.int_tuple = (1, 2, 3)
m1.save()
if is_prepend_reversed():
expected = full[2::-1] + full[3:]
else:
expected = full
m2 = TestTupleModel.get(partition=m1.partition)
self.assertEqual(tuple(m2.int_tuple), expected)
def test_to_python(self):
""" Tests that to_python of value column is called """
column = columns.Tuple(JsonTestColumn)
val = (1, 2, 3)
db_val = column.to_database(val)
assert db_val == [json.dumps(v) for v in val]
py_val = column.to_python(db_val)
assert py_val == val
def test_update_from_non_empty_to_empty(self):
# Can up date a touple raises a Runtime Error
pkey = uuid4()
tmp = TestTupleModel.create(partition=pkey, int_tuple=(1, 2))
tmp.int_tuple = (1, 3)
tmp.update()
tmp = TestTupleModel.get(partition=pkey)
self.assertEqual(tmp.int_tuple, (1, 3))
def test_insert_none(self):
pkey = uuid4()
self.assertRaises(ValidationError, TestTupleModel.create, **{'partition': pkey, 'int_tuple': (None)})
def test_blind_tuple_updates_from_none(self):
""" Tests that updates from None work as expected """
m = TestTupleModel.create(int_tuple=None)
expected = (1, 2, 3)
m.int_tuple = expected
m.save()
m2 = TestTupleModel.get(partition=m.partition)
assert m2.int_tuple == expected
TestTupleModel.objects(partition=m.partition).update(int_tuple=None)
m3 = TestTupleModel.get(partition=m.partition)
assert m3.int_tuple == ()
class TestTupleModelVeryLarge(Model):
partition = columns.UUID(primary_key=True, default=uuid4)
args = []
for i in range(32767):
args.append(columns.Integer)
int_tuple = columns.Tuple(*args, required=False)
class TestTupleModelOverLarge(Model):
partition = columns.UUID(primary_key=True, default=uuid4)
args = []
for i in range(32769):
args.append(columns.Integer)
int_tuple = columns.Tuple(*args, required=False)
class TestTupleColumnLarge(BaseCassEngTestCase):
def test_element_count_validation(self):
drop_table(TestTupleModelVeryLarge)
sync_table(TestTupleModelVeryLarge)
"""
Tests that big collections are supported
"""
test_tuple = (i for i in range(32767))
m1 = TestTupleModelVeryLarge.create(int_tuple=test_tuple)
m2 = TestTupleModelVeryLarge.get(partition=m1.partition)
print(len(m2.int_tuple))
drop_table(TestTupleModelVeryLarge)
def test_element_count_validation_too_big(self):
drop_table(TestTupleModelOverLarge)
sync_table(TestTupleModelOverLarge)
"""
Tests that big collections are detected and raise an exception.
"""
test_tuple = (i for i in range(32769))
m1 = TestTupleModelOverLarge.create(int_tuple=test_tuple)
m2 = TestTupleModelOverLarge.get(partition=m1.partition)
print(len(m2.int_tuple))
# this will need to be wrapped in an assertion
drop_table(TestTupleModelOverLarge)