diff options
Diffstat (limited to 'tests/test_flask.py')
-rw-r--r-- | tests/test_flask.py | 216 |
1 files changed, 0 insertions, 216 deletions
diff --git a/tests/test_flask.py b/tests/test_flask.py deleted file mode 100644 index f039f45..0000000 --- a/tests/test_flask.py +++ /dev/null @@ -1,216 +0,0 @@ -# encoding=utf8 -import unittest -from flask import Flask, json, abort -import flask_restful as restful - -from wsmeext.flask import signature -from wsme.api import Response -from wsme.types import Base, text - - -class Model(Base): - id = int - name = text - - -class Criterion(Base): - op = text - attr = text - value = text - -test_app = Flask(__name__) -api = restful.Api(test_app) - - -@test_app.route('/multiply') -@signature(int, int, int) -def multiply(a, b): - return a * b - - -@test_app.route('/divide_by_zero') -@signature(None) -def divide_by_zero(): - return 1 / 0 - - -@test_app.route('/models') -@signature([Model], [Criterion]) -def list_models(q=None): - if q: - name = q[0].value - else: - name = 'first' - return [Model(name=name)] - - -@test_app.route('/models/<name>') -@signature(Model, text) -def get_model(name): - return Model(name=name) - - -@test_app.route('/models/<name>/secret') -@signature(Model, text) -def model_secret(name): - abort(403) - - -@test_app.route('/models/<name>/custom-error') -@signature(Model, text) -def model_custom_error(name): - class CustomError(Exception): - code = 412 - raise CustomError("FOO!") - - -@test_app.route('/models', methods=['POST']) -@signature(Model, body=Model) -def post_model(body): - return Model(name=body.name) - - -@test_app.route('/status_sig') -@signature(int, status_code=201) -def get_status_sig(): - return 1 - - -@test_app.route('/status_response') -@signature(int) -def get_status_response(): - return Response(1, status_code=201) - - -class RestFullApi(restful.Resource): - @signature(Model) - def get(self): - return Model(id=1, name=u"Gérard") - - @signature(int, body=Model) - def post(self, model): - return model.id - -api.add_resource(RestFullApi, '/restful') - - -class FlaskrTestCase(unittest.TestCase): - - def setUp(self): - test_app.config['TESTING'] = True - self.app = test_app.test_client() - - def tearDown(self): - pass - - def test_multiply(self): - r = self.app.get('/multiply?a=2&b=5') - assert r.data == b'10', r.data - - def test_get_model(self): - resp = self.app.get('/models/test') - assert resp.status_code == 200 - - def test_list_models(self): - resp = self.app.get('/models') - assert resp.status_code == 200 - - def test_array_parameter(self): - resp = self.app.get('/models?q.op=%3D&q.attr=name&q.value=second') - assert resp.status_code == 200 - self.assertEqual( - resp.data, b'[{"name": "second"}]' - ) - - def test_post_model(self): - resp = self.app.post('/models', data={"body.name": "test"}) - assert resp.status_code == 200 - resp = self.app.post( - '/models', - data=json.dumps({"name": "test"}), - content_type="application/json" - ) - assert resp.status_code == 200 - - def test_get_status_sig(self): - resp = self.app.get('/status_sig') - assert resp.status_code == 201 - - def test_get_status_response(self): - resp = self.app.get('/status_response') - assert resp.status_code == 201 - - def test_custom_clientside_error(self): - r = self.app.get( - '/models/test/secret', - headers={'Accept': 'application/json'} - ) - assert r.status_code == 403, r.status_code - assert '403 Forbidden:' in json.loads(r.data)['faultstring'] - - r = self.app.get( - '/models/test/secret', - headers={'Accept': 'application/xml'} - ) - assert r.status_code == 403, r.status_code - assert r.data == (b"<error><faultcode>Client</faultcode>" - b"<faultstring>403 Forbidden: You don't have the " - b"permission to access the requested resource. It " - b"is either read-protected or not readable by the " - b"server." - b"</faultstring><debuginfo /></error>") - - # NOTE(cdent): For reasons unclear, 'r' here has no value on data - # even though it does earlier in the stack. If works with Werkzeug - # <0.14.0 but not after. As WSME does not have test-requirement, nor - # pinning, so not a lot to do here. - @unittest.expectedFailure - def test_custom_non_http_clientside_error(self): - r = self.app.get( - '/models/test/custom-error', - headers={'Accept': 'application/json'} - ) - assert r.status_code == 412, r.status_code - assert json.loads(r.data)['faultstring'] == 'FOO!' - - r = self.app.get( - '/models/test/custom-error', - headers={'Accept': 'application/xml'} - ) - assert r.status_code == 412, r.status_code - assert r.data == (b'<error><faultcode>Client</faultcode>' - b'<faultstring>FOO!</faultstring>' - b'<debuginfo /></error>') - - def test_serversideerror(self): - r = self.app.get('/divide_by_zero') - assert r.status_code == 500 - data = json.loads(r.data) - self.assertEqual(data['debuginfo'], None) - self.assertEqual(data['faultcode'], 'Server') - self.assertIn('by zero', data['faultstring']) - - def test_restful_get(self): - r = self.app.get('/restful', headers={'Accept': 'application/json'}) - self.assertEqual(r.status_code, 200) - - data = json.loads(r.data) - - self.assertEqual(data['id'], 1) - self.assertEqual(data['name'], u"Gérard") - - def test_restful_post(self): - r = self.app.post( - '/restful', - data=json.dumps({'id': 5, 'name': u'Huguette'}), - headers={ - 'Accept': 'application/json', - 'Content-Type': 'application/json'}) - self.assertEqual(r.status_code, 200) - - data = json.loads(r.data) - - self.assertEqual(data, 5) - -if __name__ == '__main__': - test_app.run() |