test/unittest_rqlrewrite.py
branchstable
changeset 3826 0c0c051863cb
parent 3443 34e451da9b5d
child 3877 7ca53fc72a0a
child 4212 ab6573088b4a
--- 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()