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 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_exception_is_overwritten_by_endpoint(self):
        "The endpoint exception should take precedence"
        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
            ],
            exceptions=[
                (CustomException, 409),
            ]
        ))
        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, 409)
Exemple #4
0
    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_process_request_with_multiple_middlewares_order_1(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,
                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, 302)

        self.assertEqual(json.loads(resp.data.decode(resp.charset)), {})
    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 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_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')
Exemple #9
0
    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')
Exemple #10
0
    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')
Exemple #11
0
    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_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 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_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')
Exemple #16
0
    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)
Exemple #17
0
    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)
Exemple #18
0
    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_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)
Exemple #20
0
    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)
Exemple #21
0
    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_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_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 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_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_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)
Exemple #27
0
    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 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_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)
Exemple #30
0
    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()
Exemple #31
0
    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_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_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 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)
Exemple #35
0
    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 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__)
        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_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')
Exemple #39
0
    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"},
            {"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__)
        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 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)
Exemple #43
0
    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 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)
Exemple #45
0
    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()
Exemple #46
0
    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()
Exemple #47
0
    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()
    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()