web/test/unittest_facet.py
brancholdstable
changeset 6665 90f2f20367bc
parent 6433 95c40961df21
child 6435 71b2a3fe7ba1
equal deleted inserted replaced
6018:f4d1d5d9ccbb 6665:90f2f20367bc
       
     1 from cubicweb.devtools.testlib import CubicWebTC
       
     2 from cubicweb.web import facet
       
     3 
       
     4 class BaseFacetTC(CubicWebTC):
       
     5 
       
     6     def prepare_rqlst(self):
       
     7         req = self.request()
       
     8         rset = self.execute('CWUser X')
       
     9         rqlst = rset.syntax_tree().copy()
       
    10         req.vreg.rqlhelper.annotate(rqlst)
       
    11         mainvar, baserql = facet.prepare_facets_rqlst(rqlst, rset.args)
       
    12         self.assertEqual(mainvar.name, 'X')
       
    13         self.assertEqual(baserql, 'Any X WHERE X is CWUser')
       
    14         self.assertEqual(rqlst.as_string(), 'DISTINCT Any  WHERE X is CWUser')
       
    15         return req, rset, rqlst, mainvar
       
    16 
       
    17     def test_relation_simple(self):
       
    18         req, rset, rqlst, mainvar = self.prepare_rqlst()
       
    19         f = facet.RelationFacet(req, rset=rset,
       
    20                                 rqlst=rqlst.children[0],
       
    21                                 filtered_variable=mainvar)
       
    22         f.rtype = 'in_group'
       
    23         f.role = 'subject'
       
    24         f.target_attr = 'name'
       
    25         guests, managers = [eid for eid, in self.execute('CWGroup G ORDERBY GN '
       
    26                                                          'WHERE G name GN, G name IN ("guests", "managers")')]
       
    27         self.assertEqual(f.vocabulary(),
       
    28                           [(u'guests', guests), (u'managers', managers)])
       
    29         # ensure rqlst is left unmodified
       
    30         self.assertEqual(rqlst.as_string(), 'DISTINCT Any  WHERE X is CWUser')
       
    31         #rqlst = rset.syntax_tree()
       
    32         self.assertEqual(f.possible_values(),
       
    33                           [str(guests), str(managers)])
       
    34         # ensure rqlst is left unmodified
       
    35         self.assertEqual(rqlst.as_string(), 'DISTINCT Any  WHERE X is CWUser')
       
    36         req.form[f.__regid__] = str(guests)
       
    37         f.add_rql_restrictions()
       
    38         # selection is cluttered because rqlst has been prepared for facet (it
       
    39         # is not in real life)
       
    40         self.assertEqual(f.rqlst.as_string(),
       
    41                           'DISTINCT Any  WHERE X is CWUser, X in_group D, D eid %s' % guests)
       
    42 
       
    43     def test_relation_optional_rel(self):
       
    44         req = self.request()
       
    45         rset = self.execute('Any X,GROUP_CONCAT(GN) GROUPBY X '
       
    46                             'WHERE X in_group G?, G name GN, NOT G name "users"')
       
    47         rqlst = rset.syntax_tree().copy()
       
    48         req.vreg.rqlhelper.annotate(rqlst)
       
    49         mainvar, baserql = facet.prepare_facets_rqlst(rqlst, rset.args)
       
    50 
       
    51         f = facet.RelationFacet(req, rset=rset,
       
    52                                 rqlst=rqlst.children[0],
       
    53                                 filtered_variable=mainvar)
       
    54         f.rtype = 'in_group'
       
    55         f.role = 'subject'
       
    56         f.target_attr = 'name'
       
    57         guests, managers = [eid for eid, in self.execute('CWGroup G ORDERBY GN '
       
    58                                                          'WHERE G name GN, G name IN ("guests", "managers")')]
       
    59         self.assertEqual(f.vocabulary(),
       
    60                           [(u'guests', guests), (u'managers', managers)])
       
    61         # ensure rqlst is left unmodified
       
    62         self.assertEqual(rqlst.as_string(), 'DISTINCT Any  GROUPBY X WHERE X in_group G?, G name GN, NOT G name "users"')
       
    63         #rqlst = rset.syntax_tree()
       
    64         self.assertEqual(sorted(f.possible_values()),
       
    65                           [str(guests), str(managers)])
       
    66         # ensure rqlst is left unmodified
       
    67         self.assertEqual(rqlst.as_string(), 'DISTINCT Any  GROUPBY X WHERE X in_group G?, G name GN, NOT G name "users"')
       
    68         req.form[f.__regid__] = str(guests)
       
    69         f.add_rql_restrictions()
       
    70         # selection is cluttered because rqlst has been prepared for facet (it
       
    71         # is not in real life)
       
    72         self.assertEqual(f.rqlst.as_string(),
       
    73                           'DISTINCT Any  GROUPBY X WHERE X in_group G?, G name GN, NOT G name "users", X in_group D, D eid %s' % guests)
       
    74 
       
    75 
       
    76     def test_relationattribute(self):
       
    77         req, rset, rqlst, mainvar = self.prepare_rqlst()
       
    78         f = facet.RelationAttributeFacet(req, rset=rset,
       
    79                                          rqlst=rqlst.children[0],
       
    80                                          filtered_variable=mainvar)
       
    81         f.rtype = 'in_group'
       
    82         f.role = 'subject'
       
    83         f.target_attr = 'name'
       
    84         self.assertEqual(f.vocabulary(),
       
    85                           [(u'guests', u'guests'), (u'managers', u'managers')])
       
    86         # ensure rqlst is left unmodified
       
    87         self.assertEqual(rqlst.as_string(), 'DISTINCT Any  WHERE X is CWUser')
       
    88         #rqlst = rset.syntax_tree()
       
    89         self.assertEqual(f.possible_values(),
       
    90                           ['guests', 'managers'])
       
    91         # ensure rqlst is left unmodified
       
    92         self.assertEqual(rqlst.as_string(), 'DISTINCT Any  WHERE X is CWUser')
       
    93         req.form[f.__regid__] = 'guests'
       
    94         f.add_rql_restrictions()
       
    95         # selection is cluttered because rqlst has been prepared for facet (it
       
    96         # is not in real life)
       
    97         self.assertEqual(f.rqlst.as_string(),
       
    98                           "DISTINCT Any  WHERE X is CWUser, X in_group E, E name 'guests'")
       
    99 
       
   100 
       
   101     def test_attribute(self):
       
   102         req, rset, rqlst, mainvar = self.prepare_rqlst()
       
   103         f = facet.AttributeFacet(req, rset=rset,
       
   104                                  rqlst=rqlst.children[0],
       
   105                                  filtered_variable=mainvar)
       
   106         f.rtype = 'login'
       
   107         self.assertEqual(f.vocabulary(),
       
   108                           [(u'admin', u'admin'), (u'anon', u'anon')])
       
   109         # ensure rqlst is left unmodified
       
   110         self.assertEqual(rqlst.as_string(), 'DISTINCT Any  WHERE X is CWUser')
       
   111         #rqlst = rset.syntax_tree()
       
   112         self.assertEqual(f.possible_values(),
       
   113                           ['admin', 'anon'])
       
   114         # ensure rqlst is left unmodified
       
   115         self.assertEqual(rqlst.as_string(), 'DISTINCT Any  WHERE X is CWUser')
       
   116         req.form[f.__regid__] = 'admin'
       
   117         f.add_rql_restrictions()
       
   118         # selection is cluttered because rqlst has been prepared for facet (it
       
   119         # is not in real life)
       
   120         self.assertEqual(f.rqlst.as_string(),
       
   121                           "DISTINCT Any  WHERE X is CWUser, X login 'admin'")
       
   122 
       
   123 
       
   124 if __name__ == '__main__':
       
   125     from logilab.common.testlib import unittest_main
       
   126     unittest_main()