server/test/unittest_querier.py
branchstable
changeset 6340 470d8e828fda
parent 6209 e3e5870807e9
child 6360 1edfc0f3bb1d
equal deleted inserted replaced
6339:bdc3dc94d744 6340:470d8e828fda
    55 TYPEMAP = _GenericAdvFuncHelper.TYPE_MAPPING
    55 TYPEMAP = _GenericAdvFuncHelper.TYPE_MAPPING
    56 
    56 
    57 class MakeSchemaTC(TestCase):
    57 class MakeSchemaTC(TestCase):
    58     def test_known_values(self):
    58     def test_known_values(self):
    59         solution = {'A': 'String', 'B': 'CWUser'}
    59         solution = {'A': 'String', 'B': 'CWUser'}
    60         self.assertEquals(make_schema((Variable('A'), Variable('B')), solution,
    60         self.assertEqual(make_schema((Variable('A'), Variable('B')), solution,
    61                                       'table0', TYPEMAP),
    61                                       'table0', TYPEMAP),
    62                           ('C0 text,C1 integer', {'A': 'table0.C0', 'B': 'table0.C1'}))
    62                           ('C0 text,C1 integer', {'A': 'table0.C0', 'B': 'table0.C1'}))
    63 
    63 
    64 
    64 
    65 repo, cnx = init_test_database()
    65 repo, cnx = init_test_database()
    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',
   480         self.failUnlessEqual(len(rset), 3)
   480         self.failUnlessEqual(len(rset), 3)
   481         self.failUnlessEqual(rset[0][1], 'owners')
   481         self.failUnlessEqual(rset[0][1], 'owners')
   482 
   482 
   483     def test_select_aggregat_sort(self):
   483     def test_select_aggregat_sort(self):
   484         rset = self.execute('Any G, COUNT(U) GROUPBY G ORDERBY 2 WHERE U in_group G')
   484         rset = self.execute('Any G, COUNT(U) GROUPBY G ORDERBY 2 WHERE U in_group G')
   485         self.assertEquals(len(rset.rows), 2)
   485         self.assertEqual(len(rset.rows), 2)
   486         self.assertEquals(len(rset.rows[0]), 2)
   486         self.assertEqual(len(rset.rows[0]), 2)
   487         self.assertEquals(rset.description[0], ('CWGroup', 'Int',))
   487         self.assertEqual(rset.description[0], ('CWGroup', 'Int',))
   488 
   488 
   489     def test_select_aggregat_having(self):
   489     def test_select_aggregat_having(self):
   490         rset = self.execute('Any N,COUNT(RDEF) GROUPBY N ORDERBY 2,N '
   490         rset = self.execute('Any N,COUNT(RDEF) GROUPBY N ORDERBY 2,N '
   491                             'WHERE RT name N, RDEF relation_type RT '
   491                             'WHERE RT name N, RDEF relation_type RT '
   492                             'HAVING COUNT(RDEF) > 10')
   492                             'HAVING COUNT(RDEF) > 10')
   493         self.assertListEquals(rset.rows,
   493         self.assertListEqual(rset.rows,
   494                               [[u'description_format', 12],
   494                               [[u'description_format', 12],
   495                                [u'description', 13],
   495                                [u'description', 13],
   496                                [u'name', 14],
   496                                [u'name', 14],
   497                                [u'created_by', 38],
   497                                [u'created_by', 38],
   498                                [u'creation_date', 38],
   498                                [u'creation_date', 38],
   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)
   700         self.assertEqual(len(rset.rows), 2)
   700         self.assertEqual(len(rset.rows), 2)
   701 
   701 
   702     def test_select_explicit_eid(self):
   702     def test_select_explicit_eid(self):
   703         rset = self.execute('Any X,E WHERE X owned_by U, X eid E, U eid %(u)s', {'u': self.session.user.eid})
   703         rset = self.execute('Any X,E WHERE X owned_by U, X eid E, U eid %(u)s', {'u': self.session.user.eid})
   704         self.failUnless(rset)
   704         self.failUnless(rset)
   705         self.assertEquals(rset.description[0][1], 'Int')
   705         self.assertEqual(rset.description[0][1], 'Int')
   706 
   706 
   707 #     def test_select_rewritten_optional(self):
   707 #     def test_select_rewritten_optional(self):
   708 #         eid = self.execute("INSERT Affaire X: X sujet 'cool'")[0][0]
   708 #         eid = self.execute("INSERT Affaire X: X sujet 'cool'")[0][0]
   709 #         rset = self.execute('Any X WHERE X eid %(x)s, EXISTS(X owned_by U) OR EXISTS(X concerne S?, S owned_by U)',
   709 #         rset = self.execute('Any X WHERE X eid %(x)s, EXISTS(X owned_by U) OR EXISTS(X concerne S?, S owned_by U)',
   710 #                             {'x': eid}, 'x')
   710 #                             {'x': eid}, 'x')
   711 #         self.assertEquals(rset.rows, [[eid]])
   711 #         self.assertEqual(rset.rows, [[eid]])
   712 
   712 
   713     def test_today_bug(self):
   713     def test_today_bug(self):
   714         self.execute("INSERT Tag X: X name 'bidule', X creation_date NOW")
   714         self.execute("INSERT Tag X: X name 'bidule', X creation_date NOW")
   715         self.execute("INSERT Tag Y: Y name 'toto'")
   715         self.execute("INSERT Tag Y: Y name 'toto'")
   716         rset = self.execute("Any D WHERE X name in ('bidule', 'toto') , X creation_date D")
   716         rset = self.execute("Any D WHERE X name in ('bidule', 'toto') , X creation_date D")
   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
   786         self.execute('INSERT Transition X: X name "hop"')
   786         self.execute('INSERT Transition X: X name "hop"')
   787         rset = self.execute('Any N,NX ORDERBY 2 WITH N,NX BEING '
   787         rset = self.execute('Any N,NX ORDERBY 2 WITH N,NX BEING '
   788                             '((Any N,COUNT(X) GROUPBY N WHERE X name N, X is State HAVING COUNT(X)>1)'
   788                             '((Any N,COUNT(X) GROUPBY N WHERE X name N, X is State HAVING COUNT(X)>1)'
   789                             ' UNION '
   789                             ' UNION '
   790                             '(Any N,COUNT(X) GROUPBY N WHERE X name N, X is Transition HAVING COUNT(X)>1))')
   790                             '(Any N,COUNT(X) GROUPBY N WHERE X name N, X is Transition HAVING COUNT(X)>1))')
   791         self.assertEquals(rset.rows, [[u'hop', 2], [u'hop', 2]])
   791         self.assertEqual(rset.rows, [[u'hop', 2], [u'hop', 2]])
   792 
   792 
   793     def test_select_union_selection_with_diff_variables(self):
   793     def test_select_union_selection_with_diff_variables(self):
   794         rset = self.execute('(Any N WHERE X name N, X is State)'
   794         rset = self.execute('(Any N WHERE X name N, X is State)'
   795                             ' UNION '
   795                             ' UNION '
   796                             '(Any NN WHERE XX name NN, XX is Transition)')
   796                             '(Any NN WHERE XX name NN, XX is Transition)')
   797         self.assertEquals(sorted(r[0] for r in rset.rows),
   797         self.assertEqual(sorted(r[0] for r in rset.rows),
   798                           ['abort', 'activate', 'activated', 'ben non',
   798                           ['abort', 'activate', 'activated', 'ben non',
   799                            'deactivate', 'deactivated', 'done', 'en cours',
   799                            'deactivate', 'deactivated', 'done', 'en cours',
   800                            'end', 'finie', 'markasdone', 'pitetre', 'redoit',
   800                            'end', 'finie', 'markasdone', 'pitetre', 'redoit',
   801                            'start', 'todo'])
   801                            'start', 'todo'])
   802 
   802 
   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,
   990 
   990 
   991     def test_insertion_description_with_where(self):
   991     def test_insertion_description_with_where(self):
   992         rset = self.execute('INSERT CWUser E, EmailAddress EM: E login "X", E upassword "X", '
   992         rset = self.execute('INSERT CWUser E, EmailAddress EM: E login "X", E upassword "X", '
   993                             'E primary_email EM, EM address "X", E in_group G '
   993                             'E primary_email EM, EM address "X", E in_group G '
   994                             'WHERE G name "managers"')
   994                             'WHERE G name "managers"')
   995         self.assertEquals(list(rset.description[0]), ['CWUser', 'EmailAddress'])
   995         self.assertEqual(list(rset.description[0]), ['CWUser', 'EmailAddress'])
   996 
   996 
   997     # deletion queries tests ##################################################
   997     # deletion queries tests ##################################################
   998 
   998 
   999     def test_delete_1(self):
   999     def test_delete_1(self):
  1000         self.execute("INSERT Personne Y: Y nom 'toto'")
  1000         self.execute("INSERT Personne Y: Y nom 'toto'")
  1005         rset = self.execute('Personne X WHERE X nom "toto"')
  1005         rset = self.execute('Personne X WHERE X nom "toto"')
  1006         self.assertEqual(len(rset.rows), 0)
  1006         self.assertEqual(len(rset.rows), 0)
  1007 
  1007 
  1008     def test_delete_2(self):
  1008     def test_delete_2(self):
  1009         rset = self.execute("INSERT Personne X, Personne Y, Societe Z : X nom 'syt', Y nom 'adim', Z nom 'Logilab', X travaille Z, Y travaille Z")
  1009         rset = self.execute("INSERT Personne X, Personne Y, Societe Z : X nom 'syt', Y nom 'adim', Z nom 'Logilab', X travaille Z, Y travaille Z")
  1010         self.assertEquals(len(rset), 1)
  1010         self.assertEqual(len(rset), 1)
  1011         self.assertEquals(len(rset[0]), 3)
  1011         self.assertEqual(len(rset[0]), 3)
  1012         self.assertEquals(rset.description[0], ('Personne', 'Personne', 'Societe'))
  1012         self.assertEqual(rset.description[0], ('Personne', 'Personne', 'Societe'))
  1013         self.assertEquals(self.execute('Any N WHERE X nom N, X eid %s'% rset[0][0])[0][0], 'syt')
  1013         self.assertEqual(self.execute('Any N WHERE X nom N, X eid %s'% rset[0][0])[0][0], 'syt')
  1014         rset = self.execute('Personne X WHERE X travaille Y, Y nom "Logilab"')
  1014         rset = self.execute('Personne X WHERE X travaille Y, Y nom "Logilab"')
  1015         self.assertEqual(len(rset.rows), 2, rset.rows)
  1015         self.assertEqual(len(rset.rows), 2, rset.rows)
  1016         self.execute("DELETE X travaille Y WHERE X is Personne, Y nom 'Logilabo'")
  1016         self.execute("DELETE X travaille Y WHERE X is Personne, Y nom 'Logilabo'")
  1017         rset = self.execute('Personne X WHERE X travaille Y, Y nom "Logilab"')
  1017         rset = self.execute('Personne X WHERE X travaille Y, Y nom "Logilab"')
  1018         self.assertEqual(len(rset.rows), 2, rset.rows)
  1018         self.assertEqual(len(rset.rows), 2, rset.rows)
  1034     def test_delete_symmetric(self):
  1034     def test_delete_symmetric(self):
  1035         teid1 = self.execute("INSERT Folder T: T name 'toto'")[0][0]
  1035         teid1 = self.execute("INSERT Folder T: T name 'toto'")[0][0]
  1036         teid2 = self.execute("INSERT Folder T: T name 'tutu'")[0][0]
  1036         teid2 = self.execute("INSERT Folder T: T name 'tutu'")[0][0]
  1037         self.execute('SET X see_also Y WHERE X eid %s, Y eid %s' % (teid1, teid2))
  1037         self.execute('SET X see_also Y WHERE X eid %s, Y eid %s' % (teid1, teid2))
  1038         rset = self.execute('Any X,Y WHERE X see_also Y')
  1038         rset = self.execute('Any X,Y WHERE X see_also Y')
  1039         self.assertEquals(len(rset) , 2, rset.rows)
  1039         self.assertEqual(len(rset) , 2, rset.rows)
  1040         self.execute('DELETE X see_also Y WHERE X eid %s, Y eid %s' % (teid1, teid2))
  1040         self.execute('DELETE X see_also Y WHERE X eid %s, Y eid %s' % (teid1, teid2))
  1041         rset = self.execute('Any X,Y WHERE X see_also Y')
  1041         rset = self.execute('Any X,Y WHERE X see_also Y')
  1042         self.assertEquals(len(rset) , 0)
  1042         self.assertEqual(len(rset) , 0)
  1043         self.execute('SET X see_also Y WHERE X eid %s, Y eid %s' % (teid1, teid2))
  1043         self.execute('SET X see_also Y WHERE X eid %s, Y eid %s' % (teid1, teid2))
  1044         rset = self.execute('Any X,Y WHERE X see_also Y')
  1044         rset = self.execute('Any X,Y WHERE X see_also Y')
  1045         self.assertEquals(len(rset) , 2)
  1045         self.assertEqual(len(rset) , 2)
  1046         self.execute('DELETE X see_also Y WHERE X eid %s, Y eid %s' % (teid2, teid1))
  1046         self.execute('DELETE X see_also Y WHERE X eid %s, Y eid %s' % (teid2, teid1))
  1047         rset = self.execute('Any X,Y WHERE X see_also Y')
  1047         rset = self.execute('Any X,Y WHERE X see_also Y')
  1048         self.assertEquals(len(rset) , 0)
  1048         self.assertEqual(len(rset) , 0)
  1049 
  1049 
  1050     def test_nonregr_delete_cache(self):
  1050     def test_nonregr_delete_cache(self):
  1051         """test that relations are properly cleaned when an entity is deleted
  1051         """test that relations are properly cleaned when an entity is deleted
  1052         (using cachekey on sql generation returned always the same query for an eid,
  1052         (using cachekey on sql generation returned always the same query for an eid,
  1053         whatever the relation)
  1053         whatever the relation)
  1058         #'INSERT Email X: X messageid "<1234>", X subject "test", X sender Y, X recipients Y'
  1058         #'INSERT Email X: X messageid "<1234>", X subject "test", X sender Y, X recipients Y'
  1059         eeid, = self.o.execute(s, 'INSERT Email X: X messageid "<1234>", X subject "test", X sender Y, X recipients Y WHERE Y is EmailAddress')[0]
  1059         eeid, = self.o.execute(s, 'INSERT Email X: X messageid "<1234>", X subject "test", X sender Y, X recipients Y WHERE Y is EmailAddress')[0]
  1060         self.o.execute(s, "DELETE Email X")
  1060         self.o.execute(s, "DELETE Email X")
  1061         sqlc = s.pool['system']
  1061         sqlc = s.pool['system']
  1062         sqlc.execute('SELECT * FROM recipients_relation')
  1062         sqlc.execute('SELECT * FROM recipients_relation')
  1063         self.assertEquals(len(sqlc.fetchall()), 0)
  1063         self.assertEqual(len(sqlc.fetchall()), 0)
  1064         sqlc.execute('SELECT * FROM owned_by_relation WHERE eid_from=%s'%eeid)
  1064         sqlc.execute('SELECT * FROM owned_by_relation WHERE eid_from=%s'%eeid)
  1065         self.assertEquals(len(sqlc.fetchall()), 0)
  1065         self.assertEqual(len(sqlc.fetchall()), 0)
  1066 
  1066 
  1067     def test_nonregr_delete_cache2(self):
  1067     def test_nonregr_delete_cache2(self):
  1068         eid = self.execute("INSERT Folder T: T name 'toto'")[0][0]
  1068         eid = self.execute("INSERT Folder T: T name 'toto'")[0][0]
  1069         self.commit()
  1069         self.commit()
  1070         # fill the cache
  1070         # fill the cache
  1073         self.execute("Folder X WHERE X eid %(x)s", {'x': eid})
  1073         self.execute("Folder X WHERE X eid %(x)s", {'x': eid})
  1074         self.execute("Folder X WHERE X eid %s" % eid)
  1074         self.execute("Folder X WHERE X eid %s" % eid)
  1075         self.execute("DELETE Folder T WHERE T eid %s" % eid)
  1075         self.execute("DELETE Folder T WHERE T eid %s" % eid)
  1076         self.commit()
  1076         self.commit()
  1077         rset = self.execute("Any X WHERE X eid %(x)s", {'x': eid})
  1077         rset = self.execute("Any X WHERE X eid %(x)s", {'x': eid})
  1078         self.assertEquals(rset.rows, [])
  1078         self.assertEqual(rset.rows, [])
  1079         rset = self.execute("Any X WHERE X eid %s" % eid)
  1079         rset = self.execute("Any X WHERE X eid %s" % eid)
  1080         self.assertEquals(rset.rows, [])
  1080         self.assertEqual(rset.rows, [])
  1081         rset = self.execute("Folder X WHERE X eid %(x)s", {'x': eid})
  1081         rset = self.execute("Folder X WHERE X eid %(x)s", {'x': eid})
  1082         self.assertEquals(rset.rows, [])
  1082         self.assertEqual(rset.rows, [])
  1083         rset = self.execute("Folder X WHERE X eid %s" %eid)
  1083         rset = self.execute("Folder X WHERE X eid %s" %eid)
  1084         self.assertEquals(rset.rows, [])
  1084         self.assertEqual(rset.rows, [])
  1085 
  1085 
  1086     # update queries tests ####################################################
  1086     # update queries tests ####################################################
  1087 
  1087 
  1088     def test_update_1(self):
  1088     def test_update_1(self):
  1089         peid = self.execute("INSERT Personne Y: Y nom 'toto'")[0][0]
  1089         peid = self.execute("INSERT Personne Y: Y nom 'toto'")[0][0]
  1095         self.assertEqual(tuplify(rset.rows), [('tutu', 'original')])
  1095         self.assertEqual(tuplify(rset.rows), [('tutu', 'original')])
  1096 
  1096 
  1097     def test_update_2(self):
  1097     def test_update_2(self):
  1098         peid, seid = self.execute("INSERT Personne X, Societe Y: X nom 'bidule', Y nom 'toto'")[0]
  1098         peid, seid = self.execute("INSERT Personne X, Societe Y: X nom 'bidule', Y nom 'toto'")[0]
  1099         rset = self.execute("SET X travaille Y WHERE X nom 'bidule', Y nom 'toto'")
  1099         rset = self.execute("SET X travaille Y WHERE X nom 'bidule', Y nom 'toto'")
  1100         self.assertEquals(tuplify(rset.rows), [(peid, seid)])
  1100         self.assertEqual(tuplify(rset.rows), [(peid, seid)])
  1101         rset = self.execute('Any X, Y WHERE X travaille Y')
  1101         rset = self.execute('Any X, Y WHERE X travaille Y')
  1102         self.assertEqual(len(rset.rows), 1)
  1102         self.assertEqual(len(rset.rows), 1)
  1103 
  1103 
  1104     def test_update_2bis(self):
  1104     def test_update_2bis(self):
  1105         rset = self.execute("INSERT Personne X, Societe Y: X nom 'bidule', Y nom 'toto'")
  1105         rset = self.execute("INSERT Personne X, Societe Y: X nom 'bidule', Y nom 'toto'")
  1123 
  1123 
  1124     def test_update_multiple1(self):
  1124     def test_update_multiple1(self):
  1125         peid1 = self.execute("INSERT Personne Y: Y nom 'tutu'")[0][0]
  1125         peid1 = self.execute("INSERT Personne Y: Y nom 'tutu'")[0][0]
  1126         peid2 = self.execute("INSERT Personne Y: Y nom 'toto'")[0][0]
  1126         peid2 = self.execute("INSERT Personne Y: Y nom 'toto'")[0][0]
  1127         self.execute("SET X nom 'tutu', Y nom 'toto' WHERE X nom 'toto', Y nom 'tutu'")
  1127         self.execute("SET X nom 'tutu', Y nom 'toto' WHERE X nom 'toto', Y nom 'tutu'")
  1128         self.assertEquals(self.execute('Any X WHERE X nom "toto"').rows, [[peid1]])
  1128         self.assertEqual(self.execute('Any X WHERE X nom "toto"').rows, [[peid1]])
  1129         self.assertEquals(self.execute('Any X WHERE X nom "tutu"').rows, [[peid2]])
  1129         self.assertEqual(self.execute('Any X WHERE X nom "tutu"').rows, [[peid2]])
  1130 
  1130 
  1131     def test_update_multiple2(self):
  1131     def test_update_multiple2(self):
  1132         ueid = self.execute("INSERT CWUser X: X login 'bob', X upassword 'toto'")[0][0]
  1132         ueid = self.execute("INSERT CWUser X: X login 'bob', X upassword 'toto'")[0][0]
  1133         peid1 = self.execute("INSERT Personne Y: Y nom 'turlu'")[0][0]
  1133         peid1 = self.execute("INSERT Personne Y: Y nom 'turlu'")[0][0]
  1134         peid2 = self.execute("INSERT Personne Y: Y nom 'tutu'")[0][0]
  1134         peid2 = self.execute("INSERT Personne Y: Y nom 'tutu'")[0][0]
  1147                 break
  1147                 break
  1148         self.execute('SET X ordernum Y+1 WHERE X from_entity SE, SE name "Personne", X ordernum Y, X ordernum >= %(order)s',
  1148         self.execute('SET X ordernum Y+1 WHERE X from_entity SE, SE name "Personne", X ordernum Y, X ordernum >= %(order)s',
  1149                      {'order': orders[splitidx]})
  1149                      {'order': orders[splitidx]})
  1150         orders2 = [r[0] for r in self.execute('Any O ORDERBY O WHERE ST name "Personne", X from_entity ST, X ordernum O')]
  1150         orders2 = [r[0] for r in self.execute('Any O ORDERBY O WHERE ST name "Personne", X from_entity ST, X ordernum O')]
  1151         orders = orders[:splitidx] + [o+1 for o in orders[splitidx:]]
  1151         orders = orders[:splitidx] + [o+1 for o in orders[splitidx:]]
  1152         self.assertEquals(orders2, orders)
  1152         self.assertEqual(orders2, orders)
  1153 
  1153 
  1154     def test_update_string_concat(self):
  1154     def test_update_string_concat(self):
  1155         beid = self.execute("INSERT Bookmark Y: Y title 'toto', Y path '/view'")[0][0]
  1155         beid = self.execute("INSERT Bookmark Y: Y title 'toto', Y path '/view'")[0][0]
  1156         self.execute('SET X title XN + %(suffix)s WHERE X is Bookmark, X title XN', {'suffix': u'-moved'})
  1156         self.execute('SET X title XN + %(suffix)s WHERE X is Bookmark, X title XN', {'suffix': u'-moved'})
  1157         newname = self.execute('Any XN WHERE X eid %(x)s, X title XN', {'x': beid})[0][0]
  1157         newname = self.execute('Any XN WHERE X eid %(x)s, X title XN', {'x': beid})[0][0]
  1158         self.assertEquals(newname, 'toto-moved')
  1158         self.assertEqual(newname, 'toto-moved')
  1159 
  1159 
  1160     def test_update_query_error(self):
  1160     def test_update_query_error(self):
  1161         self.execute("INSERT Personne Y: Y nom 'toto'")
  1161         self.execute("INSERT Personne Y: Y nom 'toto'")
  1162         self.assertRaises(Exception, self.execute, "SET X nom 'toto', X is Personne")
  1162         self.assertRaises(Exception, self.execute, "SET X nom 'toto', X is Personne")
  1163         self.assertRaises(QueryError, self.execute, "SET X nom 'toto', X has_text 'tutu' WHERE X is Personne")
  1163         self.assertRaises(QueryError, self.execute, "SET X nom 'toto', X has_text 'tutu' WHERE X is Personne")
  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]
  1250                              'N filed_under T, W concerne N,'
  1250                              'N filed_under T, W concerne N,'
  1251                              'W is Affaire, W filed_under A, A eid %s' % (teid1, teid2))
  1251                              'W is Affaire, W filed_under A, A eid %s' % (teid1, teid2))
  1252         rset4 = self.execute('Any N,U WHERE N todo_by U, T eid %s,'
  1252         rset4 = self.execute('Any N,U WHERE N todo_by U, T eid %s,'
  1253                              'N filed_under T, W concerne N,'
  1253                              'N filed_under T, W concerne N,'
  1254                              'W filed_under A, A eid %s' % (teid1, teid2))
  1254                              'W filed_under A, A eid %s' % (teid1, teid2))
  1255         self.assertEquals(rset1.rows, rset2.rows)
  1255         self.assertEqual(rset1.rows, rset2.rows)
  1256         self.assertEquals(rset1.rows, rset3.rows)
  1256         self.assertEqual(rset1.rows, rset3.rows)
  1257         self.assertEquals(rset1.rows, rset4.rows)
  1257         self.assertEqual(rset1.rows, rset4.rows)
  1258 
  1258 
  1259     def test_nonregr_6(self):
  1259     def test_nonregr_6(self):
  1260         self.execute('Any N,COUNT(S) GROUPBY N ORDERBY COUNT(N) WHERE S name N, S is State')
  1260         self.execute('Any N,COUNT(S) GROUPBY N ORDERBY COUNT(N) WHERE S name N, S is State')
  1261 
  1261 
  1262     def test_sqlite_encoding(self):
  1262     def test_sqlite_encoding(self):
  1270                         'modification_date': '2003/03/12 11:00',
  1270                         'modification_date': '2003/03/12 11:00',
  1271                         'creation_date': '2000/07/03 11:00'})
  1271                         'creation_date': '2000/07/03 11:00'})
  1272         rset = self.execute('Any lower(N) ORDERBY LOWER(N) WHERE X is Tag, X name N,'
  1272         rset = self.execute('Any lower(N) ORDERBY LOWER(N) WHERE X is Tag, X name N,'
  1273                             'X owned_by U, U eid %(x)s',
  1273                             'X owned_by U, U eid %(x)s',
  1274                             {'x':self.session.user.eid})
  1274                             {'x':self.session.user.eid})
  1275         self.assertEquals(rset.rows, [[u'\xe9name0']])
  1275         self.assertEqual(rset.rows, [[u'\xe9name0']])
  1276 
  1276 
  1277 
  1277 
  1278     def test_nonregr_description(self):
  1278     def test_nonregr_description(self):
  1279         """check that a correct description is built in case where infered
  1279         """check that a correct description is built in case where infered
  1280         solutions may be "fusionned" into one by the querier while all solutions
  1280         solutions may be "fusionned" into one by the querier while all solutions
  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
  1332         self.execute("SET X filed_under Y WHERE X eid %s, Y eid %s"
  1332         self.execute("SET X filed_under Y WHERE X eid %s, Y eid %s"
  1333                        % (neid2, teid2))
  1333                        % (neid2, teid2))
  1334         self.execute("SET X todo_by Y WHERE X is Note, Y eid %s" % ueid)
  1334         self.execute("SET X todo_by Y WHERE X is Note, Y eid %s" % ueid)
  1335         rset = self.execute('Any N WHERE N todo_by U, N is Note, U eid %s, N filed_under T, T eid %s'
  1335         rset = self.execute('Any N WHERE N todo_by U, N is Note, U eid %s, N filed_under T, T eid %s'
  1336                              % (ueid, teid1))
  1336                              % (ueid, teid1))
  1337         self.assertEquals(len(rset), 1)
  1337         self.assertEqual(len(rset), 1)
  1338 
  1338 
  1339     def test_nonregr_XXX(self):
  1339     def test_nonregr_XXX(self):
  1340         teid = self.execute('Transition S WHERE S name "deactivate"')[0][0]
  1340         teid = self.execute('Transition S WHERE S name "deactivate"')[0][0]
  1341         rset = self.execute('Any O WHERE O is State, '
  1341         rset = self.execute('Any O WHERE O is State, '
  1342                              'S eid %(x)s, S transition_of ET, O state_of ET', {'x': teid})
  1342                              'S eid %(x)s, S transition_of ET, O state_of ET', {'x': teid})
  1343         self.assertEquals(len(rset), 2)
  1343         self.assertEqual(len(rset), 2)
  1344         rset = self.execute('Any O WHERE O is State, NOT S destination_state O, '
  1344         rset = self.execute('Any O WHERE O is State, NOT S destination_state O, '
  1345                              'S eid %(x)s, S transition_of ET, O state_of ET', {'x': teid})
  1345                              'S eid %(x)s, S transition_of ET, O state_of ET', {'x': teid})
  1346         self.assertEquals(len(rset), 1)
  1346         self.assertEqual(len(rset), 1)
  1347 
  1347 
  1348 
  1348 
  1349     def test_nonregr_set_datetime(self):
  1349     def test_nonregr_set_datetime(self):
  1350         # huum, psycopg specific
  1350         # huum, psycopg specific
  1351         self.execute('SET X creation_date %(date)s WHERE X eid 1', {'date': date.today()})
  1351         self.execute('SET X creation_date %(date)s WHERE X eid 1', {'date': date.today()})
  1358 
  1358 
  1359     def test_nonregr_u_owned_by_u(self):
  1359     def test_nonregr_u_owned_by_u(self):
  1360         ueid = self.execute("INSERT CWUser X: X login 'bob', X upassword 'toto', X in_group G "
  1360         ueid = self.execute("INSERT CWUser X: X login 'bob', X upassword 'toto', X in_group G "
  1361                              "WHERE G name 'users'")[0][0]
  1361                              "WHERE G name 'users'")[0][0]
  1362         rset = self.execute("CWUser U")
  1362         rset = self.execute("CWUser U")
  1363         self.assertEquals(len(rset), 3) # bob + admin + anon
  1363         self.assertEqual(len(rset), 3) # bob + admin + anon
  1364         rset = self.execute("Any U WHERE NOT U owned_by U")
  1364         rset = self.execute("Any U WHERE NOT U owned_by U")
  1365         self.assertEquals(len(rset), 0) # even admin created at repo initialization time should belong to itself
  1365         self.assertEqual(len(rset), 0) # even admin created at repo initialization time should belong to itself
  1366 
  1366 
  1367     def test_nonreg_update_index(self):
  1367     def test_nonreg_update_index(self):
  1368         # this is the kind of queries generated by "cubicweb-ctl db-check -ry"
  1368         # this is the kind of queries generated by "cubicweb-ctl db-check -ry"
  1369         self.execute("SET X description D WHERE X is State, X description D")
  1369         self.execute("SET X description D WHERE X is State, X description D")
  1370 
  1370 
  1375     def test_nonregr_orderby(self):
  1375     def test_nonregr_orderby(self):
  1376         seid = self.execute('Any X WHERE X name "activated"')[0][0]
  1376         seid = self.execute('Any X WHERE X name "activated"')[0][0]
  1377         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)
  1377         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)
  1378 
  1378 
  1379     def test_nonregr_solution_cache(self):
  1379     def test_nonregr_solution_cache(self):
  1380         self.skip('XXX should be fixed or documented') # (doesn't occur if cache key is provided.)
  1380         self.skipTest('XXX should be fixed or documented') # (doesn't occur if cache key is provided.)
  1381         rset = self.execute('Any X WHERE X is CWUser, X eid %(x)s', {'x':self.ueid})
  1381         rset = self.execute('Any X WHERE X is CWUser, X eid %(x)s', {'x':self.ueid})
  1382         self.assertEquals(len(rset), 1)
  1382         self.assertEqual(len(rset), 1)
  1383         rset = self.execute('Any X WHERE X is CWUser, X eid %(x)s', {'x':12345})
  1383         rset = self.execute('Any X WHERE X is CWUser, X eid %(x)s', {'x':12345})
  1384         self.assertEquals(len(rset), 0)
  1384         self.assertEqual(len(rset), 0)
  1385 
  1385 
  1386     def test_nonregr_final_norestr(self):
  1386     def test_nonregr_final_norestr(self):
  1387         self.assertRaises(BadRQLQuery, self.execute, 'Date X')
  1387         self.assertRaises(BadRQLQuery, self.execute, 'Date X')
  1388 
  1388 
  1389 
  1389