Skip to content

Commit e8e2f86

Browse files
committed
Move decorator to outside of the class
Change unittest to test the new format using the decorator committer: Ralf Schlatterbeck <[email protected]>
1 parent 62b9762 commit e8e2f86

File tree

2 files changed

+114
-117
lines changed

2 files changed

+114
-117
lines changed

roundup/rest.py

Lines changed: 52 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,58 @@
1414
import traceback
1515
from roundup import hyperdb
1616
from roundup.exceptions import *
17-
from roundup import xmlrpc
17+
18+
19+
def _data_decorator(func):
20+
"""Wrap the returned data into an object."""
21+
def format_object(self, *args, **kwargs):
22+
# get the data / error from function
23+
try:
24+
code, data = func(self, *args, **kwargs)
25+
except IndexError, msg:
26+
code = 404
27+
data = msg
28+
except Unauthorised, msg:
29+
code = 403
30+
data = msg
31+
except (hyperdb.DesignatorError, UsageError), msg:
32+
code = 400
33+
data = msg
34+
except (AttributeError, Reject), msg:
35+
code = 405
36+
data = msg
37+
except ValueError, msg:
38+
code = 409
39+
data = msg
40+
except NotImplementedError:
41+
code = 402 # nothing to pay, just a mark for debugging purpose
42+
data = 'Method under development'
43+
except:
44+
exc, val, tb = sys.exc_info()
45+
code = 400
46+
# if self.DEBUG_MODE in roundup_server
47+
# else data = 'An error occurred. Please check...',
48+
data = val
49+
50+
# out to the logfile
51+
print 'EXCEPTION AT', time.ctime()
52+
traceback.print_exc()
53+
54+
# decorate it
55+
self.client.response_code = code
56+
if code >= 400: # any error require error format
57+
result = {
58+
'error': {
59+
'status': code,
60+
'msg': data
61+
}
62+
}
63+
else:
64+
result = {
65+
'data': data
66+
}
67+
return result
68+
return format_object
1869

1970

2071
class RestfulInstance(object):
@@ -89,55 +140,6 @@ def prop_from_arg(self, cl, key, value, itemid=None):
89140

90141
return prop
91142

92-
def _data_decorator(func):
93-
"""Wrap the returned data into an object.."""
94-
def format_object(self, *args, **kwargs):
95-
try:
96-
code, data = func(self, *args, **kwargs)
97-
except IndexError, msg:
98-
code = 404
99-
data = msg
100-
except Unauthorised, msg:
101-
code = 403
102-
data = msg
103-
except (hyperdb.DesignatorError, UsageError), msg:
104-
code = 400
105-
data = msg
106-
except (AttributeError, Reject), msg:
107-
code = 405
108-
data = msg
109-
except ValueError, msg:
110-
code = 409
111-
data = msg
112-
except NotImplementedError:
113-
code = 402 # nothing to pay, just a mark for debugging purpose
114-
data = 'Method under development'
115-
except:
116-
exc, val, tb = sys.exc_info()
117-
code = 400
118-
# if self.DEBUG_MODE in roundup_server
119-
# else data = 'An error occurred. Please check...',
120-
data = val
121-
122-
# out to the logfile
123-
print 'EXCEPTION AT', time.ctime()
124-
traceback.print_exc()
125-
126-
self.client.response_code = code
127-
if code >= 400: # any error require error format
128-
result = {
129-
'error': {
130-
'status': code,
131-
'msg': data
132-
}
133-
}
134-
else:
135-
result = {
136-
'data': data
137-
}
138-
return result
139-
return format_object
140-
141143
@_data_decorator
142144
def get_collection(self, class_name, input):
143145
"""GET resource from class URI.

test/test_rest.py

Lines changed: 62 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,9 @@ def setUp(self):
5656
'HTTP_HOST': 'localhost',
5757
'TRACKER_NAME': 'rounduptest'
5858
}
59-
dummy_client = client.Client(self.instance, None, env, [], None)
59+
self.dummy_client = client.Client(self.instance, None, env, [], None)
6060

61-
self.server = RestfulInstance(dummy_client, self.db)
61+
self.server = RestfulInstance(self.dummy_client, self.db)
6262

6363
def tearDown(self):
6464
self.db.close()
@@ -74,22 +74,22 @@ def testGet(self):
7474
obtain data for 'joe'
7575
"""
7676
# Retrieve all three users.
77-
code, results = self.server.get_collection('user', {})
78-
self.assertEqual(code, 200)
79-
self.assertEqual(len(results), 3)
77+
results = self.server.get_collection('user', {})
78+
self.assertEqual(self.dummy_client.response_code, 200)
79+
self.assertEqual(len(results['data']), 3)
8080

8181
# Obtain data for 'joe'.
82-
code, results = self.server.get_element('user', self.joeid, {})
83-
self.assertEqual(code, 200)
82+
results = self.server.get_element('user', self.joeid, {})['data']
83+
self.assertEqual(self.dummy_client.response_code, 200)
8484
self.assertEqual(results['attributes']['username'], 'joe')
8585
self.assertEqual(results['attributes']['realname'], 'Joe Random')
8686

