--- a/test/unittest_rqlrewrite.py Thu Nov 12 12:08:43 2009 +0100
+++ b/test/unittest_rqlrewrite.py Thu Nov 12 12:15:19 2009 +0100
@@ -11,6 +11,7 @@
from rql import parse, nodes, RQLHelper
from cubicweb import Unauthorized
+from cubicweb.schema import RRQLExpression
from cubicweb.rqlrewrite import RQLRewriter
from cubicweb.devtools import repotest, TestServerConfiguration
@@ -32,7 +33,7 @@
return {1: 'CWUser',
2: 'Card'}[eid]
-def rewrite(rqlst, snippets_map, kwargs):
+def rewrite(rqlst, snippets_map, kwargs, existingvars=None):
class FakeVReg:
schema = schema
@staticmethod
@@ -47,12 +48,15 @@
rqlhelper.simplify(rqlst, needcopy)
rewriter = RQLRewriter(mock_object(vreg=FakeVReg, user=(mock_object(eid=1))))
for v, snippets in snippets_map.items():
- snippets_map[v] = [mock_object(snippet_rqlst=parse('Any X WHERE '+snippet).children[0],
- expression='Any X WHERE '+snippet)
+ snippets_map[v] = [isinstance(snippet, basestring)
+ and mock_object(snippet_rqlst=parse('Any X WHERE '+snippet).children[0],
+ expression='Any X WHERE '+snippet)
+ or snippet
for snippet in snippets]
rqlhelper.compute_solutions(rqlst.children[0], {'eid': eid_func_map}, kwargs=kwargs)
solutions = rqlst.children[0].solutions
- rewriter.rewrite(rqlst.children[0], snippets_map.items(), solutions, kwargs)
+ rewriter.rewrite(rqlst.children[0], snippets_map.items(), solutions, kwargs,
+ existingvars)
test_vrefs(rqlst.children[0])
return rewriter.rewritten
@@ -241,6 +245,61 @@
u"Any X,C WHERE X? documented_by C, C is Card WITH X BEING (Any X WHERE X concerne A, X is Affaire)")
+ def test_rrqlexpr_nonexistant_subject_1(self):
+ constraint = RRQLExpression('S owned_by U')
+ rqlst = parse('Card C')
+ rewrite(rqlst, {('C', 'S'): (constraint,)}, {}, 'SU')
+ self.failUnlessEqual(rqlst.as_string(),
+ u"Any C WHERE C is Card, A eid %(B)s, EXISTS(C owned_by A)")
+ rqlst = parse('Card C')
+ rewrite(rqlst, {('C', 'S'): (constraint,)}, {}, 'OU')
+ self.failUnlessEqual(rqlst.as_string(),
+ u"Any C WHERE C is Card")
+ rqlst = parse('Card C')
+ rewrite(rqlst, {('C', 'S'): (constraint,)}, {}, 'SOU')
+ self.failUnlessEqual(rqlst.as_string(),
+ u"Any C WHERE C is Card, A eid %(B)s, EXISTS(C owned_by A)")
+
+ def test_rrqlexpr_nonexistant_subject_2(self):
+ constraint = RRQLExpression('S owned_by U, O owned_by U, O is Card')
+ rqlst = parse('Card C')
+ rewrite(rqlst, {('C', 'S'): (constraint,)}, {}, 'SU')
+ self.failUnlessEqual(rqlst.as_string(),
+ 'Any C WHERE C is Card, A eid %(B)s, EXISTS(C owned_by A)')
+ rqlst = parse('Card C')
+ rewrite(rqlst, {('C', 'S'): (constraint,)}, {}, 'OU')
+ self.failUnlessEqual(rqlst.as_string(),
+ 'Any C WHERE C is Card, B eid %(D)s, EXISTS(A owned_by B, A is Card)')
+ rqlst = parse('Card C')
+ rewrite(rqlst, {('C', 'S'): (constraint,)}, {}, 'SOU')
+ self.failUnlessEqual(rqlst.as_string(),
+ 'Any C WHERE C is Card, A eid %(B)s, EXISTS(C owned_by A, D owned_by A, D is Card)')
+
+ def test_rrqlexpr_nonexistant_subject_3(self):
+ constraint = RRQLExpression('U in_group G, G name "users"')
+ rqlst = parse('Card C')
+ rewrite(rqlst, {('C', 'S'): (constraint,)}, {}, 'SU')
+ self.failUnlessEqual(rqlst.as_string(),
+ u'Any C WHERE C is Card, A eid %(B)s, EXISTS(A in_group D, D name "users", D is CWGroup)')
+
+ def test_rrqlexpr_nonexistant_subject_4(self):
+ constraint = RRQLExpression('U in_group G, G name "users", S owned_by U')
+ rqlst = parse('Card C')
+ rewrite(rqlst, {('C', 'S'): (constraint,)}, {}, 'SU')
+ self.failUnlessEqual(rqlst.as_string(),
+ u'Any C WHERE C is Card, A eid %(B)s, EXISTS(A in_group D, D name "users", C owned_by A, D is CWGroup)')
+ rqlst = parse('Card C')
+ rewrite(rqlst, {('C', 'S'): (constraint,)}, {}, 'OU')
+ self.failUnlessEqual(rqlst.as_string(),
+ u'Any C WHERE C is Card, A eid %(B)s, EXISTS(A in_group D, D name "users", D is CWGroup)')
+
+ def test_rrqlexpr_nonexistant_subject_5(self):
+ constraint = RRQLExpression('S owned_by Z, O owned_by Z, O is Card')
+ rqlst = parse('Card C')
+ rewrite(rqlst, {('C', 'S'): (constraint,)}, {}, 'S')
+ self.failUnlessEqual(rqlst.as_string(),
+ u"Any C WHERE C is Card, EXISTS(C owned_by A, A is CWUser)")
+
if __name__ == '__main__':
unittest_main()