Skip to content

Commit 0b1cece

Browse files
committed
Python: Add tests for class based handlers in Flask
1 parent c69b776 commit 0b1cece

File tree

1 file changed

+69
-3
lines changed

1 file changed

+69
-3
lines changed

python/ql/test/experimental/library-tests/frameworks/flask/routing_test.py

Lines changed: 69 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,76 @@ def later_set(): # $ MISSING: requestHandler
2121
app.add_url_rule('/later-set', 'later_set', view_func=None) # $routeSetup="/later-set"
2222
app.view_functions['later_set'] = later_set
2323

24+
# We don't want to execute this at runtime (since program will crash). Just using
25+
# `False` makes our analysis skip it, so here's a workaround :D
26+
if __file__ == "False":
27+
@app.route(UNKNOWN_ROUTE) # $routeSetup
28+
def unkown_route(foo, bar): # $requestHandler routedParameter=foo routedParameter=bar
29+
return make_response("unkown_route") # $HttpResponse
2430

25-
@app.route(UNKNOWN_ROUTE) # $routeSetup
26-
def unkown_route(foo, bar): # $requestHandler routedParameter=foo routedParameter=bar
27-
return make_response("unkown_route") # $HttpResponse
31+
# View
32+
#
33+
# see https://flask.palletsprojects.com/en/1.1.x/views/#basic-principle
34+
35+
from flask.views import View
36+
37+
38+
class ShowUser(View):
39+
40+
def dispatch_request(self, user_id): # $ MISSING: requestHandler routedParameter=user_id
41+
return "user_id: {}".format(user_id)
42+
43+
app.add_url_rule("/basic/user/<int:user_id>", view_func=ShowUser.as_view('show_user')) # $routeSetup="/basic/user/<int:user_id>"
44+
45+
46+
class WithoutKnownRoute1(View):
47+
# For handler without known route, treat all parameters as routed parameters
48+
# (accepting that there might be a few FPs)
49+
def dispatch_request(self, foo, not_routed=42): # $ MISSING: requestHandler routedParameter=foo
50+
pass
51+
52+
53+
# MethodView
54+
#
55+
# see https://flask.palletsprojects.com/en/1.1.x/views/#method-views-for-apis
56+
57+
from flask.views import MethodView
58+
59+
60+
class UserAPI(MethodView):
61+
62+
def get(self, user_id): # $ MISSING: requestHandler routedParameter=user_id
63+
if user_id is None:
64+
# return a list of users
65+
pass
66+
else:
67+
# expose a single user
68+
pass
69+
70+
def post(self): # $ MISSING: requestHandler
71+
# create a new user
72+
pass
73+
74+
def delete(self, user_id): # $ MISSING: requestHandler routedParameter=user_id
75+
# delete a single user
76+
pass
77+
78+
def put(self, user_id): # $ MISSING: requestHandler routedParameter=user_id
79+
# update a single user
80+
pass
81+
82+
83+
user_view = UserAPI.as_view("user_api")
84+
app.add_url_rule("/users/", defaults={"user_id": None}, view_func=user_view, methods=["GET",]) # $routeSetup="/users/"
85+
app.add_url_rule("/users/", view_func=user_view, methods=["POST",]) # $routeSetup="/users/"
86+
app.add_url_rule("/users/<int:user_id>", view_func=user_view, methods=["GET", "PUT", "DELETE"]) # $routeSetup="/users/<int:user_id>"
87+
88+
89+
class WithoutKnownRoute2(MethodView):
90+
# For handler without known route, treat all parameters as routed parameters
91+
# (accepting that there might be a few FPs)
92+
def get(self, foo, not_routed=42): # $ MISSING: requestHandler routedParameter=foo
93+
pass
2894

2995

3096
if __name__ == "__main__":

0 commit comments

Comments
 (0)