web/test/unittest_urlrewrite.py
author sylvain.thenault@logilab.fr
Fri, 03 Apr 2009 19:04:00 +0200
changeset 1228 91ae10ffb611
parent 0 b97547f5f1fa
child 1398 5fe84a5f7035
permissions -rw-r--r--
* refactor ms planner (renaming, reorganization) * fix a bug originaly demonstrated by test_version_depends_on * enhance crossed relation support, though there is still some bug renaming. some tests were actually wrong. Buggy tests (wether they fail or not, they are byggy) marked by XXXFIXME)

from logilab.common.testlib import TestCase, unittest_main

from cubicweb.devtools._apptest import FakeRequest
from cubicweb.devtools.apptest import EnvBasedTC

from cubicweb.web.views.urlrewrite import SimpleReqRewriter, SchemaBasedRewriter, rgx, rgx_action


class UrlRewriteTC(TestCase):

    def test_auto_extend_rules(self):
        class Rewriter(SimpleReqRewriter):
            rules = [
                ('foo', dict(rql='Foo F')),
                ('/index', dict(vid='index2')),
                ]
        rules = []
        for pattern, values in Rewriter.rules:
            if hasattr(pattern, 'pattern'):
                pattern = pattern.pattern
            rules.append((pattern, values))
        self.assertListEquals(rules, [
            ('foo' , dict(rql='Foo F')),
            ('/index' , dict(vid='index2')),
            ('/schema', {'vid': 'schema'}),
            ('/myprefs', dict(vid='epropertiesform')),
            ('/siteconfig', dict(vid='systemepropertiesform')),
            ('/manage', dict(vid='manage')),
            ('/notfound', {'vid': '404'}),
            ('/error', {'vid': 'error'}),
            ('/schema/([^/]+?)/?$', {'rql': r'Any X WHERE X is EEType, X name "\1"', 'vid': 'eschema'}),
            ('/add/([^/]+?)/?$' , dict(vid='creation', etype=r'\1')),
            ('/doc/images/(.+?)/?$', dict(fid='\\1', vid='wdocimages')),
            ('/doc/?$', dict(fid='main', vid='wdoc')),
            ('/doc/(.+?)/?$', dict(fid='\\1', vid='wdoc')),
            ('/changelog/?$', dict(vid='changelog')),
            # now in SchemaBasedRewriter
            #('/search/(.+)$', dict(rql=r'Any X WHERE X has_text "\1"')), 
            ])


    def test_no_extend_rules(self):
        class Rewriter(SimpleReqRewriter):
            ignore_baseclass_rules = True
            rules = [
                ('foo', dict(rql='Foo F')),
                ('/index', dict(vid='index2')),
                ]
        self.assertListEquals(Rewriter.rules, [
            ('foo' , dict(rql='Foo F')),
            ('/index' , dict(vid='index2')),
            ])

    def test_basic_transformation(self):
        """test simple string-based rewrite"""
        rewriter = SimpleReqRewriter()
        req = FakeRequest()
        self.assertRaises(KeyError, rewriter.rewrite, req, '/view?vid=whatever')
        self.assertEquals(req.form, {})
        rewriter.rewrite(req, '/index')
        self.assertEquals(req.form, {'vid' : "index"})

    def test_regexp_transformation(self):
        """test regexp-based rewrite"""
        rewriter = SimpleReqRewriter()
        req = FakeRequest()
        rewriter.rewrite(req, '/add/Task')
        self.assertEquals(req.form, {'vid' : "creation", 'etype' : "Task"})
        req = FakeRequest()
        rewriter.rewrite(req, '/add/Task/')
        self.assertEquals(req.form, {'vid' : "creation", 'etype' : "Task"})




class RgxActionRewriteTC(EnvBasedTC):

    def setup_database(self):
        self.p1 = self.create_user(u'user1')
        self.p1.set_attributes(firstname=u'joe', surname=u'Dalton')
        self.p2 = self.create_user(u'user2')
        self.p2.set_attributes(firstname=u'jack', surname=u'Dalton')

    def test_rgx_action_with_transforms(self):
        class TestSchemaBasedRewriter(SchemaBasedRewriter):
            rules = [
                (rgx('/(?P<sn>\w+)/(?P<fn>\w+)'), rgx_action(r'Any X WHERE X surname %(sn)s, X firstname %(fn)s',
                                                                             argsgroups=('sn', 'fn'),
                                                                             transforms={'sn' : unicode.capitalize,
                                                                                         'fn' : unicode.lower,})),
                ]
        rewriter = TestSchemaBasedRewriter()
        req = self.request()
        pmid, rset = rewriter.rewrite(req, u'/DaLToN/JoE')
        self.assertEquals(len(rset), 1)
        self.assertEquals(rset[0][0], self.p1.eid)
        
    

if __name__ == '__main__':
    unittest_main()