Newer
Older
Eliot Berriot
committed
import os
import PIL
from django.core.files.uploadedfile import SimpleUploadedFile
Eliot Berriot
committed
from funkwhale_api.common import utils
from funkwhale_api.federation import utils as federation_utils
class TestActionFilterSet(django_filters.FilterSet):
class Meta:
model = models.User
class TestSerializer(serializers.ActionSerializer):
actions = [serializers.Action("test", allow_all=True)]
filterset_class = TestActionFilterSet
def handle_test(self, objects):
Eliot Berriot
committed
class TestDangerousSerializer(serializers.ActionSerializer):
actions = [
serializers.Action("test", allow_all=True),
serializers.Action("test_dangerous"),
]
Eliot Berriot
committed
def handle_test(self, objects):
pass
def handle_test_dangerous(self, objects):
pass
class TestDeleteOnlyInactiveSerializer(serializers.ActionSerializer):
actions = [
serializers.Action(
"test", allow_all=True, qs_filter=lambda qs: qs.filter(is_active=False)
)
]
filterset_class = TestActionFilterSet
def handle_test(self, objects):
pass
def test_action_serializer_validates_action():
serializer = TestSerializer(data, queryset=models.User.objects.none())
assert serializer.is_valid() is False
def test_action_serializer_validates_objects():
serializer = TestSerializer(data, queryset=models.User.objects.none())
assert serializer.is_valid() is False
def test_action_serializers_objects_clean_ids(factories):
serializer = TestSerializer(data, queryset=models.User.objects.all())
assert serializer.is_valid(raise_exception=True) is True
assert list(serializer.validated_data["objects"]) == [user1]
def test_action_serializers_objects_clean_all(factories):
user1 = factories["users.User"]()
user2 = factories["users.User"]()
serializer = TestSerializer(data, queryset=models.User.objects.all())
assert serializer.is_valid(raise_exception=True) is True
assert list(serializer.validated_data["objects"]) == [user1, user2]
def test_action_serializers_save(factories, mocker):
factories["users.User"]()
factories["users.User"]()
serializer = TestSerializer(data, queryset=models.User.objects.all())
assert serializer.is_valid(raise_exception=True) is True
assert result == {"updated": 2, "action": "test", "result": {"hello": "world"}}
handler.assert_called_once()
def test_action_serializers_filterset(factories):
factories["users.User"](is_active=False)
user2 = factories["users.User"](is_active=True)
data = {"objects": "all", "action": "test", "filters": {"is_active": True}}
serializer = TestSerializer(data, queryset=models.User.objects.all())
assert serializer.is_valid(raise_exception=True) is True
assert list(serializer.validated_data["objects"]) == [user2]
def test_action_serializers_validates_at_least_one_object():
serializer = TestSerializer(data, queryset=models.User.objects.none())
assert serializer.is_valid() is False
Eliot Berriot
committed
def test_dangerous_actions_refuses_all(factories):
factories["users.User"]()
data = {"objects": "all", "action": "test_dangerous"}
serializer = TestDangerousSerializer(data, queryset=models.User.objects.all())
Eliot Berriot
committed
assert serializer.is_valid() is False
Eliot Berriot
committed
def test_action_serializers_can_require_filter(factories):
user1 = factories["users.User"](is_active=False)
factories["users.User"](is_active=True)
serializer = TestDeleteOnlyInactiveSerializer(
data, queryset=models.User.objects.all()
)
Eliot Berriot
committed
assert serializer.is_valid(raise_exception=True) is True
assert list(serializer.validated_data["objects"]) == [user1]
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
def test_track_fields_for_update(mocker):
@serializers.track_fields_for_update("field1", "field2")
class S(serializers.serializers.Serializer):
field1 = serializers.serializers.CharField()
field2 = serializers.serializers.CharField()
def update(self, obj, validated_data):
for key, value in validated_data.items():
setattr(obj, key, value)
return obj
on_updated_fields = mocker.stub()
class Obj(object):
field1 = "value1"
field2 = "value2"
obj = Obj()
serializer = S(obj, data={"field1": "newvalue1", "field2": "newvalue2"})
assert serializer.is_valid(raise_exception=True)
serializer.save()
serializer.on_updated_fields.assert_called_once_with(
obj,
{"field1": "value1", "field2": "value2"},
{"field1": "newvalue1", "field2": "newvalue2"},
)
Eliot Berriot
committed
def test_strip_exif_field():
source_path = os.path.join(os.path.dirname(__file__), "exif.jpg")
source = PIL.Image.open(source_path)
assert bool(source._getexif())
with open(source_path, "rb") as f:
uploaded = SimpleUploadedFile("source.jpg", f.read(), content_type="image/jpeg")
field = serializers.StripExifImageField()
cleaned = PIL.Image.open(field.to_internal_value(uploaded))
assert cleaned._getexif() is None
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
def test_attachment_serializer_existing_file(factories, to_api_date):
attachment = factories["common.Attachment"]()
expected = {
"uuid": str(attachment.uuid),
"size": attachment.size,
"mimetype": attachment.mimetype,
"creation_date": to_api_date(attachment.creation_date),
"urls": {
"source": attachment.url,
"original": federation_utils.full_url(attachment.file.url),
"medium_square_crop": federation_utils.full_url(
attachment.file.crop["200x200"].url
),
},
# XXX: BACKWARD COMPATIBILITY
"original": federation_utils.full_url(attachment.file.url),
"medium_square_crop": federation_utils.full_url(
attachment.file.crop["200x200"].url
),
"small_square_crop": federation_utils.full_url(
attachment.file.crop["200x200"].url
),
"square_crop": federation_utils.full_url(attachment.file.crop["200x200"].url),
}
serializer = serializers.AttachmentSerializer(attachment)
assert serializer.data == expected
def test_attachment_serializer_remote_file(factories, to_api_date):
attachment = factories["common.Attachment"](file=None)
proxy_url = reverse("api:v1:attachments-proxy", kwargs={"uuid": attachment.uuid})
expected = {
"uuid": str(attachment.uuid),
"size": attachment.size,
"mimetype": attachment.mimetype,
"creation_date": to_api_date(attachment.creation_date),
# everything is the same, except for the urls field because:
# - the file isn't available on the local pod
# - we need to return different URLs so that the client can trigger
# a fetch and get redirected to the desired version
#
"urls": {
"source": attachment.url,
"original": federation_utils.full_url(proxy_url + "?next=original"),
"medium_square_crop": federation_utils.full_url(
proxy_url + "?next=medium_square_crop"
),
},
# XXX: BACKWARD COMPATIBILITY
"original": federation_utils.full_url(proxy_url + "?next=original"),
"medium_square_crop": federation_utils.full_url(
proxy_url + "?next=medium_square_crop"
),
"square_crop": federation_utils.full_url(
proxy_url + "?next=medium_square_crop"
),
"small_square_crop": federation_utils.full_url(
proxy_url + "?next=medium_square_crop"
),
}
serializer = serializers.AttachmentSerializer(attachment)
assert serializer.data == expected
def test_content_serializer(factories):
content = factories["common.Content"]()
expected = {
"text": content.text,
"content_type": content.content_type,
"html": utils.render_html(content.text, content.content_type),
}
serializer = serializers.ContentSerializer(content)
assert serializer.data == expected
def test_plugin_serializer():
class TestPlugin(plugins.Plugin):
name = "test_plugin"
verbose_name = "A test plugin"
plugins.register(TestPlugin)
instance = plugins.save(TestPlugin)
assert isinstance(instance.plugin, TestPlugin)
expected = {
"code": "test_plugin",
"label": "A test plugin",
"enabled": True,
"conf": None,
}
assert serializers.PodPluginSerializer(instance).data == expected