server/test/unittest_migractions.py
branchstable
changeset 3315 59220b704562
parent 3267 320a715e2a22
child 3293 69c0ba095536
child 3316 c4c07aab1c39
equal deleted inserted replaced
3298:caef98aa4a98 3315:59220b704562
    43                                         repo=self.repo, cnx=self.cnx,
    43                                         repo=self.repo, cnx=self.cnx,
    44                                         interactive=False)
    44                                         interactive=False)
    45         assert self.cnx is self.mh._cnx
    45         assert self.cnx is self.mh._cnx
    46         assert self.session is self.mh.session, (self.session.id, self.mh.session.id)
    46         assert self.session is self.mh.session, (self.session.id, self.mh.session.id)
    47 
    47 
       
    48 
    48     def test_add_attribute_int(self):
    49     def test_add_attribute_int(self):
    49         self.failIf('whatever' in self.schema)
    50         self.failIf('whatever' in self.schema)
    50         paraordernum = self.mh.rqlexec('Any O WHERE X name "Note", RT name "para", RDEF from_entity X, RDEF relation_type RT, RDEF ordernum O')[0][0]
    51         orderdict = dict(self.mh.rqlexec('Any RTN, O WHERE X name "Note", RDEF from_entity X, '
       
    52                                          'RDEF relation_type RT, RDEF ordernum O, RT name RTN'))
    51         self.mh.cmd_add_attribute('Note', 'whatever')
    53         self.mh.cmd_add_attribute('Note', 'whatever')
    52         self.failUnless('whatever' in self.schema)
    54         self.failUnless('whatever' in self.schema)
    53         self.assertEquals(self.schema['whatever'].subjects(), ('Note',))
    55         self.assertEquals(self.schema['whatever'].subjects(), ('Note',))
    54         self.assertEquals(self.schema['whatever'].objects(), ('Int',))
    56         self.assertEquals(self.schema['whatever'].objects(), ('Int',))
    55         paraordernum2 = self.mh.rqlexec('Any O WHERE X name "Note", RT name "para", RDEF from_entity X, RDEF relation_type RT, RDEF ordernum O')[0][0]
    57         orderdict2 = dict(self.mh.rqlexec('Any RTN, O WHERE X name "Note", RDEF from_entity X, '
    56         self.assertEquals(paraordernum2, paraordernum+1)
    58                                           'RDEF relation_type RT, RDEF ordernum O, RT name RTN'))
       
    59         whateverorder = migrschema['whatever'].rproperty('Note', 'Int', 'order')
       
    60         for k, v in orderdict.iteritems():
       
    61             if v >= whateverorder:
       
    62                 orderdict[k] = v+1
       
    63         orderdict['whatever'] = whateverorder
       
    64         self.assertDictEquals(orderdict, orderdict2)
    57         #self.assertEquals([r.type for r in self.schema['Note'].ordered_relations()],
    65         #self.assertEquals([r.type for r in self.schema['Note'].ordered_relations()],
    58         #                  ['modification_date', 'creation_date', 'owned_by',
    66         #                  ['modification_date', 'creation_date', 'owned_by',
    59         #                   'eid', 'ecrit_par', 'inline1', 'date', 'type',
    67         #                   'eid', 'ecrit_par', 'inline1', 'date', 'type',
    60         #                   'whatever', 'para', 'in_basket'])
    68         #                   'whatever', 'date', 'in_basket'])
    61         # NB: commit instead of rollback make following test fail with py2.5
    69         # NB: commit instead of rollback make following test fail with py2.5
    62         #     this sounds like a pysqlite/2.5 bug (the same eid is affected to
    70         #     this sounds like a pysqlite/2.5 bug (the same eid is affected to
    63         #     two different entities)
    71         #     two different entities)
    64         self.mh.rollback()
    72         self.mh.rollback()
    65 
    73 
   104         c2 = self.mh.rqlexec('Any C WHERE X eid %s, X civility C' % eid2)[0][0]
   112         c2 = self.mh.rqlexec('Any C WHERE X eid %s, X civility C' % eid2)[0][0]
   105         self.failUnlessEqual(c2, None)
   113         self.failUnlessEqual(c2, None)
   106 
   114 
   107 
   115 
   108     def test_workflow_actions(self):
   116     def test_workflow_actions(self):
   109         foo = self.mh.cmd_add_state(u'foo', ('Personne', 'Email'), initial=True)
   117         wf = self.mh.cmd_add_workflow(u'foo', ('Personne', 'Email'))
   110         for etype in ('Personne', 'Email'):
   118         for etype in ('Personne', 'Email'):
   111             s1 = self.mh.rqlexec('Any N WHERE S state_of ET, ET name "%s", S name N' %
   119             s1 = self.mh.rqlexec('Any N WHERE WF workflow_of ET, ET name "%s", WF name N' %
   112                                  etype)[0][0]
   120                                  etype)[0][0]
   113             self.assertEquals(s1, "foo")
   121             self.assertEquals(s1, "foo")
   114             s1 = self.mh.rqlexec('Any N WHERE ET initial_state S, ET name "%s", S name N' %
   122             s1 = self.mh.rqlexec('Any N WHERE ET default_workflow WF, ET name "%s", WF name N' %
   115                                  etype)[0][0]
   123                                  etype)[0][0]
   116             self.assertEquals(s1, "foo")
   124             self.assertEquals(s1, "foo")
   117         bar = self.mh.cmd_add_state(u'bar', ('Personne', 'Email'), initial=True)
       
   118         baz = self.mh.cmd_add_transition(u'baz', ('Personne', 'Email'),
       
   119                                          (foo,), bar, ('managers',))
       
   120         for etype in ('Personne', 'Email'):
       
   121             t1 = self.mh.rqlexec('Any N WHERE T transition_of ET, ET name "%s", T name N' %
       
   122                                  etype)[0][0]
       
   123             self.assertEquals(t1, "baz")
       
   124         gn = self.mh.rqlexec('Any GN WHERE T require_group G, G name GN, T eid %s' % baz)[0][0]
       
   125         self.assertEquals(gn, 'managers')
       
   126 
   125 
   127     def test_add_entity_type(self):
   126     def test_add_entity_type(self):
   128         self.failIf('Folder2' in self.schema)
   127         self.failIf('Folder2' in self.schema)
   129         self.failIf('filed_under2' in self.schema)
   128         self.failIf('filed_under2' in self.schema)
   130         self.mh.cmd_add_entity_type('Folder2')
   129         self.mh.cmd_add_entity_type('Folder2')
   131         self.failUnless('Folder2' in self.schema)
   130         self.failUnless('Folder2' in self.schema)
   132         self.failUnless(self.execute('CWEType X WHERE X name "Folder2"'))
   131         self.failUnless(self.execute('CWEType X WHERE X name "Folder2"'))
   133         self.failUnless('filed_under2' in self.schema)
   132         self.failUnless('filed_under2' in self.schema)
   134         self.failUnless(self.execute('CWRType X WHERE X name "filed_under2"'))
   133         self.failUnless(self.execute('CWRType X WHERE X name "filed_under2"'))
       
   134         self.schema.rebuild_infered_relations()
   135         self.assertEquals(sorted(str(rs) for rs in self.schema['Folder2'].subject_relations()),
   135         self.assertEquals(sorted(str(rs) for rs in self.schema['Folder2'].subject_relations()),
   136                           ['created_by', 'creation_date', 'cwuri',
   136                           ['created_by', 'creation_date', 'cwuri',
   137                            'description', 'description_format',
   137                            'description', 'description_format',
   138                            'eid',
   138                            'eid',
   139                            'filed_under2', 'has_text',
   139                            'filed_under2', 'has_text',
   148         for cstr in eschema.constraints('name'):
   148         for cstr in eschema.constraints('name'):
   149             self.failUnless(hasattr(cstr, 'eid'))
   149             self.failUnless(hasattr(cstr, 'eid'))
   150 
   150 
   151     def test_add_drop_entity_type(self):
   151     def test_add_drop_entity_type(self):
   152         self.mh.cmd_add_entity_type('Folder2')
   152         self.mh.cmd_add_entity_type('Folder2')
   153         todoeid = self.mh.cmd_add_state(u'todo', 'Folder2', initial=True)
   153         wf = self.mh.cmd_add_workflow(u'folder2 wf', 'Folder2')
   154         doneeid = self.mh.cmd_add_state(u'done', 'Folder2')
   154         todo = wf.add_state(u'todo', initial=True)
   155         self.mh.cmd_add_transition(u'redoit', 'Folder2', (doneeid,), todoeid)
   155         done = wf.add_state(u'done')
   156         self.mh.cmd_add_transition(u'markasdone', 'Folder2', (todoeid,), doneeid)
   156         wf.add_transition(u'redoit', done, todo)
       
   157         wf.add_transition(u'markasdone', todo, done)
   157         self.commit()
   158         self.commit()
   158         eschema = self.schema.eschema('Folder2')
   159         eschema = self.schema.eschema('Folder2')
   159         self.mh.cmd_drop_entity_type('Folder2')
   160         self.mh.cmd_drop_entity_type('Folder2')
   160         self.failIf('Folder2' in self.schema)
   161         self.failIf('Folder2' in self.schema)
   161         self.failIf(self.execute('CWEType X WHERE X name "Folder2"'))
   162         self.failIf(self.execute('CWEType X WHERE X name "Folder2"'))
   162         # test automatic workflow deletion
   163         # test automatic workflow deletion
   163         self.failIf(self.execute('State X WHERE NOT X state_of ET'))
   164         self.failIf(self.execute('Workflow X WHERE NOT X workflow_of ET'))
   164         self.failIf(self.execute('Transition X WHERE NOT X transition_of ET'))
   165         self.failIf(self.execute('State X WHERE NOT X state_of WF'))
       
   166         self.failIf(self.execute('Transition X WHERE NOT X transition_of WF'))
   165 
   167 
   166     def test_add_drop_relation_type(self):
   168     def test_add_drop_relation_type(self):
   167         self.mh.cmd_add_entity_type('Folder2', auto=False)
   169         self.mh.cmd_add_entity_type('Folder2', auto=False)
   168         self.mh.cmd_add_relation_type('filed_under2')
   170         self.mh.cmd_add_relation_type('filed_under2')
       
   171         self.schema.rebuild_infered_relations()
   169         self.failUnless('filed_under2' in self.schema)
   172         self.failUnless('filed_under2' in self.schema)
   170         self.assertEquals(sorted(str(e) for e in self.schema['filed_under2'].subjects()),
   173         self.assertEquals(sorted(str(e) for e in self.schema['filed_under2'].subjects()),
   171                           sorted(str(e) for e in self.schema.entities() if not e.is_final()))
   174                           sorted(str(e) for e in self.schema.entities() if not e.is_final()))
   172         self.assertEquals(self.schema['filed_under2'].objects(), ('Folder2',))
   175         self.assertEquals(self.schema['filed_under2'].objects(), ('Folder2',))
   173         self.mh.cmd_drop_relation_type('filed_under2')
   176         self.mh.cmd_drop_relation_type('filed_under2')
   181                           ('Affaire', ))
   184                           ('Affaire', ))
   182         self.assertEquals(self.schema['concerne2'].rproperty('Personne', 'Affaire', 'cardinality'),
   185         self.assertEquals(self.schema['concerne2'].rproperty('Personne', 'Affaire', 'cardinality'),
   183                           '1*')
   186                           '1*')
   184         self.mh.cmd_add_relation_definition('Personne', 'concerne2', 'Note')
   187         self.mh.cmd_add_relation_definition('Personne', 'concerne2', 'Note')
   185         self.assertEquals(sorted(self.schema['concerne2'].objects()), ['Affaire', 'Note'])
   188         self.assertEquals(sorted(self.schema['concerne2'].objects()), ['Affaire', 'Note'])
   186         self.mh.add_entity('Personne', nom=u'tot')
   189         self.mh.create_entity('Personne', nom=u'tot')
   187         self.mh.add_entity('Affaire')
   190         self.mh.create_entity('Affaire')
   188         self.mh.rqlexec('SET X concerne2 Y WHERE X is Personne, Y is Affaire')
   191         self.mh.rqlexec('SET X concerne2 Y WHERE X is Personne, Y is Affaire')
   189         self.commit()
   192         self.commit()
   190         self.mh.cmd_drop_relation_definition('Personne', 'concerne2', 'Affaire')
   193         self.mh.cmd_drop_relation_definition('Personne', 'concerne2', 'Affaire')
   191         self.failUnless('concerne2' in self.schema)
   194         self.failUnless('concerne2' in self.schema)
   192         self.mh.cmd_drop_relation_definition('Personne', 'concerne2', 'Note')
   195         self.mh.cmd_drop_relation_definition('Personne', 'concerne2', 'Note')
   217                           ['Affaire', 'Division', 'Note', 'Societe', 'SubDivision'])
   220                           ['Affaire', 'Division', 'Note', 'Societe', 'SubDivision'])
   218         self.mh.cmd_drop_relation_definition('Affaire', 'concerne', 'Societe')
   221         self.mh.cmd_drop_relation_definition('Affaire', 'concerne', 'Societe')
   219         self.assertEquals(sorted(str(e) for e in self.schema['concerne'].subjects()),
   222         self.assertEquals(sorted(str(e) for e in self.schema['concerne'].subjects()),
   220                           ['Affaire', 'Personne'])
   223                           ['Affaire', 'Personne'])
   221         self.assertEquals(sorted(str(e) for e in self.schema['concerne'].objects()),
   224         self.assertEquals(sorted(str(e) for e in self.schema['concerne'].objects()),
       
   225                           ['Affaire', 'Division', 'Note', 'SubDivision'])
       
   226         self.schema.rebuild_infered_relations() # need to be explicitly called once everything is in place
       
   227         self.assertEquals(sorted(str(e) for e in self.schema['concerne'].objects()),
   222                           ['Affaire', 'Note'])
   228                           ['Affaire', 'Note'])
   223         self.mh.cmd_add_relation_definition('Affaire', 'concerne', 'Societe')
   229         self.mh.cmd_add_relation_definition('Affaire', 'concerne', 'Societe')
   224         self.assertEquals(sorted(str(e) for e in self.schema['concerne'].subjects()),
   230         self.assertEquals(sorted(str(e) for e in self.schema['concerne'].subjects()),
   225                           ['Affaire', 'Personne'])
   231                           ['Affaire', 'Personne'])
       
   232         self.assertEquals(sorted(str(e) for e in self.schema['concerne'].objects()),
       
   233                           ['Affaire', 'Note', 'Societe'])
       
   234         self.schema.rebuild_infered_relations() # need to be explicitly called once everything is in place
   226         self.assertEquals(sorted(str(e) for e in self.schema['concerne'].objects()),
   235         self.assertEquals(sorted(str(e) for e in self.schema['concerne'].objects()),
   227                           ['Affaire', 'Division', 'Note', 'Societe', 'SubDivision'])
   236                           ['Affaire', 'Division', 'Note', 'Societe', 'SubDivision'])
   228         # trick: overwrite self.maxeid to avoid deletion of just reintroduced types
   237         # trick: overwrite self.maxeid to avoid deletion of just reintroduced types
   229         self.maxeid = self.execute('Any MAX(X)')[0][0]
   238         self.maxeid = self.execute('Any MAX(X)')[0][0]
   230 
   239 
   449 
   458 
   450     def test_remove_dep_cube(self):
   459     def test_remove_dep_cube(self):
   451         ex = self.assertRaises(ConfigurationError, self.mh.cmd_remove_cube, 'file')
   460         ex = self.assertRaises(ConfigurationError, self.mh.cmd_remove_cube, 'file')
   452         self.assertEquals(str(ex), "can't remove cube file, used as a dependency")
   461         self.assertEquals(str(ex), "can't remove cube file, used as a dependency")
   453 
   462 
   454     def test_set_state(self):
       
   455         user = self.session.user
       
   456         self.mh.set_state(user.eid, 'deactivated')
       
   457         user.clear_related_cache('in_state', 'subject')
       
   458         self.assertEquals(user.state, 'deactivated')
       
   459 
       
   460     def test_introduce_base_class(self):
   463     def test_introduce_base_class(self):
   461         self.mh.cmd_add_entity_type('Para')
   464         self.mh.cmd_add_entity_type('Para')
   462         self.mh.repo.schema.rebuild_infered_relations()
   465         self.mh.repo.schema.rebuild_infered_relations()
   463         self.assertEquals(sorted(et.type for et in self.schema['Para'].specialized_by()),
   466         self.assertEquals(sorted(et.type for et in self.schema['Para'].specialized_by()),
   464                           ['Note'])
   467                           ['Note'])