diff -r 0aeb81eb179c -r e7d348134006 server/test/unittest_migractions.py --- a/server/test/unittest_migractions.py Fri Aug 21 15:07:13 2009 +0200 +++ b/server/test/unittest_migractions.py Fri Aug 21 15:07:47 2009 +0200 @@ -449,5 +449,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()