Skip to content
Snippets Groups Projects
test_api_serializers.py 7.11 KiB
Newer Older
  • Learn to ignore specific revisions
  • Eliot Berriot's avatar
    Eliot Berriot committed
    import pytest
    
    
    from funkwhale_api.common import serializers as common_serializers
    
    from funkwhale_api.federation import api_serializers
    from funkwhale_api.federation import serializers
    
    from funkwhale_api.users import serializers as users_serializers
    
    def test_library_serializer(factories, to_api_date):
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        library = factories["music.Library"](uploads_count=5678)
    
        expected = {
            "fid": library.fid,
            "uuid": str(library.uuid),
            "actor": serializers.APIActorSerializer(library.actor).data,
            "name": library.name,
            "description": library.description,
    
            "creation_date": to_api_date(library.creation_date),
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            "uploads_count": library.uploads_count,
    
            "privacy_level": library.privacy_level,
            "follow": None,
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            "latest_scan": None,
    
        }
    
        serializer = api_serializers.LibrarySerializer(library)
    
        assert serializer.data == expected
    
    
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    def test_library_serializer_latest_scan(factories):
        library = factories["music.Library"](uploads_count=5678)
        scan = factories["music.LibraryScan"](library=library)
        setattr(library, "latest_scans", [scan])
        expected = api_serializers.LibraryScanSerializer(scan).data
        serializer = api_serializers.LibrarySerializer(library)
    
        assert serializer.data["latest_scan"] == expected
    
    
    
    def test_library_serializer_with_follow(factories, to_api_date):
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        library = factories["music.Library"](uploads_count=5678)
    
        follow = factories["federation.LibraryFollow"](target=library)
    
        setattr(library, "_follows", [follow])
        expected = {
            "fid": library.fid,
            "uuid": str(library.uuid),
            "actor": serializers.APIActorSerializer(library.actor).data,
            "name": library.name,
            "description": library.description,
    
            "creation_date": to_api_date(library.creation_date),
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            "uploads_count": library.uploads_count,
    
            "privacy_level": library.privacy_level,
            "follow": api_serializers.NestedLibraryFollowSerializer(follow).data,
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            "latest_scan": None,
    
        }
    
        serializer = api_serializers.LibrarySerializer(library)
    
        assert serializer.data == expected
    
    
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    def test_library_follow_serializer_validates_existing_follow(factories):
    
        follow = factories["federation.LibraryFollow"]()
        serializer = api_serializers.LibraryFollowSerializer(
            data={"target": follow.target.uuid}, context={"actor": follow.actor}
        )
    
        assert serializer.is_valid() is False
        assert "target" in serializer.errors
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    def test_library_follow_serializer_do_not_allow_own_library(factories):
        actor = factories["federation.Actor"]()
        library = factories["music.Library"](actor=actor)
        serializer = api_serializers.LibraryFollowSerializer(context={"actor": actor})
    
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        with pytest.raises(
            api_serializers.serializers.ValidationError, match=r".*own library.*"
        ):
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            serializer.validate_target(library)
    
    
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    def test_manage_upload_action_read(factories):
    
        ii = factories["federation.InboxItem"]()
        s = api_serializers.InboxItemActionSerializer(queryset=None)
    
        s.handle_read(ii.__class__.objects.all())
    
        assert ii.__class__.objects.filter(is_read=False).count() == 0
    
    
    
    @pytest.mark.parametrize(
        "factory_name, factory_kwargs, expected",
        [
            (
                "federation.Actor",
                {"preferred_username": "hello", "domain__name": "world"},
                {"full_username": "hello@world"},
            ),
            (
                "music.Library",
                {"name": "hello", "uuid": "ad1ee1f7-589c-4abe-b303-e4fe7a889260"},
                {"uuid": "ad1ee1f7-589c-4abe-b303-e4fe7a889260", "name": "hello"},
            ),
            (
                "federation.LibraryFollow",
                {"approved": False, "uuid": "ad1ee1f7-589c-4abe-b303-e4fe7a889260"},
                {"uuid": "ad1ee1f7-589c-4abe-b303-e4fe7a889260", "approved": False},
            ),
        ],
    )
    def test_serialize_generic_relation(factory_name, factory_kwargs, expected, factories):
        obj = factories[factory_name](**factory_kwargs)
        expected["type"] = factory_name
        assert api_serializers.serialize_generic_relation({}, obj) == expected
    
    
    
    def test_api_full_actor_serializer(factories, to_api_date):
        summary = factories["common.Content"]()
        icon = factories["common.Attachment"]()
        user = factories["users.User"]()
        actor = user.create_actor(summary_obj=summary, attachment_icon=icon)
        expected = {
            "fid": actor.fid,
            "url": actor.url,
            "creation_date": to_api_date(actor.creation_date),
            "last_fetch_date": to_api_date(actor.last_fetch_date),
            "user": users_serializers.UserBasicSerializer(user).data,
            "is_channel": False,
            "domain": actor.domain_id,
            "type": actor.type,
            "manually_approves_followers": actor.manually_approves_followers,
            "full_username": actor.full_username,
            "name": actor.name,
            "preferred_username": actor.preferred_username,
            "is_local": actor.is_local,
            "summary": common_serializers.ContentSerializer(summary).data,
            "icon": common_serializers.AttachmentSerializer(icon).data,
        }
    
        serializer = api_serializers.FullActorSerializer(actor)
    
        assert serializer.data == expected
    
    
    
    def test_fetch_serializer_no_obj(factories, to_api_date):
        fetch = factories["federation.Fetch"]()
        expected = {
            "id": fetch.pk,
            "url": fetch.url,
            "creation_date": to_api_date(fetch.creation_date),
            "fetch_date": None,
            "status": fetch.status,
            "detail": fetch.detail,
            "object": None,
            "actor": serializers.APIActorSerializer(fetch.actor).data,
        }
    
        assert api_serializers.FetchSerializer(fetch).data == expected
    
    
    @pytest.mark.parametrize(
        "object_factory, expected_type, expected_id",
        [
            ("music.Album", "album", "id"),
            ("music.Artist", "artist", "id"),
            ("music.Track", "track", "id"),
            ("music.Library", "library", "uuid"),
            ("music.Upload", "upload", "uuid"),
    
            ("audio.Channel", "channel", "uuid"),
    
            ("federation.Actor", "account", "full_username"),
        ],
    )
    def test_fetch_serializer_with_object(
        object_factory, expected_type, expected_id, factories, to_api_date
    ):
        obj = factories[object_factory]()
        fetch = factories["federation.Fetch"](object=obj)
        expected = {
            "id": fetch.pk,
            "url": fetch.url,
            "creation_date": to_api_date(fetch.creation_date),
            "fetch_date": None,
            "status": fetch.status,
            "detail": fetch.detail,
            "object": {"type": expected_type, expected_id: getattr(obj, expected_id)},
            "actor": serializers.APIActorSerializer(fetch.actor).data,
        }
    
        assert api_serializers.FetchSerializer(fetch).data == expected
    
    
    def test_fetch_serializer_unhandled_obj(factories, to_api_date):
        fetch = factories["federation.Fetch"](object=factories["users.User"]())
        expected = {
            "id": fetch.pk,
            "url": fetch.url,
            "creation_date": to_api_date(fetch.creation_date),
            "fetch_date": None,
            "status": fetch.status,
            "detail": fetch.detail,
            "object": None,
            "actor": serializers.APIActorSerializer(fetch.actor).data,
        }
    
        assert api_serializers.FetchSerializer(fetch).data == expected