NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

test_objectmapping.py (11707B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\lib\cherrypy\test\test_objectmapping.py
      2 import cherrypy
      3 from cherrypy._cptree import Application
      4 from cherrypy.test import helper
      5 script_names = ['',
      6  '/foo',
      7  '/users/fred/blog',
      8  '/corp/blog']
      9 
     10 class ObjectMappingTest(helper.CPWebCase):
     11 
     12     def setup_server():
     13 
     14         class Root:
     15 
     16             def index(self, name = 'world'):
     17                 return name
     18 
     19             index.exposed = True
     20 
     21             def foobar(self):
     22                 return 'bar'
     23 
     24             foobar.exposed = True
     25 
     26             def default(self, *params, **kwargs):
     27                 return 'default:' + repr(params)
     28 
     29             default.exposed = True
     30 
     31             def other(self):
     32                 return 'other'
     33 
     34             other.exposed = True
     35 
     36             def extra(self, *p):
     37                 return repr(p)
     38 
     39             extra.exposed = True
     40 
     41             def redirect(self):
     42                 raise cherrypy.HTTPRedirect('dir1/', 302)
     43 
     44             redirect.exposed = True
     45 
     46             def notExposed(self):
     47                 return 'not exposed'
     48 
     49             def confvalue(self):
     50                 return cherrypy.request.config.get('user')
     51 
     52             confvalue.exposed = True
     53 
     54             def redirect_via_url(self, path):
     55                 raise cherrypy.HTTPRedirect(cherrypy.url(path))
     56 
     57             redirect_via_url.exposed = True
     58 
     59             def translate_html(self):
     60                 return 'OK'
     61 
     62             translate_html.exposed = True
     63 
     64         def mapped_func(self, ID = None):
     65             return 'ID is %s' % ID
     66 
     67         mapped_func.exposed = True
     68         setattr(Root, 'Von B\xfclow', mapped_func)
     69 
     70         class Exposing:
     71 
     72             def base(self):
     73                 return 'expose works!'
     74 
     75             cherrypy.expose(base)
     76             cherrypy.expose(base, '1')
     77             cherrypy.expose(base, '2')
     78 
     79         class ExposingNewStyle(object):
     80 
     81             def base(self):
     82                 return 'expose works!'
     83 
     84             cherrypy.expose(base)
     85             cherrypy.expose(base, '1')
     86             cherrypy.expose(base, '2')
     87 
     88         class Dir1:
     89 
     90             def index(self):
     91                 return 'index for dir1'
     92 
     93             index.exposed = True
     94 
     95             def myMethod(self):
     96                 return 'myMethod from dir1, path_info is:' + repr(cherrypy.request.path_info)
     97 
     98             myMethod.exposed = True
     99             myMethod._cp_config = {'tools.trailing_slash.extra': True}
    100 
    101             def default(self, *params):
    102                 return 'default for dir1, param is:' + repr(params)
    103 
    104             default.exposed = True
    105 
    106         class Dir2:
    107 
    108             def index(self):
    109                 return 'index for dir2, path is:' + cherrypy.request.path_info
    110 
    111             index.exposed = True
    112 
    113             def script_name(self):
    114                 return cherrypy.tree.script_name()
    115 
    116             script_name.exposed = True
    117 
    118             def cherrypy_url(self):
    119                 return cherrypy.url('/extra')
    120 
    121             cherrypy_url.exposed = True
    122 
    123             def posparam(self, *vpath):
    124                 return '/'.join(vpath)
    125 
    126             posparam.exposed = True
    127 
    128         class Dir3:
    129 
    130             def default(self):
    131                 return 'default for dir3, not exposed'
    132 
    133         class Dir4:
    134 
    135             def index(self):
    136                 return 'index for dir4, not exposed'
    137 
    138         class DefNoIndex:
    139 
    140             def default(self, *args):
    141                 raise cherrypy.HTTPRedirect('contact')
    142 
    143             default.exposed = True
    144 
    145         class ByMethod:
    146             exposed = True
    147 
    148             def __init__(self, *things):
    149                 self.things = list(things)
    150 
    151             def GET(self):
    152                 return repr(self.things)
    153 
    154             def POST(self, thing):
    155                 self.things.append(thing)
    156 
    157         class Collection:
    158             default = ByMethod('a', 'bit')
    159 
    160         Root.exposing = Exposing()
    161         Root.exposingnew = ExposingNewStyle()
    162         Root.dir1 = Dir1()
    163         Root.dir1.dir2 = Dir2()
    164         Root.dir1.dir2.dir3 = Dir3()
    165         Root.dir1.dir2.dir3.dir4 = Dir4()
    166         Root.defnoindex = DefNoIndex()
    167         Root.bymethod = ByMethod('another')
    168         Root.collection = Collection()
    169         d = cherrypy.dispatch.MethodDispatcher()
    170         for url in script_names:
    171             conf = {'/': {'user': (url or '/').split('/')[-2]},
    172              '/bymethod': {'request.dispatch': d},
    173              '/collection': {'request.dispatch': d}}
    174             cherrypy.tree.mount(Root(), url, conf)
    175 
    176         class Isolated:
    177 
    178             def index(self):
    179                 return 'made it!'
    180 
    181             index.exposed = True
    182 
    183         cherrypy.tree.mount(Isolated(), '/isolated')
    184 
    185         class AnotherApp:
    186             exposed = True
    187 
    188             def GET(self):
    189                 return 'milk'
    190 
    191         cherrypy.tree.mount(AnotherApp(), '/app', {'/': {'request.dispatch': d}})
    192 
    193     setup_server = staticmethod(setup_server)
    194 
    195     def testObjectMapping(self):
    196         for url in script_names:
    197             prefix = self.script_name = url
    198             self.getPage('/')
    199             self.assertBody('world')
    200             self.getPage('/dir1/myMethod')
    201             self.assertBody("myMethod from dir1, path_info is:'/dir1/myMethod'")
    202             self.getPage('/this/method/does/not/exist')
    203             self.assertBody("default:('this', 'method', 'does', 'not', 'exist')")
    204             self.getPage('/extra/too/much')
    205             self.assertBody("('too', 'much')")
    206             self.getPage('/other')
    207             self.assertBody('other')
    208             self.getPage('/notExposed')
    209             self.assertBody("default:('notExposed',)")
    210             self.getPage('/dir1/dir2/')
    211             self.assertBody('index for dir2, path is:/dir1/dir2/')
    212             self.getPage('/dir1/dir2')
    213             self.assertStatus(301)
    214             self.assertHeader('Location', '%s/dir1/dir2/' % self.base())
    215             self.getPage('/dir1/myMethod/')
    216             self.assertStatus(301)
    217             self.assertHeader('Location', '%s/dir1/myMethod' % self.base())
    218             self.getPage('/dir1/dir2/dir3/dir4/index')
    219             self.assertBody("default for dir1, param is:('dir2', 'dir3', 'dir4', 'index')")
    220             self.getPage('/defnoindex')
    221             self.assertStatus((302, 303))
    222             self.assertHeader('Location', '%s/contact' % self.base())
    223             self.getPage('/defnoindex/')
    224             self.assertStatus((302, 303))
    225             self.assertHeader('Location', '%s/defnoindex/contact' % self.base())
    226             self.getPage('/defnoindex/page')
    227             self.assertStatus((302, 303))
    228             self.assertHeader('Location', '%s/defnoindex/contact' % self.base())
    229             self.getPage('/redirect')
    230             self.assertStatus('302 Found')
    231             self.assertHeader('Location', '%s/dir1/' % self.base())
    232             if not getattr(cherrypy.server, 'using_apache', False):
    233                 self.getPage('/Von%20B%fclow?ID=14')
    234                 self.assertBody('ID is 14')
    235                 self.getPage('/page%2Fname')
    236                 self.assertBody("default:('page/name',)")
    237             self.getPage('/dir1/dir2/script_name')
    238             self.assertBody(url)
    239             self.getPage('/dir1/dir2/cherrypy_url')
    240             self.assertBody('%s/extra' % self.base())
    241             self.getPage('/confvalue')
    242             self.assertBody((url or '/').split('/')[-2])
    243 
    244         self.script_name = ''
    245         self.getPage('http://%s:%s/' % (self.interface(), self.PORT))
    246         self.assertBody('world')
    247         self.getPage('http://%s:%s/abs/?service=http://192.168.0.1/x/y/z' % (self.interface(), self.PORT))
    248         self.assertBody("default:('abs',)")
    249         self.getPage('/rel/?service=http://192.168.120.121:8000/x/y/z')
    250         self.assertBody("default:('rel',)")
    251         self.getPage('/isolated/')
    252         self.assertStatus('200 OK')
    253         self.assertBody('made it!')
    254         self.getPage('/isolated/doesnt/exist')
    255         self.assertStatus('404 Not Found')
    256         self.getPage('/foobar')
    257         self.assertBody('bar')
    258 
    259     def test_translate(self):
    260         self.getPage('/translate_html')
    261         self.assertStatus('200 OK')
    262         self.assertBody('OK')
    263         self.getPage('/translate.html')
    264         self.assertStatus('200 OK')
    265         self.assertBody('OK')
    266         self.getPage('/translate-html')
    267         self.assertStatus('200 OK')
    268         self.assertBody('OK')
    269 
    270     def test_redir_using_url(self):
    271         for url in script_names:
    272             prefix = self.script_name = url
    273             self.getPage('/redirect_via_url?path=./')
    274             self.assertStatus(('302 Found', '303 See Other'))
    275             self.assertHeader('Location', '%s/' % self.base())
    276             self.getPage('/redirect_via_url?path=./')
    277             self.assertStatus(('302 Found', '303 See Other'))
    278             self.assertHeader('Location', '%s/' % self.base())
    279             self.getPage('/redirect_via_url/?path=./')
    280             self.assertStatus(('302 Found', '303 See Other'))
    281             self.assertHeader('Location', '%s/' % self.base())
    282             self.getPage('/redirect_via_url/?path=./')
    283             self.assertStatus(('302 Found', '303 See Other'))
    284             self.assertHeader('Location', '%s/' % self.base())
    285 
    286     def testPositionalParams(self):
    287         self.getPage('/dir1/dir2/posparam/18/24/hut/hike')
    288         self.assertBody('18/24/hut/hike')
    289         self.getPage('/dir1/dir2/5/3/sir')
    290         self.assertBody("default for dir1, param is:('dir2', '5', '3', 'sir')")
    291         self.getPage('/dir1/dir2/script_name/extra/stuff')
    292         self.assertStatus(404)
    293 
    294     def testExpose(self):
    295         self.getPage('/exposing/base')
    296         self.assertBody('expose works!')
    297         self.getPage('/exposing/1')
    298         self.assertBody('expose works!')
    299         self.getPage('/exposing/2')
    300         self.assertBody('expose works!')
    301         self.getPage('/exposingnew/base')
    302         self.assertBody('expose works!')
    303         self.getPage('/exposingnew/1')
    304         self.assertBody('expose works!')
    305         self.getPage('/exposingnew/2')
    306         self.assertBody('expose works!')
    307 
    308     def testMethodDispatch(self):
    309         self.getPage('/bymethod')
    310         self.assertBody("['another']")
    311         self.assertHeader('Allow', 'GET, HEAD, POST')
    312         self.getPage('/bymethod', method='HEAD')
    313         self.assertBody('')
    314         self.assertHeader('Allow', 'GET, HEAD, POST')
    315         self.getPage('/bymethod', method='POST', body='thing=one')
    316         self.assertBody('')
    317         self.assertHeader('Allow', 'GET, HEAD, POST')
    318         self.getPage('/bymethod')
    319         self.assertBody("['another', u'one']")
    320         self.assertHeader('Allow', 'GET, HEAD, POST')
    321         self.getPage('/bymethod', method='PUT')
    322         self.assertErrorPage(405)
    323         self.assertHeader('Allow', 'GET, HEAD, POST')
    324         self.getPage('/collection/silly', method='POST')
    325         self.getPage('/collection', method='GET')
    326         self.assertBody("['a', 'bit', 'silly']")
    327         self.getPage('/app')
    328         self.assertBody('milk')
    329 
    330     def testTreeMounting(self):
    331 
    332         class Root(object):
    333 
    334             def hello(self):
    335                 return 'Hello world!'
    336 
    337             hello.exposed = True
    338 
    339         a = Application(Root(), '/somewhere')
    340         self.assertRaises(ValueError, cherrypy.tree.mount, a, '/somewhereelse')
    341         a = Application(Root(), '/somewhere')
    342         cherrypy.tree.mount(a, '/somewhere')
    343         self.getPage('/somewhere/hello')
    344         self.assertStatus(200)
    345         del cherrypy.tree.apps['/somewhere']
    346         cherrypy.tree.mount(a)
    347         self.getPage('/somewhere/hello')
    348         self.assertStatus(200)
    349         a = Application(Root(), script_name=None)
    350         self.assertRaises(TypeError, cherrypy.tree.mount, a, None)