Download Install Tutorial Docs FAQ Tools WikiLicense Team IRC Planet Involvement Shop Book

root/branches/cherrypy-2.x/cherrypy/test/test_objectmapping.py

Revision 1238 (checked in by fumanchu, 2 years ago)

Fix for CP2.2 for #541 (absoluteURI in request line). I also copied whatever wsgiserver bugfixes seemed relevant from trunk. Version upgraded to 2.2.2rc1.

  • Property svn:eol-style set to native
Line 
1 import test
2 test.prefer_parent_path()
3
4 import cherrypy
5
6
7 mount_points = ["/", "/users/fred/blog", "/corp/blog"]
8
9 def setup_server():
10     class Root:
11         def index(self, name="world"):
12             return name
13         index.exposed = True
14        
15         def default(self, *params):
16             return "default:" + repr(params)
17         default.exposed = True
18        
19         def other(self):
20             return "other"
21         other.exposed = True
22        
23         def extra(self, *p):
24             return repr(p)
25         extra.exposed = True
26        
27         def redirect(self):
28             raise cherrypy.HTTPRedirect('dir1/', 302)
29         redirect.exposed = True
30        
31         def notExposed(self):
32             return "not exposed"
33        
34         def confvalue(self):
35             return cherrypy.config.get("user")
36         confvalue.exposed = True
37
38     def mapped_func(self, ID=None):
39         return "ID is %s" % ID
40     mapped_func.exposed = True
41     setattr(Root, "Von B\xfclow", mapped_func)
42
43
44     class Exposing:
45         def base(self):
46             return "expose works!"
47         cherrypy.expose(base)
48         cherrypy.expose(base, "1")
49         cherrypy.expose(base, "2")
50
51     class ExposingNewStyle(object):
52         def base(self):
53             return "expose works!"
54         cherrypy.expose(base)
55         cherrypy.expose(base, "1")
56         cherrypy.expose(base, "2")
57
58
59
60     class Dir1:
61         def index(self):
62             return "index for dir1"
63         index.exposed = True
64        
65         def myMethod(self):
66             return "myMethod from dir1, object Path is:" + repr(cherrypy.request.object_path)
67         myMethod.exposed = True
68        
69         def default(self, *params):
70             return "default for dir1, param is:" + repr(params)
71         default.exposed = True
72
73
74     class Dir2:
75         def index(self):
76             return "index for dir2, path is:" + cherrypy.request.path
77         index.exposed = True
78        
79         def mount_point(self):
80             return cherrypy.tree.mount_point()
81         mount_point.exposed = True
82        
83         def tree_url(self):
84             return cherrypy.tree.url("/extra")
85         tree_url.exposed = True
86        
87         def posparam(self, *vpath):
88             return "/".join(vpath)
89         posparam.exposed = True
90
91
92     class Dir3:
93         def default(self):
94             return "default for dir3, not exposed"
95
96
97     class Dir4:
98         def index(self):
99             return "index for dir4, not exposed"
100
101     class DefNoIndex:
102         def default(self, *args):
103             return "defnoindex:" + repr(args)
104         default.exposed = True
105
106
107     Root.exposing = Exposing()
108     Root.exposingnew = ExposingNewStyle()
109     Root.dir1 = Dir1()
110     Root.dir1.dir2 = Dir2()
111     Root.dir1.dir2.dir3 = Dir3()
112     Root.dir1.dir2.dir3.dir4 = Dir4()
113     Root.defnoindex = DefNoIndex()
114
115
116     for url in mount_points:
117         conf = {'user': url.split("/")[-2]}
118         cherrypy.tree.mount(Root(), url, {'/': conf})
119
120     cherrypy.config.update({
121         'server.log_to_screen': False,
122         'server.environment': "production",
123     })
124
125
126     class Isolated:
127         def index(self):
128             return "made it!"
129         index.exposed = True
130
131     cherrypy.tree.mount(Isolated(), "/isolated")
132
133
134 import helper
135
136 class ObjectMappingTest(helper.CPWebCase):
137    
138     def testObjectMapping(self):
139         for url in mount_points:
140             prefix = self.mount_point = url
141             if prefix == "/":
142                 prefix = ""
143            
144             self.getPage('/')
145             self.assertBody('world')
146            
147             self.getPage("/dir1/myMethod")
148             self.assertBody("myMethod from dir1, object Path is:'%s/dir1/myMethod'"
149                             % prefix)
150            
151             self.getPage("/this/method/does/not/exist")
152             self.assertBody("default:('this', 'method', 'does', 'not', 'exist')")
153            
154             self.getPage("/extra/too/much")
155             self.assertBody("('too', 'much')")
156            
157             self.getPage("/other")
158             self.assertBody('other')
159            
160             self.getPage("/notExposed")
161             self.assertBody("default:('notExposed',)")
162            
163             self.getPage("/dir1/dir2/")
164             self.assertBody('index for dir2, path is:%s/dir1/dir2/'
165                             % prefix)
166            
167             self.getPage("/dir1/dir2")
168             self.assert_(self.status in ('302 Found', '303 See Other'))
169             self.assertHeader('Location', 'http://%s:%s%s/dir1/dir2/'
170                               % (self.HOST, self.PORT, prefix))
171            
172             self.getPage("/dir1/dir2/dir3/dir4/index")
173             self.assertBody("default for dir1, param is:('dir2', 'dir3', 'dir4', 'index')")
174            
175             # Test *vpath when default() is defined but not index()
176             self.getPage("/defnoindex")
177             self.assertBody("defnoindex:()")
178             self.getPage("/defnoindex/")
179             self.assertBody("defnoindex:()")
180            
181             self.getPage("/redirect")
182             self.assertStatus('302 Found')
183             self.assertHeader('Location', 'http://%s:%s%s/dir1/'
184                               % (self.HOST, self.PORT, prefix))
185            
186             # Test that we can use URL's which aren't all valid Python identifiers
187             # This should also test the %XX-unquoting of URL's.
188             self.getPage("/Von%20B%fclow?ID=14")
189             self.assertBody("ID is 14")
190            
191             # Test that %2F in the path doesn't get unquoted too early;
192             # that is, it should not be used to separate path components.
193             # See ticket #393.
194             self.getPage("/page%2Fname")
195             self.assertBody("default:('page/name',)")
196            
197             self.getPage("/dir1/dir2/mount_point")
198             self.assertBody(url)
199             self.getPage("/dir1/dir2/tree_url")
200             self.assertBody(prefix + "/extra")
201            
202             # Test that configs don't overwrite each other from diferent apps
203             self.getPage("/confvalue")
204             self.assertBody(url.split("/")[-2])
205        
206         self.mount_point = ""
207        
208         # Test absoluteURI's in the Request-Line
209         self.getPage('http://localhost/')
210         self.assertBody('world')
211        
212         # Test that the "isolated" app doesn't leak url's into the root app.
213         # If it did leak, Root.default() would answer with
214         #   "default:('isolated', 'doesnt', 'exist')".
215         self.getPage("/isolated/")
216         self.assertStatus("200 OK")
217         self.assertBody("made it!")
218         self.getPage("/isolated/doesnt/exist")
219         self.assertStatus("404 Not Found")
220    
221     def testPositionalParams(self):
222         self.getPage("/dir1/dir2/posparam/18/24/hut/hike")
223         self.assertBody("18/24/hut/hike")
224        
225         # intermediate index methods should not receive posparams;
226         # only the "final" index method should do so.
227         self.getPage("/dir1/dir2/5/3/sir")
228         self.assertBody("default for dir1, param is:('dir2', '5', '3', 'sir')")
229    
230     def testExpose(self):
231         # Test the cherrypy.expose function/decorator
232         self.getPage("/exposing/base")
233         self.assertBody("expose works!")
234        
235         self.getPage("/exposing/1")
236         self.assertBody("expose works!")
237        
238         self.getPage("/exposing/2")
239         self.assertBody("expose works!")
240        
241         self.getPage("/exposingnew/base")
242         self.assertBody("expose works!")
243        
244         self.getPage("/exposingnew/1")
245         self.assertBody("expose works!")
246        
247         self.getPage("/exposingnew/2")
248         self.assertBody("expose works!")
249
250
251
252 if __name__ == "__main__":
253     setup_server()
254     helper.testmain()
Note: See TracBrowser for help on using the browser.

Hosted by WebFaction

Log in as guest/cpguest to create tickets