--- a/server/test/unittest_migractions.py Fri Aug 21 15:04:35 2009 +0200
+++ b/server/test/unittest_migractions.py Fri Aug 21 15:05:50 2009 +0200
@@ -457,5 +457,47 @@
user.clear_related_cache('in_state', 'subject')
self.assertEquals(user.state, 'deactivated')
+ def test_introduce_base_class(self):
+ self.mh.cmd_add_entity_type('Para')
+ self.mh.repo.schema.rebuild_infered_relations()
+ self.assertEquals(sorted(et.type for et in self.schema['Para'].specialized_by()),
+ ['Note'])
+ self.assertEquals(self.schema['Note'].specializes().type, 'Para')
+ self.mh.cmd_add_entity_type('Text')
+ self.mh.repo.schema.rebuild_infered_relations()
+ self.assertEquals(sorted(et.type for et in self.schema['Para'].specialized_by()),
+ ['Note', 'Text'])
+ self.assertEquals(self.schema['Text'].specializes().type, 'Para')
+ # test columns have been actually added
+ text = self.execute('INSERT Text X: X para "hip", X summary "hop", X newattr "momo"').get_entity(0, 0)
+ note = self.execute('INSERT Note X: X para "hip", X shortpara "hop", X newattr "momo"').get_entity(0, 0)
+ aff = self.execute('INSERT Affaire X').get_entity(0, 0)
+ self.failUnless(self.execute('SET X newnotinlined Y WHERE X eid %(x)s, Y eid %(y)s',
+ {'x': text.eid, 'y': aff.eid}, 'x'))
+ self.failUnless(self.execute('SET X newnotinlined Y WHERE X eid %(x)s, Y eid %(y)s',
+ {'x': note.eid, 'y': aff.eid}, 'x'))
+ self.failUnless(self.execute('SET X newinlined Y WHERE X eid %(x)s, Y eid %(y)s',
+ {'x': text.eid, 'y': aff.eid}, 'x'))
+ self.failUnless(self.execute('SET X newinlined Y WHERE X eid %(x)s, Y eid %(y)s',
+ {'x': note.eid, 'y': aff.eid}, 'x'))
+ # XXX remove specializes by ourselves, else tearDown fails when removing
+ # Para because of Note inheritance. This could be fixed by putting the
+ # MemSchemaCWETypeDel(session, name) operation in the
+ # after_delete_entity(CWEType) hook, since in that case the MemSchemaSpecializesDel
+ # operation would be removed before, but I'm not sure this is a desired behaviour.
+ #
+ # also we need more tests about introducing/removing base classes or
+ # specialization relationship...
+ self.session.data['rebuild-infered'] = True
+ try:
+ self.execute('DELETE X specializes Y WHERE Y name "Para"')
+ self.commit()
+ finally:
+ self.session.data['rebuild-infered'] = False
+ self.assertEquals(sorted(et.type for et in self.schema['Para'].specialized_by()),
+ [])
+ self.assertEquals(self.schema['Note'].specializes(), None)
+ self.assertEquals(self.schema['Text'].specializes(), None)
+
if __name__ == '__main__':
unittest_main()