3
from ivle.webapp.base.rest import (JSONRESTView, named_operation,
5
from ivle.webapp.errors import BadRequest, MethodNotAllowed, Unauthorized
3
from ivle.webapp.base.views import RESTView, JSONRESTView, named_operation
4
from ivle.webapp.errors import BadRequest, MethodNotAllowed
6
5
from ivle.webapp.testing import FakeUser, FakeRequest
8
7
class JSONRESTViewTestWithoutPUT(JSONRESTView):
9
8
'''A small JSON REST view for testing purposes, without a PUT method.'''
10
def get_permissions(self, user):
11
if user.login == u'fakeuser':
12
return set(['view', 'edit'])
13
if user.login == u'otheruser':
17
@require_permission('view')
19
10
return {'method': 'get'}
21
@require_permission('edit')
22
12
def PATCH(self, req, data):
23
13
return {'method': 'patch',
24
14
'result': data['result'], 'test': data['test']}
26
@named_operation('view')
27
17
def do_stuff(self, req, what):
28
18
return {'result': 'Did %s!' % what}
30
@named_operation('edit')
31
21
def say_something(self, req, thing='nothing'):
32
22
return {'result': 'Said %s!' % thing}
34
@named_operation('edit')
35
def do_say_something(self, req, what, thing='nothing'):
36
return {'result': 'Said %s and %s!' % (what, thing)}
38
@named_operation('view')
39
25
def get_req_method(self, req):
40
26
return {'method': req.method}
42
28
class JSONRESTViewTest(JSONRESTViewTestWithoutPUT):
43
29
'''A small JSON REST view for testing purposes.'''
44
@require_permission('edit')
45
30
def PUT(self, req, data):
46
31
return {'method': 'put',
47
32
'result': data['result'], 'test': data['test']}
211
196
assert req.content_type == 'application/json'
212
197
assert req.response_body == '{"result": "Said something!"}\n'
214
def testNamedOperationWithDefaultAndMissingArgs(self):
217
req.request_body = urllib.urlencode({'ivle.op': 'do_say_something',
218
'thing': 'something'})
219
view = JSONRESTViewTest(req)
222
except BadRequest, e:
223
assert e.message == 'Missing arguments: what'
225
raise AssertionError("did not raise BadRequest")
227
199
def testNamedOperationUsingRequest(self):
228
200
req = FakeRequest()
229
201
req.method = 'POST'
233
205
assert req.content_type == 'application/json'
234
206
assert req.response_body == '{"method": "POST"}\n'
236
def testInvalidPOSTData(self):
239
req.request_body = 'I am invalid&&&&'
240
view = JSONRESTViewTest(req)
243
except BadRequest, e:
245
assert e.message == 'No named operation specified.'
247
raise AssertionError("did not raise BadRequest")
249
def testInvalidPATCHData(self):
252
req.request_body = 'I am invalid'
253
view = JSONRESTViewTest(req)
256
except BadRequest, e:
257
assert e.message == 'Invalid JSON data'
259
raise AssertionError("did not raise BadRequest")
261
def testInvalidPUTData(self):
264
req.request_body = 'I am invalid'
265
view = JSONRESTViewTest(req)
268
except BadRequest, e:
269
assert e.message == 'Invalid JSON data'
271
raise AssertionError("did not raise BadRequest")
273
class TestJSONRESTSecurity:
274
def testGoodMethod(self):
276
req.user.login = u'otheruser'
278
view = JSONRESTViewTest(req)
280
assert req.content_type == 'application/json'
281
assert req.response_body == '{"method": "get"}\n'
283
def testBadMethod(self):
285
req.user.login = u'otheruser'
287
view = JSONRESTViewTest(req)
290
except Unauthorized, e:
293
raise AssertionError("did not raise Unauthorized")
295
def testGoodNamedOperation(self):
297
req.user.login = u'otheruser'
299
req.request_body = urllib.urlencode({'ivle.op': 'do_stuff',
301
view = JSONRESTViewTest(req)
303
assert req.content_type == 'application/json'
304
assert req.response_body == '{"result": "Did blah!"}\n'
306
def testBadNamedOperation(self):
308
req.user.login = u'otheruser'
310
req.request_body = urllib.urlencode({'ivle.op': 'say_something'})
311
view = JSONRESTViewTest(req)
314
except Unauthorized, e:
317
raise AssertionError("did not raise Unauthorized")