Added validation on collection serializers

This commit is contained in:
Eliot Berriot 2018-04-07 17:18:54 +02:00
parent 33972f1f40
commit 4320fc77b2
No known key found for this signature in database
GPG Key ID: DD6965E2476E5C27
3 changed files with 64 additions and 2 deletions

View File

@ -21,6 +21,7 @@ AP_CONTEXT = [
{},
]
class ActorSerializer(serializers.ModelSerializer):
# left maps to activitypub fields, right to our internal models
id = serializers.URLField(source='url')
@ -206,6 +207,11 @@ OBJECT_SERIALIZERS = {
class PaginatedCollectionSerializer(serializers.Serializer):
type = serializers.ChoiceField(choices=['Collection'])
totalItems = serializers.IntegerField(min_value=0)
items = serializers.ListField()
actor = serializers.URLField()
id = serializers.URLField()
def to_representation(self, conf):
paginator = Paginator(
@ -230,6 +236,14 @@ class PaginatedCollectionSerializer(serializers.Serializer):
class CollectionPageSerializer(serializers.Serializer):
type = serializers.ChoiceField(choices=['CollectionPage'])
totalItems = serializers.IntegerField(min_value=0)
items = serializers.ListField()
actor = serializers.URLField()
id = serializers.URLField()
prev = serializers.URLField(required=False)
next = serializers.URLField(required=False)
partOf = serializers.URLField()
def to_representation(self, conf):
page = conf['page']

View File

@ -34,7 +34,7 @@ def test_actor_serializer_from_ap(db):
}
serializer = serializers.ActorSerializer(data=payload)
assert serializer.is_valid()
assert serializer.is_valid(raise_exception=True)
actor = serializer.build()
@ -65,7 +65,7 @@ def test_actor_serializer_only_mandatory_field_from_ap(db):
}
serializer = serializers.ActorSerializer(data=payload)
assert serializer.is_valid()
assert serializer.is_valid(raise_exception=True)
actor = serializer.build()
@ -201,6 +201,53 @@ def test_paginated_collection_serializer(factories):
assert serializer.data == expected
def test_paginated_collection_serializer_validation():
data = {
'type': 'Collection',
'id': 'https://test.federation/test',
'totalItems': 5,
'actor': 'http://test.actor',
'items': []
}
serializer = serializers.PaginatedCollectionSerializer(
data=data
)
assert serializer.is_valid(raise_exception=True) is True
assert serializer.validated_data['totalItems'] == 5
assert serializer.validated_data['id'] == data['id']
assert serializer.validated_data['actor'] == data['actor']
assert serializer.validated_data['items'] == []
def test_collection_page_serializer_validdation():
base = 'https://test.federation/test'
data = {
'type': 'CollectionPage',
'id': base + '?page=2',
'totalItems': 5,
'actor': 'https://test.actor',
'items': [],
'prev': base + '?page=1',
'next': base + '?page=3',
'partOf': base,
}
serializer = serializers.CollectionPageSerializer(
data=data
)
assert serializer.is_valid(raise_exception=True) is True
assert serializer.validated_data['totalItems'] == 5
assert serializer.validated_data['id'] == data['id']
assert serializer.validated_data['actor'] == data['actor']
assert serializer.validated_data['items'] == []
assert serializer.validated_data['prev'] == data['prev']
assert serializer.validated_data['next'] == data['next']
assert serializer.validated_data['partOf'] == data['partOf']
def test_collection_page_serializer(factories):
tfs = factories['music.TrackFile'].create_batch(size=5)
actor = factories['federation.Actor'](local=True)

View File

@ -116,6 +116,7 @@ def test_audio_file_list_actor_page(
assert response.status_code == 200
assert response.data == expected
def test_audio_file_list_actor_page_exclude_federated_files(
db, settings, api_client, factories):
settings.FEDERATION_MUSIC_NEEDS_APPROVAL = False