82 pass |
82 pass |
83 |
83 |
84 def test_preprocess_1(self): |
84 def test_preprocess_1(self): |
85 reid = self.execute('Any X WHERE X is CWRType, X name "owned_by"')[0][0] |
85 reid = self.execute('Any X WHERE X is CWRType, X name "owned_by"')[0][0] |
86 rqlst = self._prepare('Any COUNT(RDEF) WHERE RDEF relation_type X, X eid %(x)s', {'x': reid}) |
86 rqlst = self._prepare('Any COUNT(RDEF) WHERE RDEF relation_type X, X eid %(x)s', {'x': reid}) |
87 self.assertEquals(rqlst.solutions, [{'RDEF': 'CWAttribute'}, {'RDEF': 'CWRelation'}]) |
87 self.assertEqual(rqlst.solutions, [{'RDEF': 'CWAttribute'}, {'RDEF': 'CWRelation'}]) |
88 |
88 |
89 def test_preprocess_2(self): |
89 def test_preprocess_2(self): |
90 teid = self.execute("INSERT Tag X: X name 'tag'")[0][0] |
90 teid = self.execute("INSERT Tag X: X name 'tag'")[0][0] |
91 #geid = self.execute("CWGroup G WHERE G name 'users'")[0][0] |
91 #geid = self.execute("CWGroup G WHERE G name 'users'")[0][0] |
92 #self.execute("SET X tags Y WHERE X eid %(t)s, Y eid %(g)s", |
92 #self.execute("SET X tags Y WHERE X eid %(t)s, Y eid %(g)s", |
93 # {'g': geid, 't': teid}, 'g') |
93 # {'g': geid, 't': teid}, 'g') |
94 rqlst = self._prepare('Any X WHERE E eid %(x)s, E tags X', {'x': teid}) |
94 rqlst = self._prepare('Any X WHERE E eid %(x)s, E tags X', {'x': teid}) |
95 # the query may be optimized, should keep only one solution |
95 # the query may be optimized, should keep only one solution |
96 # (any one, etype will be discarded) |
96 # (any one, etype will be discarded) |
97 self.assertEquals(len(rqlst.solutions), 1) |
97 self.assertEqual(len(rqlst.solutions), 1) |
98 |
98 |
99 def test_preprocess_security(self): |
99 def test_preprocess_security(self): |
100 plan = self._prepare_plan('Any ETN,COUNT(X) GROUPBY ETN ' |
100 plan = self._prepare_plan('Any ETN,COUNT(X) GROUPBY ETN ' |
101 'WHERE X is ET, ET name ETN') |
101 'WHERE X is ET, ET name ETN') |
102 plan.session = self.user_groups_session('users') |
102 plan.session = self.user_groups_session('users') |
103 union = plan.rqlst |
103 union = plan.rqlst |
104 plan.preprocess(union) |
104 plan.preprocess(union) |
105 self.assertEquals(len(union.children), 1) |
105 self.assertEqual(len(union.children), 1) |
106 self.assertEquals(len(union.children[0].with_), 1) |
106 self.assertEqual(len(union.children[0].with_), 1) |
107 subq = union.children[0].with_[0].query |
107 subq = union.children[0].with_[0].query |
108 self.assertEquals(len(subq.children), 3) |
108 self.assertEqual(len(subq.children), 3) |
109 self.assertEquals([t.as_string() for t in union.children[0].selection], |
109 self.assertEqual([t.as_string() for t in union.children[0].selection], |
110 ['ETN','COUNT(X)']) |
110 ['ETN','COUNT(X)']) |
111 self.assertEquals([t.as_string() for t in union.children[0].groupby], |
111 self.assertEqual([t.as_string() for t in union.children[0].groupby], |
112 ['ETN']) |
112 ['ETN']) |
113 partrqls = sorted(((rqlst.as_string(), rqlst.solutions) for rqlst in subq.children)) |
113 partrqls = sorted(((rqlst.as_string(), rqlst.solutions) for rqlst in subq.children)) |
114 rql, solutions = partrqls[0] |
114 rql, solutions = partrqls[0] |
115 self.assertEquals(rql, |
115 self.assertEqual(rql, |
116 'Any ETN,X WHERE X is ET, ET name ETN, (EXISTS(X owned_by %(B)s))' |
116 'Any ETN,X WHERE X is ET, ET name ETN, (EXISTS(X owned_by %(B)s))' |
117 ' OR ((((EXISTS(D concerne C?, C owned_by %(B)s, X identity D, C is Division, D is Affaire))' |
117 ' OR ((((EXISTS(D concerne C?, C owned_by %(B)s, X identity D, C is Division, D is Affaire))' |
118 ' OR (EXISTS(H concerne G?, G owned_by %(B)s, G is SubDivision, X identity H, H is Affaire)))' |
118 ' OR (EXISTS(H concerne G?, G owned_by %(B)s, G is SubDivision, X identity H, H is Affaire)))' |
119 ' OR (EXISTS(I concerne F?, F owned_by %(B)s, F is Societe, X identity I, I is Affaire)))' |
119 ' OR (EXISTS(I concerne F?, F owned_by %(B)s, F is Societe, X identity I, I is Affaire)))' |
120 ' OR (EXISTS(J concerne E?, E owned_by %(B)s, E is Note, X identity J, J is Affaire)))' |
120 ' OR (EXISTS(J concerne E?, E owned_by %(B)s, E is Note, X identity J, J is Affaire)))' |
121 ', ET is CWEType, X is Affaire') |
121 ', ET is CWEType, X is Affaire') |
122 self.assertEquals(solutions, [{'C': 'Division', |
122 self.assertEqual(solutions, [{'C': 'Division', |
123 'D': 'Affaire', |
123 'D': 'Affaire', |
124 'E': 'Note', |
124 'E': 'Note', |
125 'F': 'Societe', |
125 'F': 'Societe', |
126 'G': 'SubDivision', |
126 'G': 'SubDivision', |
127 'H': 'Affaire', |
127 'H': 'Affaire', |
128 'I': 'Affaire', |
128 'I': 'Affaire', |
129 'J': 'Affaire', |
129 'J': 'Affaire', |
130 'X': 'Affaire', |
130 'X': 'Affaire', |
131 'ET': 'CWEType', 'ETN': 'String'}]) |
131 'ET': 'CWEType', 'ETN': 'String'}]) |
132 rql, solutions = partrqls[1] |
132 rql, solutions = partrqls[1] |
133 self.assertEquals(rql, 'Any ETN,X WHERE X is ET, ET name ETN, ET is CWEType, X is IN(BaseTransition, Bookmark, CWAttribute, CWCache, CWConstraint, CWConstraintType, CWEType, CWGroup, CWPermission, CWProperty, CWRType, CWRelation, CWUniqueTogetherConstraint, CWUser, Card, Comment, Division, Email, EmailAddress, EmailPart, EmailThread, ExternalUri, File, Folder, Note, Personne, RQLExpression, Societe, State, SubDivision, SubWorkflowExitPoint, Tag, TrInfo, Transition, Workflow, WorkflowTransition)') |
133 self.assertEqual(rql, 'Any ETN,X WHERE X is ET, ET name ETN, ET is CWEType, X is IN(BaseTransition, Bookmark, CWAttribute, CWCache, CWConstraint, CWConstraintType, CWEType, CWGroup, CWPermission, CWProperty, CWRType, CWRelation, CWUniqueTogetherConstraint, CWUser, Card, Comment, Division, Email, EmailAddress, EmailPart, EmailThread, ExternalUri, File, Folder, Note, Personne, RQLExpression, Societe, State, SubDivision, SubWorkflowExitPoint, Tag, TrInfo, Transition, Workflow, WorkflowTransition)') |
134 self.assertListEquals(sorted(solutions), |
134 self.assertListEqual(sorted(solutions), |
135 sorted([{'X': 'BaseTransition', 'ETN': 'String', 'ET': 'CWEType'}, |
135 sorted([{'X': 'BaseTransition', 'ETN': 'String', 'ET': 'CWEType'}, |
136 {'X': 'Bookmark', 'ETN': 'String', 'ET': 'CWEType'}, |
136 {'X': 'Bookmark', 'ETN': 'String', 'ET': 'CWEType'}, |
137 {'X': 'Card', 'ETN': 'String', 'ET': 'CWEType'}, |
137 {'X': 'Card', 'ETN': 'String', 'ET': 'CWEType'}, |
138 {'X': 'Comment', 'ETN': 'String', 'ET': 'CWEType'}, |
138 {'X': 'Comment', 'ETN': 'String', 'ET': 'CWEType'}, |
139 {'X': 'Division', 'ETN': 'String', 'ET': 'CWEType'}, |
139 {'X': 'Division', 'ETN': 'String', 'ET': 'CWEType'}, |
167 {'X': 'Transition', 'ETN': 'String', 'ET': 'CWEType'}, |
167 {'X': 'Transition', 'ETN': 'String', 'ET': 'CWEType'}, |
168 {'X': 'TrInfo', 'ETN': 'String', 'ET': 'CWEType'}, |
168 {'X': 'TrInfo', 'ETN': 'String', 'ET': 'CWEType'}, |
169 {'X': 'Workflow', 'ETN': 'String', 'ET': 'CWEType'}, |
169 {'X': 'Workflow', 'ETN': 'String', 'ET': 'CWEType'}, |
170 {'X': 'WorkflowTransition', 'ETN': 'String', 'ET': 'CWEType'}])) |
170 {'X': 'WorkflowTransition', 'ETN': 'String', 'ET': 'CWEType'}])) |
171 rql, solutions = partrqls[2] |
171 rql, solutions = partrqls[2] |
172 self.assertEquals(rql, |
172 self.assertEqual(rql, |
173 'Any ETN,X WHERE X is ET, ET name ETN, EXISTS(X owned_by %(C)s), ' |
173 'Any ETN,X WHERE X is ET, ET name ETN, EXISTS(X owned_by %(C)s), ' |
174 'ET is CWEType, X is Basket') |
174 'ET is CWEType, X is Basket') |
175 self.assertEquals(solutions, [{'ET': 'CWEType', |
175 self.assertEqual(solutions, [{'ET': 'CWEType', |
176 'X': 'Basket', |
176 'X': 'Basket', |
177 'ETN': 'String', |
177 'ETN': 'String', |
178 }]) |
178 }]) |
179 |
179 |
180 def test_preprocess_security_aggregat(self): |
180 def test_preprocess_security_aggregat(self): |
181 plan = self._prepare_plan('Any MAX(X)') |
181 plan = self._prepare_plan('Any MAX(X)') |
182 plan.session = self.user_groups_session('users') |
182 plan.session = self.user_groups_session('users') |
183 union = plan.rqlst |
183 union = plan.rqlst |
184 plan.preprocess(union) |
184 plan.preprocess(union) |
185 self.assertEquals(len(union.children), 1) |
185 self.assertEqual(len(union.children), 1) |
186 self.assertEquals(len(union.children[0].with_), 1) |
186 self.assertEqual(len(union.children[0].with_), 1) |
187 subq = union.children[0].with_[0].query |
187 subq = union.children[0].with_[0].query |
188 self.assertEquals(len(subq.children), 3) |
188 self.assertEqual(len(subq.children), 3) |
189 self.assertEquals([t.as_string() for t in union.children[0].selection], |
189 self.assertEqual([t.as_string() for t in union.children[0].selection], |
190 ['MAX(X)']) |
190 ['MAX(X)']) |
191 |
191 |
192 def test_preprocess_nonregr(self): |
192 def test_preprocess_nonregr(self): |
193 rqlst = self._prepare('Any S ORDERBY SI WHERE NOT S ecrit_par O, S para SI') |
193 rqlst = self._prepare('Any S ORDERBY SI WHERE NOT S ecrit_par O, S para SI') |
194 self.assertEquals(len(rqlst.solutions), 1) |
194 self.assertEqual(len(rqlst.solutions), 1) |
195 |
195 |
196 def test_build_description(self): |
196 def test_build_description(self): |
197 # should return an empty result set |
197 # should return an empty result set |
198 rset = self.execute('Any X WHERE X eid %(x)s', {'x': self.session.user.eid}) |
198 rset = self.execute('Any X WHERE X eid %(x)s', {'x': self.session.user.eid}) |
199 self.assertEquals(rset.description[0][0], 'CWUser') |
199 self.assertEqual(rset.description[0][0], 'CWUser') |
200 rset = self.execute('Any 1') |
200 rset = self.execute('Any 1') |
201 self.assertEquals(rset.description[0][0], 'Int') |
201 self.assertEqual(rset.description[0][0], 'Int') |
202 rset = self.execute('Any TRUE') |
202 rset = self.execute('Any TRUE') |
203 self.assertEquals(rset.description[0][0], 'Boolean') |
203 self.assertEqual(rset.description[0][0], 'Boolean') |
204 rset = self.execute('Any "hop"') |
204 rset = self.execute('Any "hop"') |
205 self.assertEquals(rset.description[0][0], 'String') |
205 self.assertEqual(rset.description[0][0], 'String') |
206 rset = self.execute('Any TODAY') |
206 rset = self.execute('Any TODAY') |
207 self.assertEquals(rset.description[0][0], 'Date') |
207 self.assertEqual(rset.description[0][0], 'Date') |
208 rset = self.execute('Any NOW') |
208 rset = self.execute('Any NOW') |
209 self.assertEquals(rset.description[0][0], 'Datetime') |
209 self.assertEqual(rset.description[0][0], 'Datetime') |
210 rset = self.execute('Any %(x)s', {'x': 1}) |
210 rset = self.execute('Any %(x)s', {'x': 1}) |
211 self.assertEquals(rset.description[0][0], 'Int') |
211 self.assertEqual(rset.description[0][0], 'Int') |
212 rset = self.execute('Any %(x)s', {'x': 1L}) |
212 rset = self.execute('Any %(x)s', {'x': 1L}) |
213 self.assertEquals(rset.description[0][0], 'Int') |
213 self.assertEqual(rset.description[0][0], 'Int') |
214 rset = self.execute('Any %(x)s', {'x': True}) |
214 rset = self.execute('Any %(x)s', {'x': True}) |
215 self.assertEquals(rset.description[0][0], 'Boolean') |
215 self.assertEqual(rset.description[0][0], 'Boolean') |
216 rset = self.execute('Any %(x)s', {'x': 1.0}) |
216 rset = self.execute('Any %(x)s', {'x': 1.0}) |
217 self.assertEquals(rset.description[0][0], 'Float') |
217 self.assertEqual(rset.description[0][0], 'Float') |
218 rset = self.execute('Any %(x)s', {'x': datetime.now()}) |
218 rset = self.execute('Any %(x)s', {'x': datetime.now()}) |
219 self.assertEquals(rset.description[0][0], 'Datetime') |
219 self.assertEqual(rset.description[0][0], 'Datetime') |
220 rset = self.execute('Any %(x)s', {'x': 'str'}) |
220 rset = self.execute('Any %(x)s', {'x': 'str'}) |
221 self.assertEquals(rset.description[0][0], 'String') |
221 self.assertEqual(rset.description[0][0], 'String') |
222 rset = self.execute('Any %(x)s', {'x': u'str'}) |
222 rset = self.execute('Any %(x)s', {'x': u'str'}) |
223 self.assertEquals(rset.description[0][0], 'String') |
223 self.assertEqual(rset.description[0][0], 'String') |
224 |
224 |
225 |
225 |
226 class QuerierTC(BaseQuerierTC): |
226 class QuerierTC(BaseQuerierTC): |
227 repo = repo |
227 repo = repo |
228 |
228 |
242 def test_bytes_storage(self): |
242 def test_bytes_storage(self): |
243 feid = self.execute('INSERT File X: X data_name "foo.pdf", X data_format "text/plain", X data %(data)s', |
243 feid = self.execute('INSERT File X: X data_name "foo.pdf", X data_format "text/plain", X data %(data)s', |
244 {'data': Binary("xxx")})[0][0] |
244 {'data': Binary("xxx")})[0][0] |
245 fdata = self.execute('Any D WHERE X data D, X eid %(x)s', {'x': feid})[0][0] |
245 fdata = self.execute('Any D WHERE X data D, X eid %(x)s', {'x': feid})[0][0] |
246 self.assertIsInstance(fdata, Binary) |
246 self.assertIsInstance(fdata, Binary) |
247 self.assertEquals(fdata.getvalue(), 'xxx') |
247 self.assertEqual(fdata.getvalue(), 'xxx') |
248 |
248 |
249 # selection queries tests ################################################# |
249 # selection queries tests ################################################# |
250 |
250 |
251 def test_select_1(self): |
251 def test_select_1(self): |
252 rset = self.execute('Any X ORDERBY X WHERE X is CWGroup') |
252 rset = self.execute('Any X ORDERBY X WHERE X is CWGroup') |
253 result, descr = rset.rows, rset.description |
253 result, descr = rset.rows, rset.description |
254 self.assertEquals(tuplify(result), [(1,), (2,), (3,), (4,)]) |
254 self.assertEqual(tuplify(result), [(1,), (2,), (3,), (4,)]) |
255 self.assertEquals(descr, [('CWGroup',), ('CWGroup',), ('CWGroup',), ('CWGroup',)]) |
255 self.assertEqual(descr, [('CWGroup',), ('CWGroup',), ('CWGroup',), ('CWGroup',)]) |
256 |
256 |
257 def test_select_2(self): |
257 def test_select_2(self): |
258 rset = self.execute('Any X ORDERBY N WHERE X is CWGroup, X name N') |
258 rset = self.execute('Any X ORDERBY N WHERE X is CWGroup, X name N') |
259 self.assertEquals(tuplify(rset.rows), [(1,), (2,), (3,), (4,)]) |
259 self.assertEqual(tuplify(rset.rows), [(1,), (2,), (3,), (4,)]) |
260 self.assertEquals(rset.description, [('CWGroup',), ('CWGroup',), ('CWGroup',), ('CWGroup',)]) |
260 self.assertEqual(rset.description, [('CWGroup',), ('CWGroup',), ('CWGroup',), ('CWGroup',)]) |
261 rset = self.execute('Any X ORDERBY N DESC WHERE X is CWGroup, X name N') |
261 rset = self.execute('Any X ORDERBY N DESC WHERE X is CWGroup, X name N') |
262 self.assertEquals(tuplify(rset.rows), [(4,), (3,), (2,), (1,)]) |
262 self.assertEqual(tuplify(rset.rows), [(4,), (3,), (2,), (1,)]) |
263 |
263 |
264 def test_select_3(self): |
264 def test_select_3(self): |
265 rset = self.execute('Any N GROUPBY N WHERE X is CWGroup, X name N') |
265 rset = self.execute('Any N GROUPBY N WHERE X is CWGroup, X name N') |
266 result, descr = rset.rows, rset.description |
266 result, descr = rset.rows, rset.description |
267 result.sort() |
267 result.sort() |
268 self.assertEquals(tuplify(result), [('guests',), ('managers',), ('owners',), ('users',)]) |
268 self.assertEqual(tuplify(result), [('guests',), ('managers',), ('owners',), ('users',)]) |
269 self.assertEquals(descr, [('String',), ('String',), ('String',), ('String',)]) |
269 self.assertEqual(descr, [('String',), ('String',), ('String',), ('String',)]) |
270 |
270 |
271 def test_select_is(self): |
271 def test_select_is(self): |
272 rset = self.execute('Any X, TN ORDERBY TN LIMIT 10 WHERE X is T, T name TN') |
272 rset = self.execute('Any X, TN ORDERBY TN LIMIT 10 WHERE X is T, T name TN') |
273 result, descr = rset.rows, rset.description |
273 result, descr = rset.rows, rset.description |
274 self.assertEquals(result[0][1], descr[0][0]) |
274 self.assertEqual(result[0][1], descr[0][0]) |
275 |
275 |
276 def test_select_is_aggr(self): |
276 def test_select_is_aggr(self): |
277 rset = self.execute('Any TN, COUNT(X) GROUPBY TN ORDERBY 2 DESC WHERE X is T, T name TN') |
277 rset = self.execute('Any TN, COUNT(X) GROUPBY TN ORDERBY 2 DESC WHERE X is T, T name TN') |
278 result, descr = rset.rows, rset.description |
278 result, descr = rset.rows, rset.description |
279 self.assertEquals(descr[0][0], 'String') |
279 self.assertEqual(descr[0][0], 'String') |
280 self.assertEquals(descr[0][1], 'Int') |
280 self.assertEqual(descr[0][1], 'Int') |
281 self.assertEquals(result[0][0], 'CWRelation') # XXX may change as schema evolve |
281 self.assertEqual(result[0][0], 'CWRelation') # XXX may change as schema evolve |
282 |
282 |
283 def test_select_groupby_orderby(self): |
283 def test_select_groupby_orderby(self): |
284 rset = self.execute('Any N GROUPBY N ORDERBY N WHERE X is CWGroup, X name N') |
284 rset = self.execute('Any N GROUPBY N ORDERBY N WHERE X is CWGroup, X name N') |
285 self.assertEquals(tuplify(rset.rows), [('guests',), ('managers',), ('owners',), ('users',)]) |
285 self.assertEqual(tuplify(rset.rows), [('guests',), ('managers',), ('owners',), ('users',)]) |
286 self.assertEquals(rset.description, [('String',), ('String',), ('String',), ('String',)]) |
286 self.assertEqual(rset.description, [('String',), ('String',), ('String',), ('String',)]) |
287 |
287 |
288 def test_select_complex_groupby(self): |
288 def test_select_complex_groupby(self): |
289 rset = self.execute('Any N GROUPBY N WHERE X name N') |
289 rset = self.execute('Any N GROUPBY N WHERE X name N') |
290 rset = self.execute('Any N,MAX(D) GROUPBY N LIMIT 5 WHERE X name N, X creation_date D') |
290 rset = self.execute('Any N,MAX(D) GROUPBY N LIMIT 5 WHERE X name N, X creation_date D') |
291 |
291 |
293 seid = self.execute('State X WHERE X name "deactivated"')[0][0] |
293 seid = self.execute('State X WHERE X name "deactivated"')[0][0] |
294 rset = self.execute('Any U,L,S GROUPBY U,L,S WHERE X in_state S, U login L, S eid %s' % seid) |
294 rset = self.execute('Any U,L,S GROUPBY U,L,S WHERE X in_state S, U login L, S eid %s' % seid) |
295 |
295 |
296 def test_select_complex_orderby(self): |
296 def test_select_complex_orderby(self): |
297 rset1 = self.execute('Any N ORDERBY N WHERE X name N') |
297 rset1 = self.execute('Any N ORDERBY N WHERE X name N') |
298 self.assertEquals(sorted(rset1.rows), rset1.rows) |
298 self.assertEqual(sorted(rset1.rows), rset1.rows) |
299 rset = self.execute('Any N ORDERBY N LIMIT 5 OFFSET 1 WHERE X name N') |
299 rset = self.execute('Any N ORDERBY N LIMIT 5 OFFSET 1 WHERE X name N') |
300 self.assertEquals(rset.rows[0][0], rset1.rows[1][0]) |
300 self.assertEqual(rset.rows[0][0], rset1.rows[1][0]) |
301 self.assertEquals(len(rset), 5) |
301 self.assertEqual(len(rset), 5) |
302 |
302 |
303 def test_select_5(self): |
303 def test_select_5(self): |
304 rset = self.execute('Any X, TMP ORDERBY TMP WHERE X name TMP, X is CWGroup') |
304 rset = self.execute('Any X, TMP ORDERBY TMP WHERE X name TMP, X is CWGroup') |
305 self.assertEquals(tuplify(rset.rows), [(1, 'guests',), (2, 'managers',), (3, 'owners',), (4, 'users',)]) |
305 self.assertEqual(tuplify(rset.rows), [(1, 'guests',), (2, 'managers',), (3, 'owners',), (4, 'users',)]) |
306 self.assertEquals(rset.description, [('CWGroup', 'String',), ('CWGroup', 'String',), ('CWGroup', 'String',), ('CWGroup', 'String',)]) |
306 self.assertEqual(rset.description, [('CWGroup', 'String',), ('CWGroup', 'String',), ('CWGroup', 'String',), ('CWGroup', 'String',)]) |
307 |
307 |
308 def test_select_6(self): |
308 def test_select_6(self): |
309 self.execute("INSERT Personne X: X nom 'bidule'")[0] |
309 self.execute("INSERT Personne X: X nom 'bidule'")[0] |
310 rset = self.execute('Any Y where X name TMP, Y nom in (TMP, "bidule")') |
310 rset = self.execute('Any Y where X name TMP, Y nom in (TMP, "bidule")') |
311 #self.assertEquals(rset.description, [('Personne',), ('Personne',)]) |
311 #self.assertEqual(rset.description, [('Personne',), ('Personne',)]) |
312 self.assert_(('Personne',) in rset.description) |
312 self.assert_(('Personne',) in rset.description) |
313 rset = self.execute('DISTINCT Any Y where X name TMP, Y nom in (TMP, "bidule")') |
313 rset = self.execute('DISTINCT Any Y where X name TMP, Y nom in (TMP, "bidule")') |
314 self.assert_(('Personne',) in rset.description) |
314 self.assert_(('Personne',) in rset.description) |
315 |
315 |
316 def test_select_not_attr(self): |
316 def test_select_not_attr(self): |
317 peid = self.execute("INSERT Personne X: X nom 'bidule'")[0][0] |
317 peid = self.execute("INSERT Personne X: X nom 'bidule'")[0][0] |
318 seid = self.execute("INSERT Societe X: X nom 'chouette'")[0][0] |
318 seid = self.execute("INSERT Societe X: X nom 'chouette'")[0][0] |
319 rset = self.execute('Personne X WHERE NOT X nom "bidule"') |
319 rset = self.execute('Personne X WHERE NOT X nom "bidule"') |
320 self.assertEquals(len(rset.rows), 0, rset.rows) |
320 self.assertEqual(len(rset.rows), 0, rset.rows) |
321 rset = self.execute('Personne X WHERE NOT X nom "bid"') |
321 rset = self.execute('Personne X WHERE NOT X nom "bid"') |
322 self.assertEquals(len(rset.rows), 1, rset.rows) |
322 self.assertEqual(len(rset.rows), 1, rset.rows) |
323 self.execute("SET P travaille S WHERE P nom 'bidule', S nom 'chouette'") |
323 self.execute("SET P travaille S WHERE P nom 'bidule', S nom 'chouette'") |
324 rset = self.execute('Personne X WHERE NOT X travaille S') |
324 rset = self.execute('Personne X WHERE NOT X travaille S') |
325 self.assertEquals(len(rset.rows), 0, rset.rows) |
325 self.assertEqual(len(rset.rows), 0, rset.rows) |
326 |
326 |
327 def test_select_is_in(self): |
327 def test_select_is_in(self): |
328 self.execute("INSERT Personne X: X nom 'bidule'") |
328 self.execute("INSERT Personne X: X nom 'bidule'") |
329 self.execute("INSERT Societe X: X nom 'chouette'") |
329 self.execute("INSERT Societe X: X nom 'chouette'") |
330 self.assertEquals(len(self.execute("Any X WHERE X is IN (Personne, Societe)")), |
330 self.assertEqual(len(self.execute("Any X WHERE X is IN (Personne, Societe)")), |
331 2) |
331 2) |
332 |
332 |
333 def test_select_not_rel(self): |
333 def test_select_not_rel(self): |
334 self.execute("INSERT Personne X: X nom 'bidule'") |
334 self.execute("INSERT Personne X: X nom 'bidule'") |
335 self.execute("INSERT Societe X: X nom 'chouette'") |
335 self.execute("INSERT Societe X: X nom 'chouette'") |
336 self.execute("INSERT Personne X: X nom 'autre'") |
336 self.execute("INSERT Personne X: X nom 'autre'") |
337 self.execute("SET P travaille S WHERE P nom 'bidule', S nom 'chouette'") |
337 self.execute("SET P travaille S WHERE P nom 'bidule', S nom 'chouette'") |
338 rset = self.execute('Personne X WHERE NOT X travaille S') |
338 rset = self.execute('Personne X WHERE NOT X travaille S') |
339 self.assertEquals(len(rset.rows), 1, rset.rows) |
339 self.assertEqual(len(rset.rows), 1, rset.rows) |
340 rset = self.execute('Personne X WHERE NOT X travaille S, S nom "chouette"') |
340 rset = self.execute('Personne X WHERE NOT X travaille S, S nom "chouette"') |
341 self.assertEquals(len(rset.rows), 1, rset.rows) |
341 self.assertEqual(len(rset.rows), 1, rset.rows) |
342 |
342 |
343 def test_select_nonregr_inlined(self): |
343 def test_select_nonregr_inlined(self): |
344 self.execute("INSERT Note X: X para 'bidule'") |
344 self.execute("INSERT Note X: X para 'bidule'") |
345 self.execute("INSERT Personne X: X nom 'chouette'") |
345 self.execute("INSERT Personne X: X nom 'chouette'") |
346 self.execute("INSERT Personne X: X nom 'autre'") |
346 self.execute("INSERT Personne X: X nom 'autre'") |
347 self.execute("SET X ecrit_par P WHERE X para 'bidule', P nom 'chouette'") |
347 self.execute("SET X ecrit_par P WHERE X para 'bidule', P nom 'chouette'") |
348 rset = self.execute('Any U,T ORDERBY T DESC WHERE U is CWUser, ' |
348 rset = self.execute('Any U,T ORDERBY T DESC WHERE U is CWUser, ' |
349 'N ecrit_par U, N type T')#, {'x': self.ueid}) |
349 'N ecrit_par U, N type T')#, {'x': self.ueid}) |
350 self.assertEquals(len(rset.rows), 0) |
350 self.assertEqual(len(rset.rows), 0) |
351 |
351 |
352 def test_select_nonregr_edition_not(self): |
352 def test_select_nonregr_edition_not(self): |
353 groupeids = set((1, 2, 3)) |
353 groupeids = set((1, 2, 3)) |
354 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')) |
354 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')) |
355 rset = self.execute('DISTINCT Any Y WHERE X is CWEType, X name "CWGroup", Y eid IN(1, 2, 3), NOT X read_permission Y') |
355 rset = self.execute('DISTINCT Any Y WHERE X is CWEType, X name "CWGroup", Y eid IN(1, 2, 3), NOT X read_permission Y') |
356 self.assertEquals(sorted(r[0] for r in rset.rows), sorted(groupeids - groupreadperms)) |
356 self.assertEqual(sorted(r[0] for r in rset.rows), sorted(groupeids - groupreadperms)) |
357 rset = self.execute('DISTINCT Any Y WHERE X name "CWGroup", Y eid IN(1, 2, 3), NOT X read_permission Y') |
357 rset = self.execute('DISTINCT Any Y WHERE X name "CWGroup", Y eid IN(1, 2, 3), NOT X read_permission Y') |
358 self.assertEquals(sorted(r[0] for r in rset.rows), sorted(groupeids - groupreadperms)) |
358 self.assertEqual(sorted(r[0] for r in rset.rows), sorted(groupeids - groupreadperms)) |
359 |
359 |
360 def test_select_outer_join(self): |
360 def test_select_outer_join(self): |
361 peid1 = self.execute("INSERT Personne X: X nom 'bidule'")[0][0] |
361 peid1 = self.execute("INSERT Personne X: X nom 'bidule'")[0][0] |
362 peid2 = self.execute("INSERT Personne X: X nom 'autre'")[0][0] |
362 peid2 = self.execute("INSERT Personne X: X nom 'autre'")[0][0] |
363 seid1 = self.execute("INSERT Societe X: X nom 'chouette'")[0][0] |
363 seid1 = self.execute("INSERT Societe X: X nom 'chouette'")[0][0] |
364 seid2 = self.execute("INSERT Societe X: X nom 'chouetos'")[0][0] |
364 seid2 = self.execute("INSERT Societe X: X nom 'chouetos'")[0][0] |
365 rset = self.execute('Any X,S ORDERBY X WHERE X travaille S?') |
365 rset = self.execute('Any X,S ORDERBY X WHERE X travaille S?') |
366 self.assertEquals(rset.rows, [[peid1, None], [peid2, None]]) |
366 self.assertEqual(rset.rows, [[peid1, None], [peid2, None]]) |
367 self.execute("SET P travaille S WHERE P nom 'bidule', S nom 'chouette'") |
367 self.execute("SET P travaille S WHERE P nom 'bidule', S nom 'chouette'") |
368 rset = self.execute('Any X,S ORDERBY X WHERE X travaille S?') |
368 rset = self.execute('Any X,S ORDERBY X WHERE X travaille S?') |
369 self.assertEquals(rset.rows, [[peid1, seid1], [peid2, None]]) |
369 self.assertEqual(rset.rows, [[peid1, seid1], [peid2, None]]) |
370 rset = self.execute('Any S,X ORDERBY S WHERE X? travaille S') |
370 rset = self.execute('Any S,X ORDERBY S WHERE X? travaille S') |
371 self.assertEquals(rset.rows, [[seid1, peid1], [seid2, None]]) |
371 self.assertEqual(rset.rows, [[seid1, peid1], [seid2, None]]) |
372 |
372 |
373 def test_select_outer_join_optimized(self): |
373 def test_select_outer_join_optimized(self): |
374 peid1 = self.execute("INSERT Personne X: X nom 'bidule'")[0][0] |
374 peid1 = self.execute("INSERT Personne X: X nom 'bidule'")[0][0] |
375 rset = self.execute('Any X WHERE X eid %(x)s, P? connait X', {'x':peid1}) |
375 rset = self.execute('Any X WHERE X eid %(x)s, P? connait X', {'x':peid1}) |
376 self.assertEquals(rset.rows, [[peid1]]) |
376 self.assertEqual(rset.rows, [[peid1]]) |
377 rset = self.execute('Any X WHERE X eid %(x)s, X require_permission P?', |
377 rset = self.execute('Any X WHERE X eid %(x)s, X require_permission P?', |
378 {'x':peid1}) |
378 {'x':peid1}) |
379 self.assertEquals(rset.rows, [[peid1]]) |
379 self.assertEqual(rset.rows, [[peid1]]) |
380 |
380 |
381 def test_select_left_outer_join(self): |
381 def test_select_left_outer_join(self): |
382 rset = self.execute('DISTINCT Any G WHERE U? in_group G') |
382 rset = self.execute('DISTINCT Any G WHERE U? in_group G') |
383 self.assertEquals(len(rset), 4) |
383 self.assertEqual(len(rset), 4) |
384 rset = self.execute('DISTINCT Any G WHERE U? in_group G, U eid %(x)s', |
384 rset = self.execute('DISTINCT Any G WHERE U? in_group G, U eid %(x)s', |
385 {'x': self.session.user.eid}) |
385 {'x': self.session.user.eid}) |
386 self.assertEquals(len(rset), 4) |
386 self.assertEqual(len(rset), 4) |
387 |
387 |
388 def test_select_ambigous_outer_join(self): |
388 def test_select_ambigous_outer_join(self): |
389 teid = self.execute("INSERT Tag X: X name 'tag'")[0][0] |
389 teid = self.execute("INSERT Tag X: X name 'tag'")[0][0] |
390 self.execute("INSERT Tag X: X name 'tagbis'")[0][0] |
390 self.execute("INSERT Tag X: X name 'tagbis'")[0][0] |
391 geid = self.execute("CWGroup G WHERE G name 'users'")[0][0] |
391 geid = self.execute("CWGroup G WHERE G name 'users'")[0][0] |
393 {'g': geid, 't': teid}) |
393 {'g': geid, 't': teid}) |
394 rset = self.execute("Any GN,TN ORDERBY GN WHERE T? tags G, T name TN, G name GN") |
394 rset = self.execute("Any GN,TN ORDERBY GN WHERE T? tags G, T name TN, G name GN") |
395 self.failUnless(['users', 'tag'] in rset.rows) |
395 self.failUnless(['users', 'tag'] in rset.rows) |
396 self.failUnless(['activated', None] in rset.rows) |
396 self.failUnless(['activated', None] in rset.rows) |
397 rset = self.execute("Any GN,TN ORDERBY GN WHERE T tags G?, T name TN, G name GN") |
397 rset = self.execute("Any GN,TN ORDERBY GN WHERE T tags G?, T name TN, G name GN") |
398 self.assertEquals(rset.rows, [[None, 'tagbis'], ['users', 'tag']]) |
398 self.assertEqual(rset.rows, [[None, 'tagbis'], ['users', 'tag']]) |
399 |
399 |
400 def test_select_not_inline_rel(self): |
400 def test_select_not_inline_rel(self): |
401 self.execute("INSERT Personne X: X nom 'bidule'") |
401 self.execute("INSERT Personne X: X nom 'bidule'") |
402 self.execute("INSERT Note X: X type 'a'") |
402 self.execute("INSERT Note X: X type 'a'") |
403 self.execute("INSERT Note X: X type 'b'") |
403 self.execute("INSERT Note X: X type 'b'") |
404 self.execute("SET X ecrit_par Y WHERE X type 'a', Y nom 'bidule'") |
404 self.execute("SET X ecrit_par Y WHERE X type 'a', Y nom 'bidule'") |
405 rset = self.execute('Note X WHERE NOT X ecrit_par P') |
405 rset = self.execute('Note X WHERE NOT X ecrit_par P') |
406 self.assertEquals(len(rset.rows), 1, rset.rows) |
406 self.assertEqual(len(rset.rows), 1, rset.rows) |
407 |
407 |
408 def test_select_not_unlinked_multiple_solutions(self): |
408 def test_select_not_unlinked_multiple_solutions(self): |
409 self.execute("INSERT Personne X: X nom 'bidule'") |
409 self.execute("INSERT Personne X: X nom 'bidule'") |
410 self.execute("INSERT Note X: X type 'a'") |
410 self.execute("INSERT Note X: X type 'a'") |
411 self.execute("INSERT Note X: X type 'b'") |
411 self.execute("INSERT Note X: X type 'b'") |
412 self.execute("SET Y evaluee X WHERE X type 'a', Y nom 'bidule'") |
412 self.execute("SET Y evaluee X WHERE X type 'a', Y nom 'bidule'") |
413 rset = self.execute('Note X WHERE NOT Y evaluee X') |
413 rset = self.execute('Note X WHERE NOT Y evaluee X') |
414 self.assertEquals(len(rset.rows), 1, rset.rows) |
414 self.assertEqual(len(rset.rows), 1, rset.rows) |
415 |
415 |
416 def test_select_date_extraction(self): |
416 def test_select_date_extraction(self): |
417 self.execute("INSERT Personne X: X nom 'foo', X datenaiss %(d)s", |
417 self.execute("INSERT Personne X: X nom 'foo', X datenaiss %(d)s", |
418 {'d': datetime(2001, 2,3, 12,13)}) |
418 {'d': datetime(2001, 2,3, 12,13)}) |
419 test_data = [('YEAR', 2001), ('MONTH', 2), ('DAY', 3), |
419 test_data = [('YEAR', 2001), ('MONTH', 2), ('DAY', 3), |
420 ('HOUR', 12), ('MINUTE', 13)] |
420 ('HOUR', 12), ('MINUTE', 13)] |
421 for funcname, result in test_data: |
421 for funcname, result in test_data: |
422 rset = self.execute('Any %s(D) WHERE X is Personne, X datenaiss D' |
422 rset = self.execute('Any %s(D) WHERE X is Personne, X datenaiss D' |
423 % funcname) |
423 % funcname) |
424 self.assertEquals(len(rset.rows), 1) |
424 self.assertEqual(len(rset.rows), 1) |
425 self.assertEquals(rset.rows[0][0], result) |
425 self.assertEqual(rset.rows[0][0], result) |
426 self.assertEquals(rset.description, [('Int',)]) |
426 self.assertEqual(rset.description, [('Int',)]) |
427 |
427 |
428 def test_select_aggregat_count(self): |
428 def test_select_aggregat_count(self): |
429 rset = self.execute('Any COUNT(X)') |
429 rset = self.execute('Any COUNT(X)') |
430 self.assertEquals(len(rset.rows), 1) |
430 self.assertEqual(len(rset.rows), 1) |
431 self.assertEquals(len(rset.rows[0]), 1) |
431 self.assertEqual(len(rset.rows[0]), 1) |
432 self.assertEquals(rset.description, [('Int',)]) |
432 self.assertEqual(rset.description, [('Int',)]) |
433 |
433 |
434 def test_select_aggregat_sum(self): |
434 def test_select_aggregat_sum(self): |
435 rset = self.execute('Any SUM(O) WHERE X ordernum O') |
435 rset = self.execute('Any SUM(O) WHERE X ordernum O') |
436 self.assertEquals(len(rset.rows), 1) |
436 self.assertEqual(len(rset.rows), 1) |
437 self.assertEquals(len(rset.rows[0]), 1) |
437 self.assertEqual(len(rset.rows[0]), 1) |
438 self.assertEquals(rset.description, [('Int',)]) |
438 self.assertEqual(rset.description, [('Int',)]) |
439 |
439 |
440 def test_select_aggregat_min(self): |
440 def test_select_aggregat_min(self): |
441 rset = self.execute('Any MIN(X) WHERE X is Personne') |
441 rset = self.execute('Any MIN(X) WHERE X is Personne') |
442 self.assertEquals(len(rset.rows), 1) |
442 self.assertEqual(len(rset.rows), 1) |
443 self.assertEquals(len(rset.rows[0]), 1) |
443 self.assertEqual(len(rset.rows[0]), 1) |
444 self.assertEquals(rset.description, [('Personne',)]) |
444 self.assertEqual(rset.description, [('Personne',)]) |
445 rset = self.execute('Any MIN(O) WHERE X ordernum O') |
445 rset = self.execute('Any MIN(O) WHERE X ordernum O') |
446 self.assertEquals(len(rset.rows), 1) |
446 self.assertEqual(len(rset.rows), 1) |
447 self.assertEquals(len(rset.rows[0]), 1) |
447 self.assertEqual(len(rset.rows[0]), 1) |
448 self.assertEquals(rset.description, [('Int',)]) |
448 self.assertEqual(rset.description, [('Int',)]) |
449 |
449 |
450 def test_select_aggregat_max(self): |
450 def test_select_aggregat_max(self): |
451 rset = self.execute('Any MAX(X) WHERE X is Personne') |
451 rset = self.execute('Any MAX(X) WHERE X is Personne') |
452 self.assertEquals(len(rset.rows), 1) |
452 self.assertEqual(len(rset.rows), 1) |
453 self.assertEquals(len(rset.rows[0]), 1) |
453 self.assertEqual(len(rset.rows[0]), 1) |
454 self.assertEquals(rset.description, [('Personne',)]) |
454 self.assertEqual(rset.description, [('Personne',)]) |
455 rset = self.execute('Any MAX(O) WHERE X ordernum O') |
455 rset = self.execute('Any MAX(O) WHERE X ordernum O') |
456 self.assertEquals(len(rset.rows), 1) |
456 self.assertEqual(len(rset.rows), 1) |
457 self.assertEquals(len(rset.rows[0]), 1) |
457 self.assertEqual(len(rset.rows[0]), 1) |
458 self.assertEquals(rset.description, [('Int',)]) |
458 self.assertEqual(rset.description, [('Int',)]) |
459 |
459 |
460 def test_select_custom_aggregat_concat_string(self): |
460 def test_select_custom_aggregat_concat_string(self): |
461 rset = self.execute('Any GROUP_CONCAT(N) WHERE X is CWGroup, X name N') |
461 rset = self.execute('Any GROUP_CONCAT(N) WHERE X is CWGroup, X name N') |
462 self.failUnless(rset) |
462 self.failUnless(rset) |
463 self.failUnlessEqual(sorted(rset[0][0].split(', ')), ['guests', 'managers', |
463 self.failUnlessEqual(sorted(rset[0][0].split(', ')), ['guests', 'managers', |
506 def test_select_aggregat_having_dumb(self): |
506 def test_select_aggregat_having_dumb(self): |
507 # dumb but should not raise an error |
507 # dumb but should not raise an error |
508 rset = self.execute('Any U,COUNT(X) GROUPBY U ' |
508 rset = self.execute('Any U,COUNT(X) GROUPBY U ' |
509 'WHERE U eid %(x)s, X owned_by U ' |
509 'WHERE U eid %(x)s, X owned_by U ' |
510 'HAVING COUNT(X) > 10', {'x': self.ueid}) |
510 'HAVING COUNT(X) > 10', {'x': self.ueid}) |
511 self.assertEquals(len(rset.rows), 1) |
511 self.assertEqual(len(rset.rows), 1) |
512 self.assertEquals(rset.rows[0][0], self.ueid) |
512 self.assertEqual(rset.rows[0][0], self.ueid) |
513 |
513 |
514 def test_select_having_non_aggregat_1(self): |
514 def test_select_having_non_aggregat_1(self): |
515 rset = self.execute('Any L WHERE X login L, X creation_date CD ' |
515 rset = self.execute('Any L WHERE X login L, X creation_date CD ' |
516 'HAVING YEAR(CD) = %s' % date.today().year) |
516 'HAVING YEAR(CD) = %s' % date.today().year) |
517 self.assertListEquals(rset.rows, |
517 self.assertListEqual(rset.rows, |
518 [[u'admin'], |
518 [[u'admin'], |
519 [u'anon']]) |
519 [u'anon']]) |
520 |
520 |
521 def test_select_having_non_aggregat_2(self): |
521 def test_select_having_non_aggregat_2(self): |
522 rset = self.execute('Any L GROUPBY L WHERE X login L, X in_group G, ' |
522 rset = self.execute('Any L GROUPBY L WHERE X login L, X in_group G, ' |
523 'X creation_date CD HAVING YEAR(CD) = %s OR COUNT(G) > 1' |
523 'X creation_date CD HAVING YEAR(CD) = %s OR COUNT(G) > 1' |
524 % date.today().year) |
524 % date.today().year) |
525 self.assertListEquals(rset.rows, |
525 self.assertListEqual(rset.rows, |
526 [[u'admin'], |
526 [[u'admin'], |
527 [u'anon']]) |
527 [u'anon']]) |
528 |
528 |
529 def test_select_complex_sort(self): |
529 def test_select_complex_sort(self): |
530 """need sqlite including http://www.sqlite.org/cvstrac/tktview?tn=3773 fix""" |
530 """need sqlite including http://www.sqlite.org/cvstrac/tktview?tn=3773 fix""" |
531 rset = self.execute('Any X ORDERBY X,D LIMIT 5 WHERE X creation_date D') |
531 rset = self.execute('Any X ORDERBY X,D LIMIT 5 WHERE X creation_date D') |
532 result = rset.rows |
532 result = rset.rows |
533 result.sort() |
533 result.sort() |
534 self.assertEquals(tuplify(result), [(1,), (2,), (3,), (4,), (5,)]) |
534 self.assertEqual(tuplify(result), [(1,), (2,), (3,), (4,), (5,)]) |
535 |
535 |
536 def test_select_upper(self): |
536 def test_select_upper(self): |
537 rset = self.execute('Any X, UPPER(L) ORDERBY L WHERE X is CWUser, X login L') |
537 rset = self.execute('Any X, UPPER(L) ORDERBY L WHERE X is CWUser, X login L') |
538 self.assertEquals(len(rset.rows), 2) |
538 self.assertEqual(len(rset.rows), 2) |
539 self.assertEquals(rset.rows[0][1], 'ADMIN') |
539 self.assertEqual(rset.rows[0][1], 'ADMIN') |
540 self.assertEquals(rset.description[0], ('CWUser', 'String',)) |
540 self.assertEqual(rset.description[0], ('CWUser', 'String',)) |
541 self.assertEquals(rset.rows[1][1], 'ANON') |
541 self.assertEqual(rset.rows[1][1], 'ANON') |
542 self.assertEquals(rset.description[1], ('CWUser', 'String',)) |
542 self.assertEqual(rset.description[1], ('CWUser', 'String',)) |
543 eid = rset.rows[0][0] |
543 eid = rset.rows[0][0] |
544 rset = self.execute('Any UPPER(L) WHERE X eid %s, X login L'%eid) |
544 rset = self.execute('Any UPPER(L) WHERE X eid %s, X login L'%eid) |
545 self.assertEquals(rset.rows[0][0], 'ADMIN') |
545 self.assertEqual(rset.rows[0][0], 'ADMIN') |
546 self.assertEquals(rset.description, [('String',)]) |
546 self.assertEqual(rset.description, [('String',)]) |
547 |
547 |
548 ## def test_select_simplified(self): |
548 ## def test_select_simplified(self): |
549 ## ueid = self.session.user.eid |
549 ## ueid = self.session.user.eid |
550 ## rset = self.execute('Any L WHERE %s login L'%ueid) |
550 ## rset = self.execute('Any L WHERE %s login L'%ueid) |
551 ## self.assertEquals(rset.rows[0][0], 'admin') |
551 ## self.assertEqual(rset.rows[0][0], 'admin') |
552 ## rset = self.execute('Any L WHERE %(x)s login L', {'x':ueid}) |
552 ## rset = self.execute('Any L WHERE %(x)s login L', {'x':ueid}) |
553 ## self.assertEquals(rset.rows[0][0], 'admin') |
553 ## self.assertEqual(rset.rows[0][0], 'admin') |
554 |
554 |
555 def test_select_searchable_text_1(self): |
555 def test_select_searchable_text_1(self): |
556 rset = self.execute(u"INSERT Personne X: X nom 'bidüle'") |
556 rset = self.execute(u"INSERT Personne X: X nom 'bidüle'") |
557 rset = self.execute(u"INSERT Societe X: X nom 'bidüle'") |
557 rset = self.execute(u"INSERT Societe X: X nom 'bidüle'") |
558 rset = self.execute("INSERT Societe X: X nom 'chouette'") |
558 rset = self.execute("INSERT Societe X: X nom 'chouette'") |
559 self.commit() |
559 self.commit() |
560 rset = self.execute('Any X where X has_text %(text)s', {'text': u'bidüle'}) |
560 rset = self.execute('Any X where X has_text %(text)s', {'text': u'bidüle'}) |
561 self.assertEquals(len(rset.rows), 2, rset.rows) |
561 self.assertEqual(len(rset.rows), 2, rset.rows) |
562 rset = self.execute(u'Any N where N has_text "bidüle"') |
562 rset = self.execute(u'Any N where N has_text "bidüle"') |
563 self.assertEquals(len(rset.rows), 2, rset.rows) |
563 self.assertEqual(len(rset.rows), 2, rset.rows) |
564 biduleeids = [r[0] for r in rset.rows] |
564 biduleeids = [r[0] for r in rset.rows] |
565 rset = self.execute(u'Any N where NOT N has_text "bidüle"') |
565 rset = self.execute(u'Any N where NOT N has_text "bidüle"') |
566 self.failIf([r[0] for r in rset.rows if r[0] in biduleeids]) |
566 self.failIf([r[0] for r in rset.rows if r[0] in biduleeids]) |
567 # duh? |
567 # duh? |
568 rset = self.execute('Any X WHERE X has_text %(text)s', {'text': u'ça'}) |
568 rset = self.execute('Any X WHERE X has_text %(text)s', {'text': u'ça'}) |
571 rset = self.execute("INSERT Personne X: X nom 'bidule'") |
571 rset = self.execute("INSERT Personne X: X nom 'bidule'") |
572 rset = self.execute("INSERT Personne X: X nom 'chouette'") |
572 rset = self.execute("INSERT Personne X: X nom 'chouette'") |
573 rset = self.execute("INSERT Societe X: X nom 'bidule'") |
573 rset = self.execute("INSERT Societe X: X nom 'bidule'") |
574 self.commit() |
574 self.commit() |
575 rset = self.execute('Personne N where N has_text "bidule"') |
575 rset = self.execute('Personne N where N has_text "bidule"') |
576 self.assertEquals(len(rset.rows), 1, rset.rows) |
576 self.assertEqual(len(rset.rows), 1, rset.rows) |
577 |
577 |
578 def test_select_searchable_text_3(self): |
578 def test_select_searchable_text_3(self): |
579 rset = self.execute("INSERT Personne X: X nom 'bidule', X sexe 'M'") |
579 rset = self.execute("INSERT Personne X: X nom 'bidule', X sexe 'M'") |
580 rset = self.execute("INSERT Personne X: X nom 'bidule', X sexe 'F'") |
580 rset = self.execute("INSERT Personne X: X nom 'bidule', X sexe 'F'") |
581 rset = self.execute("INSERT Societe X: X nom 'bidule'") |
581 rset = self.execute("INSERT Societe X: X nom 'bidule'") |
582 self.commit() |
582 self.commit() |
583 rset = self.execute('Any X where X has_text "bidule" and X sexe "M"') |
583 rset = self.execute('Any X where X has_text "bidule" and X sexe "M"') |
584 self.assertEquals(len(rset.rows), 1, rset.rows) |
584 self.assertEqual(len(rset.rows), 1, rset.rows) |
585 |
585 |
586 def test_select_multiple_searchable_text(self): |
586 def test_select_multiple_searchable_text(self): |
587 self.execute(u"INSERT Personne X: X nom 'bidüle'") |
587 self.execute(u"INSERT Personne X: X nom 'bidüle'") |
588 self.execute("INSERT Societe X: X nom 'chouette', S travaille X") |
588 self.execute("INSERT Societe X: X nom 'chouette', S travaille X") |
589 self.execute(u"INSERT Personne X: X nom 'bidüle'") |
589 self.execute(u"INSERT Personne X: X nom 'bidüle'") |
590 self.commit() |
590 self.commit() |
591 rset = self.execute('Personne X WHERE X has_text %(text)s, X travaille S, S has_text %(text2)s', |
591 rset = self.execute('Personne X WHERE X has_text %(text)s, X travaille S, S has_text %(text2)s', |
592 {'text': u'bidüle', |
592 {'text': u'bidüle', |
593 'text2': u'chouette',} |
593 'text2': u'chouette',} |
594 ) |
594 ) |
595 self.assertEquals(len(rset.rows), 1, rset.rows) |
595 self.assertEqual(len(rset.rows), 1, rset.rows) |
596 |
596 |
597 def test_select_no_descr(self): |
597 def test_select_no_descr(self): |
598 rset = self.execute('Any X WHERE X is CWGroup', build_descr=0) |
598 rset = self.execute('Any X WHERE X is CWGroup', build_descr=0) |
599 rset.rows.sort() |
599 rset.rows.sort() |
600 self.assertEquals(tuplify(rset.rows), [(1,), (2,), (3,), (4,)]) |
600 self.assertEqual(tuplify(rset.rows), [(1,), (2,), (3,), (4,)]) |
601 self.assertEquals(rset.description, ()) |
601 self.assertEqual(rset.description, ()) |
602 |
602 |
603 def test_select_limit_offset(self): |
603 def test_select_limit_offset(self): |
604 rset = self.execute('CWGroup X ORDERBY N LIMIT 2 WHERE X name N') |
604 rset = self.execute('CWGroup X ORDERBY N LIMIT 2 WHERE X name N') |
605 self.assertEquals(tuplify(rset.rows), [(1,), (2,)]) |
605 self.assertEqual(tuplify(rset.rows), [(1,), (2,)]) |
606 self.assertEquals(rset.description, [('CWGroup',), ('CWGroup',)]) |
606 self.assertEqual(rset.description, [('CWGroup',), ('CWGroup',)]) |
607 rset = self.execute('CWGroup X ORDERBY N LIMIT 2 OFFSET 2 WHERE X name N') |
607 rset = self.execute('CWGroup X ORDERBY N LIMIT 2 OFFSET 2 WHERE X name N') |
608 self.assertEquals(tuplify(rset.rows), [(3,), (4,)]) |
608 self.assertEqual(tuplify(rset.rows), [(3,), (4,)]) |
609 |
609 |
610 def test_select_symmetric(self): |
610 def test_select_symmetric(self): |
611 self.execute("INSERT Personne X: X nom 'machin'") |
611 self.execute("INSERT Personne X: X nom 'machin'") |
612 self.execute("INSERT Personne X: X nom 'bidule'") |
612 self.execute("INSERT Personne X: X nom 'bidule'") |
613 self.execute("INSERT Personne X: X nom 'chouette'") |
613 self.execute("INSERT Personne X: X nom 'chouette'") |
614 self.execute("INSERT Personne X: X nom 'trucmuche'") |
614 self.execute("INSERT Personne X: X nom 'trucmuche'") |
615 self.execute("SET X connait Y WHERE X nom 'chouette', Y nom 'bidule'") |
615 self.execute("SET X connait Y WHERE X nom 'chouette', Y nom 'bidule'") |
616 self.execute("SET X connait Y WHERE X nom 'machin', Y nom 'chouette'") |
616 self.execute("SET X connait Y WHERE X nom 'machin', Y nom 'chouette'") |
617 rset = self.execute('Any P where P connait P2') |
617 rset = self.execute('Any P where P connait P2') |
618 self.assertEquals(len(rset.rows), 3, rset.rows) |
618 self.assertEqual(len(rset.rows), 3, rset.rows) |
619 rset = self.execute('Any P where NOT P connait P2') |
619 rset = self.execute('Any P where NOT P connait P2') |
620 self.assertEquals(len(rset.rows), 1, rset.rows) # trucmuche |
620 self.assertEqual(len(rset.rows), 1, rset.rows) # trucmuche |
621 rset = self.execute('Any P where P connait P2, P2 nom "bidule"') |
621 rset = self.execute('Any P where P connait P2, P2 nom "bidule"') |
622 self.assertEquals(len(rset.rows), 1, rset.rows) |
622 self.assertEqual(len(rset.rows), 1, rset.rows) |
623 rset = self.execute('Any P where P2 connait P, P2 nom "bidule"') |
623 rset = self.execute('Any P where P2 connait P, P2 nom "bidule"') |
624 self.assertEquals(len(rset.rows), 1, rset.rows) |
624 self.assertEqual(len(rset.rows), 1, rset.rows) |
625 rset = self.execute('Any P where P connait P2, P2 nom "chouette"') |
625 rset = self.execute('Any P where P connait P2, P2 nom "chouette"') |
626 self.assertEquals(len(rset.rows), 2, rset.rows) |
626 self.assertEqual(len(rset.rows), 2, rset.rows) |
627 rset = self.execute('Any P where P2 connait P, P2 nom "chouette"') |
627 rset = self.execute('Any P where P2 connait P, P2 nom "chouette"') |
628 self.assertEquals(len(rset.rows), 2, rset.rows) |
628 self.assertEqual(len(rset.rows), 2, rset.rows) |
629 |
629 |
630 def test_select_inline(self): |
630 def test_select_inline(self): |
631 self.execute("INSERT Personne X: X nom 'bidule'") |
631 self.execute("INSERT Personne X: X nom 'bidule'") |
632 self.execute("INSERT Note X: X type 'a'") |
632 self.execute("INSERT Note X: X type 'a'") |
633 self.execute("SET X ecrit_par Y WHERE X type 'a', Y nom 'bidule'") |
633 self.execute("SET X ecrit_par Y WHERE X type 'a', Y nom 'bidule'") |
634 rset = self.execute('Any N where N ecrit_par X, X nom "bidule"') |
634 rset = self.execute('Any N where N ecrit_par X, X nom "bidule"') |
635 self.assertEquals(len(rset.rows), 1, rset.rows) |
635 self.assertEqual(len(rset.rows), 1, rset.rows) |
636 |
636 |
637 def test_select_creation_date(self): |
637 def test_select_creation_date(self): |
638 self.execute("INSERT Personne X: X nom 'bidule'") |
638 self.execute("INSERT Personne X: X nom 'bidule'") |
639 rset = self.execute('Any D WHERE X nom "bidule", X creation_date D') |
639 rset = self.execute('Any D WHERE X nom "bidule", X creation_date D') |
640 self.assertEqual(len(rset.rows), 1) |
640 self.assertEqual(len(rset.rows), 1) |
727 self.assertEqual(len(rset.rows), 2) |
727 self.assertEqual(len(rset.rows), 2) |
728 |
728 |
729 def test_select_boolean(self): |
729 def test_select_boolean(self): |
730 rset = self.execute('Any N WHERE X is CWEType, X name N, X final %(val)s', |
730 rset = self.execute('Any N WHERE X is CWEType, X name N, X final %(val)s', |
731 {'val': True}) |
731 {'val': True}) |
732 self.assertEquals(sorted(r[0] for r in rset.rows), ['Boolean', 'Bytes', |
732 self.assertEqual(sorted(r[0] for r in rset.rows), ['Boolean', 'Bytes', |
733 'Date', 'Datetime', |
733 'Date', 'Datetime', |
734 'Decimal', 'Float', |
734 'Decimal', 'Float', |
735 'Int', 'Interval', |
735 'Int', 'Interval', |
736 'Password', 'String', |
736 'Password', 'String', |
737 'Time']) |
737 'Time']) |
738 rset = self.execute('Any N WHERE X is CWEType, X name N, X final TRUE') |
738 rset = self.execute('Any N WHERE X is CWEType, X name N, X final TRUE') |
739 self.assertEquals(sorted(r[0] for r in rset.rows), ['Boolean', 'Bytes', |
739 self.assertEqual(sorted(r[0] for r in rset.rows), ['Boolean', 'Bytes', |
740 'Date', 'Datetime', |
740 'Date', 'Datetime', |
741 'Decimal', 'Float', |
741 'Decimal', 'Float', |
742 'Int', 'Interval', |
742 'Int', 'Interval', |
743 'Password', 'String', |
743 'Password', 'String', |
744 'Time']) |
744 'Time']) |
745 |
745 |
746 def test_select_constant(self): |
746 def test_select_constant(self): |
747 rset = self.execute('Any X, "toto" ORDERBY X WHERE X is CWGroup') |
747 rset = self.execute('Any X, "toto" ORDERBY X WHERE X is CWGroup') |
748 self.assertEquals(rset.rows, |
748 self.assertEqual(rset.rows, |
749 map(list, zip((1,2,3,4), ('toto','toto','toto','toto',)))) |
749 map(list, zip((1,2,3,4), ('toto','toto','toto','toto',)))) |
750 self.assertIsInstance(rset[0][1], unicode) |
750 self.assertIsInstance(rset[0][1], unicode) |
751 self.assertEquals(rset.description, |
751 self.assertEqual(rset.description, |
752 zip(('CWGroup', 'CWGroup', 'CWGroup', 'CWGroup'), |
752 zip(('CWGroup', 'CWGroup', 'CWGroup', 'CWGroup'), |
753 ('String', 'String', 'String', 'String',))) |
753 ('String', 'String', 'String', 'String',))) |
754 rset = self.execute('Any X, %(value)s ORDERBY X WHERE X is CWGroup', {'value': 'toto'}) |
754 rset = self.execute('Any X, %(value)s ORDERBY X WHERE X is CWGroup', {'value': 'toto'}) |
755 self.assertEquals(rset.rows, |
755 self.assertEqual(rset.rows, |
756 map(list, zip((1,2,3,4), ('toto','toto','toto','toto',)))) |
756 map(list, zip((1,2,3,4), ('toto','toto','toto','toto',)))) |
757 self.assertIsInstance(rset[0][1], unicode) |
757 self.assertIsInstance(rset[0][1], unicode) |
758 self.assertEquals(rset.description, |
758 self.assertEqual(rset.description, |
759 zip(('CWGroup', 'CWGroup', 'CWGroup', 'CWGroup'), |
759 zip(('CWGroup', 'CWGroup', 'CWGroup', 'CWGroup'), |
760 ('String', 'String', 'String', 'String',))) |
760 ('String', 'String', 'String', 'String',))) |
761 rset = self.execute('Any X,GN WHERE X is CWUser, G is CWGroup, X login "syt", X in_group G, G name GN') |
761 rset = self.execute('Any X,GN WHERE X is CWUser, G is CWGroup, X login "syt", X in_group G, G name GN') |
762 |
762 |
763 def test_select_union(self): |
763 def test_select_union(self): |
764 rset = self.execute('Any X,N ORDERBY N WITH X,N BEING ' |
764 rset = self.execute('Any X,N ORDERBY N WITH X,N BEING ' |
765 '((Any X,N WHERE X name N, X transition_of WF, WF workflow_of E, E name %(name)s)' |
765 '((Any X,N WHERE X name N, X transition_of WF, WF workflow_of E, E name %(name)s)' |
766 ' UNION ' |
766 ' UNION ' |
767 '(Any X,N WHERE X name N, X state_of WF, WF workflow_of E, E name %(name)s))', |
767 '(Any X,N WHERE X name N, X state_of WF, WF workflow_of E, E name %(name)s))', |
768 {'name': 'CWUser'}) |
768 {'name': 'CWUser'}) |
769 self.assertEquals([x[1] for x in rset.rows], |
769 self.assertEqual([x[1] for x in rset.rows], |
770 ['activate', 'activated', 'deactivate', 'deactivated']) |
770 ['activate', 'activated', 'deactivate', 'deactivated']) |
771 self.assertEquals(rset.description, |
771 self.assertEqual(rset.description, |
772 [('Transition', 'String'), ('State', 'String'), |
772 [('Transition', 'String'), ('State', 'String'), |
773 ('Transition', 'String'), ('State', 'String')]) |
773 ('Transition', 'String'), ('State', 'String')]) |
774 |
774 |
775 def test_select_union_aggregat(self): |
775 def test_select_union_aggregat(self): |
776 # meaningless, the goal in to have group by done on different attribute |
776 # meaningless, the goal in to have group by done on different attribute |
805 eid2 = self.execute('CWUser X WHERE X login "admin"')[0][0] |
805 eid2 = self.execute('CWUser X WHERE X login "admin"')[0][0] |
806 rset = self.execute('(Any X WHERE X eid %(x)s)' |
806 rset = self.execute('(Any X WHERE X eid %(x)s)' |
807 ' UNION ' |
807 ' UNION ' |
808 '(Any Y WHERE Y eid %(y)s)', |
808 '(Any Y WHERE Y eid %(y)s)', |
809 {'x': eid1, 'y': eid2}) |
809 {'x': eid1, 'y': eid2}) |
810 self.assertEquals(rset.description[:], [('CWGroup',), ('CWUser',)]) |
810 self.assertEqual(rset.description[:], [('CWGroup',), ('CWUser',)]) |
811 |
811 |
812 def test_exists(self): |
812 def test_exists(self): |
813 geid = self.execute("INSERT CWGroup X: X name 'lulufanclub'")[0][0] |
813 geid = self.execute("INSERT CWGroup X: X name 'lulufanclub'")[0][0] |
814 self.execute("SET U in_group G WHERE G name 'lulufanclub'") |
814 self.execute("SET U in_group G WHERE G name 'lulufanclub'") |
815 peid = self.execute("INSERT Personne X: X prenom 'lulu', X nom 'petit'")[0][0] |
815 peid = self.execute("INSERT Personne X: X prenom 'lulu', X nom 'petit'")[0][0] |
816 rset = self.execute("Any X WHERE X prenom 'lulu'," |
816 rset = self.execute("Any X WHERE X prenom 'lulu'," |
817 "EXISTS (U in_group G, G name 'lulufanclub' OR G name 'managers');") |
817 "EXISTS (U in_group G, G name 'lulufanclub' OR G name 'managers');") |
818 self.assertEquals(rset.rows, [[peid]]) |
818 self.assertEqual(rset.rows, [[peid]]) |
819 |
819 |
820 def test_identity(self): |
820 def test_identity(self): |
821 eid = self.execute('Any X WHERE X identity Y, Y eid 1')[0][0] |
821 eid = self.execute('Any X WHERE X identity Y, Y eid 1')[0][0] |
822 self.assertEquals(eid, 1) |
822 self.assertEqual(eid, 1) |
823 eid = self.execute('Any X WHERE Y identity X, Y eid 1')[0][0] |
823 eid = self.execute('Any X WHERE Y identity X, Y eid 1')[0][0] |
824 self.assertEquals(eid, 1) |
824 self.assertEqual(eid, 1) |
825 login = self.execute('Any L WHERE X login "admin", X identity Y, Y login L')[0][0] |
825 login = self.execute('Any L WHERE X login "admin", X identity Y, Y login L')[0][0] |
826 self.assertEquals(login, 'admin') |
826 self.assertEqual(login, 'admin') |
827 |
827 |
828 def test_select_date_mathexp(self): |
828 def test_select_date_mathexp(self): |
829 rset = self.execute('Any X, TODAY - CD WHERE X is CWUser, X creation_date CD') |
829 rset = self.execute('Any X, TODAY - CD WHERE X is CWUser, X creation_date CD') |
830 self.failUnless(rset) |
830 self.failUnless(rset) |
831 self.failUnlessEqual(rset.description[0][1], 'Interval') |
831 self.failUnlessEqual(rset.description[0][1], 'Interval') |
837 # percent users by groups |
837 # percent users by groups |
838 self.execute('SET X in_group G WHERE G name "users"') |
838 self.execute('SET X in_group G WHERE G name "users"') |
839 rset = self.execute('Any GN, COUNT(X)*100/T GROUPBY GN ORDERBY 2,1' |
839 rset = self.execute('Any GN, COUNT(X)*100/T GROUPBY GN ORDERBY 2,1' |
840 ' WHERE G name GN, X in_group G' |
840 ' WHERE G name GN, X in_group G' |
841 ' WITH T BEING (Any COUNT(U) WHERE U is CWUser)') |
841 ' WITH T BEING (Any COUNT(U) WHERE U is CWUser)') |
842 self.assertEquals(rset.rows, [[u'guests', 50], [u'managers', 50], [u'users', 100]]) |
842 self.assertEqual(rset.rows, [[u'guests', 50], [u'managers', 50], [u'users', 100]]) |
843 self.assertEquals(rset.description, [('String', 'Int'), ('String', 'Int'), ('String', 'Int')]) |
843 self.assertEqual(rset.description, [('String', 'Int'), ('String', 'Int'), ('String', 'Int')]) |
844 |
844 |
845 def test_select_subquery_aggregat_2(self): |
845 def test_select_subquery_aggregat_2(self): |
846 expected = self.execute('Any X, 0, COUNT(T) GROUPBY X ' |
846 expected = self.execute('Any X, 0, COUNT(T) GROUPBY X ' |
847 'WHERE X is Workflow, T transition_of X').rows |
847 'WHERE X is Workflow, T transition_of X').rows |
848 rset = self.execute(''' |
848 rset = self.execute(''' |
849 Any P1,B,E WHERE P1 identity P2 WITH |
849 Any P1,B,E WHERE P1 identity P2 WITH |
850 P1,B BEING (Any P,COUNT(T) GROUPBY P WHERE P is Workflow, T is Transition, |
850 P1,B BEING (Any P,COUNT(T) GROUPBY P WHERE P is Workflow, T is Transition, |
851 T? transition_of P, T type "auto"), |
851 T? transition_of P, T type "auto"), |
852 P2,E BEING (Any P,COUNT(T) GROUPBY P WHERE P is Workflow, T is Transition, |
852 P2,E BEING (Any P,COUNT(T) GROUPBY P WHERE P is Workflow, T is Transition, |
853 T? transition_of P, T type "normal")''') |
853 T? transition_of P, T type "normal")''') |
854 self.assertEquals(sorted(rset.rows), sorted(expected)) |
854 self.assertEqual(sorted(rset.rows), sorted(expected)) |
855 |
855 |
856 def test_select_subquery_const(self): |
856 def test_select_subquery_const(self): |
857 rset = self.execute('Any X WITH X BEING ((Any NULL) UNION (Any "toto"))') |
857 rset = self.execute('Any X WITH X BEING ((Any NULL) UNION (Any "toto"))') |
858 self.assertEquals(rset.rows, [[None], ['toto']]) |
858 self.assertEqual(rset.rows, [[None], ['toto']]) |
859 self.assertEquals(rset.description, [(None,), ('String',)]) |
859 self.assertEqual(rset.description, [(None,), ('String',)]) |
860 |
860 |
861 # insertion queries tests ################################################# |
861 # insertion queries tests ################################################# |
862 |
862 |
863 def test_insert_is(self): |
863 def test_insert_is(self): |
864 eid, = self.execute("INSERT Personne X: X nom 'bidule'")[0] |
864 eid, = self.execute("INSERT Personne X: X nom 'bidule'")[0] |
865 etype, = self.execute("Any TN WHERE X is T, X eid %s, T name TN" % eid)[0] |
865 etype, = self.execute("Any TN WHERE X is T, X eid %s, T name TN" % eid)[0] |
866 self.assertEquals(etype, 'Personne') |
866 self.assertEqual(etype, 'Personne') |
867 self.execute("INSERT Personne X: X nom 'managers'") |
867 self.execute("INSERT Personne X: X nom 'managers'") |
868 |
868 |
869 def test_insert_1(self): |
869 def test_insert_1(self): |
870 rset = self.execute("INSERT Personne X: X nom 'bidule'") |
870 rset = self.execute("INSERT Personne X: X nom 'bidule'") |
871 self.assertEquals(len(rset.rows), 1) |
871 self.assertEqual(len(rset.rows), 1) |
872 self.assertEquals(rset.description, [('Personne',)]) |
872 self.assertEqual(rset.description, [('Personne',)]) |
873 rset = self.execute('Personne X WHERE X nom "bidule"') |
873 rset = self.execute('Personne X WHERE X nom "bidule"') |
874 self.assert_(rset.rows) |
874 self.assert_(rset.rows) |
875 self.assertEquals(rset.description, [('Personne',)]) |
875 self.assertEqual(rset.description, [('Personne',)]) |
876 |
876 |
877 def test_insert_1_multiple(self): |
877 def test_insert_1_multiple(self): |
878 self.execute("INSERT Personne X: X nom 'bidule'") |
878 self.execute("INSERT Personne X: X nom 'bidule'") |
879 self.execute("INSERT Personne X: X nom 'chouette'") |
879 self.execute("INSERT Personne X: X nom 'chouette'") |
880 rset = self.execute("INSERT Societe Y: Y nom N, P travaille Y WHERE P nom N") |
880 rset = self.execute("INSERT Societe Y: Y nom N, P travaille Y WHERE P nom N") |
881 self.assertEquals(len(rset.rows), 2) |
881 self.assertEqual(len(rset.rows), 2) |
882 self.assertEquals(rset.description, [('Societe',), ('Societe',)]) |
882 self.assertEqual(rset.description, [('Societe',), ('Societe',)]) |
883 |
883 |
884 def test_insert_2(self): |
884 def test_insert_2(self): |
885 rset = self.execute("INSERT Personne X, Personne Y: X nom 'bidule', Y nom 'tutu'") |
885 rset = self.execute("INSERT Personne X, Personne Y: X nom 'bidule', Y nom 'tutu'") |
886 self.assertEquals(rset.description, [('Personne', 'Personne')]) |
886 self.assertEqual(rset.description, [('Personne', 'Personne')]) |
887 rset = self.execute('Personne X WHERE X nom "bidule" or X nom "tutu"') |
887 rset = self.execute('Personne X WHERE X nom "bidule" or X nom "tutu"') |
888 self.assert_(rset.rows) |
888 self.assert_(rset.rows) |
889 self.assertEquals(rset.description, [('Personne',), ('Personne',)]) |
889 self.assertEqual(rset.description, [('Personne',), ('Personne',)]) |
890 |
890 |
891 def test_insert_3(self): |
891 def test_insert_3(self): |
892 self.execute("INSERT Personne X: X nom Y WHERE U login 'admin', U login Y") |
892 self.execute("INSERT Personne X: X nom Y WHERE U login 'admin', U login Y") |
893 rset = self.execute('Personne X WHERE X nom "admin"') |
893 rset = self.execute('Personne X WHERE X nom "admin"') |
894 self.assert_(rset.rows) |
894 self.assert_(rset.rows) |
895 self.assertEquals(rset.description, [('Personne',)]) |
895 self.assertEqual(rset.description, [('Personne',)]) |
896 |
896 |
897 def test_insert_4(self): |
897 def test_insert_4(self): |
898 self.execute("INSERT Societe Y: Y nom 'toto'") |
898 self.execute("INSERT Societe Y: Y nom 'toto'") |
899 self.execute("INSERT Personne X: X nom 'bidule', X travaille Y WHERE Y nom 'toto'") |
899 self.execute("INSERT Personne X: X nom 'bidule', X travaille Y WHERE Y nom 'toto'") |
900 rset = self.execute('Any X, Y WHERE X nom "bidule", Y nom "toto", X travaille Y') |
900 rset = self.execute('Any X, Y WHERE X nom "bidule", Y nom "toto", X travaille Y') |
901 self.assert_(rset.rows) |
901 self.assert_(rset.rows) |
902 self.assertEquals(rset.description, [('Personne', 'Societe',)]) |
902 self.assertEqual(rset.description, [('Personne', 'Societe',)]) |
903 |
903 |
904 def test_insert_4bis(self): |
904 def test_insert_4bis(self): |
905 peid = self.execute("INSERT Personne X: X nom 'bidule'")[0][0] |
905 peid = self.execute("INSERT Personne X: X nom 'bidule'")[0][0] |
906 seid = self.execute("INSERT Societe Y: Y nom 'toto', X travaille Y WHERE X eid %(x)s", |
906 seid = self.execute("INSERT Societe Y: Y nom 'toto', X travaille Y WHERE X eid %(x)s", |
907 {'x': str(peid)})[0][0] |
907 {'x': str(peid)})[0][0] |
922 def test_insert_5(self): |
922 def test_insert_5(self): |
923 self.execute("INSERT Personne X: X nom 'bidule'") |
923 self.execute("INSERT Personne X: X nom 'bidule'") |
924 self.execute("INSERT Societe Y: Y nom 'toto', X travaille Y WHERE X nom 'bidule'") |
924 self.execute("INSERT Societe Y: Y nom 'toto', X travaille Y WHERE X nom 'bidule'") |
925 rset = self.execute('Any X, Y WHERE X nom "bidule", Y nom "toto", X travaille Y') |
925 rset = self.execute('Any X, Y WHERE X nom "bidule", Y nom "toto", X travaille Y') |
926 self.assert_(rset.rows) |
926 self.assert_(rset.rows) |
927 self.assertEquals(rset.description, [('Personne', 'Societe',)]) |
927 self.assertEqual(rset.description, [('Personne', 'Societe',)]) |
928 |
928 |
929 def test_insert_5bis(self): |
929 def test_insert_5bis(self): |
930 peid = self.execute("INSERT Personne X: X nom 'bidule'")[0][0] |
930 peid = self.execute("INSERT Personne X: X nom 'bidule'")[0][0] |
931 self.execute("INSERT Societe Y: Y nom 'toto', X travaille Y WHERE X eid %(x)s", |
931 self.execute("INSERT Societe Y: Y nom 'toto', X travaille Y WHERE X eid %(x)s", |
932 {'x': peid}) |
932 {'x': peid}) |
933 rset = self.execute('Any X, Y WHERE X nom "bidule", Y nom "toto", X travaille Y') |
933 rset = self.execute('Any X, Y WHERE X nom "bidule", Y nom "toto", X travaille Y') |
934 self.assert_(rset.rows) |
934 self.assert_(rset.rows) |
935 self.assertEquals(rset.description, [('Personne', 'Societe',)]) |
935 self.assertEqual(rset.description, [('Personne', 'Societe',)]) |
936 |
936 |
937 def test_insert_6(self): |
937 def test_insert_6(self): |
938 self.execute("INSERT Personne X, Societe Y: X nom 'bidule', Y nom 'toto', X travaille Y") |
938 self.execute("INSERT Personne X, Societe Y: X nom 'bidule', Y nom 'toto', X travaille Y") |
939 rset = self.execute('Any X, Y WHERE X nom "bidule", Y nom "toto", X travaille Y') |
939 rset = self.execute('Any X, Y WHERE X nom "bidule", Y nom "toto", X travaille Y') |
940 self.assert_(rset.rows) |
940 self.assert_(rset.rows) |
941 self.assertEquals(rset.description, [('Personne', 'Societe',)]) |
941 self.assertEqual(rset.description, [('Personne', 'Societe',)]) |
942 |
942 |
943 def test_insert_7(self): |
943 def test_insert_7(self): |
944 self.execute("INSERT Personne X, Societe Y: X nom N, Y nom 'toto', X travaille Y WHERE U login 'admin', U login N") |
944 self.execute("INSERT Personne X, Societe Y: X nom N, Y nom 'toto', X travaille Y WHERE U login 'admin', U login N") |
945 rset = self.execute('Any X, Y WHERE X nom "admin", Y nom "toto", X travaille Y') |
945 rset = self.execute('Any X, Y WHERE X nom "admin", Y nom "toto", X travaille Y') |
946 self.assert_(rset.rows) |
946 self.assert_(rset.rows) |
947 self.assertEquals(rset.description, [('Personne', 'Societe',)]) |
947 self.assertEqual(rset.description, [('Personne', 'Societe',)]) |
948 |
948 |
949 def test_insert_7_2(self): |
949 def test_insert_7_2(self): |
950 self.execute("INSERT Personne X, Societe Y: X nom N, Y nom 'toto', X travaille Y WHERE U login N") |
950 self.execute("INSERT Personne X, Societe Y: X nom N, Y nom 'toto', X travaille Y WHERE U login N") |
951 rset = self.execute('Any X, Y WHERE Y nom "toto", X travaille Y') |
951 rset = self.execute('Any X, Y WHERE Y nom "toto", X travaille Y') |
952 self.assertEquals(len(rset), 2) |
952 self.assertEqual(len(rset), 2) |
953 self.assertEquals(rset.description, [('Personne', 'Societe',), |
953 self.assertEqual(rset.description, [('Personne', 'Societe',), |
954 ('Personne', 'Societe',)]) |
954 ('Personne', 'Societe',)]) |
955 |
955 |
956 def test_insert_8(self): |
956 def test_insert_8(self): |
957 self.execute("INSERT Societe Y, Personne X: Y nom N, X nom 'toto', X travaille Y WHERE U login 'admin', U login N") |
957 self.execute("INSERT Societe Y, Personne X: Y nom N, X nom 'toto', X travaille Y WHERE U login 'admin', U login N") |
958 rset = self.execute('Any X, Y WHERE X nom "toto", Y nom "admin", X travaille Y') |
958 rset = self.execute('Any X, Y WHERE X nom "toto", Y nom "admin", X travaille Y') |
959 self.assert_(rset.rows) |
959 self.assert_(rset.rows) |
960 self.assertEquals(rset.description, [('Personne', 'Societe',)]) |
960 self.assertEqual(rset.description, [('Personne', 'Societe',)]) |
961 |
961 |
962 def test_insert_9(self): |
962 def test_insert_9(self): |
963 self.execute("INSERT Societe X: X nom 'Lo'") |
963 self.execute("INSERT Societe X: X nom 'Lo'") |
964 self.execute("INSERT Societe X: X nom 'Gi'") |
964 self.execute("INSERT Societe X: X nom 'Gi'") |
965 self.execute("INSERT SubDivision X: X nom 'Lab'") |
965 self.execute("INSERT SubDivision X: X nom 'Lab'") |
966 rset = self.execute("INSERT Personne X: X nom N, X travaille Y, X travaille_subdivision Z WHERE Y is Societe, Z is SubDivision, Y nom N") |
966 rset = self.execute("INSERT Personne X: X nom N, X travaille Y, X travaille_subdivision Z WHERE Y is Societe, Z is SubDivision, Y nom N") |
967 self.assertEquals(len(rset), 2) |
967 self.assertEqual(len(rset), 2) |
968 self.assertEquals(rset.description, [('Personne',), ('Personne',)]) |
968 self.assertEqual(rset.description, [('Personne',), ('Personne',)]) |
969 # self.assertSetEquals(set(x.nom for x in rset.entities()), |
969 # self.assertSetEqual(set(x.nom for x in rset.entities()), |
970 # ['Lo', 'Gi']) |
970 # ['Lo', 'Gi']) |
971 # self.assertSetEquals(set(y.nom for x in rset.entities() for y in x.travaille), |
971 # self.assertSetEqual(set(y.nom for x in rset.entities() for y in x.travaille), |
972 # ['Lo', 'Gi']) |
972 # ['Lo', 'Gi']) |
973 # self.assertEquals([y.nom for x in rset.entities() for y in x.travaille_subdivision], |
973 # self.assertEqual([y.nom for x in rset.entities() for y in x.travaille_subdivision], |
974 # ['Lab', 'Lab']) |
974 # ['Lab', 'Lab']) |
975 |
975 |
976 def test_insert_query_error(self): |
976 def test_insert_query_error(self): |
977 self.assertRaises(Exception, |
977 self.assertRaises(Exception, |
978 self.execute, |
978 self.execute, |
1166 |
1166 |
1167 # upassword encryption tests ################################################# |
1167 # upassword encryption tests ################################################# |
1168 |
1168 |
1169 def test_insert_upassword(self): |
1169 def test_insert_upassword(self): |
1170 rset = self.execute("INSERT CWUser X: X login 'bob', X upassword 'toto'") |
1170 rset = self.execute("INSERT CWUser X: X login 'bob', X upassword 'toto'") |
1171 self.assertEquals(len(rset.rows), 1) |
1171 self.assertEqual(len(rset.rows), 1) |
1172 self.assertEquals(rset.description, [('CWUser',)]) |
1172 self.assertEqual(rset.description, [('CWUser',)]) |
1173 self.assertRaises(Unauthorized, |
1173 self.assertRaises(Unauthorized, |
1174 self.execute, "Any P WHERE X is CWUser, X login 'bob', X upassword P") |
1174 self.execute, "Any P WHERE X is CWUser, X login 'bob', X upassword P") |
1175 cursor = self.pool['system'] |
1175 cursor = self.pool['system'] |
1176 cursor.execute("SELECT %supassword from %sCWUser WHERE %slogin='bob'" |
1176 cursor.execute("SELECT %supassword from %sCWUser WHERE %slogin='bob'" |
1177 % (SQL_PREFIX, SQL_PREFIX, SQL_PREFIX)) |
1177 % (SQL_PREFIX, SQL_PREFIX, SQL_PREFIX)) |
1178 passwd = str(cursor.fetchone()[0]) |
1178 passwd = str(cursor.fetchone()[0]) |
1179 self.assertEquals(passwd, crypt_password('toto', passwd[:2])) |
1179 self.assertEqual(passwd, crypt_password('toto', passwd[:2])) |
1180 rset = self.execute("Any X WHERE X is CWUser, X login 'bob', X upassword %(pwd)s", |
1180 rset = self.execute("Any X WHERE X is CWUser, X login 'bob', X upassword %(pwd)s", |
1181 {'pwd': Binary(passwd)}) |
1181 {'pwd': Binary(passwd)}) |
1182 self.assertEquals(len(rset.rows), 1) |
1182 self.assertEqual(len(rset.rows), 1) |
1183 self.assertEquals(rset.description, [('CWUser',)]) |
1183 self.assertEqual(rset.description, [('CWUser',)]) |
1184 |
1184 |
1185 def test_update_upassword(self): |
1185 def test_update_upassword(self): |
1186 cursor = self.pool['system'] |
1186 cursor = self.pool['system'] |
1187 rset = self.execute("INSERT CWUser X: X login 'bob', X upassword %(pwd)s", {'pwd': 'toto'}) |
1187 rset = self.execute("INSERT CWUser X: X login 'bob', X upassword %(pwd)s", {'pwd': 'toto'}) |
1188 self.assertEquals(rset.description[0][0], 'CWUser') |
1188 self.assertEqual(rset.description[0][0], 'CWUser') |
1189 rset = self.execute("SET X upassword %(pwd)s WHERE X is CWUser, X login 'bob'", |
1189 rset = self.execute("SET X upassword %(pwd)s WHERE X is CWUser, X login 'bob'", |
1190 {'pwd': 'tutu'}) |
1190 {'pwd': 'tutu'}) |
1191 cursor.execute("SELECT %supassword from %sCWUser WHERE %slogin='bob'" |
1191 cursor.execute("SELECT %supassword from %sCWUser WHERE %slogin='bob'" |
1192 % (SQL_PREFIX, SQL_PREFIX, SQL_PREFIX)) |
1192 % (SQL_PREFIX, SQL_PREFIX, SQL_PREFIX)) |
1193 passwd = str(cursor.fetchone()[0]) |
1193 passwd = str(cursor.fetchone()[0]) |
1194 self.assertEquals(passwd, crypt_password('tutu', passwd[:2])) |
1194 self.assertEqual(passwd, crypt_password('tutu', passwd[:2])) |
1195 rset = self.execute("Any X WHERE X is CWUser, X login 'bob', X upassword %(pwd)s", |
1195 rset = self.execute("Any X WHERE X is CWUser, X login 'bob', X upassword %(pwd)s", |
1196 {'pwd': Binary(passwd)}) |
1196 {'pwd': Binary(passwd)}) |
1197 self.assertEquals(len(rset.rows), 1) |
1197 self.assertEqual(len(rset.rows), 1) |
1198 self.assertEquals(rset.description, [('CWUser',)]) |
1198 self.assertEqual(rset.description, [('CWUser',)]) |
1199 |
1199 |
1200 # non regression tests #################################################### |
1200 # non regression tests #################################################### |
1201 |
1201 |
1202 def test_nonregr_1(self): |
1202 def test_nonregr_1(self): |
1203 teid = self.execute("INSERT Tag X: X name 'tag'")[0][0] |
1203 teid = self.execute("INSERT Tag X: X name 'tag'")[0][0] |
1204 self.execute("SET X tags Y WHERE X name 'tag', Y is State, Y name 'activated'") |
1204 self.execute("SET X tags Y WHERE X name 'tag', Y is State, Y name 'activated'") |
1205 rset = self.execute('Any X WHERE T tags X') |
1205 rset = self.execute('Any X WHERE T tags X') |
1206 self.assertEquals(len(rset.rows), 1, rset.rows) |
1206 self.assertEqual(len(rset.rows), 1, rset.rows) |
1207 rset = self.execute('Any T WHERE T tags X, X is State') |
1207 rset = self.execute('Any T WHERE T tags X, X is State') |
1208 self.assertEquals(rset.rows, [[teid]]) |
1208 self.assertEqual(rset.rows, [[teid]]) |
1209 rset = self.execute('Any T WHERE T tags X') |
1209 rset = self.execute('Any T WHERE T tags X') |
1210 self.assertEquals(rset.rows, [[teid]]) |
1210 self.assertEqual(rset.rows, [[teid]]) |
1211 |
1211 |
1212 def test_nonregr_2(self): |
1212 def test_nonregr_2(self): |
1213 teid = self.execute("INSERT Tag X: X name 'tag'")[0][0] |
1213 teid = self.execute("INSERT Tag X: X name 'tag'")[0][0] |
1214 geid = self.execute("CWGroup G WHERE G name 'users'")[0][0] |
1214 geid = self.execute("CWGroup G WHERE G name 'users'")[0][0] |
1215 self.execute("SET X tags Y WHERE X eid %(t)s, Y eid %(g)s", |
1215 self.execute("SET X tags Y WHERE X eid %(t)s, Y eid %(g)s", |
1216 {'g': geid, 't': teid}) |
1216 {'g': geid, 't': teid}) |
1217 rset = self.execute('Any X WHERE E eid %(x)s, E tags X', |
1217 rset = self.execute('Any X WHERE E eid %(x)s, E tags X', |
1218 {'x': teid}) |
1218 {'x': teid}) |
1219 self.assertEquals(rset.rows, [[geid]]) |
1219 self.assertEqual(rset.rows, [[geid]]) |
1220 |
1220 |
1221 def test_nonregr_3(self): |
1221 def test_nonregr_3(self): |
1222 """bad sql generated on the second query (destination_state is not |
1222 """bad sql generated on the second query (destination_state is not |
1223 detected as an inlined relation) |
1223 detected as an inlined relation) |
1224 """ |
1224 """ |
1225 rset = self.execute('Any S,ES,T WHERE S state_of WF, WF workflow_of ET, ET name "CWUser",' |
1225 rset = self.execute('Any S,ES,T WHERE S state_of WF, WF workflow_of ET, ET name "CWUser",' |
1226 'ES allowed_transition T, T destination_state S') |
1226 'ES allowed_transition T, T destination_state S') |
1227 self.assertEquals(len(rset.rows), 2) |
1227 self.assertEqual(len(rset.rows), 2) |
1228 |
1228 |
1229 def test_nonregr_4(self): |
1229 def test_nonregr_4(self): |
1230 # fix variables'type, else we get (nb of entity types with a 'name' attribute)**3 |
1230 # fix variables'type, else we get (nb of entity types with a 'name' attribute)**3 |
1231 # union queries and that make for instance a 266Ko sql query which is refused |
1231 # union queries and that make for instance a 266Ko sql query which is refused |
1232 # by the server (or client lib) |
1232 # by the server (or client lib) |
1233 rset = self.execute('Any ER,SE,OE WHERE SE name "Comment", ER name "comments", OE name "Comment",' |
1233 rset = self.execute('Any ER,SE,OE WHERE SE name "Comment", ER name "comments", OE name "Comment",' |
1234 'ER is CWRType, SE is CWEType, OE is CWEType') |
1234 'ER is CWRType, SE is CWEType, OE is CWEType') |
1235 self.assertEquals(len(rset), 1) |
1235 self.assertEqual(len(rset), 1) |
1236 |
1236 |
1237 def test_nonregr_5(self): |
1237 def test_nonregr_5(self): |
1238 # jpl #15505: equivalent queries returning different result sets |
1238 # jpl #15505: equivalent queries returning different result sets |
1239 teid1 = self.execute("INSERT Folder X: X name 'hop'")[0][0] |
1239 teid1 = self.execute("INSERT Folder X: X name 'hop'")[0][0] |
1240 teid2 = self.execute("INSERT Folder X: X name 'hip'")[0][0] |
1240 teid2 = self.execute("INSERT Folder X: X name 'hip'")[0][0] |
1284 self.execute("INSERT Societe Y: Y nom 'toto'") |
1284 self.execute("INSERT Societe Y: Y nom 'toto'") |
1285 beid = self.execute("INSERT Basket B: B name 'mybasket'")[0][0] |
1285 beid = self.execute("INSERT Basket B: B name 'mybasket'")[0][0] |
1286 self.execute("SET X in_basket B WHERE X is Personne") |
1286 self.execute("SET X in_basket B WHERE X is Personne") |
1287 self.execute("SET X in_basket B WHERE X is Societe") |
1287 self.execute("SET X in_basket B WHERE X is Societe") |
1288 rset = self.execute('Any X WHERE X in_basket B, B eid %s' % beid) |
1288 rset = self.execute('Any X WHERE X in_basket B, B eid %s' % beid) |
1289 self.assertEquals(len(rset), 2) |
1289 self.assertEqual(len(rset), 2) |
1290 self.assertEquals(rset.description, [('Personne',), ('Societe',)]) |
1290 self.assertEqual(rset.description, [('Personne',), ('Societe',)]) |
1291 |
1291 |
1292 |
1292 |
1293 def test_nonregr_cache_1(self): |
1293 def test_nonregr_cache_1(self): |
1294 peid = self.execute("INSERT Personne X: X nom 'bidule'")[0][0] |
1294 peid = self.execute("INSERT Personne X: X nom 'bidule'")[0][0] |
1295 beid = self.execute("INSERT Basket X: X name 'tag'")[0][0] |
1295 beid = self.execute("INSERT Basket X: X name 'tag'")[0][0] |
1296 self.execute("SET X in_basket Y WHERE X is Personne, Y eid %(y)s", |
1296 self.execute("SET X in_basket Y WHERE X is Personne, Y eid %(y)s", |
1297 {'y': beid}) |
1297 {'y': beid}) |
1298 rset = self.execute("Any X WHERE X in_basket B, B eid %(x)s", |
1298 rset = self.execute("Any X WHERE X in_basket B, B eid %(x)s", |
1299 {'x': beid}) |
1299 {'x': beid}) |
1300 self.assertEquals(rset.rows, [[peid]]) |
1300 self.assertEqual(rset.rows, [[peid]]) |
1301 rset = self.execute("Any X WHERE X in_basket B, B eid %(x)s", |
1301 rset = self.execute("Any X WHERE X in_basket B, B eid %(x)s", |
1302 {'x': beid}) |
1302 {'x': beid}) |
1303 self.assertEquals(rset.rows, [[peid]]) |
1303 self.assertEqual(rset.rows, [[peid]]) |
1304 |
1304 |
1305 def test_nonregr_has_text_cache(self): |
1305 def test_nonregr_has_text_cache(self): |
1306 eid1 = self.execute("INSERT Personne X: X nom 'bidule'")[0][0] |
1306 eid1 = self.execute("INSERT Personne X: X nom 'bidule'")[0][0] |
1307 eid2 = self.execute("INSERT Personne X: X nom 'tag'")[0][0] |
1307 eid2 = self.execute("INSERT Personne X: X nom 'tag'")[0][0] |
1308 self.commit() |
1308 self.commit() |
1309 rset = self.execute("Any X WHERE X has_text %(text)s", {'text': 'bidule'}) |
1309 rset = self.execute("Any X WHERE X has_text %(text)s", {'text': 'bidule'}) |
1310 self.assertEquals(rset.rows, [[eid1]]) |
1310 self.assertEqual(rset.rows, [[eid1]]) |
1311 rset = self.execute("Any X WHERE X has_text %(text)s", {'text': 'tag'}) |
1311 rset = self.execute("Any X WHERE X has_text %(text)s", {'text': 'tag'}) |
1312 self.assertEquals(rset.rows, [[eid2]]) |
1312 self.assertEqual(rset.rows, [[eid2]]) |
1313 |
1313 |
1314 def test_nonregr_sortterm_management(self): |
1314 def test_nonregr_sortterm_management(self): |
1315 """Error: Variable has no attribute 'sql' in rql2sql.py (visit_variable) |
1315 """Error: Variable has no attribute 'sql' in rql2sql.py (visit_variable) |
1316 |
1316 |
1317 cause: old variable ref inserted into a fresh rqlst copy |
1317 cause: old variable ref inserted into a fresh rqlst copy |