# -*- coding: utf-8 -*-# copyright 2003-2014 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/>."""Unit tests for url publishing service"""importrefromlogilab.common.testlibimportunittest_mainfromcubicweb.rsetimportResultSetfromcubicweb.devtools.testlibimportCubicWebTCfromcubicweb.devtools.fakeimportFakeRequestfromcubicweb.webimportNotFound,Redirectfromcubicweb.web.views.urlrewriteimportSimpleReqRewriterclassURLPublisherTC(CubicWebTC):"""test suite for QSPreProcessor"""defsetup_database(self):withself.admin_access.repo_cnx()ascnx:self.create_user(cnx,u'ÿsaÿe')b=cnx.create_entity('BlogEntry',title=u'hell\'o',content=u'blabla')# take care: Tag's name normalized to lower casec=cnx.create_entity('Tag',name=u'yo')cnx.execute('SET C tags B WHERE C eid %(c)s, B eid %(b)s',{'c':c.eid,'b':b.eid})cnx.commit()defprocess(self,req,url):returnself.app.url_resolver.process(req,url)deftest_raw_path(self):"""tests raw path resolution'"""withself.admin_access.web_request()asreq:self.assertEqual(self.process(req,'view'),('view',None))self.assertEqual(self.process(req,'edit'),('edit',None))self.assertRaises(NotFound,self.process,req,'whatever')deftest_eid_path(self):"""tests eid path resolution"""withself.admin_access.web_request()asreq:self.assertIsInstance(self.process(req,'123')[1],ResultSet)self.assertEqual(len(self.process(req,'123')[1]),1)self.assertRaises(NotFound,self.process,req,'123/345')self.assertRaises(NotFound,self.process,req,'not_eid')deftest_rest_path_etype(self):"""tests the rest path resolution"""withself.admin_access.web_request()asreq:ctrl,rset=self.process(req,'CWEType')self.assertEqual(ctrl,'view')self.assertEqual(rset.description[0][0],'CWEType')self.assertEqual("Any X,AA,AB ORDERBY AA WHERE X is_instance_of CWEType, ""X name AA, X modification_date AB",rset.printable_rql())deftest_rest_path_by_attr(self):withself.admin_access.web_request()asreq:ctrl,rset=self.process(req,'CWUser/login/admin')self.assertEqual(ctrl,'view')self.assertEqual(len(rset),1)self.assertEqual(rset.description[0][0],'CWUser')self.assertEqual('Any X,AA,AB,AC,AD WHERE X is_instance_of CWUser, ''X login AA, X firstname AB, X surname AC, ''X modification_date AD, X login "admin"',rset.printable_rql())deftest_rest_path_unique_attr(self):withself.admin_access.web_request()asreq:ctrl,rset=self.process(req,'cwuser/admin')self.assertEqual(ctrl,'view')self.assertEqual(len(rset),1)self.assertEqual(rset.description[0][0],'CWUser')self.assertEqual('Any X,AA,AB,AC,AD WHERE X is_instance_of CWUser, ''X login AA, X firstname AB, X surname AC, ''X modification_date AD, X login "admin"',rset.printable_rql())deftest_rest_path_eid(self):withself.admin_access.web_request()asreq:ctrl,rset=self.process(req,'cwuser/eid/%s'%self.user(req).eid)self.assertEqual(ctrl,'view')self.assertEqual(len(rset),1)self.assertEqual(rset.description[0][0],'CWUser')self.assertEqual('Any X,AA,AB,AC,AD WHERE X is_instance_of CWUser, ''X login AA, X firstname AB, X surname AC, ''X modification_date AD, X eid %s'%rset[0][0],rset.printable_rql())deftest_rest_path_non_ascii_paths(self):withself.admin_access.web_request()asreq:ctrl,rset=self.process(req,'CWUser/login/%C3%BFsa%C3%BFe')self.assertEqual(ctrl,'view')self.assertEqual(len(rset),1)self.assertEqual(rset.description[0][0],'CWUser')self.assertEqual(u'Any X,AA,AB,AC,AD WHERE X is_instance_of CWUser, 'u'X login AA, X firstname AB, X surname AC, 'u'X modification_date AD, X login "\xffsa\xffe"',rset.printable_rql())deftest_rest_path_quoted_paths(self):withself.admin_access.web_request()asreq:ctrl,rset=self.process(req,'BlogEntry/title/hell%27o')self.assertEqual(ctrl,'view')self.assertEqual(len(rset),1)self.assertEqual(rset.description[0][0],'BlogEntry')self.assertEqual(u'Any X,AA,AB,AC WHERE X is_instance_of BlogEntry, ''X creation_date AA, X title AB, X modification_date AC, ''X title "hell\'o"',rset.printable_rql())deftest_rest_path_errors(self):withself.admin_access.web_request()asreq:self.assertRaises(NotFound,self.process,req,'CWUser/eid/30000')self.assertRaises(NotFound,self.process,req,'Workcases')self.assertRaises(NotFound,self.process,req,'CWUser/inexistant_attribute/joe')deftest_action_path(self):"""tests the action path resolution"""withself.admin_access.web_request()asreq:self.assertRaises(Redirect,self.process,req,'1/edit')self.assertRaises(Redirect,self.process,req,'Tag/name/yo/edit')self.assertRaises(Redirect,self.process,req,'Tag/yo/edit')self.assertRaises(NotFound,self.process,req,'view/edit')self.assertRaises(NotFound,self.process,req,'1/non_action')self.assertRaises(NotFound,self.process,req,'CWUser/login/admin/non_action')deftest_regexp_path(self):"""tests the regexp path resolution"""withself.admin_access.web_request()asreq:ctrl,rset=self.process(req,'add/Task')self.assertEqual(ctrl,'view')self.assertEqual(rset,None)self.assertEqual(req.form,{'etype':"Task",'vid':"creation"})self.assertRaises(NotFound,self.process,req,'add/foo/bar')deftest_nonascii_path(self):oldrules=SimpleReqRewriter.rulesSimpleReqRewriter.rules=[(re.compile('/\w+',re.U),dict(vid='foo')),]withself.admin_access.web_request()asreq:try:path=str(FakeRequest().url_quote(u'été'))ctrl,rset=self.process(req,path)self.assertEqual(rset,None)self.assertEqual(req.form,{'vid':"foo"})finally:SimpleReqRewriter.rules=oldrulesif__name__=='__main__':unittest_main()