94 'Any ETN,X WHERE X is ET, ET name ETN, (EXISTS(X owned_by %(B)s))' |
94 'Any ETN,X WHERE X is ET, ET name ETN, (EXISTS(X owned_by %(B)s))' |
95 ' OR ((((EXISTS(D concerne C?, C owned_by %(B)s, X identity D, C is Division, D is Affaire))' |
95 ' OR ((((EXISTS(D concerne C?, C owned_by %(B)s, X identity D, C is Division, D is Affaire))' |
96 ' OR (EXISTS(H concerne G?, G owned_by %(B)s, G is SubDivision, X identity H, H is Affaire)))' |
96 ' OR (EXISTS(H concerne G?, G owned_by %(B)s, G is SubDivision, X identity H, H is Affaire)))' |
97 ' OR (EXISTS(I concerne F?, F owned_by %(B)s, F is Societe, X identity I, I is Affaire)))' |
97 ' OR (EXISTS(I concerne F?, F owned_by %(B)s, F is Societe, X identity I, I is Affaire)))' |
98 ' OR (EXISTS(J concerne E?, E owned_by %(B)s, E is Note, X identity J, J is Affaire)))' |
98 ' OR (EXISTS(J concerne E?, E owned_by %(B)s, E is Note, X identity J, J is Affaire)))' |
99 ', ET is EEType, X is Affaire') |
99 ', ET is CWEType, X is Affaire') |
100 self.assertEquals(solutions, [{'C': 'Division', |
100 self.assertEquals(solutions, [{'C': 'Division', |
101 'D': 'Affaire', |
101 'D': 'Affaire', |
102 'E': 'Note', |
102 'E': 'Note', |
103 'F': 'Societe', |
103 'F': 'Societe', |
104 'G': 'SubDivision', |
104 'G': 'SubDivision', |
105 'H': 'Affaire', |
105 'H': 'Affaire', |
106 'I': 'Affaire', |
106 'I': 'Affaire', |
107 'J': 'Affaire', |
107 'J': 'Affaire', |
108 'X': 'Affaire', |
108 'X': 'Affaire', |
109 'ET': 'EEType', 'ETN': 'String'}]) |
109 'ET': 'CWEType', 'ETN': 'String'}]) |
110 rql, solutions = partrqls[1] |
110 rql, solutions = partrqls[1] |
111 self.assertEquals(rql, 'Any ETN,X WHERE X is ET, ET name ETN, ET is EEType, ' |
111 self.assertEquals(rql, 'Any ETN,X WHERE X is ET, ET name ETN, ET is CWEType, ' |
112 'X is IN(Bookmark, Card, Comment, Division, ECache, EConstraint, EConstraintType, EEType, EFRDef, EGroup, ENFRDef, EPermission, EProperty, ERType, EUser, Email, EmailAddress, EmailPart, EmailThread, File, Folder, Image, Note, Personne, RQLExpression, Societe, State, SubDivision, Tag, TrInfo, Transition)') |
112 'X is IN(Bookmark, Card, Comment, Division, CWCache, CWConstraint, CWConstraintType, CWEType, CWAttribute, CWGroup, CWRelation, CWPermission, CWProperty, CWRType, CWUser, Email, EmailAddress, EmailPart, EmailThread, File, Folder, Image, Note, Personne, RQLExpression, Societe, State, SubDivision, Tag, TrInfo, Transition)') |
113 self.assertListEquals(sorted(solutions), |
113 self.assertListEquals(sorted(solutions), |
114 sorted([{'X': 'Bookmark', 'ETN': 'String', 'ET': 'EEType'}, |
114 sorted([{'X': 'Bookmark', 'ETN': 'String', 'ET': 'CWEType'}, |
115 {'X': 'Card', 'ETN': 'String', 'ET': 'EEType'}, |
115 {'X': 'Card', 'ETN': 'String', 'ET': 'CWEType'}, |
116 {'X': 'Comment', 'ETN': 'String', 'ET': 'EEType'}, |
116 {'X': 'Comment', 'ETN': 'String', 'ET': 'CWEType'}, |
117 {'X': 'Division', 'ETN': 'String', 'ET': 'EEType'}, |
117 {'X': 'Division', 'ETN': 'String', 'ET': 'CWEType'}, |
118 {'X': 'ECache', 'ETN': 'String', 'ET': 'EEType'}, |
118 {'X': 'CWCache', 'ETN': 'String', 'ET': 'CWEType'}, |
119 {'X': 'EConstraint', 'ETN': 'String', 'ET': 'EEType'}, |
119 {'X': 'CWConstraint', 'ETN': 'String', 'ET': 'CWEType'}, |
120 {'X': 'EConstraintType', 'ETN': 'String', 'ET': 'EEType'}, |
120 {'X': 'CWConstraintType', 'ETN': 'String', 'ET': 'CWEType'}, |
121 {'X': 'EEType', 'ETN': 'String', 'ET': 'EEType'}, |
121 {'X': 'CWEType', 'ETN': 'String', 'ET': 'CWEType'}, |
122 {'X': 'EFRDef', 'ETN': 'String', 'ET': 'EEType'}, |
122 {'X': 'CWAttribute', 'ETN': 'String', 'ET': 'CWEType'}, |
123 {'X': 'EGroup', 'ETN': 'String', 'ET': 'EEType'}, |
123 {'X': 'CWGroup', 'ETN': 'String', 'ET': 'CWEType'}, |
124 {'X': 'Email', 'ETN': 'String', 'ET': 'EEType'}, |
124 {'X': 'Email', 'ETN': 'String', 'ET': 'CWEType'}, |
125 {'X': 'EmailAddress', 'ETN': 'String', 'ET': 'EEType'}, |
125 {'X': 'EmailAddress', 'ETN': 'String', 'ET': 'CWEType'}, |
126 {'X': 'EmailPart', 'ETN': 'String', 'ET': 'EEType'}, |
126 {'X': 'EmailPart', 'ETN': 'String', 'ET': 'CWEType'}, |
127 {'X': 'EmailThread', 'ETN': 'String', 'ET': 'EEType'}, |
127 {'X': 'EmailThread', 'ETN': 'String', 'ET': 'CWEType'}, |
128 {'X': 'ENFRDef', 'ETN': 'String', 'ET': 'EEType'}, |
128 {'X': 'CWRelation', 'ETN': 'String', 'ET': 'CWEType'}, |
129 {'X': 'EPermission', 'ETN': 'String', 'ET': 'EEType'}, |
129 {'X': 'CWPermission', 'ETN': 'String', 'ET': 'CWEType'}, |
130 {'X': 'EProperty', 'ETN': 'String', 'ET': 'EEType'}, |
130 {'X': 'CWProperty', 'ETN': 'String', 'ET': 'CWEType'}, |
131 {'X': 'ERType', 'ETN': 'String', 'ET': 'EEType'}, |
131 {'X': 'CWRType', 'ETN': 'String', 'ET': 'CWEType'}, |
132 {'X': 'EUser', 'ETN': 'String', 'ET': 'EEType'}, |
132 {'X': 'CWUser', 'ETN': 'String', 'ET': 'CWEType'}, |
133 {'X': 'File', 'ETN': 'String', 'ET': 'EEType'}, |
133 {'X': 'File', 'ETN': 'String', 'ET': 'CWEType'}, |
134 {'X': 'Folder', 'ETN': 'String', 'ET': 'EEType'}, |
134 {'X': 'Folder', 'ETN': 'String', 'ET': 'CWEType'}, |
135 {'X': 'Image', 'ETN': 'String', 'ET': 'EEType'}, |
135 {'X': 'Image', 'ETN': 'String', 'ET': 'CWEType'}, |
136 {'X': 'Note', 'ETN': 'String', 'ET': 'EEType'}, |
136 {'X': 'Note', 'ETN': 'String', 'ET': 'CWEType'}, |
137 {'X': 'Personne', 'ETN': 'String', 'ET': 'EEType'}, |
137 {'X': 'Personne', 'ETN': 'String', 'ET': 'CWEType'}, |
138 {'X': 'RQLExpression', 'ETN': 'String', 'ET': 'EEType'}, |
138 {'X': 'RQLExpression', 'ETN': 'String', 'ET': 'CWEType'}, |
139 {'X': 'Societe', 'ETN': 'String', 'ET': 'EEType'}, |
139 {'X': 'Societe', 'ETN': 'String', 'ET': 'CWEType'}, |
140 {'X': 'State', 'ETN': 'String', 'ET': 'EEType'}, |
140 {'X': 'State', 'ETN': 'String', 'ET': 'CWEType'}, |
141 {'X': 'SubDivision', 'ETN': 'String', 'ET': 'EEType'}, |
141 {'X': 'SubDivision', 'ETN': 'String', 'ET': 'CWEType'}, |
142 {'X': 'Tag', 'ETN': 'String', 'ET': 'EEType'}, |
142 {'X': 'Tag', 'ETN': 'String', 'ET': 'CWEType'}, |
143 {'X': 'Transition', 'ETN': 'String', 'ET': 'EEType'}, |
143 {'X': 'Transition', 'ETN': 'String', 'ET': 'CWEType'}, |
144 {'X': 'TrInfo', 'ETN': 'String', 'ET': 'EEType'}])) |
144 {'X': 'TrInfo', 'ETN': 'String', 'ET': 'CWEType'}])) |
145 rql, solutions = partrqls[2] |
145 rql, solutions = partrqls[2] |
146 self.assertEquals(rql, |
146 self.assertEquals(rql, |
147 'Any ETN,X WHERE X is ET, ET name ETN, EXISTS(X owned_by %(C)s), ' |
147 'Any ETN,X WHERE X is ET, ET name ETN, EXISTS(X owned_by %(C)s), ' |
148 'ET is EEType, X is Basket') |
148 'ET is CWEType, X is Basket') |
149 self.assertEquals(solutions, [{'ET': 'EEType', |
149 self.assertEquals(solutions, [{'ET': 'CWEType', |
150 'X': 'Basket', |
150 'X': 'Basket', |
151 'ETN': 'String', |
151 'ETN': 'String', |
152 }]) |
152 }]) |
153 |
153 |
154 def test_preprocess_security_aggregat(self): |
154 def test_preprocess_security_aggregat(self): |
200 class QuerierTC(BaseQuerierTC): |
200 class QuerierTC(BaseQuerierTC): |
201 repo = repo |
201 repo = repo |
202 |
202 |
203 def test_encoding_pb(self): |
203 def test_encoding_pb(self): |
204 self.assertRaises(RQLSyntaxError, self.execute, |
204 self.assertRaises(RQLSyntaxError, self.execute, |
205 'Any X WHERE X is ERType, X name "öwned_by"') |
205 'Any X WHERE X is CWRType, X name "öwned_by"') |
206 |
206 |
207 def test_unknown_eid(self): |
207 def test_unknown_eid(self): |
208 # should return an empty result set |
208 # should return an empty result set |
209 self.failIf(self.execute('Any X WHERE X eid 99999999')) |
209 self.failIf(self.execute('Any X WHERE X eid 99999999')) |
210 |
210 |
211 # selection queries tests ################################################# |
211 # selection queries tests ################################################# |
212 |
212 |
213 def test_select_1(self): |
213 def test_select_1(self): |
214 rset = self.execute('Any X ORDERBY X WHERE X is EGroup') |
214 rset = self.execute('Any X ORDERBY X WHERE X is CWGroup') |
215 result, descr = rset.rows, rset.description |
215 result, descr = rset.rows, rset.description |
216 self.assertEquals(tuplify(result), [(1,), (2,), (3,), (4,)]) |
216 self.assertEquals(tuplify(result), [(1,), (2,), (3,), (4,)]) |
217 self.assertEquals(descr, [('EGroup',), ('EGroup',), ('EGroup',), ('EGroup',)]) |
217 self.assertEquals(descr, [('CWGroup',), ('CWGroup',), ('CWGroup',), ('CWGroup',)]) |
218 |
218 |
219 def test_select_2(self): |
219 def test_select_2(self): |
220 rset = self.execute('Any X ORDERBY N WHERE X is EGroup, X name N') |
220 rset = self.execute('Any X ORDERBY N WHERE X is CWGroup, X name N') |
221 self.assertEquals(tuplify(rset.rows), [(3,), (1,), (4,), (2,)]) |
221 self.assertEquals(tuplify(rset.rows), [(3,), (1,), (4,), (2,)]) |
222 self.assertEquals(rset.description, [('EGroup',), ('EGroup',), ('EGroup',), ('EGroup',)]) |
222 self.assertEquals(rset.description, [('CWGroup',), ('CWGroup',), ('CWGroup',), ('CWGroup',)]) |
223 rset = self.execute('Any X ORDERBY N DESC WHERE X is EGroup, X name N') |
223 rset = self.execute('Any X ORDERBY N DESC WHERE X is CWGroup, X name N') |
224 self.assertEquals(tuplify(rset.rows), [(2,), (4,), (1,), (3,)]) |
224 self.assertEquals(tuplify(rset.rows), [(2,), (4,), (1,), (3,)]) |
225 |
225 |
226 def test_select_3(self): |
226 def test_select_3(self): |
227 rset = self.execute('Any N GROUPBY N WHERE X is EGroup, X name N') |
227 rset = self.execute('Any N GROUPBY N WHERE X is CWGroup, X name N') |
228 result, descr = rset.rows, rset.description |
228 result, descr = rset.rows, rset.description |
229 result.sort() |
229 result.sort() |
230 self.assertEquals(tuplify(result), [('guests',), ('managers',), ('owners',), ('users',)]) |
230 self.assertEquals(tuplify(result), [('guests',), ('managers',), ('owners',), ('users',)]) |
231 self.assertEquals(descr, [('String',), ('String',), ('String',), ('String',)]) |
231 self.assertEquals(descr, [('String',), ('String',), ('String',), ('String',)]) |
232 |
232 |
261 rset = self.execute('Any N ORDERBY N LIMIT 5 OFFSET 1 WHERE X name N') |
261 rset = self.execute('Any N ORDERBY N LIMIT 5 OFFSET 1 WHERE X name N') |
262 self.assertEquals(rset.rows[0][0], rset1.rows[1][0]) |
262 self.assertEquals(rset.rows[0][0], rset1.rows[1][0]) |
263 self.assertEquals(len(rset), 5) |
263 self.assertEquals(len(rset), 5) |
264 |
264 |
265 def test_select_5(self): |
265 def test_select_5(self): |
266 rset = self.execute('Any X, TMP ORDERBY TMP WHERE X name TMP, X is EGroup') |
266 rset = self.execute('Any X, TMP ORDERBY TMP WHERE X name TMP, X is CWGroup') |
267 self.assertEquals(tuplify(rset.rows), [(3, 'guests',), (1, 'managers',), (4, 'owners',), (2, 'users',)]) |
267 self.assertEquals(tuplify(rset.rows), [(3, 'guests',), (1, 'managers',), (4, 'owners',), (2, 'users',)]) |
268 self.assertEquals(rset.description, [('EGroup', 'String',), ('EGroup', 'String',), ('EGroup', 'String',), ('EGroup', 'String',)]) |
268 self.assertEquals(rset.description, [('CWGroup', 'String',), ('CWGroup', 'String',), ('CWGroup', 'String',), ('CWGroup', 'String',)]) |
269 |
269 |
270 def test_select_6(self): |
270 def test_select_6(self): |
271 self.execute("INSERT Personne X: X nom 'bidule'")[0] |
271 self.execute("INSERT Personne X: X nom 'bidule'")[0] |
272 rset = self.execute('Any Y where X name TMP, Y nom in (TMP, "bidule")') |
272 rset = self.execute('Any Y where X name TMP, Y nom in (TMP, "bidule")') |
273 #self.assertEquals(rset.description, [('Personne',), ('Personne',)]) |
273 #self.assertEquals(rset.description, [('Personne',), ('Personne',)]) |
305 def test_select_nonregr_inlined(self): |
305 def test_select_nonregr_inlined(self): |
306 self.execute("INSERT Note X: X para 'bidule'") |
306 self.execute("INSERT Note X: X para 'bidule'") |
307 self.execute("INSERT Personne X: X nom 'chouette'") |
307 self.execute("INSERT Personne X: X nom 'chouette'") |
308 self.execute("INSERT Personne X: X nom 'autre'") |
308 self.execute("INSERT Personne X: X nom 'autre'") |
309 self.execute("SET X ecrit_par P WHERE X para 'bidule', P nom 'chouette'") |
309 self.execute("SET X ecrit_par P WHERE X para 'bidule', P nom 'chouette'") |
310 rset = self.execute('Any U,T ORDERBY T DESC WHERE U is EUser, ' |
310 rset = self.execute('Any U,T ORDERBY T DESC WHERE U is CWUser, ' |
311 'N ecrit_par U, N type T')#, {'x': self.ueid}) |
311 'N ecrit_par U, N type T')#, {'x': self.ueid}) |
312 self.assertEquals(len(rset.rows), 0) |
312 self.assertEquals(len(rset.rows), 0) |
313 |
313 |
314 def test_select_nonregr_edition_not(self): |
314 def test_select_nonregr_edition_not(self): |
315 groupeids = set((1, 2, 3)) |
315 groupeids = set((1, 2, 3)) |
316 groupreadperms = set(r[0] for r in self.execute('Any Y WHERE X name "EGroup", Y eid IN(1, 2, 3), X read_permission Y')) |
316 groupreadperms = set(r[0] for r in self.execute('Any Y WHERE X name "CWGroup", Y eid IN(1, 2, 3), X read_permission Y')) |
317 rset = self.execute('DISTINCT Any Y WHERE X is EEType, X name "EGroup", Y eid IN(1, 2, 3), NOT X read_permission Y') |
317 rset = self.execute('DISTINCT Any Y WHERE X is CWEType, X name "CWGroup", Y eid IN(1, 2, 3), NOT X read_permission Y') |
318 self.assertEquals(sorted(r[0] for r in rset.rows), sorted(groupeids - groupreadperms)) |
318 self.assertEquals(sorted(r[0] for r in rset.rows), sorted(groupeids - groupreadperms)) |
319 rset = self.execute('DISTINCT Any Y WHERE X name "EGroup", Y eid IN(1, 2, 3), NOT X read_permission Y') |
319 rset = self.execute('DISTINCT Any Y WHERE X name "CWGroup", Y eid IN(1, 2, 3), NOT X read_permission Y') |
320 self.assertEquals(sorted(r[0] for r in rset.rows), sorted(groupeids - groupreadperms)) |
320 self.assertEquals(sorted(r[0] for r in rset.rows), sorted(groupeids - groupreadperms)) |
321 |
321 |
322 def test_select_outer_join(self): |
322 def test_select_outer_join(self): |
323 peid1 = self.execute("INSERT Personne X: X nom 'bidule'")[0][0] |
323 peid1 = self.execute("INSERT Personne X: X nom 'bidule'")[0][0] |
324 peid2 = self.execute("INSERT Personne X: X nom 'autre'")[0][0] |
324 peid2 = self.execute("INSERT Personne X: X nom 'autre'")[0][0] |
421 self.assertEquals(len(rset.rows), 1) |
421 self.assertEquals(len(rset.rows), 1) |
422 self.assertEquals(len(rset.rows[0]), 1) |
422 self.assertEquals(len(rset.rows[0]), 1) |
423 self.assertEquals(rset.description, [('Int',)]) |
423 self.assertEquals(rset.description, [('Int',)]) |
424 |
424 |
425 def test_select_custom_aggregat_concat_string(self): |
425 def test_select_custom_aggregat_concat_string(self): |
426 rset = self.execute('Any CONCAT_STRINGS(N) WHERE X is EGroup, X name N') |
426 rset = self.execute('Any CONCAT_STRINGS(N) WHERE X is CWGroup, X name N') |
427 self.failUnless(rset) |
427 self.failUnless(rset) |
428 self.failUnlessEqual(sorted(rset[0][0].split(', ')), ['guests', 'managers', |
428 self.failUnlessEqual(sorted(rset[0][0].split(', ')), ['guests', 'managers', |
429 'owners', 'users']) |
429 'owners', 'users']) |
430 |
430 |
431 def test_select_custom_regproc_limit_size(self): |
431 def test_select_custom_regproc_limit_size(self): |
432 rset = self.execute('Any TEXT_LIMIT_SIZE(N, 3) WHERE X is EGroup, X name N, X name "managers"') |
432 rset = self.execute('Any TEXT_LIMIT_SIZE(N, 3) WHERE X is CWGroup, X name N, X name "managers"') |
433 self.failUnless(rset) |
433 self.failUnless(rset) |
434 self.failUnlessEqual(rset[0][0], 'man...') |
434 self.failUnlessEqual(rset[0][0], 'man...') |
435 self.execute("INSERT Basket X: X name 'bidule', X description '<b>hop hop</b>', X description_format 'text/html'") |
435 self.execute("INSERT Basket X: X name 'bidule', X description '<b>hop hop</b>', X description_format 'text/html'") |
436 rset = self.execute('Any LIMIT_SIZE(D, DF, 3) WHERE X is Basket, X description D, X description_format DF') |
436 rset = self.execute('Any LIMIT_SIZE(D, DF, 3) WHERE X is Basket, X description D, X description_format DF') |
437 self.failUnless(rset) |
437 self.failUnless(rset) |
438 self.failUnlessEqual(rset[0][0], 'hop...') |
438 self.failUnlessEqual(rset[0][0], 'hop...') |
439 |
439 |
440 def test_select_regproc_orderby(self): |
440 def test_select_regproc_orderby(self): |
441 rset = self.execute('DISTINCT Any X,N ORDERBY GROUP_SORT_VALUE(N) WHERE X is EGroup, X name N, X name "managers"') |
441 rset = self.execute('DISTINCT Any X,N ORDERBY GROUP_SORT_VALUE(N) WHERE X is CWGroup, X name N, X name "managers"') |
442 self.failUnlessEqual(len(rset), 1) |
442 self.failUnlessEqual(len(rset), 1) |
443 self.failUnlessEqual(rset[0][1], 'managers') |
443 self.failUnlessEqual(rset[0][1], 'managers') |
444 rset = self.execute('Any X,N ORDERBY GROUP_SORT_VALUE(N) WHERE X is EGroup, X name N, NOT U in_group X, U login "admin"') |
444 rset = self.execute('Any X,N ORDERBY GROUP_SORT_VALUE(N) WHERE X is CWGroup, X name N, NOT U in_group X, U login "admin"') |
445 self.failUnlessEqual(len(rset), 3) |
445 self.failUnlessEqual(len(rset), 3) |
446 self.failUnlessEqual(rset[0][1], 'owners') |
446 self.failUnlessEqual(rset[0][1], 'owners') |
447 |
447 |
448 def test_select_aggregat_sort(self): |
448 def test_select_aggregat_sort(self): |
449 rset = self.execute('Any G, COUNT(U) GROUPBY G ORDERBY 2 WHERE U in_group G') |
449 rset = self.execute('Any G, COUNT(U) GROUPBY G ORDERBY 2 WHERE U in_group G') |
450 self.assertEquals(len(rset.rows), 2) |
450 self.assertEquals(len(rset.rows), 2) |
451 self.assertEquals(len(rset.rows[0]), 2) |
451 self.assertEquals(len(rset.rows[0]), 2) |
452 self.assertEquals(rset.description[0], ('EGroup', 'Int',)) |
452 self.assertEquals(rset.description[0], ('CWGroup', 'Int',)) |
453 |
453 |
454 def test_select_aggregat_having(self): |
454 def test_select_aggregat_having(self): |
455 rset = self.execute('Any N,COUNT(RDEF) GROUPBY N ORDERBY 2,N ' |
455 rset = self.execute('Any N,COUNT(RDEF) GROUPBY N ORDERBY 2,N ' |
456 'WHERE RT name N, RDEF relation_type RT ' |
456 'WHERE RT name N, RDEF relation_type RT ' |
457 'HAVING COUNT(RDEF) > 10') |
457 'HAVING COUNT(RDEF) > 10') |
536 'text2': u'chouette',} |
536 'text2': u'chouette',} |
537 ) |
537 ) |
538 self.assertEquals(len(rset.rows), 1, rset.rows) |
538 self.assertEquals(len(rset.rows), 1, rset.rows) |
539 |
539 |
540 def test_select_no_descr(self): |
540 def test_select_no_descr(self): |
541 rset = self.execute('Any X WHERE X is EGroup', build_descr=0) |
541 rset = self.execute('Any X WHERE X is CWGroup', build_descr=0) |
542 rset.rows.sort() |
542 rset.rows.sort() |
543 self.assertEquals(tuplify(rset.rows), [(1,), (2,), (3,), (4,)]) |
543 self.assertEquals(tuplify(rset.rows), [(1,), (2,), (3,), (4,)]) |
544 self.assertEquals(rset.description, ()) |
544 self.assertEquals(rset.description, ()) |
545 |
545 |
546 def test_select_limit_offset(self): |
546 def test_select_limit_offset(self): |
547 rset = self.execute('EGroup X ORDERBY N LIMIT 2 WHERE X name N') |
547 rset = self.execute('CWGroup X ORDERBY N LIMIT 2 WHERE X name N') |
548 self.assertEquals(tuplify(rset.rows), [(3,), (1,)]) |
548 self.assertEquals(tuplify(rset.rows), [(3,), (1,)]) |
549 self.assertEquals(rset.description, [('EGroup',), ('EGroup',)]) |
549 self.assertEquals(rset.description, [('CWGroup',), ('CWGroup',)]) |
550 rset = self.execute('EGroup X ORDERBY N LIMIT 2 OFFSET 2 WHERE X name N') |
550 rset = self.execute('CWGroup X ORDERBY N LIMIT 2 OFFSET 2 WHERE X name N') |
551 self.assertEquals(tuplify(rset.rows), [(4,), (2,)]) |
551 self.assertEquals(tuplify(rset.rows), [(4,), (2,)]) |
552 |
552 |
553 def test_select_symetric(self): |
553 def test_select_symetric(self): |
554 self.execute("INSERT Personne X: X nom 'machin'") |
554 self.execute("INSERT Personne X: X nom 'machin'") |
555 self.execute("INSERT Personne X: X nom 'bidule'") |
555 self.execute("INSERT Personne X: X nom 'bidule'") |
672 self.execute("INSERT Tag Y: Y name 'toto'") |
672 self.execute("INSERT Tag Y: Y name 'toto'") |
673 rset = self.execute('Tag X WHERE X creation_date TODAY') |
673 rset = self.execute('Tag X WHERE X creation_date TODAY') |
674 self.assertEqual(len(rset.rows), 2) |
674 self.assertEqual(len(rset.rows), 2) |
675 |
675 |
676 def test_select_boolean(self): |
676 def test_select_boolean(self): |
677 rset = self.execute('Any N WHERE X is EEType, X name N, X final %(val)s', |
677 rset = self.execute('Any N WHERE X is CWEType, X name N, X final %(val)s', |
678 {'val': True}) |
678 {'val': True}) |
679 self.assertEquals(sorted(r[0] for r in rset.rows), ['Boolean', 'Bytes', |
679 self.assertEquals(sorted(r[0] for r in rset.rows), ['Boolean', 'Bytes', |
680 'Date', 'Datetime', |
680 'Date', 'Datetime', |
681 'Decimal', 'Float', |
681 'Decimal', 'Float', |
682 'Int', 'Interval', |
682 'Int', 'Interval', |
683 'Password', 'String', |
683 'Password', 'String', |
684 'Time']) |
684 'Time']) |
685 rset = self.execute('Any N WHERE X is EEType, X name N, X final TRUE') |
685 rset = self.execute('Any N WHERE X is CWEType, X name N, X final TRUE') |
686 self.assertEquals(sorted(r[0] for r in rset.rows), ['Boolean', 'Bytes', |
686 self.assertEquals(sorted(r[0] for r in rset.rows), ['Boolean', 'Bytes', |
687 'Date', 'Datetime', |
687 'Date', 'Datetime', |
688 'Decimal', 'Float', |
688 'Decimal', 'Float', |
689 'Int', 'Interval', |
689 'Int', 'Interval', |
690 'Password', 'String', |
690 'Password', 'String', |
691 'Time']) |
691 'Time']) |
692 |
692 |
693 def test_select_constant(self): |
693 def test_select_constant(self): |
694 rset = self.execute('Any X, "toto" ORDERBY X WHERE X is EGroup') |
694 rset = self.execute('Any X, "toto" ORDERBY X WHERE X is CWGroup') |
695 self.assertEquals(rset.rows, |
695 self.assertEquals(rset.rows, |
696 map(list, zip((1,2,3,4), ('toto','toto','toto','toto',)))) |
696 map(list, zip((1,2,3,4), ('toto','toto','toto','toto',)))) |
697 self.assertIsInstance(rset[0][1], unicode) |
697 self.assertIsInstance(rset[0][1], unicode) |
698 self.assertEquals(rset.description, |
698 self.assertEquals(rset.description, |
699 zip(('EGroup', 'EGroup', 'EGroup', 'EGroup'), |
699 zip(('CWGroup', 'CWGroup', 'CWGroup', 'CWGroup'), |
700 ('String', 'String', 'String', 'String',))) |
700 ('String', 'String', 'String', 'String',))) |
701 rset = self.execute('Any X, %(value)s ORDERBY X WHERE X is EGroup', {'value': 'toto'}) |
701 rset = self.execute('Any X, %(value)s ORDERBY X WHERE X is CWGroup', {'value': 'toto'}) |
702 self.assertEquals(rset.rows, |
702 self.assertEquals(rset.rows, |
703 map(list, zip((1,2,3,4), ('toto','toto','toto','toto',)))) |
703 map(list, zip((1,2,3,4), ('toto','toto','toto','toto',)))) |
704 self.assertIsInstance(rset[0][1], unicode) |
704 self.assertIsInstance(rset[0][1], unicode) |
705 self.assertEquals(rset.description, |
705 self.assertEquals(rset.description, |
706 zip(('EGroup', 'EGroup', 'EGroup', 'EGroup'), |
706 zip(('CWGroup', 'CWGroup', 'CWGroup', 'CWGroup'), |
707 ('String', 'String', 'String', 'String',))) |
707 ('String', 'String', 'String', 'String',))) |
708 rset = self.execute('Any X,GN WHERE X is EUser, G is EGroup, X login "syt", X in_group G, G name GN') |
708 rset = self.execute('Any X,GN WHERE X is CWUser, G is CWGroup, X login "syt", X in_group G, G name GN') |
709 |
709 |
710 def test_select_union(self): |
710 def test_select_union(self): |
711 rset = self.execute('Any X,N ORDERBY N WITH X,N BEING ' |
711 rset = self.execute('Any X,N ORDERBY N WITH X,N BEING ' |
712 '((Any X,N WHERE X name N, X transition_of E, E name %(name)s)' |
712 '((Any X,N WHERE X name N, X transition_of E, E name %(name)s)' |
713 ' UNION ' |
713 ' UNION ' |
714 '(Any X,N WHERE X name N, X state_of E, E name %(name)s))', |
714 '(Any X,N WHERE X name N, X state_of E, E name %(name)s))', |
715 {'name': 'EUser'}) |
715 {'name': 'CWUser'}) |
716 self.assertEquals([x[1] for x in rset.rows], |
716 self.assertEquals([x[1] for x in rset.rows], |
717 ['activate', 'activated', 'deactivate', 'deactivated']) |
717 ['activate', 'activated', 'deactivate', 'deactivated']) |
718 self.assertEquals(rset.description, |
718 self.assertEquals(rset.description, |
719 [('Transition', 'String'), ('State', 'String'), |
719 [('Transition', 'String'), ('State', 'String'), |
720 ('Transition', 'String'), ('State', 'String')]) |
720 ('Transition', 'String'), ('State', 'String')]) |
1063 |
1063 |
1064 |
1064 |
1065 # upassword encryption tests ################################################# |
1065 # upassword encryption tests ################################################# |
1066 |
1066 |
1067 def test_insert_upassword(self): |
1067 def test_insert_upassword(self): |
1068 rset = self.execute("INSERT EUser X: X login 'bob', X upassword 'toto'") |
1068 rset = self.execute("INSERT CWUser X: X login 'bob', X upassword 'toto'") |
1069 self.assertEquals(len(rset.rows), 1) |
1069 self.assertEquals(len(rset.rows), 1) |
1070 self.assertEquals(rset.description, [('EUser',)]) |
1070 self.assertEquals(rset.description, [('CWUser',)]) |
1071 self.assertRaises(Unauthorized, |
1071 self.assertRaises(Unauthorized, |
1072 self.execute, "Any P WHERE X is EUser, X login 'bob', X upassword P") |
1072 self.execute, "Any P WHERE X is CWUser, X login 'bob', X upassword P") |
1073 cursor = self.pool['system'] |
1073 cursor = self.pool['system'] |
1074 cursor.execute("SELECT %supassword from %sEUser WHERE %slogin='bob'" |
1074 cursor.execute("SELECT %supassword from %sCWUser WHERE %slogin='bob'" |
1075 % (SQL_PREFIX, SQL_PREFIX, SQL_PREFIX)) |
1075 % (SQL_PREFIX, SQL_PREFIX, SQL_PREFIX)) |
1076 passwd = cursor.fetchone()[0].getvalue() |
1076 passwd = cursor.fetchone()[0].getvalue() |
1077 self.assertEquals(passwd, crypt_password('toto', passwd[:2])) |
1077 self.assertEquals(passwd, crypt_password('toto', passwd[:2])) |
1078 rset = self.execute("Any X WHERE X is EUser, X login 'bob', X upassword '%s'" % passwd) |
1078 rset = self.execute("Any X WHERE X is CWUser, X login 'bob', X upassword '%s'" % passwd) |
1079 self.assertEquals(len(rset.rows), 1) |
1079 self.assertEquals(len(rset.rows), 1) |
1080 self.assertEquals(rset.description, [('EUser',)]) |
1080 self.assertEquals(rset.description, [('CWUser',)]) |
1081 |
1081 |
1082 def test_update_upassword(self): |
1082 def test_update_upassword(self): |
1083 cursor = self.pool['system'] |
1083 cursor = self.pool['system'] |
1084 rset = self.execute("INSERT EUser X: X login 'bob', X upassword %(pwd)s", {'pwd': 'toto'}) |
1084 rset = self.execute("INSERT CWUser X: X login 'bob', X upassword %(pwd)s", {'pwd': 'toto'}) |
1085 self.assertEquals(rset.description[0][0], 'EUser') |
1085 self.assertEquals(rset.description[0][0], 'CWUser') |
1086 rset = self.execute("SET X upassword %(pwd)s WHERE X is EUser, X login 'bob'", |
1086 rset = self.execute("SET X upassword %(pwd)s WHERE X is CWUser, X login 'bob'", |
1087 {'pwd': 'tutu'}) |
1087 {'pwd': 'tutu'}) |
1088 cursor.execute("SELECT %supassword from %sEUser WHERE %slogin='bob'" |
1088 cursor.execute("SELECT %supassword from %sCWUser WHERE %slogin='bob'" |
1089 % (SQL_PREFIX, SQL_PREFIX, SQL_PREFIX)) |
1089 % (SQL_PREFIX, SQL_PREFIX, SQL_PREFIX)) |
1090 passwd = cursor.fetchone()[0].getvalue() |
1090 passwd = cursor.fetchone()[0].getvalue() |
1091 self.assertEquals(passwd, crypt_password('tutu', passwd[:2])) |
1091 self.assertEquals(passwd, crypt_password('tutu', passwd[:2])) |
1092 rset = self.execute("Any X WHERE X is EUser, X login 'bob', X upassword '%s'" % passwd) |
1092 rset = self.execute("Any X WHERE X is CWUser, X login 'bob', X upassword '%s'" % passwd) |
1093 self.assertEquals(len(rset.rows), 1) |
1093 self.assertEquals(len(rset.rows), 1) |
1094 self.assertEquals(rset.description, [('EUser',)]) |
1094 self.assertEquals(rset.description, [('CWUser',)]) |
1095 |
1095 |
1096 # non regression tests #################################################### |
1096 # non regression tests #################################################### |
1097 |
1097 |
1098 def test_nonregr_1(self): |
1098 def test_nonregr_1(self): |
1099 teid = self.execute("INSERT Tag X: X name 'tag'")[0][0] |
1099 teid = self.execute("INSERT Tag X: X name 'tag'")[0][0] |
1105 rset = self.execute('Any T WHERE T tags X') |
1105 rset = self.execute('Any T WHERE T tags X') |
1106 self.assertEquals(rset.rows, [[teid]]) |
1106 self.assertEquals(rset.rows, [[teid]]) |
1107 |
1107 |
1108 def test_nonregr_2(self): |
1108 def test_nonregr_2(self): |
1109 teid = self.execute("INSERT Tag X: X name 'tag'")[0][0] |
1109 teid = self.execute("INSERT Tag X: X name 'tag'")[0][0] |
1110 geid = self.execute("EGroup G WHERE G name 'users'")[0][0] |
1110 geid = self.execute("CWGroup G WHERE G name 'users'")[0][0] |
1111 self.execute("SET X tags Y WHERE X eid %(t)s, Y eid %(g)s", |
1111 self.execute("SET X tags Y WHERE X eid %(t)s, Y eid %(g)s", |
1112 {'g': geid, 't': teid}) |
1112 {'g': geid, 't': teid}) |
1113 rset = self.execute('Any X WHERE E eid %(x)s, E tags X', |
1113 rset = self.execute('Any X WHERE E eid %(x)s, E tags X', |
1114 {'x': teid}) |
1114 {'x': teid}) |
1115 self.assertEquals(rset.rows, [[geid]]) |
1115 self.assertEquals(rset.rows, [[geid]]) |
1116 |
1116 |
1117 def test_nonregr_3(self): |
1117 def test_nonregr_3(self): |
1118 """bad sql generated on the second query (destination_state is not |
1118 """bad sql generated on the second query (destination_state is not |
1119 detected as an inlined relation) |
1119 detected as an inlined relation) |
1120 """ |
1120 """ |
1121 rset = self.execute('Any S,ES,T WHERE S state_of ET, ET name "EUser",' |
1121 rset = self.execute('Any S,ES,T WHERE S state_of ET, ET name "CWUser",' |
1122 'ES allowed_transition T, T destination_state S') |
1122 'ES allowed_transition T, T destination_state S') |
1123 self.assertEquals(len(rset.rows), 2) |
1123 self.assertEquals(len(rset.rows), 2) |
1124 |
1124 |
1125 def test_nonregr_4(self): |
1125 def test_nonregr_4(self): |
1126 # fix variables'type, else we get (nb of entity types with a 'name' attribute)**3 |
1126 # fix variables'type, else we get (nb of entity types with a 'name' attribute)**3 |
1127 # union queries and that make for instance a 266Ko sql query which is refused |
1127 # union queries and that make for instance a 266Ko sql query which is refused |
1128 # by the server (or client lib) |
1128 # by the server (or client lib) |
1129 rset = self.execute('Any ER,SE,OE WHERE SE name "Comment", ER name "comments", OE name "Comment",' |
1129 rset = self.execute('Any ER,SE,OE WHERE SE name "Comment", ER name "comments", OE name "Comment",' |
1130 'ER is ERType, SE is EEType, OE is EEType') |
1130 'ER is CWRType, SE is CWEType, OE is CWEType') |
1131 self.assertEquals(len(rset), 1) |
1131 self.assertEquals(len(rset), 1) |
1132 |
1132 |
1133 def test_nonregr_5(self): |
1133 def test_nonregr_5(self): |
1134 # jpl #15505: equivalent queries returning different result sets |
1134 # jpl #15505: equivalent queries returning different result sets |
1135 teid1 = self.execute("INSERT Folder X: X name 'hop'")[0][0] |
1135 teid1 = self.execute("INSERT Folder X: X name 'hop'")[0][0] |
1244 def test_nonregr_set_datetime(self): |
1244 def test_nonregr_set_datetime(self): |
1245 # huum, psycopg specific |
1245 # huum, psycopg specific |
1246 self.execute('SET X creation_date %(date)s WHERE X eid 1', {'date': date.today()}) |
1246 self.execute('SET X creation_date %(date)s WHERE X eid 1', {'date': date.today()}) |
1247 |
1247 |
1248 def test_nonregr_set_query(self): |
1248 def test_nonregr_set_query(self): |
1249 ueid = self.execute("INSERT EUser X: X login 'bob', X upassword 'toto'")[0][0] |
1249 ueid = self.execute("INSERT CWUser X: X login 'bob', X upassword 'toto'")[0][0] |
1250 self.execute("SET E in_group G, E in_state S, " |
1250 self.execute("SET E in_group G, E in_state S, " |
1251 "E firstname %(firstname)s, E surname %(surname)s " |
1251 "E firstname %(firstname)s, E surname %(surname)s " |
1252 "WHERE E eid %(x)s, G name 'users', S name 'activated'", |
1252 "WHERE E eid %(x)s, G name 'users', S name 'activated'", |
1253 {'x':ueid, 'firstname': u'jean', 'surname': u'paul'}, 'x') |
1253 {'x':ueid, 'firstname': u'jean', 'surname': u'paul'}, 'x') |
1254 |
1254 |
1255 def test_nonregr_u_owned_by_u(self): |
1255 def test_nonregr_u_owned_by_u(self): |
1256 ueid = self.execute("INSERT EUser X: X login 'bob', X upassword 'toto', X in_group G " |
1256 ueid = self.execute("INSERT CWUser X: X login 'bob', X upassword 'toto', X in_group G " |
1257 "WHERE G name 'users'")[0][0] |
1257 "WHERE G name 'users'")[0][0] |
1258 rset = self.execute("EUser U") |
1258 rset = self.execute("CWUser U") |
1259 self.assertEquals(len(rset), 3) # bob + admin + anon |
1259 self.assertEquals(len(rset), 3) # bob + admin + anon |
1260 rset = self.execute("Any U WHERE NOT U owned_by U") |
1260 rset = self.execute("Any U WHERE NOT U owned_by U") |
1261 self.assertEquals(len(rset), 0) # even admin created at repo initialization time should belong to itself |
1261 self.assertEquals(len(rset), 0) # even admin created at repo initialization time should belong to itself |
1262 |
1262 |
1263 def test_nonreg_update_index(self): |
1263 def test_nonreg_update_index(self): |
1264 # this is the kind of queries generated by "cubicweb-ctl db-check -ry" |
1264 # this is the kind of queries generated by "cubicweb-ctl db-check -ry" |
1265 self.execute("SET X description D WHERE X is State, X description D") |
1265 self.execute("SET X description D WHERE X is State, X description D") |
1266 |
1266 |
1267 def test_nonregr_is(self): |
1267 def test_nonregr_is(self): |
1268 uteid = self.execute('Any ET WHERE ET name "EUser"')[0][0] |
1268 uteid = self.execute('Any ET WHERE ET name "CWUser"')[0][0] |
1269 self.execute('Any X, ET WHERE X is ET, ET eid %s' % uteid) |
1269 self.execute('Any X, ET WHERE X is ET, ET eid %s' % uteid) |
1270 |
1270 |
1271 def test_nonregr_orderby(self): |
1271 def test_nonregr_orderby(self): |
1272 seid = self.execute('Any X WHERE X name "activated"')[0][0] |
1272 seid = self.execute('Any X WHERE X name "activated"')[0][0] |
1273 self.execute('Any X,S, MAX(T) GROUPBY X,S ORDERBY S WHERE X is EUser, T tags X, S eid IN(%s), X in_state S' % seid) |
1273 self.execute('Any X,S, MAX(T) GROUPBY X,S ORDERBY S WHERE X is CWUser, T tags X, S eid IN(%s), X in_state S' % seid) |
1274 |
1274 |
1275 def test_nonregr_solution_cache(self): |
1275 def test_nonregr_solution_cache(self): |
1276 self.skip('XXX should be fixed or documented') # (doesn't occur if cache key is provided.) |
1276 self.skip('XXX should be fixed or documented') # (doesn't occur if cache key is provided.) |
1277 rset = self.execute('Any X WHERE X is EUser, X eid %(x)s', {'x':self.ueid}) |
1277 rset = self.execute('Any X WHERE X is CWUser, X eid %(x)s', {'x':self.ueid}) |
1278 self.assertEquals(len(rset), 1) |
1278 self.assertEquals(len(rset), 1) |
1279 rset = self.execute('Any X WHERE X is EUser, X eid %(x)s', {'x':12345}) |
1279 rset = self.execute('Any X WHERE X is CWUser, X eid %(x)s', {'x':12345}) |
1280 self.assertEquals(len(rset), 0) |
1280 self.assertEquals(len(rset), 0) |
1281 |
1281 |
1282 def test_nonregr_final_norestr(self): |
1282 def test_nonregr_final_norestr(self): |
1283 self.assertRaises(BadRQLQuery, self.execute, 'Date X') |
1283 self.assertRaises(BadRQLQuery, self.execute, 'Date X') |
1284 |
1284 |