Changeset 2054
- Timestamp:
- 10/30/08 11:50:25
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/dynamicnodedispatch-869/cherrypy/test/test_dynamicobjectmapping.py
r2053 r2054 66 66 # DynamicNodeAndMethodDispatcher example. 67 67 # This example exposes a fairly naive HTTP api 68 class SomeModel(object):68 class User(object): 69 69 def __init__(self, id, name): 70 70 self.id = id … … 74 74 return unicode(self.name) 75 75 76 model_lookup = {77 1: SomeModel(1, 'foo'),78 2: SomeModel(2, 'bar'),76 user_lookup = { 77 1: User(1, 'foo'), 78 2: User(2, 'bar'), 79 79 } 80 80 81 def make_ model(name, id=None):81 def make_user(name, id=None): 82 82 if not id: 83 id = max(* model_lookup.keys()) + 184 model_lookup[id] = SomeModel(id, name)83 id = max(*user_lookup.keys()) + 1 84 user_lookup[id] = User(id, name) 85 85 return id 86 86 87 class ObjectNode(object):87 class UserContainerNode(object): 88 88 exposed = True 89 89 … … 92 92 Allow the creation of a new Object 93 93 """ 94 return "POST %d" % make_ model(name)94 return "POST %d" % make_user(name) 95 95 96 96 def GET(self): 97 return unicode(sorted( model_lookup.keys()))97 return unicode(sorted(user_lookup.keys())) 98 98 99 99 def getsubnode(self, objname): … … 102 102 except ValueError: 103 103 return None 104 return ModelInstanceNode(id)105 106 class ModelInstanceNode(object):104 return UserInstanceNode(id) 105 106 class UserInstanceNode(object): 107 107 exposed = True 108 108 def __init__(self, id): 109 109 self.id = id 110 self. model = model_lookup.get(id, None)110 self.user = user_lookup.get(id, None) 111 111 112 112 # For all but PUT methods there MUST be a valid user identified 113 113 # by self.id 114 if not self. modeland cherrypy.request.method != 'PUT':114 if not self.user and cherrypy.request.method != 'PUT': 115 115 raise cherrypy.HTTPError(404) 116 116 … … 119 119 Return the appropriate representation of the instance. 120 120 """ 121 return unicode(self. model)121 return unicode(self.user) 122 122 123 123 def POST(self, name): … … 125 125 Update the fields of the user instance. 126 126 """ 127 self. model.name = name128 return "POST %d" % self. model.id127 self.user.name = name 128 return "POST %d" % self.user.id 129 129 130 130 def PUT(self, name): … … 132 132 Create a new user with the specified id, or edit it if it already exists 133 133 """ 134 if self. model:135 # Edit the current model136 self. model.name = name137 return "PUT %d" % self. model.id134 if self.user: 135 # Edit the current user 136 self.user.name = name 137 return "PUT %d" % self.user.id 138 138 else: 139 # Make a new modelwith said attributes.140 return "PUT %d" % make_ model(name, self.id)139 # Make a new user with said attributes. 140 return "PUT %d" % make_user(name, self.id) 141 141 142 142 def DELETE(self): … … 144 144 Delete the user specified at the id. 145 145 """ 146 id = self. model.id147 del model_lookup[self.model.id]148 del self. model146 id = self.user.id 147 del user_lookup[self.user.id] 148 del self.user 149 149 return "DELETE %d" % id 150 150 151 151 152 Root. models = ObjectNode()152 Root.users = UserContainerNode() 153 153 154 154 d = cherrypy.dispatch.DynamicNodeDispatcher() … … 159 159 'user': (url or "/").split("/")[-2] 160 160 }, 161 '/ models': {161 '/users': { 162 162 'request.dispatch': md}, 163 163 } … … 233 233 def testMethodDispatch(self): 234 234 # GET acts like a container 235 self.getPage("/ models")235 self.getPage("/users") 236 236 self.assertBody("[1, 2]") 237 237 self.assertHeader('Allow', 'GET, HEAD, POST') 238 238 239 239 # POST to the container URI allows creation 240 self.getPage("/ models", method="POST", body="name=baz")240 self.getPage("/users", method="POST", body="name=baz") 241 241 self.assertBody("POST 3") 242 242 self.assertHeader('Allow', 'GET, HEAD, POST') … … 244 244 # POST to a specific instanct URI results in a 404 245 245 # as the resource does not exit. 246 self.getPage("/ models/5", method="POST", body="name=baz")246 self.getPage("/users/5", method="POST", body="name=baz") 247 247 self.assertStatus(404) 248 248 249 249 # PUT to a specific instanct URI results in creation 250 self.getPage("/ models/5", method="PUT", body="name=boris")250 self.getPage("/users/5", method="PUT", body="name=boris") 251 251 self.assertBody("PUT 5") 252 252 self.assertHeader('Allow', 'DELETE, GET, HEAD, POST, PUT') 253 253 254 254 # GET acts like a container 255 self.getPage("/ models")255 self.getPage("/users") 256 256 self.assertBody("[1, 2, 3, 5]") 257 257 self.assertHeader('Allow', 'GET, HEAD, POST') … … 264 264 ) 265 265 for id, name, updatedname, headers in test_cases: 266 self.getPage("/ models/%d" % id)266 self.getPage("/users/%d" % id) 267 267 self.assertBody(name) 268 268 self.assertHeader('Allow', headers) 269 269 270 270 # Make sure POSTs update already existings resources 271 self.getPage("/ models/%d" % id, method='POST', body="name=%s" % updatedname)271 self.getPage("/users/%d" % id, method='POST', body="name=%s" % updatedname) 272 272 self.assertBody("POST %d" % id) 273 273 self.assertHeader('Allow', headers) 274 274 275 275 # Make sure PUTs Update already existing resources. 276 self.getPage("/ models/%d" % id, method='PUT', body="name=%s" % updatedname)276 self.getPage("/users/%d" % id, method='PUT', body="name=%s" % updatedname) 277 277 self.assertBody("PUT %d" % id) 278 278 self.assertHeader('Allow', headers) 279 279 280 280 # Make sure DELETES Remove already existing resources. 281 self.getPage("/ models/%d" % id, method='DELETE')281 self.getPage("/users/%d" % id, method='DELETE') 282 282 self.assertBody("DELETE %d" % id) 283 283 self.assertHeader('Allow', headers) … … 285 285 286 286 # GET acts like a container 287 self.getPage("/ models")287 self.getPage("/users") 288 288 self.assertBody("[]") 289 289 self.assertHeader('Allow', 'GET, HEAD, POST')

