web/test/unittest_urlrewrite.py
changeset 11057 0b59724cb3f2
parent 11052 058bb3dc685f
child 11058 23eb30449fe5
equal deleted inserted replaced
11052:058bb3dc685f 11057:0b59724cb3f2
     1 # copyright 2003-2014 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
       
     2 # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
       
     3 #
       
     4 # This file is part of CubicWeb.
       
     5 #
       
     6 # CubicWeb is free software: you can redistribute it and/or modify it under the
       
     7 # terms of the GNU Lesser General Public License as published by the Free
       
     8 # Software Foundation, either version 2.1 of the License, or (at your option)
       
     9 # any later version.
       
    10 #
       
    11 # CubicWeb is distributed in the hope that it will be useful, but WITHOUT
       
    12 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
       
    13 # FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
       
    14 # details.
       
    15 #
       
    16 # You should have received a copy of the GNU Lesser General Public License along
       
    17 # with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
       
    18 
       
    19 from six import text_type
       
    20 
       
    21 from logilab.common import tempattr
       
    22 
       
    23 from cubicweb.devtools.testlib import CubicWebTC
       
    24 from cubicweb.devtools.fake import FakeRequest
       
    25 
       
    26 from cubicweb.web.views.urlrewrite import (SimpleReqRewriter, SchemaBasedRewriter,
       
    27                                            rgx, rgx_action)
       
    28 
       
    29 
       
    30 class UrlRewriteTC(CubicWebTC):
       
    31 
       
    32     def test_auto_extend_rules(self):
       
    33         class Rewriter(SimpleReqRewriter):
       
    34             rules = [
       
    35                 ('foo', dict(rql='Foo F')),
       
    36                 ('/index', dict(vid='index2')),
       
    37                 ]
       
    38         rules = []
       
    39         for pattern, values in Rewriter.rules:
       
    40             if hasattr(pattern, 'pattern'):
       
    41                 pattern = pattern.pattern
       
    42             rules.append((pattern, values))
       
    43         self.assertListEqual(rules, [
       
    44             ('foo' , dict(rql='Foo F')),
       
    45             ('/index' , dict(vid='index2')),
       
    46             ('/_', dict(vid='manage')),
       
    47             ('/_registry', dict(vid='registry')),
       
    48             ('/schema', dict(vid='schema')),
       
    49             ('/myprefs', dict(vid='propertiesform')),
       
    50             ('/siteconfig', dict(vid='systempropertiesform')),
       
    51             ('/siteinfo', dict(vid='siteinfo')),
       
    52             ('/manage', dict(vid='manage')),
       
    53             ('/notfound', dict(vid='404')),
       
    54             ('/error', dict(vid='error')),
       
    55             ('/sparql', dict(vid='sparql')),
       
    56             ('/processinfo', dict(vid='processinfo')),
       
    57             ('/cwuser$', {'vid': 'cw.users-and-groups-management',
       
    58                           'tab': 'cw_users_management'}),
       
    59             ('/cwgroup$', {'vid': 'cw.users-and-groups-management',
       
    60                            'tab': 'cw_groups_management'}),
       
    61             ('/cwsource$', {'vid': 'cw.sources-management'}),
       
    62             ('/schema/([^/]+?)/?$', {'rql': r'Any X WHERE X is CWEType, X name "\1"', 'vid': 'primary'}),
       
    63             ('/add/([^/]+?)/?$' , dict(vid='creation', etype=r'\1')),
       
    64             ('/doc/images/(.+?)/?$', dict(fid='\\1', vid='wdocimages')),
       
    65             ('/doc/?$', dict(fid='main', vid='wdoc')),
       
    66             ('/doc/(.+?)/?$', dict(fid='\\1', vid='wdoc')),
       
    67             # now in SchemaBasedRewriter
       
    68             #('/search/(.+)$', dict(rql=r'Any X WHERE X has_text "\1"')),
       
    69             ])
       
    70 
       
    71 
       
    72     def test_no_extend_rules(self):
       
    73         class Rewriter(SimpleReqRewriter):
       
    74             ignore_baseclass_rules = True
       
    75             rules = [
       
    76                 ('foo', dict(rql='Foo F')),
       
    77                 ('/index', dict(vid='index2')),
       
    78                 ]
       
    79         self.assertListEqual(Rewriter.rules, [
       
    80             ('foo' , dict(rql='Foo F')),
       
    81             ('/index' , dict(vid='index2')),
       
    82             ])
       
    83 
       
    84     def test_basic_transformation(self):
       
    85         """test simple string-based rewrite"""
       
    86         req = FakeRequest()
       
    87         rewriter = SimpleReqRewriter(req)
       
    88         self.assertRaises(KeyError, rewriter.rewrite, req, '/view?vid=whatever')
       
    89         self.assertEqual(req.form, {})
       
    90         rewriter.rewrite(req, '/index')
       
    91         self.assertEqual(req.form, {'vid' : "index"})
       
    92 
       
    93     def test_regexp_transformation(self):
       
    94         """test regexp-based rewrite"""
       
    95         req = FakeRequest()
       
    96         rewriter = SimpleReqRewriter(req)
       
    97         rewriter.rewrite(req, '/add/Task')
       
    98         self.assertEqual(req.form, {'vid' : "creation", 'etype' : "Task"})
       
    99         req = FakeRequest()
       
   100         rewriter.rewrite(req, '/add/Task/')
       
   101         self.assertEqual(req.form, {'vid' : "creation", 'etype' : "Task"})
       
   102 
       
   103     def test_inheritance(self):
       
   104         BaseTransition = self.vreg['etypes'].etype_class('BaseTransition')
       
   105         with self.admin_access.web_request() as req:
       
   106             x = req.create_entity('WorkflowTransition', name=u'test')
       
   107             ctrlid, rset = self.app.url_resolver.process(req, 'basetransition/%s' % x.eid)
       
   108             self.assertEqual(ctrlid, 'view')
       
   109             self.assertEqual(x.eid, rset[0][0])
       
   110             # cw_rest_attr_info is cached but clear_cache doesn't like cached class
       
   111             # method
       
   112             del BaseTransition._cw_rest_attr_info_cache_
       
   113             try:
       
   114                 with tempattr(BaseTransition, 'rest_attr', 'name'):
       
   115 
       
   116                     ctrlid, rset = self.app.url_resolver.process(req, 'basetransition/%s' % x.name)
       
   117                     self.assertEqual(ctrlid, 'view')
       
   118                     self.assertEqual(x.eid, rset[0][0])
       
   119             finally:
       
   120                 del BaseTransition._cw_rest_attr_info_cache_
       
   121 
       
   122 
       
   123 
       
   124 class RgxActionRewriteTC(CubicWebTC):
       
   125 
       
   126     def setup_database(self):
       
   127         with self.admin_access.repo_cnx() as cnx:
       
   128             p1 = self.create_user(cnx, u'user1')
       
   129             p1.cw_set(firstname=u'joe', surname=u'Dalton')
       
   130             p2 = self.create_user(cnx, u'user2')
       
   131             p2.cw_set(firstname=u'jack', surname=u'Dalton')
       
   132             self.p1eid = p1.eid
       
   133             cnx.commit()
       
   134 
       
   135     def test_rgx_action_with_transforms(self):
       
   136         class TestSchemaBasedRewriter(SchemaBasedRewriter):
       
   137             rules = [
       
   138                 (rgx('/(?P<sn>\w+)/(?P<fn>\w+)'),
       
   139                  rgx_action(r'Any X WHERE X surname %(sn)s, '
       
   140                             'X firstname %(fn)s',
       
   141                             argsgroups=('sn', 'fn'),
       
   142                             transforms={'sn' : text_type.capitalize,
       
   143                                         'fn' : text_type.lower,})),
       
   144                 ]
       
   145         with self.admin_access.web_request() as req:
       
   146             rewriter = TestSchemaBasedRewriter(req)
       
   147             _pmid, rset = rewriter.rewrite(req, u'/DaLToN/JoE')
       
   148             self.assertEqual(len(rset), 1)
       
   149             self.assertEqual(rset[0][0], self.p1eid)
       
   150             self.assertEqual(rset.description[0][0], 'CWUser')
       
   151 
       
   152     def test_inheritance_precedence(self):
       
   153         RQL1 = 'Any C WHERE C is CWEType'
       
   154         RQL2 = 'Any C WHERE C is CWUser'
       
   155 
       
   156         class BaseRewriter(SchemaBasedRewriter):
       
   157             rules = [
       
   158                (rgx('/collector(.*)'),
       
   159                 rgx_action(rql=RQL1,
       
   160                     form=dict(vid='baseindex')),
       
   161                 ),
       
   162                 ]
       
   163         class Rewriter(BaseRewriter):
       
   164             rules = [
       
   165                (rgx('/collector/something(/?)'),
       
   166                 rgx_action(rql=RQL2,
       
   167                     form=dict(vid='index')),
       
   168                 ),
       
   169                 ]
       
   170 
       
   171         with self.admin_access.web_request() as req:
       
   172             rewriter = Rewriter(req)
       
   173             _pmid, rset = rewriter.rewrite(req, '/collector')
       
   174             self.assertEqual(rset.rql, RQL1)
       
   175             self.assertEqual(req.form, {'vid' : "baseindex"})
       
   176             _pmid, rset = rewriter.rewrite(req, '/collector/something')
       
   177             self.assertEqual(rset.rql, RQL2)
       
   178             self.assertEqual(req.form, {'vid' : "index"})
       
   179             _pmid, rset = rewriter.rewrite(req, '/collector/something/')
       
   180             self.assertEqual(req.form, {'vid' : "index"})
       
   181             self.assertEqual(rset.rql, RQL2)
       
   182             _pmid, rset = rewriter.rewrite(req, '/collector/somethingelse/')
       
   183             self.assertEqual(rset.rql, RQL1)
       
   184             self.assertEqual(req.form, {'vid' : "baseindex"})
       
   185 
       
   186     def test_inheritance_precedence_same_rgx(self):
       
   187         RQL1 = 'Any C WHERE C is CWEType'
       
   188         RQL2 = 'Any C WHERE C is CWUser'
       
   189 
       
   190         class BaseRewriter(SchemaBasedRewriter):
       
   191             rules = [
       
   192                (rgx('/collector(.*)'),
       
   193                 rgx_action(rql=RQL1,
       
   194                     form=dict(vid='baseindex')),
       
   195                 ),
       
   196                 ]
       
   197         class Rewriter(BaseRewriter):
       
   198             rules = [
       
   199                (rgx('/collector(.*)'),
       
   200                 rgx_action(rql=RQL2,
       
   201                     form=dict(vid='index')),
       
   202                 ),
       
   203                 ]
       
   204 
       
   205         with self.admin_access.web_request() as req:
       
   206             rewriter = Rewriter(req)
       
   207             _pmid, rset = rewriter.rewrite(req, '/collector')
       
   208             self.assertEqual(rset.rql, RQL2)
       
   209             self.assertEqual(req.form, {'vid' : "index"})
       
   210             _pmid, rset = rewriter.rewrite(req, '/collector/something')
       
   211             self.assertEqual(rset.rql, RQL2)
       
   212             self.assertEqual(req.form, {'vid' : "index"})
       
   213             _pmid, rset = rewriter.rewrite(req, '/collector/something/')
       
   214             self.assertEqual(req.form, {'vid' : "index"})
       
   215             self.assertEqual(rset.rql, RQL2)
       
   216             _pmid, rset = rewriter.rewrite(req, '/collector/somethingelse/')
       
   217             self.assertEqual(rset.rql, RQL2)
       
   218             self.assertEqual(req.form, {'vid' : "index"})
       
   219 
       
   220 
       
   221 if __name__ == '__main__':
       
   222     from logilab.common.testlib import unittest_main
       
   223     unittest_main()