8787
# Obtain data for 'joe'.
88-
code, results = self.server.get_attribute(
88+
results = self.server.get_attribute(
8989
'user', self.joeid, 'username', {}
9090
)
91-
self.assertEqual(code, 200)
92-
self.assertEqual(results['data'], 'joe')
91+
self.assertEqual(self.dummy_client.response_code, 200)
92+
self.assertEqual(results['data']['data'], 'joe')
9393

9494
def testPut(self):
9595
"""
@@ -101,30 +101,29 @@ def testPut(self):
101101
form.list = [
102102
cgi.MiniFieldStorage('data', 'Joe Doe Doe')
103103
]
104-
code, results = self.server.put_attribute(
104+
results = self.server.put_attribute(
105105
'user', self.joeid, 'realname', form
106106
)
107-
code, results = self.server.get_attribute(
107+
results = self.server.get_attribute(
108108
'user', self.joeid, 'realname', {}
109109
)
110-
self.assertEqual(code, 200)
111-
self.assertEqual(results['data'], 'Joe Doe Doe')
110+
self.assertEqual(self.dummy_client.response_code, 200)
111+
self.assertEqual(results['data']['data'], 'Joe Doe Doe')
112112

113113
# Reset joe's 'realname'.
114114
form = cgi.FieldStorage()
115115
form.list = [
116116
cgi.MiniFieldStorage('realname', 'Joe Doe')
117117
]
118-
code, results = self.server.put_element('user', self.joeid, form)
119-
code, results = self.server.get_element('user', self.joeid, {})
120-
self.assertEqual(code, 200)
121-
self.assertEqual(results['attributes']['realname'], 'Joe Doe')
118+
results = self.server.put_element('user', self.joeid, form)
119+
results = self.server.get_element('user', self.joeid, {})
120+
self.assertEqual(self.dummy_client.response_code, 200)
121+
self.assertEqual(results['data']['attributes']['realname'], 'Joe Doe')
122122

123123
# check we can't change admin's details
124-
self.assertRaises(
125-
Unauthorised,
126-
self.server.put_element, 'user', '1', form
127-
)
124+
results = self.server.put_element('user', '1', form)
125+
self.assertEqual(self.dummy_client.response_code, 403)
126+
self.assertEqual(results['error']['status'], 403)
128127

129128
def testPost(self):
130129
"""
@@ -135,12 +134,12 @@ def testPost(self):
135134
form.list = [
136135
cgi.MiniFieldStorage('title', 'foo')
137136
]
138-
code, results = self.server.post_collection('issue', form)
139-
self.assertEqual(code, 201)
140-
issueid = results['id']
141-
code, results = self.server.get_element('issue', issueid, {})
142-
self.assertEqual(code, 200)
143-
self.assertEqual(results['attributes']['title'], 'foo')
137+
results = self.server.post_collection('issue', form)
138+
self.assertEqual(self.dummy_client.response_code, 201)
139+
issueid = results['data']['id']
140+
results = self.server.get_element('issue', issueid, {})
141+
self.assertEqual(self.dummy_client.response_code, 200)
142+
self.assertEqual(results['data']['attributes']['title'], 'foo')
144143
self.assertEqual(self.db.issue.get(issueid, "tx_Source"), 'web')
145144

146145
def testPostFile(self):
@@ -152,11 +151,11 @@ def testPostFile(self):
152151
form.list = [
153152
cgi.MiniFieldStorage('content', 'hello\r\nthere')
154153
]
155-
code, results = self.server.post_collection('file', form)
156-
self.assertEqual(code, 201)
157-
fileid = results['id']
158-
code, results = self.server.get_element('file', fileid, {})
159-
self.assertEqual(code, 200)
154+
results = self.server.post_collection('file', form)
155+
self.assertEqual(self.dummy_client.response_code, 201)
156+
fileid = results['data']['id']
157+
results = self.server.get_element('file', fileid, {})['data']
158+
self.assertEqual(self.dummy_client.response_code, 200)
160159
self.assertEqual(results['attributes']['content'], 'hello\r\nthere')
161160

162161
def testAuthDeniedPut(self):
@@ -168,10 +167,9 @@ def testAuthDeniedPut(self):
168167
form.list = [
169168
cgi.MiniFieldStorage('realname', 'someone')
170169
]
171-
self.assertRaises(
172-
Unauthorised,
173-
self.server.put_element, 'user', '1', form
174-
)
170+
results = self.server.put_element('user', '1', form)
171+
self.assertEqual(self.dummy_client.response_code, 403)
172+
self.assertEqual(results['error']['status'], 403)
175173

176174
def testAuthDeniedPost(self):
177175
"""
@@ -181,10 +179,9 @@ def testAuthDeniedPost(self):
181179
form.list = [
182180
cgi.MiniFieldStorage('username', 'blah')
183181
]
184-
self.assertRaises(
185-
Unauthorised,
186-
self.server.post_collection, 'user', form
187-
)
182+
results = self.server.post_collection('user', form)
183+
self.assertEqual(self.dummy_client.response_code, 403)
184+
self.assertEqual(results['error']['status'], 403)
188185

189186
def testAuthAllowedPut(self):
190187
"""
@@ -196,10 +193,9 @@ def testAuthAllowedPut(self):
196193
cgi.MiniFieldStorage('realname', 'someone')
197194
]
198195
try:
199-
try:
200-
self.server.put_element('user', '2', form)
201-
except Unauthorised, err:
202-
self.fail('raised %s' % err)
196+
self.server.put_element('user', '2', form)
197+
except Unauthorised, err:
198+
self.fail('raised %s' % err)
203199
finally:
204200
self.db.setCurrentUser('joe')
205201

