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']) |