Skip to content

Commit 023fe45

Browse files
authored
Merge pull request Raekkeri#19 from Raekkeri/fileupload
Fileupload
2 parents 7dc4a72 + 275c879 commit 023fe45

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

requestlogs/storages.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import json
22
import logging
33

4+
from django.core.files.uploadedfile import UploadedFile
45
from rest_framework import serializers
56
from rest_framework.utils.encoders import JSONEncoder
67

@@ -12,6 +13,11 @@
1213

1314
class JsonDumpField(serializers.Field):
1415
def to_representation(self, value):
16+
if isinstance(value, dict):
17+
for field_name, field_value in value.items():
18+
if isinstance(field_value, UploadedFile):
19+
value[field_name] = (
20+
f'<{field_value.__class__.__name__}, size={field_value.size}>')
1521
return json.dumps(value, cls=JSONEncoder)
1622

1723

tests/test_storages.py

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,34 @@
1+
from io import BytesIO
2+
from unittest.mock import patch
3+
14
import django
25
from django.urls import reverse_lazy
3-
from django.test import override_settings, TestCase
6+
from django.test import override_settings, modify_settings, TestCase
47
if django.VERSION[0] < 2:
58
from django.conf.urls import url
69
else:
710
from django.urls import re_path as url
811
from rest_framework import serializers
12+
from rest_framework.response import Response
13+
from rest_framework.decorators import api_view
14+
from rest_framework.test import APITestCase
915

1016
from requestlogs.storages import JsonDumpField, BaseStorage
1117

1218

19+
@api_view(['POST'])
20+
def upload_view(request):
21+
class FileSerializer(serializers.Serializer):
22+
file = serializers.FileField()
23+
24+
s = FileSerializer(data=request.data)
25+
assert s.is_valid()
26+
return Response({'status': 'ok'})
27+
28+
1329
urlpatterns = [
1430
url(r'^/?$', lambda r: None, name='home'),
31+
url(r'^upload/?$', upload_view),
1532
]
1633

1734

@@ -26,3 +43,20 @@ def test_serialize_proxy(self):
2643
storage = SimpleStorage()
2744
s = storage.prepare({'blob': {'url': reverse_lazy('home')}})
2845
assert s == {'blob': '{"url": "/"}'}
46+
47+
48+
@override_settings(
49+
ROOT_URLCONF=__name__,
50+
REQUESTLOGS={'STORAGE_CLASS': 'tests.test_views.TestStorage'},
51+
)
52+
@modify_settings(MIDDLEWARE={
53+
'append': 'requestlogs.middleware.RequestLogsMiddleware',
54+
})
55+
class TestWithFileUpload(APITestCase):
56+
def test_post_file(self):
57+
buf = BytesIO(b'\x89PNG')
58+
with patch('tests.test_views.TestStorage.do_store') as mocked_store:
59+
response = self.client.post('/upload', data={'file': buf})
60+
61+
assert mocked_store.call_args[0][0]['request']['data'] == \
62+
'{"file": "<InMemoryUploadedFile, size=4>"}'

0 commit comments

Comments
 (0)