server/test/unittest_migractions.py
changeset 6366 1806148d6ce8
parent 6292 054fa36060d5
parent 6340 470d8e828fda
child 6370 8c3d6f739fa3
equal deleted inserted replaced
6333:e3994fcc21c3 6366:1806148d6ce8
    82         self.commit()
    82         self.commit()
    83         orderdict = dict(self.mh.rqlexec('Any RTN, O WHERE X name "Note", RDEF from_entity X, '
    83         orderdict = dict(self.mh.rqlexec('Any RTN, O WHERE X name "Note", RDEF from_entity X, '
    84                                          'RDEF relation_type RT, RDEF ordernum O, RT name RTN'))
    84                                          'RDEF relation_type RT, RDEF ordernum O, RT name RTN'))
    85         self.mh.cmd_add_attribute('Note', 'whatever')
    85         self.mh.cmd_add_attribute('Note', 'whatever')
    86         self.failUnless('whatever' in self.schema)
    86         self.failUnless('whatever' in self.schema)
    87         self.assertEquals(self.schema['whatever'].subjects(), ('Note',))
    87         self.assertEqual(self.schema['whatever'].subjects(), ('Note',))
    88         self.assertEquals(self.schema['whatever'].objects(), ('Int',))
    88         self.assertEqual(self.schema['whatever'].objects(), ('Int',))
    89         self.assertEquals(self.schema['Note'].default('whatever'), 2)
    89         self.assertEqual(self.schema['Note'].default('whatever'), 2)
    90         note = self.execute('Note X').get_entity(0, 0)
    90         note = self.execute('Note X').get_entity(0, 0)
    91         self.assertEquals(note.whatever, 2)
    91         self.assertEqual(note.whatever, 2)
    92         orderdict2 = dict(self.mh.rqlexec('Any RTN, O WHERE X name "Note", RDEF from_entity X, '
    92         orderdict2 = dict(self.mh.rqlexec('Any RTN, O WHERE X name "Note", RDEF from_entity X, '
    93                                           'RDEF relation_type RT, RDEF ordernum O, RT name RTN'))
    93                                           'RDEF relation_type RT, RDEF ordernum O, RT name RTN'))
    94         whateverorder = migrschema['whatever'].rdef('Note', 'Int').order
    94         whateverorder = migrschema['whatever'].rdef('Note', 'Int').order
    95         for k, v in orderdict.iteritems():
    95         for k, v in orderdict.iteritems():
    96             if v >= whateverorder:
    96             if v >= whateverorder:
    97                 orderdict[k] = v+1
    97                 orderdict[k] = v+1
    98         orderdict['whatever'] = whateverorder
    98         orderdict['whatever'] = whateverorder
    99         self.assertDictEquals(orderdict, orderdict2)
    99         self.assertDictEquals(orderdict, orderdict2)
   100         #self.assertEquals([r.type for r in self.schema['Note'].ordered_relations()],
   100         #self.assertEqual([r.type for r in self.schema['Note'].ordered_relations()],
   101         #                  ['modification_date', 'creation_date', 'owned_by',
   101         #                  ['modification_date', 'creation_date', 'owned_by',
   102         #                   'eid', 'ecrit_par', 'inline1', 'date', 'type',
   102         #                   'eid', 'ecrit_par', 'inline1', 'date', 'type',
   103         #                   'whatever', 'date', 'in_basket'])
   103         #                   'whatever', 'date', 'in_basket'])
   104         # NB: commit instead of rollback make following test fail with py2.5
   104         # NB: commit instead of rollback make following test fail with py2.5
   105         #     this sounds like a pysqlite/2.5 bug (the same eid is affected to
   105         #     this sounds like a pysqlite/2.5 bug (the same eid is affected to
   108 
   108 
   109     def test_add_attribute_varchar(self):
   109     def test_add_attribute_varchar(self):
   110         self.failIf('shortpara' in self.schema)
   110         self.failIf('shortpara' in self.schema)
   111         self.mh.cmd_add_attribute('Note', 'shortpara')
   111         self.mh.cmd_add_attribute('Note', 'shortpara')
   112         self.failUnless('shortpara' in self.schema)
   112         self.failUnless('shortpara' in self.schema)
   113         self.assertEquals(self.schema['shortpara'].subjects(), ('Note', ))
   113         self.assertEqual(self.schema['shortpara'].subjects(), ('Note', ))
   114         self.assertEquals(self.schema['shortpara'].objects(), ('String', ))
   114         self.assertEqual(self.schema['shortpara'].objects(), ('String', ))
   115         # test created column is actually a varchar(64)
   115         # test created column is actually a varchar(64)
   116         notesql = self.mh.sqlexec("SELECT sql FROM sqlite_master WHERE type='table' and name='%sNote'" % SQL_PREFIX)[0][0]
   116         notesql = self.mh.sqlexec("SELECT sql FROM sqlite_master WHERE type='table' and name='%sNote'" % SQL_PREFIX)[0][0]
   117         fields = dict(x.strip().split()[:2] for x in notesql.split('(', 1)[1].rsplit(')', 1)[0].split(','))
   117         fields = dict(x.strip().split()[:2] for x in notesql.split('(', 1)[1].rsplit(')', 1)[0].split(','))
   118         self.assertEquals(fields['%sshortpara' % SQL_PREFIX], 'varchar(64)')
   118         self.assertEqual(fields['%sshortpara' % SQL_PREFIX], 'varchar(64)')
   119         self.mh.rollback()
   119         self.mh.rollback()
   120 
   120 
   121     def test_add_datetime_with_default_value_attribute(self):
   121     def test_add_datetime_with_default_value_attribute(self):
   122         self.failIf('mydate' in self.schema)
   122         self.failIf('mydate' in self.schema)
   123         self.failIf('shortpara' in self.schema)
   123         self.failIf('shortpara' in self.schema)
   124         self.mh.cmd_add_attribute('Note', 'mydate')
   124         self.mh.cmd_add_attribute('Note', 'mydate')
   125         self.failUnless('mydate' in self.schema)
   125         self.failUnless('mydate' in self.schema)
   126         self.assertEquals(self.schema['mydate'].subjects(), ('Note', ))
   126         self.assertEqual(self.schema['mydate'].subjects(), ('Note', ))
   127         self.assertEquals(self.schema['mydate'].objects(), ('Date', ))
   127         self.assertEqual(self.schema['mydate'].objects(), ('Date', ))
   128         testdate = date(2005, 12, 13)
   128         testdate = date(2005, 12, 13)
   129         eid1 = self.mh.rqlexec('INSERT Note N')[0][0]
   129         eid1 = self.mh.rqlexec('INSERT Note N')[0][0]
   130         eid2 = self.mh.rqlexec('INSERT Note N: N mydate %(mydate)s', {'mydate' : testdate})[0][0]
   130         eid2 = self.mh.rqlexec('INSERT Note N: N mydate %(mydate)s', {'mydate' : testdate})[0][0]
   131         d1 = self.mh.rqlexec('Any D WHERE X eid %(x)s, X mydate D', {'x': eid1})[0][0]
   131         d1 = self.mh.rqlexec('Any D WHERE X eid %(x)s, X mydate D', {'x': eid1})[0][0]
   132         d2 = self.mh.rqlexec('Any D WHERE X eid %(x)s, X mydate D', {'x': eid2})[0][0]
   132         d2 = self.mh.rqlexec('Any D WHERE X eid %(x)s, X mydate D', {'x': eid2})[0][0]
   133         self.assertEquals(d1, date.today())
   133         self.assertEqual(d1, date.today())
   134         self.assertEquals(d2, testdate)
   134         self.assertEqual(d2, testdate)
   135         self.mh.rollback()
   135         self.mh.rollback()
   136 
   136 
   137     def test_drop_chosen_constraints_ctxmanager(self):
   137     def test_drop_chosen_constraints_ctxmanager(self):
   138         with self.mh.cmd_dropped_constraints('Note', 'unique_id', UniqueConstraint):
   138         with self.mh.cmd_dropped_constraints('Note', 'unique_id', UniqueConstraint):
   139             self.mh.cmd_add_attribute('Note', 'unique_id')
   139             self.mh.cmd_add_attribute('Note', 'unique_id')
   173     def test_workflow_actions(self):
   173     def test_workflow_actions(self):
   174         wf = self.mh.cmd_add_workflow(u'foo', ('Personne', 'Email'))
   174         wf = self.mh.cmd_add_workflow(u'foo', ('Personne', 'Email'))
   175         for etype in ('Personne', 'Email'):
   175         for etype in ('Personne', 'Email'):
   176             s1 = self.mh.rqlexec('Any N WHERE WF workflow_of ET, ET name "%s", WF name N' %
   176             s1 = self.mh.rqlexec('Any N WHERE WF workflow_of ET, ET name "%s", WF name N' %
   177                                  etype)[0][0]
   177                                  etype)[0][0]
   178             self.assertEquals(s1, "foo")
   178             self.assertEqual(s1, "foo")
   179             s1 = self.mh.rqlexec('Any N WHERE ET default_workflow WF, ET name "%s", WF name N' %
   179             s1 = self.mh.rqlexec('Any N WHERE ET default_workflow WF, ET name "%s", WF name N' %
   180                                  etype)[0][0]
   180                                  etype)[0][0]
   181             self.assertEquals(s1, "foo")
   181             self.assertEqual(s1, "foo")
   182 
   182 
   183     def test_add_entity_type(self):
   183     def test_add_entity_type(self):
   184         self.failIf('Folder2' in self.schema)
   184         self.failIf('Folder2' in self.schema)
   185         self.failIf('filed_under2' in self.schema)
   185         self.failIf('filed_under2' in self.schema)
   186         self.mh.cmd_add_entity_type('Folder2')
   186         self.mh.cmd_add_entity_type('Folder2')
   187         self.failUnless('Folder2' in self.schema)
   187         self.failUnless('Folder2' in self.schema)
   188         self.failUnless(self.execute('CWEType X WHERE X name "Folder2"'))
   188         self.failUnless(self.execute('CWEType X WHERE X name "Folder2"'))
   189         self.failUnless('filed_under2' in self.schema)
   189         self.failUnless('filed_under2' in self.schema)
   190         self.failUnless(self.execute('CWRType X WHERE X name "filed_under2"'))
   190         self.failUnless(self.execute('CWRType X WHERE X name "filed_under2"'))
   191         self.schema.rebuild_infered_relations()
   191         self.schema.rebuild_infered_relations()
   192         self.assertEquals(sorted(str(rs) for rs in self.schema['Folder2'].subject_relations()),
   192         self.assertEqual(sorted(str(rs) for rs in self.schema['Folder2'].subject_relations()),
   193                           ['created_by', 'creation_date', 'cwuri',
   193                           ['created_by', 'creation_date', 'cwuri',
   194                            'description', 'description_format',
   194                            'description', 'description_format',
   195                            'eid',
   195                            'eid',
   196                            'filed_under2', 'has_text',
   196                            'filed_under2', 'has_text',
   197                            'identity', 'in_basket', 'is', 'is_instance_of',
   197                            'identity', 'in_basket', 'is', 'is_instance_of',
   198                            'modification_date', 'name', 'owned_by'])
   198                            'modification_date', 'name', 'owned_by'])
   199         self.assertEquals([str(rs) for rs in self.schema['Folder2'].object_relations()],
   199         self.assertEqual([str(rs) for rs in self.schema['Folder2'].object_relations()],
   200                           ['filed_under2', 'identity'])
   200                           ['filed_under2', 'identity'])
   201         self.assertEquals(sorted(str(e) for e in self.schema['filed_under2'].subjects()),
   201         self.assertEqual(sorted(str(e) for e in self.schema['filed_under2'].subjects()),
   202                           sorted(str(e) for e in self.schema.entities() if not e.final))
   202                           sorted(str(e) for e in self.schema.entities() if not e.final))
   203         self.assertEquals(self.schema['filed_under2'].objects(), ('Folder2',))
   203         self.assertEqual(self.schema['filed_under2'].objects(), ('Folder2',))
   204         eschema = self.schema.eschema('Folder2')
   204         eschema = self.schema.eschema('Folder2')
   205         for cstr in eschema.rdef('name').constraints:
   205         for cstr in eschema.rdef('name').constraints:
   206             self.failUnless(hasattr(cstr, 'eid'))
   206             self.failUnless(hasattr(cstr, 'eid'))
   207 
   207 
   208     def test_add_drop_entity_type(self):
   208     def test_add_drop_entity_type(self):
   225     def test_add_drop_relation_type(self):
   225     def test_add_drop_relation_type(self):
   226         self.mh.cmd_add_entity_type('Folder2', auto=False)
   226         self.mh.cmd_add_entity_type('Folder2', auto=False)
   227         self.mh.cmd_add_relation_type('filed_under2')
   227         self.mh.cmd_add_relation_type('filed_under2')
   228         self.schema.rebuild_infered_relations()
   228         self.schema.rebuild_infered_relations()
   229         self.failUnless('filed_under2' in self.schema)
   229         self.failUnless('filed_under2' in self.schema)
   230         self.assertEquals(sorted(str(e) for e in self.schema['filed_under2'].subjects()),
   230         self.assertEqual(sorted(str(e) for e in self.schema['filed_under2'].subjects()),
   231                           sorted(str(e) for e in self.schema.entities() if not e.final))
   231                           sorted(str(e) for e in self.schema.entities() if not e.final))
   232         self.assertEquals(self.schema['filed_under2'].objects(), ('Folder2',))
   232         self.assertEqual(self.schema['filed_under2'].objects(), ('Folder2',))
   233         self.mh.cmd_drop_relation_type('filed_under2')
   233         self.mh.cmd_drop_relation_type('filed_under2')
   234         self.failIf('filed_under2' in self.schema)
   234         self.failIf('filed_under2' in self.schema)
   235 
   235 
   236     def test_add_relation_definition_nortype(self):
   236     def test_add_relation_definition_nortype(self):
   237         self.mh.cmd_add_relation_definition('Personne', 'concerne2', 'Affaire')
   237         self.mh.cmd_add_relation_definition('Personne', 'concerne2', 'Affaire')
   238         self.assertEquals(self.schema['concerne2'].subjects(),
   238         self.assertEqual(self.schema['concerne2'].subjects(),
   239                           ('Personne',))
   239                           ('Personne',))
   240         self.assertEquals(self.schema['concerne2'].objects(),
   240         self.assertEqual(self.schema['concerne2'].objects(),
   241                           ('Affaire', ))
   241                           ('Affaire', ))
   242         self.assertEquals(self.schema['concerne2'].rdef('Personne', 'Affaire').cardinality,
   242         self.assertEqual(self.schema['concerne2'].rdef('Personne', 'Affaire').cardinality,
   243                           '1*')
   243                           '1*')
   244         self.mh.cmd_add_relation_definition('Personne', 'concerne2', 'Note')
   244         self.mh.cmd_add_relation_definition('Personne', 'concerne2', 'Note')
   245         self.assertEquals(sorted(self.schema['concerne2'].objects()), ['Affaire', 'Note'])
   245         self.assertEqual(sorted(self.schema['concerne2'].objects()), ['Affaire', 'Note'])
   246         self.mh.create_entity('Personne', nom=u'tot')
   246         self.mh.create_entity('Personne', nom=u'tot')
   247         self.mh.create_entity('Affaire')
   247         self.mh.create_entity('Affaire')
   248         self.mh.rqlexec('SET X concerne2 Y WHERE X is Personne, Y is Affaire')
   248         self.mh.rqlexec('SET X concerne2 Y WHERE X is Personne, Y is Affaire')
   249         self.commit()
   249         self.commit()
   250         self.mh.cmd_drop_relation_definition('Personne', 'concerne2', 'Affaire')
   250         self.mh.cmd_drop_relation_definition('Personne', 'concerne2', 'Affaire')
   251         self.failUnless('concerne2' in self.schema)
   251         self.failUnless('concerne2' in self.schema)
   252         self.mh.cmd_drop_relation_definition('Personne', 'concerne2', 'Note')
   252         self.mh.cmd_drop_relation_definition('Personne', 'concerne2', 'Note')
   253         self.failIf('concerne2' in self.schema)
   253         self.failIf('concerne2' in self.schema)
   254 
   254 
   255     def test_drop_relation_definition_existant_rtype(self):
   255     def test_drop_relation_definition_existant_rtype(self):
   256         self.assertEquals(sorted(str(e) for e in self.schema['concerne'].subjects()),
   256         self.assertEqual(sorted(str(e) for e in self.schema['concerne'].subjects()),
   257                           ['Affaire', 'Personne'])
   257                           ['Affaire', 'Personne'])
   258         self.assertEquals(sorted(str(e) for e in self.schema['concerne'].objects()),
   258         self.assertEqual(sorted(str(e) for e in self.schema['concerne'].objects()),
   259                           ['Affaire', 'Division', 'Note', 'Societe', 'SubDivision'])
   259                           ['Affaire', 'Division', 'Note', 'Societe', 'SubDivision'])
   260         self.mh.cmd_drop_relation_definition('Personne', 'concerne', 'Affaire')
   260         self.mh.cmd_drop_relation_definition('Personne', 'concerne', 'Affaire')
   261         self.assertEquals(sorted(str(e) for e in self.schema['concerne'].subjects()),
   261         self.assertEqual(sorted(str(e) for e in self.schema['concerne'].subjects()),
   262                           ['Affaire'])
   262                           ['Affaire'])
   263         self.assertEquals(sorted(str(e) for e in self.schema['concerne'].objects()),
   263         self.assertEqual(sorted(str(e) for e in self.schema['concerne'].objects()),
   264                           ['Division', 'Note', 'Societe', 'SubDivision'])
   264                           ['Division', 'Note', 'Societe', 'SubDivision'])
   265         self.mh.cmd_add_relation_definition('Personne', 'concerne', 'Affaire')
   265         self.mh.cmd_add_relation_definition('Personne', 'concerne', 'Affaire')
   266         self.assertEquals(sorted(str(e) for e in self.schema['concerne'].subjects()),
   266         self.assertEqual(sorted(str(e) for e in self.schema['concerne'].subjects()),
   267                           ['Affaire', 'Personne'])
   267                           ['Affaire', 'Personne'])
   268         self.assertEquals(sorted(str(e) for e in self.schema['concerne'].objects()),
   268         self.assertEqual(sorted(str(e) for e in self.schema['concerne'].objects()),
   269                           ['Affaire', 'Division', 'Note', 'Societe', 'SubDivision'])
   269                           ['Affaire', 'Division', 'Note', 'Societe', 'SubDivision'])
   270         # trick: overwrite self.maxeid to avoid deletion of just reintroduced types
   270         # trick: overwrite self.maxeid to avoid deletion of just reintroduced types
   271         self.maxeid = self.execute('Any MAX(X)')[0][0]
   271         self.maxeid = self.execute('Any MAX(X)')[0][0]
   272 
   272 
   273     def test_drop_relation_definition_with_specialization(self):
   273     def test_drop_relation_definition_with_specialization(self):
   274         self.assertEquals(sorted(str(e) for e in self.schema['concerne'].subjects()),
   274         self.assertEqual(sorted(str(e) for e in self.schema['concerne'].subjects()),
   275                           ['Affaire', 'Personne'])
   275                           ['Affaire', 'Personne'])
   276         self.assertEquals(sorted(str(e) for e in self.schema['concerne'].objects()),
   276         self.assertEqual(sorted(str(e) for e in self.schema['concerne'].objects()),
   277                           ['Affaire', 'Division', 'Note', 'Societe', 'SubDivision'])
   277                           ['Affaire', 'Division', 'Note', 'Societe', 'SubDivision'])
   278         self.mh.cmd_drop_relation_definition('Affaire', 'concerne', 'Societe')
   278         self.mh.cmd_drop_relation_definition('Affaire', 'concerne', 'Societe')
   279         self.assertEquals(sorted(str(e) for e in self.schema['concerne'].subjects()),
   279         self.assertEqual(sorted(str(e) for e in self.schema['concerne'].subjects()),
   280                           ['Affaire', 'Personne'])
   280                           ['Affaire', 'Personne'])
   281         self.assertEquals(sorted(str(e) for e in self.schema['concerne'].objects()),
   281         self.assertEqual(sorted(str(e) for e in self.schema['concerne'].objects()),
   282                           ['Affaire', 'Division', 'Note', 'SubDivision'])
   282                           ['Affaire', 'Division', 'Note', 'SubDivision'])
   283         self.schema.rebuild_infered_relations() # need to be explicitly called once everything is in place
   283         self.schema.rebuild_infered_relations() # need to be explicitly called once everything is in place
   284         self.assertEquals(sorted(str(e) for e in self.schema['concerne'].objects()),
   284         self.assertEqual(sorted(str(e) for e in self.schema['concerne'].objects()),
   285                           ['Affaire', 'Note'])
   285                           ['Affaire', 'Note'])
   286         self.mh.cmd_add_relation_definition('Affaire', 'concerne', 'Societe')
   286         self.mh.cmd_add_relation_definition('Affaire', 'concerne', 'Societe')
   287         self.assertEquals(sorted(str(e) for e in self.schema['concerne'].subjects()),
   287         self.assertEqual(sorted(str(e) for e in self.schema['concerne'].subjects()),
   288                           ['Affaire', 'Personne'])
   288                           ['Affaire', 'Personne'])
   289         self.assertEquals(sorted(str(e) for e in self.schema['concerne'].objects()),
   289         self.assertEqual(sorted(str(e) for e in self.schema['concerne'].objects()),
   290                           ['Affaire', 'Note', 'Societe'])
   290                           ['Affaire', 'Note', 'Societe'])
   291         self.schema.rebuild_infered_relations() # need to be explicitly called once everything is in place
   291         self.schema.rebuild_infered_relations() # need to be explicitly called once everything is in place
   292         self.assertEquals(sorted(str(e) for e in self.schema['concerne'].objects()),
   292         self.assertEqual(sorted(str(e) for e in self.schema['concerne'].objects()),
   293                           ['Affaire', 'Division', 'Note', 'Societe', 'SubDivision'])
   293                           ['Affaire', 'Division', 'Note', 'Societe', 'SubDivision'])
   294         # trick: overwrite self.maxeid to avoid deletion of just reintroduced types
   294         # trick: overwrite self.maxeid to avoid deletion of just reintroduced types
   295         self.maxeid = self.execute('Any MAX(X)')[0][0]
   295         self.maxeid = self.execute('Any MAX(X)')[0][0]
   296 
   296 
   297     def test_rename_relation(self):
   297     def test_rename_relation(self):
   298         self.skip('implement me')
   298         self.skipTest('implement me')
   299 
   299 
   300     def test_change_relation_props_non_final(self):
   300     def test_change_relation_props_non_final(self):
   301         rschema = self.schema['concerne']
   301         rschema = self.schema['concerne']
   302         card = rschema.rdef('Affaire', 'Societe').cardinality
   302         card = rschema.rdef('Affaire', 'Societe').cardinality
   303         self.assertEquals(card, '**')
   303         self.assertEqual(card, '**')
   304         try:
   304         try:
   305             self.mh.cmd_change_relation_props('Affaire', 'concerne', 'Societe',
   305             self.mh.cmd_change_relation_props('Affaire', 'concerne', 'Societe',
   306                                               cardinality='?*')
   306                                               cardinality='?*')
   307             card = rschema.rdef('Affaire', 'Societe').cardinality
   307             card = rschema.rdef('Affaire', 'Societe').cardinality
   308             self.assertEquals(card, '?*')
   308             self.assertEqual(card, '?*')
   309         finally:
   309         finally:
   310             self.mh.cmd_change_relation_props('Affaire', 'concerne', 'Societe',
   310             self.mh.cmd_change_relation_props('Affaire', 'concerne', 'Societe',
   311                                               cardinality='**')
   311                                               cardinality='**')
   312 
   312 
   313     def test_change_relation_props_final(self):
   313     def test_change_relation_props_final(self):
   314         rschema = self.schema['adel']
   314         rschema = self.schema['adel']
   315         card = rschema.rdef('Personne', 'String').fulltextindexed
   315         card = rschema.rdef('Personne', 'String').fulltextindexed
   316         self.assertEquals(card, False)
   316         self.assertEqual(card, False)
   317         try:
   317         try:
   318             self.mh.cmd_change_relation_props('Personne', 'adel', 'String',
   318             self.mh.cmd_change_relation_props('Personne', 'adel', 'String',
   319                                               fulltextindexed=True)
   319                                               fulltextindexed=True)
   320             card = rschema.rdef('Personne', 'String').fulltextindexed
   320             card = rschema.rdef('Personne', 'String').fulltextindexed
   321             self.assertEquals(card, True)
   321             self.assertEqual(card, True)
   322         finally:
   322         finally:
   323             self.mh.cmd_change_relation_props('Personne', 'adel', 'String',
   323             self.mh.cmd_change_relation_props('Personne', 'adel', 'String',
   324                                               fulltextindexed=False)
   324                                               fulltextindexed=False)
   325 
   325 
   326     def test_sync_schema_props_perms(self):
   326     def test_sync_schema_props_perms(self):
   336         delete_concerne_rqlexpr = self._rrqlexpr_rset('delete', 'concerne')
   336         delete_concerne_rqlexpr = self._rrqlexpr_rset('delete', 'concerne')
   337         add_concerne_rqlexpr = self._rrqlexpr_rset('add', 'concerne')
   337         add_concerne_rqlexpr = self._rrqlexpr_rset('add', 'concerne')
   338         
   338         
   339         self.mh.cmd_sync_schema_props_perms(commit=False)
   339         self.mh.cmd_sync_schema_props_perms(commit=False)
   340 
   340 
   341         self.assertEquals(cursor.execute('Any D WHERE X name "Personne", X description D')[0][0],
   341         self.assertEqual(cursor.execute('Any D WHERE X name "Personne", X description D')[0][0],
   342                           'blabla bla')
   342                           'blabla bla')
   343         self.assertEquals(cursor.execute('Any D WHERE X name "titre", X description D')[0][0],
   343         self.assertEqual(cursor.execute('Any D WHERE X name "titre", X description D')[0][0],
   344                           'usually a title')
   344                           'usually a title')
   345         self.assertEquals(cursor.execute('Any D WHERE X relation_type RT, RT name "titre",'
   345         self.assertEqual(cursor.execute('Any D WHERE X relation_type RT, RT name "titre",'
   346                                          'X from_entity FE, FE name "Personne",'
   346                                          'X from_entity FE, FE name "Personne",'
   347                                          'X description D')[0][0],
   347                                          'X description D')[0][0],
   348                           'title for this person')
   348                           'title for this person')
   349         rinorder = [n for n, in cursor.execute(
   349         rinorder = [n for n, in cursor.execute(
   350             'Any N ORDERBY O WHERE X is CWAttribute, X relation_type RT, RT name N,'
   350             'Any N ORDERBY O WHERE X is CWAttribute, X relation_type RT, RT name N,'
   351             'X from_entity FE, FE name "Personne",'
   351             'X from_entity FE, FE name "Personne",'
   352             'X ordernum O')]
   352             'X ordernum O')]
   353         expected = [u'nom', u'prenom', u'sexe', u'promo', u'ass', u'adel', u'titre',
   353         expected = [u'nom', u'prenom', u'sexe', u'promo', u'ass', u'adel', u'titre',
   354                     u'web', u'tel', u'fax', u'datenaiss', u'test', 'description', u'firstname',
   354                     u'web', u'tel', u'fax', u'datenaiss', u'test', 'description', u'firstname',
   355                     u'creation_date', 'cwuri', u'modification_date']
   355                     u'creation_date', 'cwuri', u'modification_date']
   356         self.assertEquals(rinorder, expected)
   356         self.assertEqual(rinorder, expected)
   357 
   357 
   358         # test permissions synchronization ####################################
   358         # test permissions synchronization ####################################
   359         # new rql expr to add note entity
   359         # new rql expr to add note entity
   360         eexpr = self._erqlexpr_entity('add', 'Note')
   360         eexpr = self._erqlexpr_entity('add', 'Note')
   361         self.assertEquals(eexpr.expression,
   361         self.assertEqual(eexpr.expression,
   362                           'X ecrit_part PE, U in_group G, '
   362                           'X ecrit_part PE, U in_group G, '
   363                           'PE require_permission P, P name "add_note", P require_group G')
   363                           'PE require_permission P, P name "add_note", P require_group G')
   364         self.assertEquals([et.name for et in eexpr.reverse_add_permission], ['Note'])
   364         self.assertEqual([et.name for et in eexpr.reverse_add_permission], ['Note'])
   365         self.assertEquals(eexpr.reverse_read_permission, ())
   365         self.assertEqual(eexpr.reverse_read_permission, ())
   366         self.assertEquals(eexpr.reverse_delete_permission, ())
   366         self.assertEqual(eexpr.reverse_delete_permission, ())
   367         self.assertEquals(eexpr.reverse_update_permission, ())
   367         self.assertEqual(eexpr.reverse_update_permission, ())
   368         # no more rqlexpr to delete and add para attribute
   368         # no more rqlexpr to delete and add para attribute
   369         self.failIf(self._rrqlexpr_rset('add', 'para'))
   369         self.failIf(self._rrqlexpr_rset('add', 'para'))
   370         self.failIf(self._rrqlexpr_rset('delete', 'para'))
   370         self.failIf(self._rrqlexpr_rset('delete', 'para'))
   371         # new rql expr to add ecrit_par relation
   371         # new rql expr to add ecrit_par relation
   372         rexpr = self._rrqlexpr_entity('add', 'ecrit_par')
   372         rexpr = self._rrqlexpr_entity('add', 'ecrit_par')
   373         self.assertEquals(rexpr.expression,
   373         self.assertEqual(rexpr.expression,
   374                           'O require_permission P, P name "add_note", '
   374                           'O require_permission P, P name "add_note", '
   375                           'U in_group G, P require_group G')
   375                           'U in_group G, P require_group G')
   376         self.assertEquals([rdef.rtype.name for rdef in rexpr.reverse_add_permission], ['ecrit_par'])
   376         self.assertEqual([rdef.rtype.name for rdef in rexpr.reverse_add_permission], ['ecrit_par'])
   377         self.assertEquals(rexpr.reverse_read_permission, ())
   377         self.assertEqual(rexpr.reverse_read_permission, ())
   378         self.assertEquals(rexpr.reverse_delete_permission, ())
   378         self.assertEqual(rexpr.reverse_delete_permission, ())
   379         # no more rqlexpr to delete and add travaille relation
   379         # no more rqlexpr to delete and add travaille relation
   380         self.failIf(self._rrqlexpr_rset('add', 'travaille'))
   380         self.failIf(self._rrqlexpr_rset('add', 'travaille'))
   381         self.failIf(self._rrqlexpr_rset('delete', 'travaille'))
   381         self.failIf(self._rrqlexpr_rset('delete', 'travaille'))
   382         # no more rqlexpr to delete and update Societe entity
   382         # no more rqlexpr to delete and update Societe entity
   383         self.failIf(self._erqlexpr_rset('update', 'Societe'))
   383         self.failIf(self._erqlexpr_rset('update', 'Societe'))
   384         self.failIf(self._erqlexpr_rset('delete', 'Societe'))
   384         self.failIf(self._erqlexpr_rset('delete', 'Societe'))
   385         # no more rqlexpr to read Affaire entity
   385         # no more rqlexpr to read Affaire entity
   386         self.failIf(self._erqlexpr_rset('read', 'Affaire'))
   386         self.failIf(self._erqlexpr_rset('read', 'Affaire'))
   387         # rqlexpr to update Affaire entity has been updated
   387         # rqlexpr to update Affaire entity has been updated
   388         eexpr = self._erqlexpr_entity('update', 'Affaire')
   388         eexpr = self._erqlexpr_entity('update', 'Affaire')
   389         self.assertEquals(eexpr.expression, 'X concerne S, S owned_by U')
   389         self.assertEqual(eexpr.expression, 'X concerne S, S owned_by U')
   390         # no change for rqlexpr to add and delete Affaire entity
   390         # no change for rqlexpr to add and delete Affaire entity
   391         self.assertEquals(len(self._erqlexpr_rset('delete', 'Affaire')), 1)
   391         self.assertEqual(len(self._erqlexpr_rset('delete', 'Affaire')), 1)
   392         self.assertEquals(len(self._erqlexpr_rset('add', 'Affaire')), 1)
   392         self.assertEqual(len(self._erqlexpr_rset('add', 'Affaire')), 1)
   393         # no change for rqlexpr to add and delete concerne relation
   393         # no change for rqlexpr to add and delete concerne relation
   394         self.assertEquals(len(self._rrqlexpr_rset('delete', 'concerne')), len(delete_concerne_rqlexpr))
   394         self.assertEqual(len(self._rrqlexpr_rset('delete', 'concerne')), len(delete_concerne_rqlexpr))
   395         self.assertEquals(len(self._rrqlexpr_rset('add', 'concerne')), len(add_concerne_rqlexpr))
   395         self.assertEqual(len(self._rrqlexpr_rset('add', 'concerne')), len(add_concerne_rqlexpr))
   396         # * migrschema involve:
   396         # * migrschema involve:
   397         #   * 7 rqlexprs deletion (2 in (Affaire read + Societe + travaille) + 1
   397         #   * 7 rqlexprs deletion (2 in (Affaire read + Societe + travaille) + 1
   398         #     in para attribute)
   398         #     in para attribute)
   399         #   * 1 update (Affaire update)
   399         #   * 1 update (Affaire update)
   400         #   * 2 new (Note add, ecrit_par add)
   400         #   * 2 new (Note add, ecrit_par add)
   401         #   * 2 implicit new for attributes update_permission (Note.para, Personne.test)
   401         #   * 2 implicit new for attributes update_permission (Note.para, Personne.test)
   402         # remaining orphan rql expr which should be deleted at commit (composite relation)
   402         # remaining orphan rql expr which should be deleted at commit (composite relation)
   403         self.assertEquals(cursor.execute('Any COUNT(X) WHERE X is RQLExpression, '
   403         self.assertEqual(cursor.execute('Any COUNT(X) WHERE X is RQLExpression, '
   404                                          'NOT ET1 read_permission X, NOT ET2 add_permission X, '
   404                                          'NOT ET1 read_permission X, NOT ET2 add_permission X, '
   405                                          'NOT ET3 delete_permission X, NOT ET4 update_permission X')[0][0],
   405                                          'NOT ET3 delete_permission X, NOT ET4 update_permission X')[0][0],
   406                           7+1)
   406                           7+1)
   407         # finally
   407         # finally
   408         self.assertEquals(cursor.execute('Any COUNT(X) WHERE X is RQLExpression')[0][0],
   408         self.assertEqual(cursor.execute('Any COUNT(X) WHERE X is RQLExpression')[0][0],
   409                           nbrqlexpr_start + 1 + 2 + 2)
   409                           nbrqlexpr_start + 1 + 2 + 2)
   410         self.mh.commit()
   410         self.mh.commit()
   411         # unique_together test
   411         # unique_together test
   412         self.assertEqual(len(self.schema.eschema('Personne')._unique_together), 1)
   412         self.assertEqual(len(self.schema.eschema('Personne')._unique_together), 1)
   413         self.assertUnorderedIterableEquals(self.schema.eschema('Personne')._unique_together[0],
   413         self.assertItemsEqual(self.schema.eschema('Personne')._unique_together[0],
   414                                            ('nom', 'prenom', 'datenaiss'))
   414                                            ('nom', 'prenom', 'datenaiss'))
   415         rset = cursor.execute('Any C WHERE C is CWUniqueTogetherConstraint')
   415         rset = cursor.execute('Any C WHERE C is CWUniqueTogetherConstraint')
   416         self.assertEquals(len(rset), 1)
   416         self.assertEqual(len(rset), 1)
   417         relations = [r.rtype.name for r in rset.get_entity(0,0).relations]
   417         relations = [r.rtype.name for r in rset.get_entity(0,0).relations]
   418         self.assertUnorderedIterableEquals(relations, ('nom', 'prenom', 'datenaiss'))
   418         self.assertItemsEqual(relations, ('nom', 'prenom', 'datenaiss'))
   419 
   419 
   420     def _erqlexpr_rset(self, action, ertype):
   420     def _erqlexpr_rset(self, action, ertype):
   421         rql = 'RQLExpression X WHERE ET is CWEType, ET %s_permission X, ET name %%(name)s' % action
   421         rql = 'RQLExpression X WHERE ET is CWEType, ET %s_permission X, ET name %%(name)s' % action
   422         return self.mh.session.execute(rql, {'name': ertype})
   422         return self.mh.session.execute(rql, {'name': ertype})
   423     def _erqlexpr_entity(self, action, ertype):
   423     def _erqlexpr_entity(self, action, ertype):
   424         rset = self._erqlexpr_rset(action, ertype)
   424         rset = self._erqlexpr_rset(action, ertype)
   425         self.assertEquals(len(rset), 1)
   425         self.assertEqual(len(rset), 1)
   426         return rset.get_entity(0, 0)
   426         return rset.get_entity(0, 0)
   427     def _rrqlexpr_rset(self, action, ertype):
   427     def _rrqlexpr_rset(self, action, ertype):
   428         rql = 'RQLExpression X WHERE RT is CWRType, RDEF %s_permission X, RT name %%(name)s, RDEF relation_type RT' % action
   428         rql = 'RQLExpression X WHERE RT is CWRType, RDEF %s_permission X, RT name %%(name)s, RDEF relation_type RT' % action
   429         return self.mh.session.execute(rql, {'name': ertype})
   429         return self.mh.session.execute(rql, {'name': ertype})
   430     def _rrqlexpr_entity(self, action, ertype):
   430     def _rrqlexpr_entity(self, action, ertype):
   431         rset = self._rrqlexpr_rset(action, ertype)
   431         rset = self._rrqlexpr_rset(action, ertype)
   432         self.assertEquals(len(rset), 1)
   432         self.assertEqual(len(rset), 1)
   433         return rset.get_entity(0, 0)
   433         return rset.get_entity(0, 0)
   434 
   434 
   435     def test_set_size_constraint(self):
   435     def test_set_size_constraint(self):
   436         # existing previous value
   436         # existing previous value
   437         try:
   437         try:
   445             self.mh.cmd_set_size_constraint('CWEType', 'description', None)
   445             self.mh.cmd_set_size_constraint('CWEType', 'description', None)
   446 
   446 
   447     def test_add_remove_cube_and_deps(self):
   447     def test_add_remove_cube_and_deps(self):
   448         cubes = set(self.config.cubes())
   448         cubes = set(self.config.cubes())
   449         schema = self.repo.schema
   449         schema = self.repo.schema
   450         self.assertEquals(sorted((str(s), str(o)) for s, o in schema['see_also'].rdefs.keys()),
   450         self.assertEqual(sorted((str(s), str(o)) for s, o in schema['see_also'].rdefs.keys()),
   451                           sorted([('EmailThread', 'EmailThread'), ('Folder', 'Folder'),
   451                           sorted([('EmailThread', 'EmailThread'), ('Folder', 'Folder'),
   452                                   ('Bookmark', 'Bookmark'), ('Bookmark', 'Note'),
   452                                   ('Bookmark', 'Bookmark'), ('Bookmark', 'Note'),
   453                                   ('Note', 'Note'), ('Note', 'Bookmark')]))
   453                                   ('Note', 'Note'), ('Note', 'Bookmark')]))
   454         try:
   454         try:
   455             try:
   455             try:
   460                 self.failIf('file' in self.config.cubes())
   460                 self.failIf('file' in self.config.cubes())
   461                 self.failIf(self.config.cube_dir('file') in self.config.cubes_path())
   461                 self.failIf(self.config.cube_dir('file') in self.config.cubes_path())
   462                 for ertype in ('Email', 'EmailThread', 'EmailPart', 'File',
   462                 for ertype in ('Email', 'EmailThread', 'EmailPart', 'File',
   463                                'sender', 'in_thread', 'reply_to', 'data_format'):
   463                                'sender', 'in_thread', 'reply_to', 'data_format'):
   464                     self.failIf(ertype in schema, ertype)
   464                     self.failIf(ertype in schema, ertype)
   465                 self.assertEquals(sorted(schema['see_also'].rdefs.keys()),
   465                 self.assertEqual(sorted(schema['see_also'].rdefs.keys()),
   466                                   sorted([('Folder', 'Folder'),
   466                                   sorted([('Folder', 'Folder'),
   467                                           ('Bookmark', 'Bookmark'),
   467                                           ('Bookmark', 'Bookmark'),
   468                                           ('Bookmark', 'Note'),
   468                                           ('Bookmark', 'Note'),
   469                                           ('Note', 'Note'),
   469                                           ('Note', 'Note'),
   470                                           ('Note', 'Bookmark')]))
   470                                           ('Note', 'Bookmark')]))
   471                 self.assertEquals(sorted(schema['see_also'].subjects()), ['Bookmark', 'Folder', 'Note'])
   471                 self.assertEqual(sorted(schema['see_also'].subjects()), ['Bookmark', 'Folder', 'Note'])
   472                 self.assertEquals(sorted(schema['see_also'].objects()), ['Bookmark', 'Folder', 'Note'])
   472                 self.assertEqual(sorted(schema['see_also'].objects()), ['Bookmark', 'Folder', 'Note'])
   473                 self.assertEquals(self.execute('Any X WHERE X pkey "system.version.email"').rowcount, 0)
   473                 self.assertEqual(self.execute('Any X WHERE X pkey "system.version.email"').rowcount, 0)
   474                 self.assertEquals(self.execute('Any X WHERE X pkey "system.version.file"').rowcount, 0)
   474                 self.assertEqual(self.execute('Any X WHERE X pkey "system.version.file"').rowcount, 0)
   475             except :
   475             except :
   476                 import traceback
   476                 import traceback
   477                 traceback.print_exc()
   477                 traceback.print_exc()
   478                 raise
   478                 raise
   479         finally:
   479         finally:
   483             self.failUnless('file' in self.config.cubes())
   483             self.failUnless('file' in self.config.cubes())
   484             self.failUnless(self.config.cube_dir('file') in self.config.cubes_path())
   484             self.failUnless(self.config.cube_dir('file') in self.config.cubes_path())
   485             for ertype in ('Email', 'EmailThread', 'EmailPart', 'File',
   485             for ertype in ('Email', 'EmailThread', 'EmailPart', 'File',
   486                            'sender', 'in_thread', 'reply_to', 'data_format'):
   486                            'sender', 'in_thread', 'reply_to', 'data_format'):
   487                 self.failUnless(ertype in schema, ertype)
   487                 self.failUnless(ertype in schema, ertype)
   488             self.assertEquals(sorted(schema['see_also'].rdefs.keys()),
   488             self.assertEqual(sorted(schema['see_also'].rdefs.keys()),
   489                               sorted([('EmailThread', 'EmailThread'), ('Folder', 'Folder'),
   489                               sorted([('EmailThread', 'EmailThread'), ('Folder', 'Folder'),
   490                                       ('Bookmark', 'Bookmark'),
   490                                       ('Bookmark', 'Bookmark'),
   491                                       ('Bookmark', 'Note'),
   491                                       ('Bookmark', 'Note'),
   492                                       ('Note', 'Note'),
   492                                       ('Note', 'Note'),
   493                                       ('Note', 'Bookmark')]))
   493                                       ('Note', 'Bookmark')]))
   494             self.assertEquals(sorted(schema['see_also'].subjects()), ['Bookmark', 'EmailThread', 'Folder', 'Note'])
   494             self.assertEqual(sorted(schema['see_also'].subjects()), ['Bookmark', 'EmailThread', 'Folder', 'Note'])
   495             self.assertEquals(sorted(schema['see_also'].objects()), ['Bookmark', 'EmailThread', 'Folder', 'Note'])
   495             self.assertEqual(sorted(schema['see_also'].objects()), ['Bookmark', 'EmailThread', 'Folder', 'Note'])
   496             from cubes.email.__pkginfo__ import version as email_version
   496             from cubes.email.__pkginfo__ import version as email_version
   497             from cubes.file.__pkginfo__ import version as file_version
   497             from cubes.file.__pkginfo__ import version as file_version
   498             self.assertEquals(self.execute('Any V WHERE X value V, X pkey "system.version.email"')[0][0],
   498             self.assertEqual(self.execute('Any V WHERE X value V, X pkey "system.version.email"')[0][0],
   499                               email_version)
   499                               email_version)
   500             self.assertEquals(self.execute('Any V WHERE X value V, X pkey "system.version.file"')[0][0],
   500             self.assertEqual(self.execute('Any V WHERE X value V, X pkey "system.version.file"')[0][0],
   501                               file_version)
   501                               file_version)
   502             # trick: overwrite self.maxeid to avoid deletion of just reintroduced
   502             # trick: overwrite self.maxeid to avoid deletion of just reintroduced
   503             #        types (and their associated tables!)
   503             #        types (and their associated tables!)
   504             self.maxeid = self.execute('Any MAX(X)')[0][0]
   504             self.maxeid = self.execute('Any MAX(X)')[0][0]
   505             # why this commit is necessary is unclear to me (though without it
   505             # why this commit is necessary is unclear to me (though without it
   533             # next test may fail complaining of missing tables
   533             # next test may fail complaining of missing tables
   534             self.commit()
   534             self.commit()
   535 
   535 
   536     def test_remove_dep_cube(self):
   536     def test_remove_dep_cube(self):
   537         ex = self.assertRaises(ConfigurationError, self.mh.cmd_remove_cube, 'file')
   537         ex = self.assertRaises(ConfigurationError, self.mh.cmd_remove_cube, 'file')
   538         self.assertEquals(str(ex), "can't remove cube file, used as a dependency")
   538         self.assertEqual(str(ex), "can't remove cube file, used as a dependency")
   539 
   539 
   540     def test_introduce_base_class(self):
   540     def test_introduce_base_class(self):
   541         self.mh.cmd_add_entity_type('Para')
   541         self.mh.cmd_add_entity_type('Para')
   542         self.mh.repo.schema.rebuild_infered_relations()
   542         self.mh.repo.schema.rebuild_infered_relations()
   543         self.assertEquals(sorted(et.type for et in self.schema['Para'].specialized_by()),
   543         self.assertEqual(sorted(et.type for et in self.schema['Para'].specialized_by()),
   544                           ['Note'])
   544                           ['Note'])
   545         self.assertEquals(self.schema['Note'].specializes().type, 'Para')
   545         self.assertEqual(self.schema['Note'].specializes().type, 'Para')
   546         self.mh.cmd_add_entity_type('Text')
   546         self.mh.cmd_add_entity_type('Text')
   547         self.mh.repo.schema.rebuild_infered_relations()
   547         self.mh.repo.schema.rebuild_infered_relations()
   548         self.assertEquals(sorted(et.type for et in self.schema['Para'].specialized_by()),
   548         self.assertEqual(sorted(et.type for et in self.schema['Para'].specialized_by()),
   549                           ['Note', 'Text'])
   549                           ['Note', 'Text'])
   550         self.assertEquals(self.schema['Text'].specializes().type, 'Para')
   550         self.assertEqual(self.schema['Text'].specializes().type, 'Para')
   551         # test columns have been actually added
   551         # test columns have been actually added
   552         text = self.execute('INSERT Text X: X para "hip", X summary "hop", X newattr "momo"').get_entity(0, 0)
   552         text = self.execute('INSERT Text X: X para "hip", X summary "hop", X newattr "momo"').get_entity(0, 0)
   553         note = self.execute('INSERT Note X: X para "hip", X shortpara "hop", X newattr "momo", X unique_id "x"').get_entity(0, 0)
   553         note = self.execute('INSERT Note X: X para "hip", X shortpara "hop", X newattr "momo", X unique_id "x"').get_entity(0, 0)
   554         aff = self.execute('INSERT Affaire X').get_entity(0, 0)
   554         aff = self.execute('INSERT Affaire X').get_entity(0, 0)
   555         self.failUnless(self.execute('SET X newnotinlined Y WHERE X eid %(x)s, Y eid %(y)s',
   555         self.failUnless(self.execute('SET X newnotinlined Y WHERE X eid %(x)s, Y eid %(y)s',
   572         try:
   572         try:
   573             self.execute('DELETE X specializes Y WHERE Y name "Para"')
   573             self.execute('DELETE X specializes Y WHERE Y name "Para"')
   574             self.commit()
   574             self.commit()
   575         finally:
   575         finally:
   576             self.session.data['rebuild-infered'] = False
   576             self.session.data['rebuild-infered'] = False
   577         self.assertEquals(sorted(et.type for et in self.schema['Para'].specialized_by()),
   577         self.assertEqual(sorted(et.type for et in self.schema['Para'].specialized_by()),
   578                           [])
   578                           [])
   579         self.assertEquals(self.schema['Note'].specializes(), None)
   579         self.assertEqual(self.schema['Note'].specializes(), None)
   580         self.assertEquals(self.schema['Text'].specializes(), None)
   580         self.assertEqual(self.schema['Text'].specializes(), None)
   581 
   581 
   582 
   582 
   583     def test_add_symmetric_relation_type(self):
   583     def test_add_symmetric_relation_type(self):
   584         same_as_sql = self.mh.sqlexec("SELECT sql FROM sqlite_master WHERE type='table' "
   584         same_as_sql = self.mh.sqlexec("SELECT sql FROM sqlite_master WHERE type='table' "
   585                                       "and name='same_as_relation'")
   585                                       "and name='same_as_relation'")