# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved.# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr## This file is part of CubicWeb.## CubicWeb is free software: you can redistribute it and/or modify it under the# terms of the GNU Lesser General Public License as published by the Free# Software Foundation, either version 2.1 of the License, or (at your option)# any later version.## CubicWeb is distributed in the hope that it will be useful, but WITHOUT# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more# details.## You should have received a copy of the GNU Lesser General Public License along# with CubicWeb. If not, see <http://www.gnu.org/licenses/>.fromlogilab.common.testlibimportTestCase,unittest_mainfromcubicweb.devtools.testlibimportCubicWebTCfromcubicweb.devtools.fakeimportFakeRequestfromcubicweb.web.views.urlrewriteimportSimpleReqRewriter,SchemaBasedRewriter,rgx,rgx_actionclassUrlRewriteTC(CubicWebTC):deftest_auto_extend_rules(self):classRewriter(SimpleReqRewriter):rules=[('foo',dict(rql='Foo F')),('/index',dict(vid='index2')),]rules=[]forpattern,valuesinRewriter.rules:ifhasattr(pattern,'pattern'):pattern=pattern.patternrules.append((pattern,values))self.assertListEqual(rules,[('foo',dict(rql='Foo F')),('/index',dict(vid='index2')),('/_',dict(vid='manage')),('/_registry',dict(vid='registry')),('/schema',dict(vid='schema')),('/myprefs',dict(vid='propertiesform')),('/siteconfig',dict(vid='systempropertiesform')),('/siteinfo',dict(vid='siteinfo')),('/manage',dict(vid='manage')),('/notfound',dict(vid='404')),('/error',dict(vid='error')),('/sparql',dict(vid='sparql')),('/processinfo',dict(vid='processinfo')),('/cwuser$',{'vid':'cw.users-and-groups-management','tab':'cw_users_management'}),('/cwgroup$',{'vid':'cw.users-and-groups-management','tab':'cw_groups_management'}),('/cwsource$',{'vid':'cw.sources-management'}),('/schema/([^/]+?)/?$',{'rql':r'Any X WHERE X is CWEType, X name "\1"','vid':'primary'}),('/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"')),])deftest_no_extend_rules(self):classRewriter(SimpleReqRewriter):ignore_baseclass_rules=Truerules=[('foo',dict(rql='Foo F')),('/index',dict(vid='index2')),]self.assertListEqual(Rewriter.rules,[('foo',dict(rql='Foo F')),('/index',dict(vid='index2')),])deftest_basic_transformation(self):"""test simple string-based rewrite"""req=FakeRequest()rewriter=SimpleReqRewriter(req)self.assertRaises(KeyError,rewriter.rewrite,req,'/view?vid=whatever')self.assertEqual(req.form,{})rewriter.rewrite(req,'/index')self.assertEqual(req.form,{'vid':"index"})deftest_regexp_transformation(self):"""test regexp-based rewrite"""req=FakeRequest()rewriter=SimpleReqRewriter(req)rewriter.rewrite(req,'/add/Task')self.assertEqual(req.form,{'vid':"creation",'etype':"Task"})req=FakeRequest()rewriter.rewrite(req,'/add/Task/')self.assertEqual(req.form,{'vid':"creation",'etype':"Task"})classRgxActionRewriteTC(CubicWebTC):defsetup_database(self):req=self.request()self.p1=self.create_user(req,u'user1')self.p1.set_attributes(firstname=u'joe',surname=u'Dalton')self.p2=self.create_user(req,u'user2')self.p2.set_attributes(firstname=u'jack',surname=u'Dalton')deftest_rgx_action_with_transforms(self):classTestSchemaBasedRewriter(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,})),]req=self.request()rewriter=TestSchemaBasedRewriter(req)pmid,rset=rewriter.rewrite(req,u'/DaLToN/JoE')self.assertEqual(len(rset),1)self.assertEqual(rset[0][0],self.p1.eid)deftest_inheritance_precedence(self):RQL1='Any C WHERE C is CWEType'RQL2='Any C WHERE C is CWUser'classBaseRewriter(SchemaBasedRewriter):rules=[(rgx('/collector(.*)'),rgx_action(rql=RQL1,form=dict(vid='baseindex')),),]classRewriter(BaseRewriter):rules=[(rgx('/collector/something(/?)'),rgx_action(rql=RQL2,form=dict(vid='index')),),]req=self.request()rewriter=Rewriter(req)pmid,rset=rewriter.rewrite(req,'/collector')self.assertEqual(rset.rql,RQL1)self.assertEqual(req.form,{'vid':"baseindex"})pmid,rset=rewriter.rewrite(req,'/collector/something')self.assertEqual(rset.rql,RQL2)self.assertEqual(req.form,{'vid':"index"})pmid,rset=rewriter.rewrite(req,'/collector/something/')self.assertEqual(req.form,{'vid':"index"})self.assertEqual(rset.rql,RQL2)pmid,rset=rewriter.rewrite(req,'/collector/somethingelse/')self.assertEqual(rset.rql,RQL1)self.assertEqual(req.form,{'vid':"baseindex"})deftest_inheritance_precedence_same_rgx(self):RQL1='Any C WHERE C is CWEType'RQL2='Any C WHERE C is CWUser'classBaseRewriter(SchemaBasedRewriter):rules=[(rgx('/collector(.*)'),rgx_action(rql=RQL1,form=dict(vid='baseindex')),),]classRewriter(BaseRewriter):rules=[(rgx('/collector(.*)'),rgx_action(rql=RQL2,form=dict(vid='index')),),]req=self.request()rewriter=Rewriter(req)pmid,rset=rewriter.rewrite(req,'/collector')self.assertEqual(rset.rql,RQL2)self.assertEqual(req.form,{'vid':"index"})pmid,rset=rewriter.rewrite(req,'/collector/something')self.assertEqual(rset.rql,RQL2)self.assertEqual(req.form,{'vid':"index"})pmid,rset=rewriter.rewrite(req,'/collector/something/')self.assertEqual(req.form,{'vid':"index"})self.assertEqual(rset.rql,RQL2)pmid,rset=rewriter.rewrite(req,'/collector/somethingelse/')self.assertEqual(rset.rql,RQL2)self.assertEqual(req.form,{'vid':"index"})if__name__=='__main__':unittest_main()