Skip to content

Commit c87b308

Browse files
committed
Python: Add test for Django FileField upload_to
The output from running the test script is: ``` 'rootdir/bar' [13/Apr/2022 09:20:36] "POST /app/file-test/ HTTP/1.1" 200 2 'rootdir/bar' [13/Apr/2022 09:20:36] "POST /app/file-test/ HTTP/1.1" 200 2 'rootdir/foo%2fbar' [13/Apr/2022 09:20:36] "POST /app/file-test/ HTTP/1.1" 200 2 'rootdir/%2e%2e%2fbar' [13/Apr/2022 09:20:36] "POST /app/file-test/ HTTP/1.1" 200 2 'rootdir/foo%c0%afbar' [13/Apr/2022 09:20:36] "POST /app/file-test/ HTTP/1.1" 200 2 ``` I didn't add a `.py` extension, so it wasn't extracted, since we don't actually care about what we model in that file.
1 parent 304713c commit c87b308

File tree

6 files changed

+63
-7
lines changed

6 files changed

+63
-7
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
db.sqlite3
2+
3+
# The testapp/migrations/ folder needs to be comitted to git,
4+
# but we don't care to store the actual migrations
5+
testapp/migrations/
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#!/usr/bin/env python3
2+
3+
# first run the server with
4+
# python manage.py makemigrations && python manage.py migrate && python manage.py runserver
5+
6+
import requests
7+
8+
requests.post(
9+
"http://127.0.0.1:8000/app/file-test/",
10+
files={"fieldname": ("foo/bar", open("/home/rasmus/TODO", "rb"))}
11+
)
12+
13+
requests.post(
14+
"http://127.0.0.1:8000/app/file-test/",
15+
files={"fieldname": ("../bar", open("/home/rasmus/TODO", "rb"))}
16+
)
17+
18+
requests.post(
19+
"http://127.0.0.1:8000/app/file-test/",
20+
files={"fieldname": (r"foo%2fbar", open("/home/rasmus/TODO", "rb"))}
21+
)
22+
23+
requests.post(
24+
"http://127.0.0.1:8000/app/file-test/",
25+
files={"fieldname": (r"%2e%2e%2fbar", open("/home/rasmus/TODO", "rb"))}
26+
)
27+
28+
requests.post(
29+
"http://127.0.0.1:8000/app/file-test/",
30+
files={"fieldname": (r"foo%c0%afbar", open("/home/rasmus/TODO", "rb"))}
31+
)
Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
import os.path
2+
13
from django.db import models
24

3-
# Create your models here.
5+
def custom_path_function(instance, filename):
6+
print(repr(os.path.join("rootdir", filename)))
7+
raise NotImplementedError()
8+
9+
class MyModel(models.Model):
10+
upload = models.FileField(upload_to=custom_path_function)

python/ql/test/library-tests/frameworks/django-v2-v3/testapp/urls.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414

1515
path("CustomRedirectView/<foo>", views.CustomRedirectView.as_view()), # $routeSetup="CustomRedirectView/<foo>"
1616
path("CustomRedirectView2/<foo>", views.CustomRedirectView2.as_view()), # $routeSetup="CustomRedirectView2/<foo>"
17+
18+
path("file-test/", views.file_test), # $routeSetup="file-test/"
1719
]
1820

1921
from django import __version__ as django_version

python/ql/test/library-tests/frameworks/django-v2-v3/testapp/views.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from django.views.generic import View, RedirectView
33
from django.views.decorators.csrf import csrf_exempt
44

5+
from .models import MyModel
56

67
def foo(request: HttpRequest): # $requestHandler
78
return HttpResponse("foo") # $HttpResponse
@@ -45,3 +46,13 @@ def get_redirect_url(self, foo): # $ requestHandler routedParameter=foo
4546
class CustomRedirectView2(RedirectView):
4647

4748
url = "https://example.com/%(foo)s"
49+
50+
51+
# Test of FileField upload_to functions
52+
def file_test(request: HttpRequest): # $ requestHandler
53+
model = MyModel(upload=request.FILES['fieldname'])
54+
try:
55+
model.save()
56+
except NotImplementedError:
57+
pass
58+
return HttpResponse("ok") # $ HttpResponse

python/ql/test/library-tests/frameworks/django-v2-v3/testproj/settings.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,12 @@
7474
# Database
7575
# https://docs.djangoproject.com/en/3.1/ref/settings/#databases
7676

77-
# DATABASES = {
78-
# 'default': {
79-
# 'ENGINE': 'django.db.backends.sqlite3',
80-
# 'NAME': BASE_DIR / 'db.sqlite3',
81-
# }
82-
# }
77+
DATABASES = {
78+
'default': {
79+
'ENGINE': 'django.db.backends.sqlite3',
80+
'NAME': BASE_DIR / 'db.sqlite3',
81+
}
82+
}
8383

8484

8585
# Password validation

0 commit comments

Comments
 (0)