# -*- coding: utf-8 -*-"""Unit tests for url publishing service"""importrefromlogilab.common.testlibimportunittest_mainfromcubicweb.devtools.apptestimportEnvBasedTCfromcubicweb.devtools._apptestimportFakeRequestfromcubicweb.rsetimportResultSetfromcubicweb.webimportNotFound,Redirectfromcubicweb.web.views.urlrewriteimportSimpleReqRewriterclassURLPublisherTC(EnvBasedTC):"""test suite for QSPreProcessor"""defsetup_database(self):self.create_user(u'ÿsaÿe')b=self.add_entity('BlogEntry',title=u'hell\'o',content=u'blabla')c=self.add_entity('Tag',name=u'yo')# take care: Tag's name normalized to lower caseself.execute('SET C tags B WHERE C eid %(c)s, B eid %(b)s',{'c':c.eid,'b':b.eid},'b')defprocess(self,url):req=self.req=self.request()returnself.env.app.url_resolver.process(req,url)deftest_raw_path(self):"""tests raw path resolution'"""self.assertEquals(self.process('view'),('view',None))self.assertEquals(self.process('edit'),('edit',None))self.assertRaises(NotFound,self.process,'whatever')deftest_eid_path(self):"""tests eid path resolution"""self.assertIsInstance(self.process('123')[1],ResultSet)self.assertEquals(len(self.process('123')[1]),1)self.assertRaises(NotFound,self.process,'123/345')self.assertRaises(NotFound,self.process,'not_eid')deftest_rest_path(self):"""tests the rest path resolution"""ctrl,rset=self.process('EUser')self.assertEquals(ctrl,'view')self.assertEquals(rset.description[0][0],'EUser')self.assertEquals(rset.printable_rql(),"Any X,AA,AB,AC,AD ORDERBY AA WHERE X is EUser, X login AA, X firstname AB, X surname AC, X modification_date AD")ctrl,rset=self.process('EUser/login/admin')self.assertEquals(ctrl,'view')self.assertEquals(len(rset),1)self.assertEquals(rset.description[0][0],'EUser')self.assertEquals(rset.printable_rql(),'Any X WHERE X is EUser, X login "admin"')ctrl,rset=self.process('euser/admin')self.assertEquals(ctrl,'view')self.assertEquals(len(rset),1)self.assertEquals(rset.description[0][0],'EUser')self.assertEquals(rset.printable_rql(),'Any X WHERE X is EUser, X login "admin"')ctrl,rset=self.process('euser/eid/%s'%rset[0][0])self.assertEquals(ctrl,'view')self.assertEquals(len(rset),1)self.assertEquals(rset.description[0][0],'EUser')self.assertEquals(rset.printable_rql(),'Any X WHERE X is EUser, X eid 5')# test non-ascii pathsctrl,rset=self.process('EUser/login/%C3%BFsa%C3%BFe')self.assertEquals(ctrl,'view')self.assertEquals(len(rset),1)self.assertEquals(rset.description[0][0],'EUser')self.assertEquals(rset.printable_rql(),u'Any X WHERE X is EUser, X login "ÿsaÿe"')# test quoted pathsctrl,rset=self.process('BlogEntry/title/hell%27o')self.assertEquals(ctrl,'view')self.assertEquals(len(rset),1)self.assertEquals(rset.description[0][0],'BlogEntry')self.assertEquals(rset.printable_rql(),u'Any X WHERE X is BlogEntry, X title "hell\'o"')# errorsself.assertRaises(NotFound,self.process,'EUser/eid/30000')self.assertRaises(NotFound,self.process,'Workcases')self.assertRaises(NotFound,self.process,'EUser/inexistant_attribute/joe')deftest_action_path(self):"""tests the action path resolution"""self.assertRaises(Redirect,self.process,'1/edit')self.assertRaises(Redirect,self.process,'Tag/name/yo/edit')self.assertRaises(Redirect,self.process,'Tag/yo/edit')self.assertRaises(NotFound,self.process,'view/edit')self.assertRaises(NotFound,self.process,'1/non_action')self.assertRaises(NotFound,self.process,'EUser/login/admin/non_action')deftest_regexp_path(self):"""tests the regexp path resolution"""ctrl,rset=self.process('add/Task')self.assertEquals(ctrl,'view')self.assertEquals(rset,None)self.assertEquals(self.req.form,{'etype':"Task",'vid':"creation"})self.assertRaises(NotFound,self.process,'add/foo/bar')deftest_nonascii_path(self):oldrules=SimpleReqRewriter.rulesSimpleReqRewriter.rules=[(re.compile('/\w+',re.U),dict(vid='foo')),]try:path=str(FakeRequest().url_quote(u'été'))ctrl,rset=self.process(path)self.assertEquals(rset,None)self.assertEquals(self.req.form,{'vid':"foo"})finally:SimpleReqRewriter.rules=oldrulesif__name__=='__main__':unittest_main()