Skip to content
Snippets Groups Projects
test_serializers.py 7.01 KiB
Newer Older
  • Learn to ignore specific revisions
  • from funkwhale_api.music import models as music_models
    
    from funkwhale_api.subsonic import serializers
    
    
    def test_get_artists_serializer(factories):
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        artist1 = factories["music.Artist"](name="eliot")
        artist2 = factories["music.Artist"](name="Ellena")
        artist3 = factories["music.Artist"](name="Rilay")
    
        artist4 = factories["music.Artist"](name="")  # Shouldn't be serialised
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        factories["music.Album"].create_batch(size=3, artist=artist1)
        factories["music.Album"].create_batch(size=2, artist=artist2)
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            "ignoredArticles": "",
            "index": [
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                    "name": "E",
                    "artist": [
                        {"id": artist1.pk, "name": artist1.name, "albumCount": 3},
                        {"id": artist2.pk, "name": artist2.name, "albumCount": 2},
                    ],
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                    "name": "R",
                    "artist": [{"id": artist3.pk, "name": artist3.name, "albumCount": 0}],
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            ],
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        queryset = artist1.__class__.objects.filter(
    
            pk__in=[artist1.pk, artist2.pk, artist3.pk, artist4.pk]
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        )
    
    
        assert serializers.GetArtistsSerializer(queryset).data == expected
    
    
    def test_get_artist_serializer(factories):
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        artist = factories["music.Artist"]()
        album = factories["music.Album"](artist=artist)
        tracks = factories["music.Track"].create_batch(size=3, album=album)
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            "id": artist.pk,
            "name": artist.name,
            "albumCount": 1,
            "album": [
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                    "id": album.pk,
                    "coverArt": "al-{}".format(album.id),
                    "artistId": artist.pk,
                    "name": album.title,
                    "artist": artist.name,
                    "songCount": len(tracks),
                    "created": album.creation_date,
                    "year": album.release_date.year,
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            ],
    
        }
    
        assert serializers.GetArtistSerializer(artist).data == expected
    
    
    def test_get_album_serializer(factories):
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        artist = factories["music.Artist"]()
        album = factories["music.Album"](artist=artist)
    
        track = factories["music.Track"](album=album, disc_number=42)
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        upload = factories["music.Upload"](track=track, bitrate=42000, duration=43, size=44)
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            "id": album.pk,
            "artistId": artist.pk,
            "name": album.title,
            "artist": artist.name,
            "songCount": 1,
            "created": album.creation_date,
            "year": album.release_date.year,
            "coverArt": "al-{}".format(album.id),
            "song": [
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                    "id": track.pk,
                    "isDir": "false",
                    "title": track.title,
                    "coverArt": "al-{}".format(album.id),
                    "album": album.title,
                    "artist": artist.name,
                    "track": track.position,
    
                    "discNumber": track.disc_number,
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                    "year": track.album.release_date.year,
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                    "contentType": upload.mimetype,
                    "suffix": upload.extension or "",
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                    "bitrate": 42,
                    "duration": 43,
                    "size": 44,
                    "created": track.creation_date,
                    "albumId": album.pk,
                    "artistId": artist.pk,
                    "type": "music",
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            ],
    
        }
    
        assert serializers.GetAlbumSerializer(album).data == expected
    
    
    
    def test_starred_tracks2_serializer(factories):
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        artist = factories["music.Artist"]()
        album = factories["music.Album"](artist=artist)
        track = factories["music.Track"](album=album)
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        upload = factories["music.Upload"](track=track)
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        favorite = factories["favorites.TrackFavorite"](track=track)
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        expected = [serializers.get_track_data(album, track, upload)]
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        expected[0]["starred"] = favorite.creation_date
    
        data = serializers.get_starred_tracks_data([favorite])
        assert data == expected
    
    
    def test_get_album_list2_serializer(factories):
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        album1 = factories["music.Album"]()
        album2 = factories["music.Album"]()
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        qs = music_models.Album.objects.with_tracks_count().order_by("pk")
    
        expected = [
            serializers.get_album2_data(album1),
            serializers.get_album2_data(album2),
        ]
        data = serializers.get_album_list2_data(qs)
        assert data == expected
    
    
    
    def test_playlist_serializer(factories):
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        plt = factories["playlists.PlaylistTrack"]()
    
        playlist = plt.playlist
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        qs = music_models.Album.objects.with_tracks_count().order_by("pk")
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            "id": playlist.pk,
            "name": playlist.name,
            "owner": playlist.user.username,
            "public": "false",
            "songCount": 1,
            "duration": 0,
            "created": playlist.creation_date,
    
        }
        qs = playlist.__class__.objects.with_tracks_count()
        data = serializers.get_playlist_data(qs.first())
        assert data == expected
    
    
    def test_playlist_detail_serializer(factories):
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        plt = factories["playlists.PlaylistTrack"]()
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        upload = factories["music.Upload"](track=plt.track)
    
        playlist = plt.playlist
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        qs = music_models.Album.objects.with_tracks_count().order_by("pk")
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            "id": playlist.pk,
            "name": playlist.name,
            "owner": playlist.user.username,
            "public": "false",
            "songCount": 1,
            "duration": 0,
            "created": playlist.creation_date,
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            "entry": [serializers.get_track_data(plt.track.album, plt.track, upload)],
    
        }
        qs = playlist.__class__.objects.with_tracks_count()
        data = serializers.get_playlist_detail_data(qs.first())
        assert data == expected
    
    
    
    def test_directory_serializer_artist(factories):
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        track = factories["music.Track"]()
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        upload = factories["music.Upload"](track=track, bitrate=42000, duration=43, size=44)
    
        album = track.album
        artist = track.artist
    
        expected = {
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            "id": artist.pk,
            "parent": 1,
            "name": artist.name,
            "child": [
                {
                    "id": track.pk,
                    "isDir": "false",
                    "title": track.title,
                    "album": album.title,
                    "artist": artist.name,
                    "track": track.position,
                    "year": track.album.release_date.year,
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                    "contentType": upload.mimetype,
                    "suffix": upload.extension or "",
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                    "bitrate": 42,
                    "duration": 43,
                    "size": 44,
                    "created": track.creation_date,
                    "albumId": album.pk,
                    "artistId": artist.pk,
                    "parent": artist.pk,
                    "type": "music",
                }
            ],
    
        }
        data = serializers.get_music_directory_data(artist)
        assert data == expected
    
    
    
    def test_scrobble_serializer(factories):
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        upload = factories["music.Upload"]()
        track = upload.track
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        user = factories["users.User"]()
        payload = {"id": track.pk, "submission": True}
        serializer = serializers.ScrobbleSerializer(data=payload, context={"user": user})
    
    
        assert serializer.is_valid(raise_exception=True)
    
        listening = serializer.save()
    
        assert listening.user == user
        assert listening.track == track