def test_index_separator(self): class CustomSeparator(BaseModel): index_separator = '$' name = TextField(primary_key=True) data = IntegerField(index=True) CustomSeparator.create(name='huey.zai', data=3) CustomSeparator.create(name='michael.nuggie', data=5) keys = sorted(db.keys()) self.assertEqual( keys, [ # namespace | model : $-delimited indexed data b'test|customseparator:all', b'test|customseparator:data$absolute$3', b'test|customseparator:data$absolute$5', b'test|customseparator:data$continuous', b'test|customseparator:id$huey.zai', b'test|customseparator:id$michael.nuggie', b'test|customseparator:name$absolute$huey.zai', b'test|customseparator:name$absolute$michael.nuggie' ]) huey = CustomSeparator.get(CustomSeparator.data < 5) self.assertEqual(huey.name, 'huey.zai') mickey = CustomSeparator.load('michael.nuggie') self.assertEqual(mickey.data, 5)
def test_index_separator(self): class CustomSeparator(BaseModel): index_separator = '$' name = TextField(primary_key=True) data = IntegerField(index=True) CustomSeparator.create(name='huey.zai', data=3) CustomSeparator.create(name='michael.nuggie', data=5) keys = sorted(db.keys()) self.assertEqual(keys, [ # namespace | model : $-delimited indexed data b'test|customseparator:all', b'test|customseparator:data$absolute$3', b'test|customseparator:data$absolute$5', b'test|customseparator:data$continuous', b'test|customseparator:id$huey.zai', b'test|customseparator:id$michael.nuggie', b'test|customseparator:name$absolute$huey.zai', b'test|customseparator:name$absolute$michael.nuggie']) huey = CustomSeparator.get(CustomSeparator.data < 5) self.assertEqual(huey.name, 'huey.zai') mickey = CustomSeparator.load('michael.nuggie') self.assertEqual(mickey.data, 5)
def test_key_leaks(self): initial_key_count = len(db.keys()) # Store a single item. self.store_test_data(1) # See how many keys we have in the db - check again in a bit. key_len = len(db.keys()) # Store a second item. self.store_test_data(2) key_len2 = len(db.keys()) self.assertTrue(key_len != key_len2) self.ac.remove(2) # Back to the original amount of keys we had after one item. self.assertEqual(len(db.keys()), key_len) # Remove the first item, back to original count at start. self.ac.remove(1) self.assertEqual(len(db.keys()), initial_key_count)
def test_delete_indexes(self): self.assertEqual(set(db.keys()), set()) Message.create(content='charlie message', status=1) Message.create(content='huey message', status=2) keys = set(db.keys()) charlie = Message.load(1) charlie.delete() huey_keys = set(db.keys()) diff = keys - huey_keys def make_key(*args): return Message._query.make_key(*args).encode('utf-8') self.assertEqual( diff, set([ make_key('_id', 'absolute', 1), make_key('content', 'absolute', 'charlie message'), make_key('content', 'fts', 'charli'), make_key('id', 1), make_key('status', 'absolute', 1), ])) # Ensure we cannot query for Charlie, but that we can query for Huey. expressions = [ (Message.status == 1), (Message.status != 2), (Message._id == 1), (Message._id != 2), (Message.content == 'charlie message'), (Message.content != 'huey message'), (Message.content.match('charlie')), ] for expression in expressions: self.assertRaises(ValueError, Message.get, expression) expressions = [ (Message.status == 2), (Message.status > 1), (Message._id == 2), (Message._id != 1), (Message.content == 'huey message'), (Message.content != 'charlie'), (Message.content.match('huey')), (Message.content.match('message')), ] for expression in expressions: obj = Message.get(expression) self.assertEqual(obj._data, { '_id': 2, 'content': 'huey message', 'status': 2, }) after_filter_keys = set(db.keys()) symm_diff = huey_keys ^ after_filter_keys self.assertTrue(all(key.startswith(b'temp') for key in symm_diff)) huey = Message.load(2) huey.delete() final_keys = set(key for key in db.keys() if not key.startswith(b'temp')) self.assertEqual(final_keys, set([make_key('_id', '_sequence')]))
def test_delete_indexes(self): self.assertEqual(set(db.keys()), set()) Message.create(content='charlie message', status=1) Message.create(content='huey message', status=2) keys = set(db.keys()) charlie = Message.load(1) charlie.delete() huey_keys = set(db.keys()) diff = keys - huey_keys def make_key(*args): return Message._query.make_key(*args).encode('utf-8') self.assertEqual(diff, set([ make_key('_id', 'absolute', 1), make_key('content', 'absolute', 'charlie message'), make_key('content', 'fts', 'charli'), make_key('id', 1), make_key('status', 'absolute', 1), ])) # Ensure we cannot query for Charlie, but that we can query for Huey. expressions = [ (Message.status == 1), (Message.status != 2), (Message._id == 1), (Message._id != 2), (Message.content == 'charlie message'), (Message.content != 'huey message'), (Message.content.match('charlie')), ] for expression in expressions: self.assertRaises(ValueError, Message.get, expression) expressions = [ (Message.status == 2), (Message.status > 1), (Message._id == 2), (Message._id != 1), (Message.content == 'huey message'), (Message.content != 'charlie'), (Message.content.match('huey')), (Message.content.match('message')), ] for expression in expressions: obj = Message.get(expression) self.assertEqual(obj._data, { '_id': 2, 'content': 'huey message', 'status': 2, }) after_filter_keys = set(db.keys()) symm_diff = huey_keys ^ after_filter_keys self.assertTrue(all(key.startswith(b'temp') for key in symm_diff)) huey = Message.load(2) huey.delete() final_keys = set(key for key in db.keys() if not key.startswith(b'temp')) self.assertEqual(final_keys, set([make_key('_id', '_sequence')]))