web/test/unittest_facet.py
changeset 7605 48abeac162fd
parent 7601 9030e8a4481e
child 7612 bfd4ee0d43ac
equal deleted inserted replaced
7604:1eb6090311ff 7605:48abeac162fd
     5 
     5 
     6     def prepare_rqlst(self):
     6     def prepare_rqlst(self):
     7         req = self.request()
     7         req = self.request()
     8         rset = self.execute('CWUser X')
     8         rset = self.execute('CWUser X')
     9         rqlst = rset.syntax_tree().copy()
     9         rqlst = rset.syntax_tree().copy()
    10         req.vreg.rqlhelper.annotate(rqlst)
    10         filtered_variable, baserql = facet.init_facets(rset, rqlst.children[0])
    11         mainvar, baserql = facet.prepare_facets_rqlst(rqlst, rset.args)
    11         self.assertEqual(filtered_variable.name, 'X')
    12         self.assertEqual(mainvar.name, 'X')
       
    13         self.assertEqual(baserql, 'Any X WHERE X is CWUser')
    12         self.assertEqual(baserql, 'Any X WHERE X is CWUser')
    14         self.assertEqual(rqlst.as_string(), 'DISTINCT Any  WHERE X is CWUser')
    13         self.assertEqual(rqlst.as_string(), 'DISTINCT Any  WHERE X is CWUser')
    15         return req, rset, rqlst, mainvar
    14         return req, rset, rqlst, filtered_variable
    16 
    15 
    17     def _in_group_facet(self, cls=facet.RelationFacet, no_relation=False):
    16     def _in_group_facet(self, cls=facet.RelationFacet, no_relation=False):
    18         req, rset, rqlst, mainvar = self.prepare_rqlst()
    17         req, rset, rqlst, filtered_variable = self.prepare_rqlst()
    19         cls.no_relation = no_relation
    18         cls.no_relation = no_relation
    20         f = cls(req, rset=rset, rqlst=rqlst.children[0],
    19         f = cls(req, rset=rset, select=rqlst.children[0],
    21                 filtered_variable=mainvar)
    20                 filtered_variable=filtered_variable)
    22         f.__regid__ = 'in_group'
    21         f.__regid__ = 'in_group'
    23         f.rtype = 'in_group'
    22         f.rtype = 'in_group'
    24         f.role = 'subject'
    23         f.role = 'subject'
    25         f.target_attr = 'name'
    24         f.target_attr = 'name'
    26         guests, managers = [eid for eid, in self.execute('CWGroup G ORDERBY GN '
    25         guests, managers = [eid for eid, in self.execute('CWGroup G ORDERBY GN '
    32     def test_relation_simple(self):
    31     def test_relation_simple(self):
    33         f, (guests, managers) = self._in_group_facet()
    32         f, (guests, managers) = self._in_group_facet()
    34         self.assertEqual(f.vocabulary(),
    33         self.assertEqual(f.vocabulary(),
    35                       [(u'guests', guests), (u'managers', managers)])
    34                       [(u'guests', guests), (u'managers', managers)])
    36         # ensure rqlst is left unmodified
    35         # ensure rqlst is left unmodified
    37         self.assertEqual(f.rqlst.as_string(), 'DISTINCT Any  WHERE X is CWUser')
    36         self.assertEqual(f.select.as_string(), 'DISTINCT Any  WHERE X is CWUser')
    38         #rqlst = rset.syntax_tree()
    37         #rqlst = rset.syntax_tree()
    39         self.assertEqual(f.possible_values(),
    38         self.assertEqual(f.possible_values(),
    40                           [str(guests), str(managers)])
    39                           [str(guests), str(managers)])
    41         # ensure rqlst is left unmodified
    40         # ensure rqlst is left unmodified
    42         self.assertEqual(f.rqlst.as_string(), 'DISTINCT Any  WHERE X is CWUser')
    41         self.assertEqual(f.select.as_string(), 'DISTINCT Any  WHERE X is CWUser')
    43         f._cw.form[f.__regid__] = str(guests)
    42         f._cw.form[f.__regid__] = str(guests)
    44         f.add_rql_restrictions()
    43         f.add_rql_restrictions()
    45         # selection is cluttered because rqlst has been prepared for facet (it
    44         # selection is cluttered because rqlst has been prepared for facet (it
    46         # is not in real life)
    45         # is not in real life)
    47         self.assertEqual(f.rqlst.as_string(),
    46         self.assertEqual(f.select.as_string(),
    48                           'DISTINCT Any  WHERE X is CWUser, X in_group D, D eid %s' % guests)
    47                           'DISTINCT Any  WHERE X is CWUser, X in_group D, D eid %s' % guests)
    49 
    48 
    50     def test_relation_optional_rel(self):
    49     def test_relation_optional_rel(self):
    51         req = self.request()
    50         req = self.request()
    52         rset = self.execute('Any X,GROUP_CONCAT(GN) GROUPBY X '
    51         rset = self.execute('Any X,GROUP_CONCAT(GN) GROUPBY X '
    53                             'WHERE X in_group G?, G name GN, NOT G name "users"')
    52                             'WHERE X in_group G?, G name GN, NOT G name "users"')
    54         rqlst = rset.syntax_tree().copy()
    53         rqlst = rset.syntax_tree().copy()
    55         req.vreg.rqlhelper.annotate(rqlst)
    54         select = rqlst.children[0]
    56         mainvar, baserql = facet.prepare_facets_rqlst(rqlst, rset.args)
    55         filtered_variable, baserql = facet.init_facets(rset, select)
    57 
    56 
    58         f = facet.RelationFacet(req, rset=rset,
    57         f = facet.RelationFacet(req, rset=rset,
    59                                 rqlst=rqlst.children[0],
    58                                 select=select,
    60                                 filtered_variable=mainvar)
    59                                 filtered_variable=filtered_variable)
    61         f.rtype = 'in_group'
    60         f.rtype = 'in_group'
    62         f.role = 'subject'
    61         f.role = 'subject'
    63         f.target_attr = 'name'
    62         f.target_attr = 'name'
    64         guests, managers = [eid for eid, in self.execute('CWGroup G ORDERBY GN '
    63         guests, managers = [eid for eid, in self.execute('CWGroup G ORDERBY GN '
    65                                                          'WHERE G name GN, G name IN ("guests", "managers")')]
    64                                                          'WHERE G name GN, G name IN ("guests", "managers")')]
    90                           [(u'<no relation>', ''), (u'guests', guests), (u'managers', managers)])
    89                           [(u'<no relation>', ''), (u'guests', guests), (u'managers', managers)])
    91         self.assertEqual(f.possible_values(),
    90         self.assertEqual(f.possible_values(),
    92                           [str(guests), str(managers), ''])
    91                           [str(guests), str(managers), ''])
    93         f._cw.form[f.__regid__] = ''
    92         f._cw.form[f.__regid__] = ''
    94         f.add_rql_restrictions()
    93         f.add_rql_restrictions()
    95         self.assertEqual(f.rqlst.as_string(),
    94         self.assertEqual(f.select.as_string(),
    96                           'DISTINCT Any  WHERE X is CWUser, NOT X in_group G')
    95                           'DISTINCT Any  WHERE X is CWUser, NOT X in_group G')
    97 
    96 
    98     def test_relation_no_relation_2(self):
    97     def test_relation_no_relation_2(self):
    99         f, (guests, managers) = self._in_group_facet(no_relation=True)
    98         f, (guests, managers) = self._in_group_facet(no_relation=True)
   100         f._cw.form[f.__regid__] = ['', guests]
    99         f._cw.form[f.__regid__] = ['', guests]
   101         f.rqlst.save_state()
   100         f.select.save_state()
   102         f.add_rql_restrictions()
   101         f.add_rql_restrictions()
   103         self.assertEqual(f.rqlst.as_string(),
   102         self.assertEqual(f.select.as_string(),
   104                           'DISTINCT Any  WHERE X is CWUser, (NOT X in_group B) OR (X in_group A, A eid %s)' % guests)
   103                           'DISTINCT Any  WHERE X is CWUser, (NOT X in_group B) OR (X in_group A, A eid %s)' % guests)
   105         f.rqlst.recover()
   104         f.select.recover()
   106         self.assertEqual(f.rqlst.as_string(),
   105         self.assertEqual(f.select.as_string(),
   107                           'DISTINCT Any  WHERE X is CWUser')
   106                           'DISTINCT Any  WHERE X is CWUser')
   108 
   107 
   109 
   108 
   110 
   109 
   111     def test_relationattribute(self):
   110     def test_relationattribute(self):
   112         f, (guests, managers) = self._in_group_facet(cls=facet.RelationAttributeFacet)
   111         f, (guests, managers) = self._in_group_facet(cls=facet.RelationAttributeFacet)
   113         self.assertEqual(f.vocabulary(),
   112         self.assertEqual(f.vocabulary(),
   114                           [(u'guests', u'guests'), (u'managers', u'managers')])
   113                           [(u'guests', u'guests'), (u'managers', u'managers')])
   115         # ensure rqlst is left unmodified
   114         # ensure rqlst is left unmodified
   116         self.assertEqual(f.rqlst.as_string(), 'DISTINCT Any  WHERE X is CWUser')
   115         self.assertEqual(f.select.as_string(), 'DISTINCT Any  WHERE X is CWUser')
   117         #rqlst = rset.syntax_tree()
   116         #rqlst = rset.syntax_tree()
   118         self.assertEqual(f.possible_values(),
   117         self.assertEqual(f.possible_values(),
   119                           ['guests', 'managers'])
   118                           ['guests', 'managers'])
   120         # ensure rqlst is left unmodified
   119         # ensure rqlst is left unmodified
   121         self.assertEqual(f.rqlst.as_string(), 'DISTINCT Any  WHERE X is CWUser')
   120         self.assertEqual(f.select.as_string(), 'DISTINCT Any  WHERE X is CWUser')
   122         f._cw.form[f.__regid__] = 'guests'
   121         f._cw.form[f.__regid__] = 'guests'
   123         f.add_rql_restrictions()
   122         f.add_rql_restrictions()
   124         # selection is cluttered because rqlst has been prepared for facet (it
   123         # selection is cluttered because rqlst has been prepared for facet (it
   125         # is not in real life)
   124         # is not in real life)
   126         self.assertEqual(f.rqlst.as_string(),
   125         self.assertEqual(f.select.as_string(),
   127                           "DISTINCT Any  WHERE X is CWUser, X in_group E, E name 'guests'")
   126                           "DISTINCT Any  WHERE X is CWUser, X in_group E, E name 'guests'")
   128 
   127 
   129 
   128 
   130     def test_attribute(self):
   129     def test_attribute(self):
   131         req, rset, rqlst, mainvar = self.prepare_rqlst()
   130         req, rset, rqlst, filtered_variable = self.prepare_rqlst()
   132         f = facet.AttributeFacet(req, rset=rset,
   131         f = facet.AttributeFacet(req, rset=rset,
   133                                  rqlst=rqlst.children[0],
   132                                  select=rqlst.children[0],
   134                                  filtered_variable=mainvar)
   133                                  filtered_variable=filtered_variable)
   135         f.rtype = 'login'
   134         f.rtype = 'login'
   136         self.assertEqual(f.vocabulary(),
   135         self.assertEqual(f.vocabulary(),
   137                           [(u'admin', u'admin'), (u'anon', u'anon')])
   136                           [(u'admin', u'admin'), (u'anon', u'anon')])
   138         # ensure rqlst is left unmodified
   137         # ensure rqlst is left unmodified
   139         self.assertEqual(rqlst.as_string(), 'DISTINCT Any  WHERE X is CWUser')
   138         self.assertEqual(rqlst.as_string(), 'DISTINCT Any  WHERE X is CWUser')
   144         self.assertEqual(rqlst.as_string(), 'DISTINCT Any  WHERE X is CWUser')
   143         self.assertEqual(rqlst.as_string(), 'DISTINCT Any  WHERE X is CWUser')
   145         req.form[f.__regid__] = 'admin'
   144         req.form[f.__regid__] = 'admin'
   146         f.add_rql_restrictions()
   145         f.add_rql_restrictions()
   147         # selection is cluttered because rqlst has been prepared for facet (it
   146         # selection is cluttered because rqlst has been prepared for facet (it
   148         # is not in real life)
   147         # is not in real life)
   149         self.assertEqual(f.rqlst.as_string(),
   148         self.assertEqual(f.select.as_string(),
   150                           "DISTINCT Any  WHERE X is CWUser, X login 'admin'")
   149                           "DISTINCT Any  WHERE X is CWUser, X login 'admin'")
   151 
   150 
   152 
   151 
   153 if __name__ == '__main__':
   152 if __name__ == '__main__':
   154     from logilab.common.testlib import unittest_main
   153     from logilab.common.testlib import unittest_main