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: |
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 |