|
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() |