server/test/unittest_querier.py
changeset 6225 a176e68b7d0d
parent 6081 ede33e6400ab
parent 6209 e3e5870807e9
child 6366 1806148d6ce8
equal deleted inserted replaced
6182:30de0be8f895 6225:a176e68b7d0d
    14 # FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
    14 # FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
    15 # details.
    15 # details.
    16 #
    16 #
    17 # You should have received a copy of the GNU Lesser General Public License along
    17 # You should have received a copy of the GNU Lesser General Public License along
    18 # with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
    18 # with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
    19 """unit tests for modules cubicweb.server.querier and cubicweb.server.querier_steps
    19 """unit tests for modules cubicweb.server.querier and cubicweb.server.ssplanner
    20 """
    20 """
    21 from datetime import date, datetime
    21 from datetime import date, datetime
    22 
    22 
    23 from logilab.common.testlib import TestCase, unittest_main
    23 from logilab.common.testlib import TestCase, unittest_main
    24 from rql import BadRQLQuery, RQLSyntaxError
    24 from rql import BadRQLQuery, RQLSyntaxError
   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, 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.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)')
   134         self.assertListEquals(sorted(solutions),
   134         self.assertListEquals(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'},
   141                                       {'X': 'CWConstraint', 'ETN': 'String', 'ET': 'CWEType'},
   141                                       {'X': 'CWConstraint', 'ETN': 'String', 'ET': 'CWEType'},
   142                                       {'X': 'CWConstraintType', 'ETN': 'String', 'ET': 'CWEType'},
   142                                       {'X': 'CWConstraintType', 'ETN': 'String', 'ET': 'CWEType'},
   143                                       {'X': 'CWEType', 'ETN': 'String', 'ET': 'CWEType'},
   143                                       {'X': 'CWEType', 'ETN': 'String', 'ET': 'CWEType'},
   144                                       {'X': 'CWAttribute', 'ETN': 'String', 'ET': 'CWEType'},
   144                                       {'X': 'CWAttribute', 'ETN': 'String', 'ET': 'CWEType'},
   145                                       {'X': 'CWGroup', 'ETN': 'String', 'ET': 'CWEType'},
   145                                       {'X': 'CWGroup', 'ETN': 'String', 'ET': 'CWEType'},
       
   146                                       {'X': 'CWRelation', 'ETN': 'String', 'ET': 'CWEType'},
       
   147                                       {'X': 'CWPermission', 'ETN': 'String', 'ET': 'CWEType'},
       
   148                                       {'X': 'CWProperty', 'ETN': 'String', 'ET': 'CWEType'},
       
   149                                       {'X': 'CWRType', 'ETN': 'String', 'ET': 'CWEType'},
       
   150                                       {'X': 'CWUniqueTogetherConstraint', 'ETN': 'String', 'ET': 'CWEType'},
       
   151                                       {'X': 'CWUser', 'ETN': 'String', 'ET': 'CWEType'},
   146                                       {'X': 'Email', 'ETN': 'String', 'ET': 'CWEType'},
   152                                       {'X': 'Email', 'ETN': 'String', 'ET': 'CWEType'},
   147                                       {'X': 'EmailAddress', 'ETN': 'String', 'ET': 'CWEType'},
   153                                       {'X': 'EmailAddress', 'ETN': 'String', 'ET': 'CWEType'},
   148                                       {'X': 'EmailPart', 'ETN': 'String', 'ET': 'CWEType'},
   154                                       {'X': 'EmailPart', 'ETN': 'String', 'ET': 'CWEType'},
   149                                       {'X': 'EmailThread', 'ETN': 'String', 'ET': 'CWEType'},
   155                                       {'X': 'EmailThread', 'ETN': 'String', 'ET': 'CWEType'},
   150                                       {'X': 'CWRelation', 'ETN': 'String', 'ET': 'CWEType'},
       
   151                                       {'X': 'CWPermission', 'ETN': 'String', 'ET': 'CWEType'},
       
   152                                       {'X': 'CWProperty', 'ETN': 'String', 'ET': 'CWEType'},
       
   153                                       {'X': 'CWRType', 'ETN': 'String', 'ET': 'CWEType'},
       
   154                                       {'X': 'CWUser', 'ETN': 'String', 'ET': 'CWEType'},
       
   155                                       {'X': 'ExternalUri', 'ETN': 'String', 'ET': 'CWEType'},
   156                                       {'X': 'ExternalUri', 'ETN': 'String', 'ET': 'CWEType'},
   156                                       {'X': 'File', 'ETN': 'String', 'ET': 'CWEType'},
   157                                       {'X': 'File', 'ETN': 'String', 'ET': 'CWEType'},
   157                                       {'X': 'Folder', 'ETN': 'String', 'ET': 'CWEType'},
   158                                       {'X': 'Folder', 'ETN': 'String', 'ET': 'CWEType'},
   158                                       {'X': 'Note', 'ETN': 'String', 'ET': 'CWEType'},
   159                                       {'X': 'Note', 'ETN': 'String', 'ET': 'CWEType'},
   159                                       {'X': 'Personne', 'ETN': 'String', 'ET': 'CWEType'},
   160                                       {'X': 'Personne', 'ETN': 'String', 'ET': 'CWEType'},
   491                             'HAVING COUNT(RDEF) > 10')
   492                             'HAVING COUNT(RDEF) > 10')
   492         self.assertListEquals(rset.rows,
   493         self.assertListEquals(rset.rows,
   493                               [[u'description_format', 12],
   494                               [[u'description_format', 12],
   494                                [u'description', 13],
   495                                [u'description', 13],
   495                                [u'name', 14],
   496                                [u'name', 14],
   496                                [u'created_by', 37],
   497                                [u'created_by', 38],
   497                                [u'creation_date', 37],
   498                                [u'creation_date', 38],
   498                                [u'cwuri', 37],
   499                                [u'cwuri', 38],
   499                                [u'in_basket', 37],
   500                                [u'in_basket', 38],
   500                                [u'is', 37],
   501                                [u'is', 38],
   501                                [u'is_instance_of', 37],
   502                                [u'is_instance_of', 38],
   502                                [u'modification_date', 37],
   503                                [u'modification_date', 38],
   503                                [u'owned_by', 37]])
   504                                [u'owned_by', 38]])
   504 
   505 
   505     def test_select_aggregat_having_dumb(self):
   506     def test_select_aggregat_having_dumb(self):
   506         # dumb but should not raise an error
   507         # dumb but should not raise an error
   507         rset = self.execute('Any U,COUNT(X) GROUPBY U '
   508         rset = self.execute('Any U,COUNT(X) GROUPBY U '
   508                             'WHERE U eid %(x)s, X owned_by U '
   509                             'WHERE U eid %(x)s, X owned_by U '
   689         self.execute("SET S evaluee N WHERE S nom 'bidule', N para 'troc'")
   690         self.execute("SET S evaluee N WHERE S nom 'bidule', N para 'troc'")
   690         rset = self.execute('DISTINCT Any A,N WHERE A concerne S, S evaluee N')
   691         rset = self.execute('DISTINCT Any A,N WHERE A concerne S, S evaluee N')
   691         self.assertEqual(len(rset.rows), 1, rset.rows)
   692         self.assertEqual(len(rset.rows), 1, rset.rows)
   692 
   693 
   693     def test_select_ordered_distinct_1(self):
   694     def test_select_ordered_distinct_1(self):
   694         self.execute("INSERT Affaire X: X sujet 'cool', X ref '1'")
   695         self.assertRaises(BadRQLQuery,
   695         self.execute("INSERT Affaire X: X sujet 'cool', X ref '2'")
   696                           self.execute, 'DISTINCT Any S ORDERBY R WHERE A is Affaire, A sujet S, A ref R')
   696         rset = self.execute('DISTINCT Any S ORDERBY R WHERE A is Affaire, A sujet S, A ref R')
       
   697         self.assertEqual(rset.rows, [['cool']])
       
   698 
   697 
   699     def test_select_ordered_distinct_2(self):
   698     def test_select_ordered_distinct_2(self):
   700         self.execute("INSERT Affaire X: X sujet 'minor'")
   699         self.execute("INSERT Affaire X: X sujet 'minor'")
   701         self.execute("INSERT Affaire X: X sujet 'important'")
       
   702         self.execute("INSERT Affaire X: X sujet 'normal'")
       
   703         self.execute("INSERT Affaire X: X sujet 'zou'")
   700         self.execute("INSERT Affaire X: X sujet 'zou'")
   704         self.execute("INSERT Affaire X: X sujet 'abcd'")
   701         self.execute("INSERT Affaire X: X sujet 'abcd'")
   705         rset = self.execute('DISTINCT Any S ORDERBY S WHERE A is Affaire, A sujet S')
   702         rset = self.execute('DISTINCT Any S ORDERBY S WHERE A is Affaire, A sujet S')
   706         self.assertEqual(rset.rows, [['abcd'], ['important'], ['minor'], ['normal'], ['zou']])
   703         self.assertEqual(rset.rows, [['abcd'], ['minor'], ['zou']])
   707 
   704 
   708     def test_select_ordered_distinct_3(self):
   705     def test_select_ordered_distinct_3(self):
   709         rset = self.execute('DISTINCT Any N ORDERBY GROUP_SORT_VALUE(N) WHERE X is CWGroup, X name N')
   706         rset = self.execute('DISTINCT Any N ORDERBY GROUP_SORT_VALUE(N) WHERE X is CWGroup, X name N')
   710         self.assertEqual(rset.rows, [['owners'], ['guests'], ['users'], ['managers']])
   707         self.assertEqual(rset.rows, [['owners'], ['guests'], ['users'], ['managers']])
   711 
   708 
  1083     def test_nonregr_delete_cache2(self):
  1080     def test_nonregr_delete_cache2(self):
  1084         eid = self.execute("INSERT Folder T: T name 'toto'")[0][0]
  1081         eid = self.execute("INSERT Folder T: T name 'toto'")[0][0]
  1085         self.commit()
  1082         self.commit()
  1086         # fill the cache
  1083         # fill the cache
  1087         self.execute("Any X WHERE X eid %(x)s", {'x': eid})
  1084         self.execute("Any X WHERE X eid %(x)s", {'x': eid})
  1088         self.execute("Any X WHERE X eid %s" %eid)
  1085         self.execute("Any X WHERE X eid %s" % eid)
  1089         self.execute("Folder X WHERE X eid %(x)s", {'x': eid})
  1086         self.execute("Folder X WHERE X eid %(x)s", {'x': eid})
  1090         self.execute("Folder X WHERE X eid %s" %eid)
  1087         self.execute("Folder X WHERE X eid %s" % eid)
  1091         self.execute("DELETE Folder T WHERE T eid %s"%eid)
  1088         self.execute("DELETE Folder T WHERE T eid %s" % eid)
  1092         self.commit()
  1089         self.commit()
  1093         rset = self.execute("Any X WHERE X eid %(x)s", {'x': eid})
  1090         rset = self.execute("Any X WHERE X eid %(x)s", {'x': eid})
  1094         self.assertEquals(rset.rows, [])
  1091         self.assertEquals(rset.rows, [])
  1095         rset = self.execute("Any X WHERE X eid %s" %eid)
  1092         rset = self.execute("Any X WHERE X eid %s" % eid)
  1096         self.assertEquals(rset.rows, [])
  1093         self.assertEquals(rset.rows, [])
  1097         rset = self.execute("Folder X WHERE X eid %(x)s", {'x': eid})
  1094         rset = self.execute("Folder X WHERE X eid %(x)s", {'x': eid})
  1098         self.assertEquals(rset.rows, [])
  1095         self.assertEquals(rset.rows, [])
  1099         rset = self.execute("Folder X WHERE X eid %s" %eid)
  1096         rset = self.execute("Folder X WHERE X eid %s" %eid)
  1100         self.assertEquals(rset.rows, [])
  1097         self.assertEquals(rset.rows, [])