web/test/unittest_urlpublisher.py
changeset 9839 cf00a6a3f401
parent 9359 31a1813d53f3
child 10467 73ea636a5562
equal deleted inserted replaced
9838:14640aeb5ddc 9839:cf00a6a3f401
     1 # -*- coding: utf-8 -*-
     1 # -*- coding: utf-8 -*-
     2 # copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
     2 # copyright 2003-2014 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
     3 # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
     3 # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
     4 #
     4 #
     5 # This file is part of CubicWeb.
     5 # This file is part of CubicWeb.
     6 #
     6 #
     7 # CubicWeb is free software: you can redistribute it and/or modify it under the
     7 # CubicWeb is free software: you can redistribute it and/or modify it under the
    31 
    31 
    32 class URLPublisherTC(CubicWebTC):
    32 class URLPublisherTC(CubicWebTC):
    33     """test suite for QSPreProcessor"""
    33     """test suite for QSPreProcessor"""
    34 
    34 
    35     def setup_database(self):
    35     def setup_database(self):
    36         req = self.request()
    36         with self.admin_access.repo_cnx() as cnx:
    37         self.create_user(req, u'ÿsaÿe')
    37             self.create_user(cnx, u'ÿsaÿe')
    38         b = req.create_entity('BlogEntry', title=u'hell\'o', content=u'blabla')
    38             b = cnx.create_entity('BlogEntry', title=u'hell\'o', content=u'blabla')
    39         c = req.create_entity('Tag', name=u'yo') # take care: Tag's name normalized to lower case
    39             # take care: Tag's name normalized to lower case
    40         self.execute('SET C tags B WHERE C eid %(c)s, B eid %(b)s', {'c':c.eid, 'b':b.eid})
    40             c = cnx.create_entity('Tag', name=u'yo')
       
    41             cnx.execute('SET C tags B WHERE C eid %(c)s, B eid %(b)s',
       
    42                         {'c':c.eid, 'b':b.eid})
       
    43             cnx.commit()
    41 
    44 
    42     def process(self, url):
    45     def process(self, req, url):
    43         req = self.req = self.request()
       
    44         return self.app.url_resolver.process(req, url)
    46         return self.app.url_resolver.process(req, url)
    45 
    47 
    46     def test_raw_path(self):
    48     def test_raw_path(self):
    47         """tests raw path resolution'"""
    49         """tests raw path resolution'"""
    48         self.assertEqual(self.process('view'), ('view', None))
    50         with self.admin_access.web_request() as req:
    49         self.assertEqual(self.process('edit'), ('edit', None))
    51             self.assertEqual(self.process(req, 'view'), ('view', None))
    50         self.assertRaises(NotFound, self.process, 'whatever')
    52             self.assertEqual(self.process(req, 'edit'), ('edit', None))
       
    53             self.assertRaises(NotFound, self.process, req, 'whatever')
    51 
    54 
    52     def test_eid_path(self):
    55     def test_eid_path(self):
    53         """tests eid path resolution"""
    56         """tests eid path resolution"""
    54         self.assertIsInstance(self.process('123')[1], ResultSet)
    57         with self.admin_access.web_request() as req:
    55         self.assertEqual(len(self.process('123')[1]), 1)
    58             self.assertIsInstance(self.process(req, '123')[1], ResultSet)
    56         self.assertRaises(NotFound, self.process, '123/345')
    59             self.assertEqual(len(self.process(req, '123')[1]), 1)
    57         self.assertRaises(NotFound, self.process, 'not_eid')
    60             self.assertRaises(NotFound, self.process, req, '123/345')
       
    61             self.assertRaises(NotFound, self.process, req, 'not_eid')
    58 
    62 
    59     def test_rest_path_etype(self):
    63     def test_rest_path_etype(self):
    60         """tests the rest path resolution"""
    64         """tests the rest path resolution"""
    61         ctrl, rset = self.process('CWEType')
    65         with self.admin_access.web_request() as req:
    62         self.assertEqual(ctrl, 'view')
    66             ctrl, rset = self.process(req, 'CWEType')
    63         self.assertEqual(rset.description[0][0], 'CWEType')
    67             self.assertEqual(ctrl, 'view')
    64         self.assertEqual(rset.printable_rql(),
    68             self.assertEqual(rset.description[0][0], 'CWEType')
    65                           "Any X,AA,AB ORDERBY AA WHERE X is_instance_of CWEType, X name AA, X modification_date AB")
    69             self.assertEqual("Any X,AA,AB ORDERBY AA WHERE X is_instance_of CWEType, "
       
    70                              "X name AA, X modification_date AB",
       
    71                              rset.printable_rql())
    66 
    72 
    67     def test_rest_path_by_attr(self):
    73     def test_rest_path_by_attr(self):
    68         ctrl, rset = self.process('CWUser/login/admin')
    74         with self.admin_access.web_request() as req:
    69         self.assertEqual(ctrl, 'view')
    75             ctrl, rset = self.process(req, 'CWUser/login/admin')
    70         self.assertEqual(len(rset), 1)
    76             self.assertEqual(ctrl, 'view')
    71         self.assertEqual(rset.description[0][0], 'CWUser')
    77             self.assertEqual(len(rset), 1)
    72         self.assertEqual(rset.printable_rql(), '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"')
    78             self.assertEqual(rset.description[0][0], 'CWUser')
       
    79             self.assertEqual('Any X,AA,AB,AC,AD WHERE X is_instance_of CWUser, '
       
    80                              'X login AA, X firstname AB, X surname AC, '
       
    81                              'X modification_date AD, X login "admin"',
       
    82                              rset.printable_rql())
    73 
    83 
    74     def test_rest_path_unique_attr(self):
    84     def test_rest_path_unique_attr(self):
    75         ctrl, rset = self.process('cwuser/admin')
    85         with self.admin_access.web_request() as req:
    76         self.assertEqual(ctrl, 'view')
    86             ctrl, rset = self.process(req, 'cwuser/admin')
    77         self.assertEqual(len(rset), 1)
    87             self.assertEqual(ctrl, 'view')
    78         self.assertEqual(rset.description[0][0], 'CWUser')
    88             self.assertEqual(len(rset), 1)
    79         self.assertEqual(rset.printable_rql(), '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"')
    89             self.assertEqual(rset.description[0][0], 'CWUser')
       
    90             self.assertEqual('Any X,AA,AB,AC,AD WHERE X is_instance_of CWUser, '
       
    91                              'X login AA, X firstname AB, X surname AC, '
       
    92                              'X modification_date AD, X login "admin"',
       
    93                              rset.printable_rql())
    80 
    94 
    81     def test_rest_path_eid(self):
    95     def test_rest_path_eid(self):
    82         ctrl, rset = self.process('cwuser/eid/%s' % self.user().eid)
    96         with self.admin_access.web_request() as req:
    83         self.assertEqual(ctrl, 'view')
    97             ctrl, rset = self.process(req, 'cwuser/eid/%s' % self.user(req).eid)
    84         self.assertEqual(len(rset), 1)
    98             self.assertEqual(ctrl, 'view')
    85         self.assertEqual(rset.description[0][0], 'CWUser')
    99             self.assertEqual(len(rset), 1)
    86         self.assertEqual(rset.printable_rql(), '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])
   100             self.assertEqual(rset.description[0][0], 'CWUser')
       
   101             self.assertEqual('Any X,AA,AB,AC,AD WHERE X is_instance_of CWUser, '
       
   102                              'X login AA, X firstname AB, X surname AC, '
       
   103                              'X modification_date AD, X eid %s' % rset[0][0],
       
   104                              rset.printable_rql())
    87 
   105 
    88     def test_rest_path_non_ascii_paths(self):
   106     def test_rest_path_non_ascii_paths(self):
    89         ctrl, rset = self.process('CWUser/login/%C3%BFsa%C3%BFe')
   107         with self.admin_access.web_request() as req:
    90         self.assertEqual(ctrl, 'view')
   108             ctrl, rset = self.process(req, 'CWUser/login/%C3%BFsa%C3%BFe')
    91         self.assertEqual(len(rset), 1)
   109             self.assertEqual(ctrl, 'view')
    92         self.assertEqual(rset.description[0][0], 'CWUser')
   110             self.assertEqual(len(rset), 1)
    93         self.assertEqual(rset.printable_rql(), u'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 "\xffsa\xffe"')
   111             self.assertEqual(rset.description[0][0], 'CWUser')
       
   112             self.assertEqual(u'Any X,AA,AB,AC,AD WHERE X is_instance_of CWUser, '
       
   113                              u'X login AA, X firstname AB, X surname AC, '
       
   114                              u'X modification_date AD, X login "\xffsa\xffe"',
       
   115                              rset.printable_rql())
    94 
   116 
    95     def test_rest_path_quoted_paths(self):
   117     def test_rest_path_quoted_paths(self):
    96         ctrl, rset = self.process('BlogEntry/title/hell%27o')
   118         with self.admin_access.web_request() as req:
    97         self.assertEqual(ctrl, 'view')
   119             ctrl, rset = self.process(req, 'BlogEntry/title/hell%27o')
    98         self.assertEqual(len(rset), 1)
   120             self.assertEqual(ctrl, 'view')
    99         self.assertEqual(rset.description[0][0], 'BlogEntry')
   121             self.assertEqual(len(rset), 1)
   100         self.assertEqual(rset.printable_rql(), 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"')
   122             self.assertEqual(rset.description[0][0], 'BlogEntry')
       
   123             self.assertEqual(u'Any X,AA,AB,AC WHERE X is_instance_of BlogEntry, '
       
   124                              'X creation_date AA, X title AB, X modification_date AC, '
       
   125                              'X title "hell\'o"',
       
   126                              rset.printable_rql())
   101 
   127 
   102     def test_rest_path_errors(self):
   128     def test_rest_path_errors(self):
   103         self.assertRaises(NotFound, self.process, 'CWUser/eid/30000')
   129         with self.admin_access.web_request() as req:
   104         self.assertRaises(NotFound, self.process, 'Workcases')
   130             self.assertRaises(NotFound, self.process, req, 'CWUser/eid/30000')
   105         self.assertRaises(NotFound, self.process, 'CWUser/inexistant_attribute/joe')
   131             self.assertRaises(NotFound, self.process, req, 'Workcases')
       
   132             self.assertRaises(NotFound, self.process, req, 'CWUser/inexistant_attribute/joe')
   106 
   133 
   107     def test_action_path(self):
   134     def test_action_path(self):
   108         """tests the action path resolution"""
   135         """tests the action path resolution"""
   109         self.assertRaises(Redirect, self.process, '1/edit')
   136         with self.admin_access.web_request() as req:
   110         self.assertRaises(Redirect, self.process, 'Tag/name/yo/edit')
   137             self.assertRaises(Redirect, self.process, req, '1/edit')
   111         self.assertRaises(Redirect, self.process, 'Tag/yo/edit')
   138             self.assertRaises(Redirect, self.process, req, 'Tag/name/yo/edit')
   112         self.assertRaises(NotFound, self.process, 'view/edit')
   139             self.assertRaises(Redirect, self.process, req, 'Tag/yo/edit')
   113         self.assertRaises(NotFound, self.process, '1/non_action')
   140             self.assertRaises(NotFound, self.process, req, 'view/edit')
   114         self.assertRaises(NotFound, self.process, 'CWUser/login/admin/non_action')
   141             self.assertRaises(NotFound, self.process, req, '1/non_action')
       
   142             self.assertRaises(NotFound, self.process, req, 'CWUser/login/admin/non_action')
   115 
   143 
   116 
   144 
   117     def test_regexp_path(self):
   145     def test_regexp_path(self):
   118         """tests the regexp path resolution"""
   146         """tests the regexp path resolution"""
   119         ctrl, rset = self.process('add/Task')
   147         with self.admin_access.web_request() as req:
   120         self.assertEqual(ctrl, 'view')
   148             ctrl, rset = self.process(req, 'add/Task')
   121         self.assertEqual(rset, None)
   149             self.assertEqual(ctrl, 'view')
   122         self.assertEqual(self.req.form, {'etype' : "Task", 'vid' : "creation"})
   150             self.assertEqual(rset, None)
   123         self.assertRaises(NotFound, self.process, 'add/foo/bar')
   151             self.assertEqual(req.form, {'etype' : "Task", 'vid' : "creation"})
   124 
   152             self.assertRaises(NotFound, self.process, req, 'add/foo/bar')
   125 
   153 
   126     def test_nonascii_path(self):
   154     def test_nonascii_path(self):
   127         oldrules = SimpleReqRewriter.rules
   155         oldrules = SimpleReqRewriter.rules
   128         SimpleReqRewriter.rules = [(re.compile('/\w+', re.U), dict(vid='foo')),]
   156         SimpleReqRewriter.rules = [(re.compile('/\w+', re.U), dict(vid='foo')),]
   129         try:
   157         with self.admin_access.web_request() as req:
   130             path = str(FakeRequest().url_quote(u'été'))
   158             try:
   131             ctrl, rset = self.process(path)
   159                 path = str(FakeRequest().url_quote(u'été'))
   132             self.assertEqual(rset, None)
   160                 ctrl, rset = self.process(req, path)
   133             self.assertEqual(self.req.form, {'vid' : "foo"})
   161                 self.assertEqual(rset, None)
   134         finally:
   162                 self.assertEqual(req.form, {'vid' : "foo"})
   135             SimpleReqRewriter.rules = oldrules
   163             finally:
       
   164                 SimpleReqRewriter.rules = oldrules
   136 
   165 
   137 
   166 
   138 if __name__ == '__main__':
   167 if __name__ == '__main__':
   139     unittest_main()
   168     unittest_main()