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)