@@ -213,10 +209,9 @@ def testAuthAllowedPost(self):
213209
cgi.MiniFieldStorage('username', 'blah')
214210
]
215211
try:
216-
try:
217-
self.server.post_collection('user', form)
218-
except Unauthorised, err:
219-
self.fail('raised %s' % err)
212+
self.server.post_collection('user', form)
213+
except Unauthorised, err:
214+
self.fail('raised %s' % err)
220215
finally:
221216
self.db.setCurrentUser('joe')
222217

@@ -228,19 +223,19 @@ def testDeleteAttributeUri(self):
228223
issue_id = self.db.issue.create(title='foo', nosy=['1'])
229224

230225
# remove the title and nosy
231-
code, results = self.server.delete_attribute(
226+
results = self.server.delete_attribute(
232227
'issue', issue_id, 'title', {}
233228
)
234-
self.assertEqual(code, 200)
229+
self.assertEqual(self.dummy_client.response_code, 200)
235230

236-
code, results = self.server.delete_attribute(
231+
results = self.server.delete_attribute(
237232
'issue', issue_id, 'nosy', {}
238233
)
239-
self.assertEqual(code, 200)
234+
self.assertEqual(self.dummy_client.response_code, 200)
240235

241236
# verify the result
242-
code, results = self.server.get_element('issue', issue_id, {})
243-
self.assertEqual(code, 200)
237+
results = self.server.get_element('issue', issue_id, {})['data']
238+
self.assertEqual(self.dummy_client.response_code, 200)
244239
self.assertEqual(len(results['attributes']['nosy']), 0)
245240
self.assertListEqual(results['attributes']['nosy'], [])
246241
self.assertEqual(results['attributes']['title'], None)
@@ -258,12 +253,12 @@ def testPatchAdd(self):
258253
cgi.MiniFieldStorage('op', 'add'),
259254
cgi.MiniFieldStorage('nosy', '2')
260255
]
261-
code, results = self.server.patch_element('issue', issue_id, form)
262-
self.assertEqual(code, 200)
256+
results = self.server.patch_element('issue', issue_id, form)
257+
self.assertEqual(self.dummy_client.response_code, 200)
263258

264259
# verify the result
265-
code, results = self.server.get_element('issue', issue_id, {})
266-
self.assertEqual(code, 200)
260+
results = self.server.get_element('issue', issue_id, {})['data']
261+
self.assertEqual(self.dummy_client.response_code, 200)
267262
self.assertEqual(len(results['attributes']['nosy']), 2)
268263
self.assertListEqual(results['attributes']['nosy'], ['1', '2'])
269264

@@ -281,12 +276,12 @@ def testPatchReplace(self):
281276
cgi.MiniFieldStorage('nosy', '2'),
282277
cgi.MiniFieldStorage('status', '3')
283278
]
284-
code, results = self.server.patch_element('issue', issue_id, form)
285-
self.assertEqual(code, 200)
279+
results = self.server.patch_element('issue', issue_id, form)
280+
self.assertEqual(self.dummy_client.response_code, 200)
286281

287282
# verify the result
288-
code, results = self.server.get_element('issue', issue_id, {})
289-
self.assertEqual(code, 200)
283+
results = self.server.get_element('issue', issue_id, {})['data']
284+
self.assertEqual(self.dummy_client.response_code, 200)
290285
self.assertEqual(results['attributes']['status'], '3')
291286
self.assertEqual(len(results['attributes']['nosy']), 1)
292287
self.assertListEqual(results['attributes']['nosy'], ['2'])
@@ -305,12 +300,12 @@ def testPatchRemoveAll(self):
305300
cgi.MiniFieldStorage('nosy', ''),
306301
cgi.MiniFieldStorage('title', '')
307302
]
308-
code, results = self.server.patch_element('issue', issue_id, form)
309-
self.assertEqual(code, 200)
303+
results = self.server.patch_element('issue', issue_id, form)
304+
self.assertEqual(self.dummy_client.response_code, 200)
310305

311306
# verify the result
312-
code, results = self.server.get_element('issue', issue_id, {})
313-
self.assertEqual(code, 200)
307+
results = self.server.get_element('issue', issue_id, {})['data']
308+
self.assertEqual(self.dummy_client.response_code, 200)
314309
self.assertEqual(results['attributes']['title'], None)
315310
self.assertEqual(len(results['attributes']['nosy']), 0)
316311
self.assertEqual(results['attributes']['nosy'], [])

0 commit comments

Comments
 (0)