class InheritedQueriesTestCase(unittest.TestCase): def setUp(self): self.connection = Connection(safe=True) self.col = self.connection['test']['mongolite'] def tearDown(self): self.connection.drop_database('test') def test_use_inherited_queries(self): @self.connection.register class A(Document): __database__ = 'test' __collection__ = 'mongolite' structure = { '_type': str, 'a': { 'foo': int, 'bar': str, } } @self.connection.register class B(A): structure = { 'b': { 'eggs': float, } } doc_a = self.connection.A() self.assertEqual(doc_a['_type'], 'A') doc_a['a']['foo'] = 3 doc_a['a']['bar'] = 'Hello World' doc_a.save() doc_b = self.connection.B() self.assertEqual(doc_b['_type'], 'B') doc_b['a']['foo'] = 42 doc_b['a']['bar'] = 'bye bye' doc_b['b']['eggs'] = 3.14 doc_b.save() self.assertTrue( isinstance(self.connection.A.find_one({'_id': doc_b['_id']}), B)) self.assertTrue( isinstance( self.connection.A.find({ '_id': doc_b['_id'] }).next(), B)) self.assertTrue( isinstance(self.connection.A.find({'_id': doc_b['_id']})[0], B)) def test_inherited_queries_without___collection__(self): @self.connection.register class A(Document): structure = { '_type': str, 'a': { 'foo': int, 'bar': str, } } @self.connection.register class B(A): structure = { 'b': { 'eggs': float, } } doc_a = self.col.A() self.assertEqual(doc_a['_type'], 'A') doc_a['a']['foo'] = 3 doc_a['a']['bar'] = 'Hello World' doc_a.save() doc_b = self.col.B() self.assertEqual(doc_b['_type'], 'B') doc_b['a']['foo'] = 42 doc_b['a']['bar'] = 'bye bye' doc_b['b']['eggs'] = 3.14 doc_b.save() self.assertTrue( isinstance(self.col.A.find_one({'_id': doc_b['_id']}), B)) self.assertTrue( isinstance(self.col.A.find({ '_id': doc_b['_id'] }).next(), B)) self.assertTrue( isinstance(self.col.A.find({'_id': doc_b['_id']})[0], B)) def test_type_field_is_None(self): @self.connection.register class A(Document): type_field = None structure = { '_type': str, 'a': { 'foo': int, 'bar': str, } } @self.connection.register class B(A): structure = { 'b': { 'eggs': float, } } doc_a = self.col.A() self.assertEqual(doc_a['_type'], None) doc_a['a']['foo'] = 3 doc_a['a']['bar'] = 'Hello World' doc_a.save() doc_b = self.col.B() self.assertEqual(doc_b['_type'], None) doc_b['a']['foo'] = 42 doc_b['a']['bar'] = 'bye bye' doc_b['b']['eggs'] = 3.14 doc_b.save() self.assertTrue( isinstance(self.col.A.find_one({'_id': doc_b['_id']}), A)) self.assertTrue( isinstance(self.col.A.find({ '_id': doc_b['_id'] }).next(), A)) self.assertFalse( isinstance(self.col.A.find_one({'_id': doc_b['_id']}), B)) self.assertFalse( isinstance(self.col.A.find({ '_id': doc_b['_id'] }).next(), B)) def test_no__type(self): @self.connection.register class A(Document): structure = { 'a': { 'foo': int, 'bar': str, } } @self.connection.register class B(A): structure = { 'b': { 'eggs': float, } } doc_a = self.col.A() self.assertTrue('_type' not in doc_a) doc_a['a']['foo'] = 3 doc_a['a']['bar'] = 'Hello World' doc_a.save() doc_b = self.col.B() self.assertTrue('_type' not in doc_b) doc_b['a']['foo'] = 42 doc_b['a']['bar'] = 'bye bye' doc_b['b']['eggs'] = 3.14 doc_b.save() self.assertTrue( isinstance(self.col.A.find_one({'_id': doc_b['_id']}), A)) self.assertTrue( isinstance(self.col.A.find({ '_id': doc_b['_id'] }).next(), A)) self.assertFalse( isinstance(self.col.A.find_one({'_id': doc_b['_id']}), B)) self.assertFalse( isinstance(self.col.A.find({ '_id': doc_b['_id'] }).next(), B)) def test_change_type_field(self): @self.connection.register class A(Document): type_field = '_t' structure = { '_type': str, '_t': str, 'a': { 'foo': int, 'bar': str, } } @self.connection.register class B(A): structure = { 'b': { 'eggs': float, } } doc_a = self.col.A() self.assertEqual(doc_a['_type'], None) self.assertEqual(doc_a['_t'], 'A') doc_a['a']['foo'] = 3 doc_a['a']['bar'] = 'Hello World' doc_a.save() doc_b = self.col.B() self.assertEqual(doc_b['_type'], None) self.assertEqual(doc_b['_t'], 'B') doc_b['a']['foo'] = 42 doc_b['a']['bar'] = 'bye bye' doc_b['b']['eggs'] = 3.14 doc_b.save() self.assertTrue( isinstance(self.col.A.find_one({'_id': doc_b['_id']}), A)) self.assertTrue( isinstance(self.col.A.find({ '_id': doc_b['_id'] }).next(), A)) self.assertTrue( isinstance(self.col.A.find_one({'_id': doc_b['_id']}), B)) self.assertTrue( isinstance(self.col.A.find({ '_id': doc_b['_id'] }).next(), B))