web/test/unittest_facet.py
branchstable
changeset 6119 b217635d3b28
child 6338 b520b86113e3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/test/unittest_facet.py	Wed Aug 18 13:58:12 2010 +0200
@@ -0,0 +1,88 @@
+from cubicweb.devtools.testlib import CubicWebTC
+from cubicweb.web import facet
+
+class BaseFacetTC(CubicWebTC):
+
+    def prepare_rqlst(self):
+        req = self.request()
+        rset = self.execute('CWUser X')
+        rqlst = rset.syntax_tree().copy()
+        req.vreg.rqlhelper.annotate(rqlst)
+        mainvar, baserql = facet.prepare_facets_rqlst(rqlst, rset.args)
+        self.assertEquals(mainvar.name, 'X')
+        self.assertEquals(baserql, 'Any X WHERE X is CWUser')
+        self.assertEquals(rqlst.as_string(), 'DISTINCT Any  WHERE X is CWUser')
+        return req, rset, rqlst, mainvar
+
+    def test_relation(self):
+        req, rset, rqlst, mainvar = self.prepare_rqlst()
+        f = facet.RelationFacet(req, rset=rset,
+                                rqlst=rqlst.children[0],
+                                filtered_variable=mainvar)
+        f.rtype = 'in_group'
+        f.role = 'subject'
+        f.target_attr = 'name'
+        guests, managers = [eid for eid, in self.execute('CWGroup G ORDERBY GN '
+                                                         'WHERE G name GN, G name IN ("guests", "managers")')]
+        self.assertEquals(f.vocabulary(),
+                          [(u'guests', guests), (u'managers', managers)])
+        # ensure rqlst is left unmodified
+        self.assertEquals(rqlst.as_string(), 'DISTINCT Any  WHERE X is CWUser')
+        #rqlst = rset.syntax_tree()
+        self.assertEquals(f.possible_values(),
+                          [str(guests), str(managers)])
+        # ensure rqlst is left unmodified
+        self.assertEquals(rqlst.as_string(), 'DISTINCT Any  WHERE X is CWUser')
+        req.form[f.__regid__] = str(guests)
+        f.add_rql_restrictions()
+        # selection is cluttered because rqlst has been prepared for facet (it
+        # is not in real life)
+        self.assertEquals(f.rqlst.as_string(),
+                          'DISTINCT Any  WHERE X is CWUser, X in_group D, D eid %s' % guests)
+
+    def test_relationattribute(self):
+        req, rset, rqlst, mainvar = self.prepare_rqlst()
+        f = facet.RelationAttributeFacet(req, rset=rset,
+                                         rqlst=rqlst.children[0],
+                                         filtered_variable=mainvar)
+        f.rtype = 'in_group'
+        f.role = 'subject'
+        f.target_attr = 'name'
+        self.assertEquals(f.vocabulary(),
+                          [(u'guests', u'guests'), (u'managers', u'managers')])
+        # ensure rqlst is left unmodified
+        self.assertEquals(rqlst.as_string(), 'DISTINCT Any  WHERE X is CWUser')
+        #rqlst = rset.syntax_tree()
+        self.assertEquals(f.possible_values(),
+                          ['guests', 'managers'])
+        # ensure rqlst is left unmodified
+        self.assertEquals(rqlst.as_string(), 'DISTINCT Any  WHERE X is CWUser')
+        req.form[f.__regid__] = 'guests'
+        f.add_rql_restrictions()
+        # selection is cluttered because rqlst has been prepared for facet (it
+        # is not in real life)
+        self.assertEquals(f.rqlst.as_string(),
+                          "DISTINCT Any  WHERE X is CWUser, X in_group E, E name 'guests'")
+
+
+    def test_attribute(self):
+        req, rset, rqlst, mainvar = self.prepare_rqlst()
+        f = facet.AttributeFacet(req, rset=rset,
+                                 rqlst=rqlst.children[0],
+                                 filtered_variable=mainvar)
+        f.rtype = 'login'
+        self.assertEquals(f.vocabulary(),
+                          [(u'admin', u'admin'), (u'anon', u'anon')])
+        # ensure rqlst is left unmodified
+        self.assertEquals(rqlst.as_string(), 'DISTINCT Any  WHERE X is CWUser')
+        #rqlst = rset.syntax_tree()
+        self.assertEquals(f.possible_values(),
+                          ['admin', 'anon'])
+        # ensure rqlst is left unmodified
+        self.assertEquals(rqlst.as_string(), 'DISTINCT Any  WHERE X is CWUser')
+        req.form[f.__regid__] = 'admin'
+        f.add_rql_restrictions()
+        # selection is cluttered because rqlst has been prepared for facet (it
+        # is not in real life)
+        self.assertEquals(f.rqlst.as_string(),
+                          "DISTINCT Any  WHERE X is CWUser, X login 'admin'")