def test_naming_multiple_logic_apis(self): api_1 = Api(version="v1", name="read-only-methods") api_1.register_endpoint( ApiEndpoint(http_method="GET", endpoint="/task/", handler=self.get_tasks)) self.app.register_blueprint(api_1) api_2 = Api(version="v1", name="write-methods") api_2.register_endpoint( ApiEndpoint(http_method="POST", endpoint="/task/", handler=self.post_task)) self.app.register_blueprint(api_2) self.app.config['TESTING'] = True client = self.app.test_client() # Testing GET resp = client.get('/v1/task/', content_type='application/json') self.assertEqual(resp.status_code, 200) self.assertEqual(resp.headers['Content-Type'], 'application/json') data = json.loads(resp.data.decode(resp.charset)) self.assertEqual(len(data), 2) # Testing POST resp = client.post('/v1/task/', content_type='application/json', data=json.dumps({'task': 'New Task!'})) self.assertEqual(resp.status_code, 201) self.assertEqual(resp.headers['Content-Type'], 'application/json') self.assertEqual(len(self.tasks), 3)
def setUp(self): app = Flask(__name__) def success_handler(request): if request.method == 'GET': return {}, 200 elif request.method == 'POST': return {}, 201 def conflict_handler(request): return {'task': 'Conflicted Task'}, 409 api_201409 = Api(version="v1") api_201409.register_endpoint( ApiEndpoint(http_method=["GET", "POST"], endpoint="/", handler=success_handler)) api_201409.register_endpoint( ApiEndpoint(http_method="GET", endpoint="/conflict", handler=conflict_handler)) app.register_blueprint(api_201409) app.config['TESTING'] = True self.app = app.test_client()
def test_versions_with_different_endpoints_different_url(self): app = Flask(__name__) get_tasks = mock.MagicMock(return_value={'id': 1, 'task': 'Do dishes'}) get_tasks.__name__ = 'get_tasks' get_users = mock.MagicMock(return_value={ 'id': 2, 'username': '******' }) get_users.__name__ = 'get_users' api_201409 = Api(version="v1") api_201507 = Api(version="v2") api_201409.register_endpoint( ApiEndpoint(http_method="GET", endpoint="/task/", handler=get_tasks)) api_201507.register_endpoint( ApiEndpoint(http_method="GET", endpoint="/users/", handler=get_users)) app.register_blueprint(api_201409) app.register_blueprint(api_201507) app.config['TESTING'] = True self.app = app.test_client() resp = self.app.get('/v1/users/', content_type='application/json') self.assertEqual(resp.status_code, 404) resp = self.app.get('/v1/task/', content_type='application/json') self.assertEqual(resp.status_code, 200) data = json.loads(resp.data.decode(resp.charset)) self.assertEqual(data, {'id': 1, 'task': 'Do dishes'}) self.assertEqual(get_tasks.call_count, 1) self.assertEqual(get_users.call_count, 0) resp = self.app.get('/v2/task/', content_type='application/json') self.assertEqual(resp.status_code, 404) resp = self.app.get('/v2/users/', content_type='application/json') self.assertEqual(resp.status_code, 200) data = json.loads(resp.data.decode(resp.charset)) self.assertEqual(data, {'id': 2, 'username': '******'}) self.assertEqual(get_tasks.call_count, 1) self.assertEqual(get_users.call_count, 1)
def setUp(self): app = Flask(__name__) self.tasks = [ { 'id': 1, 'task': 'Decimal task', 'price': Decimal(22.755) }, { 'id': 2, 'task': 'Float task', 'price': 88.322 }, { 'id': 3, 'task': 'Integer task', 'price': 882 }, ] def get_tasks(request): return self.tasks def get_task(request, task_id): return get_task_by_id(self.tasks, task_id) def post_task(request): data = request.json self.tasks.append({'task': data['task'], 'price': data['price']}) return {}, 201 api_201409 = Api(version="v1") task_endpoint = ApiEndpoint(http_method="GET", endpoint="/task/", handler=get_tasks) api_201409.register_endpoint(task_endpoint) task_endpoint = ApiEndpoint(http_method="GET", endpoint="/task/<int:task_id>/", handler=get_task) api_201409.register_endpoint(task_endpoint) task_endpoint = ApiEndpoint(http_method="POST", endpoint="/task/", handler=post_task) api_201409.register_endpoint(task_endpoint) app.register_blueprint(api_201409) app.config['TESTING'] = True self.app = app.test_client()
def setUp(self): app = Flask(__name__) def raises_dummy_exception(request): exc_type = request.args.get('exc_type') if exc_type == 'subclass': raise DummyExceptionSubclass() elif exc_type == 'other-subclass': raise DummyExceptionOtherSubclass() raise DummyException() api_201409 = Api(version="v1") api_201409.register_endpoint(ApiEndpoint( http_method="GET", endpoint="/dummy-exception", handler=raises_dummy_exception, exceptions=[ (DummyExceptionOtherSubclass, 409), (DummyExceptionSubclass, 406), (DummyException, 400) ] )) app.register_blueprint(api_201409) app.config['TESTING'] = True self.app = app.test_client()
def test_versions_with_same_endpoints(self): app = Flask(__name__) def get_task(request): return self.tasks api_201409 = Api(version="v1") api_201507 = Api(version="v2") task_endpoint = ApiEndpoint(http_method="GET", endpoint="/task/", handler=get_task) api_201409.register_endpoint(task_endpoint) api_201507.register_endpoint(task_endpoint) app.register_blueprint(api_201409) app.register_blueprint(api_201507) app.config['TESTING'] = True self.app = app.test_client() resp = self.app.get('/v1/task/', content_type='application/json') self.assertEqual(resp.status_code, 200) resp = self.app.get('/v2/task/', content_type='application/json') self.assertEqual(resp.status_code, 200)
def test_byte_text_serializer(self): "Should return correct text response returning bytes" api_v1 = Api(version="v1") text = six.b(""" Plain text In Multiple Lines""") def bytes_endpoint(request): return text api_v1.register_endpoint( ApiEndpoint(http_method="GET", endpoint="/bytes-endpoint/", handler=bytes_endpoint, serializer='text')) self.app.register_blueprint(api_v1) client = self.app.test_client() resp = client.get('/v1/bytes-endpoint/') self.assertEqual(resp.status_code, 200) self.assertEqual(resp.data, text) self.assertEqual(resp.data.decode(resp.charset), text.decode('utf-8')) self.assertEqual(resp.headers['Content-Type'], 'text/plain')
def test_data_returned_with_correct_status_code(self): app = Flask(__name__) self.conflicted_user = { 'username': '******', } def raises_exception(request): raise DummyDataException(data=self.conflicted_user) api_201409 = Api(version="v1") api_201409.register_endpoint(ApiEndpoint( http_method="GET", endpoint="/dummy-exception", handler=raises_exception, exceptions=[ (DummyDataException, 409), ] )) app.register_blueprint(api_201409) app.config['TESTING'] = True self.app = app.test_client() resp = self.app.get( '/v1/dummy-exception', content_type='application/json') self.assertEqual(resp.status_code, 409) data = json.loads(resp.data.decode(resp.charset)) self.assertEqual(data, self.conflicted_user)
def setUp(self): app = Flask(__name__) self.username = "******" self.password = "******" def is_valid_user(username, password): return (username, password) == (self.username, self.password) self.tasks = [ { 'id': 1, 'task': 'Do the laundry' }, { 'id': 2, 'task': 'Do the dishes' }, ] def get_tasks(request): return self.tasks api_201409 = Api(version="v1") api_201409.register_endpoint( ApiEndpoint(http_method="GET", endpoint="/task/basic", handler=get_tasks, authentication=BasicAuth(is_valid_user=is_valid_user))) app.register_blueprint(api_201409) app.config['TESTING'] = True self.app = app.test_client()
def test_query_params_are_accesible(self): app = Flask(__name__) def multiplier(request, value): return {'result': value * int(request.args.get('multiplier', 1))} api_v1 = Api(version="v1") multiplier_endpoint = ApiEndpoint(http_method="GET", endpoint="/multiply/<int:value>/", handler=multiplier) api_v1.register_endpoint(multiplier_endpoint) app.register_blueprint(api_v1) app.config['TESTING'] = True self.app = app.test_client() resp = self.app.get('/v1/multiply/3/', content_type='application/json') self.assertEqual(resp.status_code, 200) data = json.loads(resp.data.decode(resp.charset)) self.assertEqual(data, {'result': 3}) resp = self.app.get('/v1/multiply/3/?multiplier=5', content_type='application/json') self.assertEqual(resp.status_code, 200) data = json.loads(resp.data.decode(resp.charset)) self.assertEqual(data, {'result': 15})
def test_version_accesible_from_handler(self): app = Flask(__name__) def get_task(request): return {'version': request.api.version} api_201409 = Api(version="v1") api_201507 = Api(version="v2") task_endpoint = ApiEndpoint(http_method="GET", endpoint="/task/", handler=get_task) api_201409.register_endpoint(task_endpoint) api_201507.register_endpoint(task_endpoint) app.register_blueprint(api_201409) app.register_blueprint(api_201507) app.config['TESTING'] = True self.app = app.test_client() resp = self.app.get('/v1/task/', content_type='application/json') self.assertEqual(resp.status_code, 200) data = json.loads(resp.data.decode(resp.charset)) self.assertEqual(data, {'version': 'v1'}) resp = self.app.get('/v2/task/', content_type='application/json') self.assertEqual(resp.status_code, 200) data = json.loads(resp.data.decode(resp.charset)) self.assertEqual(data, {'version': 'v2'})
def test_process_request_with_one_middleware_that_doesnt_return(self): app = Flask(__name__) def get_tasks(request): return self.tasks api_201409 = Api(version="v1") with mock.patch.object(DummyMiddleware, 'process_request', return_value=None) as mock_method: api_201409.register_endpoint( ApiEndpoint(http_method="GET", endpoint="/task/", handler=get_tasks, middleware=[DummyMiddleware])) app.register_blueprint(api_201409) app.config['TESTING'] = True self.app = app.test_client() resp = self.app.get('/v1/task/', content_type='application/json') self.assertEqual(resp.status_code, 200) data = json.loads(resp.data.decode(resp.charset)) self.assertEqual(data, self.tasks) self.assertEqual(mock_method.call_count, 1)
def test_string_unicode_text_serializer(self): "Should return correct text response encoding str/unicode" api_v1 = Api(version="v1") text = six.u(""" Plain text ñÑüÜäÄÁáà In Multiple Lines""") def unicode_endpoint(request): return text api_v1.register_endpoint( ApiEndpoint(http_method="GET", endpoint="/unicode-endpoint/", handler=unicode_endpoint, serializer='text')) self.app.register_blueprint(api_v1) client = self.app.test_client() resp = client.get('/v1/unicode-endpoint/') self.assertEqual(resp.status_code, 200) self.assertEqual(resp.data, text.encode(resp.charset)) self.assertEqual(resp.data.decode(resp.charset), text) self.assertEqual(resp.headers['Content-Type'], 'text/plain')
def setUp(self): app = Flask(__name__) self.tasks = [ { 'id': 1, 'task': 'Do the laundry' }, { 'id': 2, 'task': 'Do the dishes' }, ] def get_tasks(request): return self.tasks, 200, {'Access-Control-Allow-Origin': '*'} def post_task(request): data = request.json self.tasks.append({'task': data['task']}) return {}, 201, { 'X-Special-Header': 'XXX', 'Access-Control-Allow-Origin': '*' } api_201409 = Api(version="v1") task_endpoint = ApiEndpoint(http_method="GET", endpoint="/task/", handler=get_tasks) api_201409.register_endpoint(task_endpoint) task_endpoint = ApiEndpoint(http_method="POST", endpoint="/task/", handler=post_task) api_201409.register_endpoint(task_endpoint) app.register_blueprint(api_201409) app.config['TESTING'] = True self.app = app.test_client()
def setUp(self): app = Flask(__name__) self.tasks = [ { 'id': 1, 'task': 'Do the laundry' }, { 'id': 2, 'task': 'Do the dishes' }, { 'id': 3, 'task': 'Take the dog out' }, ] def get_tasks(request): return self.tasks def get_task(request, task_id): return get_task_by_id(self.tasks, task_id) api_201409 = Api(version="v1") all_task_endpoint = ApiEndpoint(http_method="GET", endpoint="/task/", handler=get_tasks) task_endpoint = ApiEndpoint(http_method="GET", endpoint="/task/<int:task_id>/", handler=get_task) api_201409.register_endpoint(task_endpoint) api_201409.register_endpoint(all_task_endpoint) app.register_blueprint(api_201409) app.config['TESTING'] = True self.app = app.test_client()
def setUp(self): app = Flask(__name__) tasks = [ { 'id': 1, 'task': 'Do the laundry' }, { 'id': 2, 'task': 'Do the dishes' }, ] def get_task(request): return tasks def post_task(request): data = request.json tasks.append({'task': data['task']}) return {}, 201 api_201409 = Api(version="v1") task_endpoint = ApiEndpoint(http_method="GET", endpoint="/task/", handler=get_task) api_201409.register_endpoint(task_endpoint) task_endpoint = ApiEndpoint(http_method="POST", endpoint="/task/", handler=post_task) api_201409.register_endpoint(task_endpoint) app.register_blueprint(api_201409) app.config['TESTING'] = True self.app = app.test_client()
def test_unexisting_serializer_raises_proper_exception(self): app = Flask(__name__) app.config['TESTING'] = True api_v1 = Api(version="v1") api_v1.register_endpoint( ApiEndpoint(http_method="GET", endpoint="/test/", handler=lambda req: {}, serializer='non-existent')) app.register_blueprint(api_v1) client = app.test_client() with self.assertRaises(exceptions.InvalidSerializerException): resp = client.get('/v1/test/') self.assertEqual(resp.status_code, 500)
def test_naming_a_single_api(self): api_1 = Api(version="v1", name="read-only-methods") api_1.register_endpoint( ApiEndpoint(http_method="GET", endpoint="/task/", handler=self.get_tasks)) self.app.register_blueprint(api_1) self.app.config['TESTING'] = True client = self.app.test_client() resp = client.get('/v1/task/', content_type='application/json') self.assertEqual(resp.status_code, 200) self.assertEqual(resp.headers['Content-Type'], 'application/json') data = json.loads(resp.data.decode(resp.charset)) self.assertEqual(len(data), 2)
def test_process_request_with_one_middleware_that_raises_exception(self): app = Flask(__name__) def get_tasks(request): return self.tasks api_201409 = Api(version="v1") api_201409.register_endpoint( ApiEndpoint(http_method="GET", endpoint="/task/", handler=get_tasks, middleware=[ForbiddenMiddleware])) app.register_blueprint(api_201409) app.config['TESTING'] = True self.app = app.test_client() resp = self.app.get('/v1/task/', content_type='application/json') self.assertEqual(resp.status_code, 403)
def test_exception_is_defined_by_middleware(self): "Should get the exception defined in the middleware" app = Flask(__name__) def get_tasks(request): return self.tasks api_201409 = Api(version="v1") api_201409.register_endpoint( ApiEndpoint(http_method="GET", endpoint="/task/", handler=get_tasks, middleware=[FullCustomExceptionMiddleware])) app.register_blueprint(api_201409) app.config['TESTING'] = True self.app = app.test_client() resp = self.app.get('/v1/task/', content_type='application/json') self.assertEqual(resp.status_code, 400)
def test_exception_is_not_defined_and_propagated(self): "Should propagate the exception if it's not defined" app = Flask(__name__) def get_tasks(request): return self.tasks api_201409 = Api(version="v1") api_201409.register_endpoint( ApiEndpoint(http_method="GET", endpoint="/task/", handler=get_tasks, middleware=[CustomExceptionMiddleware])) app.register_blueprint(api_201409) app.config['TESTING'] = True self.app = app.test_client() with self.assertRaises(CustomException): self.app.get('/v1/task/', content_type='application/json')
def test_process_request_with_one_middleware_that_returns_data(self): app = Flask(__name__) def get_tasks(request): return self.tasks api_201409 = Api(version="v1") api_201409.register_endpoint( ApiEndpoint(http_method="GET", endpoint="/task/", handler=get_tasks, middleware=[RedirectDataMiddleware])) app.register_blueprint(api_201409) app.config['TESTING'] = True self.app = app.test_client() resp = self.app.get('/v1/task/', content_type='application/json') self.assertEqual(resp.status_code, 302) self.assertEqual(json.loads(resp.data.decode(resp.charset)), {})
def test_js_with_javascript_serializer(self): "Should return valid javascript using the js serializer" api_v1 = Api(version="v1") def js_endpoint_javascript_serializer(request): js_text = "window.ReallyImportantVariable = XXX-XXX-002;" return js_text api_v1.register_endpoint( ApiEndpoint(http_method="GET", endpoint="/js-javascript-serializer/", handler=js_endpoint_javascript_serializer, serializer='javascript')) self.app.register_blueprint(api_v1) client = self.app.test_client() resp = client.get('/v1/js-javascript-serializer/') self.assertEqual(resp.status_code, 200) self.assertEqual(resp.data.decode(resp.charset), "window.ReallyImportantVariable = XXX-XXX-002;") self.assertEqual(resp.headers['Content-Type'], 'application/javascript')
def test_api_without_a_version_and_with_name(self): app = Flask(__name__) get_tasks = mock.MagicMock(return_value={'id': 1, 'task': 'Do dishes'}) get_tasks.__name__ = 'get_tasks' api_v1 = Api(name="Test-API") api_v1.register_endpoint( ApiEndpoint(http_method="GET", endpoint="/task/", handler=get_tasks)) app.register_blueprint(api_v1) app.config['TESTING'] = True self.app = app.test_client() resp = self.app.get('/task/', content_type='application/json') self.assertEqual(resp.status_code, 200) data = json.loads(resp.data.decode(resp.charset)) self.assertEqual(data, {'id': 1, 'task': 'Do dishes'}) self.assertEqual(get_tasks.call_count, 1)
def setUp(self): app = Flask(__name__) self.tasks = [{ 'id': 1, 'task': 'Do the laundry' }, { 'id': 2, 'task': 'Do the dishes' }] def get_tasks(request): return self.tasks def post_task(request): data = request.json self.tasks.append({'task': data['task']}) return {}, 201 def put_task(request, task_id): task = get_task_by_id(self.tasks, task_id) data = request.json task['task'] = data['task'] task['id'] = data['id'] return {}, 204 def patch_task(request, task_id): task = get_task_by_id(self.tasks, task_id) data = request.json task['task'] = data['task'] return {}, 204 def delete_task(request, task_id): index = get_task_index_by_id(self.tasks, task_id) task = self.tasks.pop(index) return task api_201409 = Api(version="v1") api_201409.register_endpoint( ApiEndpoint(http_method="GET", endpoint="/task/", handler=get_tasks)) api_201409.register_endpoint( ApiEndpoint(http_method="POST", endpoint="/task/", handler=post_task)) api_201409.register_endpoint( ApiEndpoint(http_method="PUT", endpoint="/task/<int:task_id>/", handler=put_task)) api_201409.register_endpoint( ApiEndpoint(http_method="PATCH", endpoint="/task/<int:task_id>/", handler=patch_task)) api_201409.register_endpoint( ApiEndpoint(http_method="DELETE", endpoint="/task/<int:task_id>/", handler=delete_task)) app.register_blueprint(api_201409) app.config['TESTING'] = True self.app = app.test_client()