from funkwhale_api.music import models as music_models from funkwhale_api.subsonic import serializers def test_get_artists_serializer(factories): artist1 = factories['music.Artist'](name='eliot') artist2 = factories['music.Artist'](name='Ellena') artist3 = factories['music.Artist'](name='Rilay') factories['music.Album'].create_batch(size=3, artist=artist1) factories['music.Album'].create_batch(size=2, artist=artist2) expected = { 'ignoredArticles': '', 'index': [ { 'name': 'E', 'artist': [ { 'id': artist1.pk, 'name': artist1.name, 'albumCount': 3, }, { 'id': artist2.pk, 'name': artist2.name, 'albumCount': 2, }, ] }, { 'name': 'R', 'artist': [ { 'id': artist3.pk, 'name': artist3.name, 'albumCount': 0, }, ] }, ] } queryset = artist1.__class__.objects.filter(pk__in=[ artist1.pk, artist2.pk, artist3.pk ]) assert serializers.GetArtistsSerializer(queryset).data == expected def test_get_artist_serializer(factories): artist = factories['music.Artist']() album = factories['music.Album'](artist=artist) tracks = factories['music.Track'].create_batch(size=3, album=album) expected = { 'id': artist.pk, 'name': artist.name, 'albumCount': 1, 'album': [ { '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, } ] } assert serializers.GetArtistSerializer(artist).data == expected def test_get_album_serializer(factories): artist = factories['music.Artist']() album = factories['music.Album'](artist=artist) track = factories['music.Track'](album=album) tf = factories['music.TrackFile']( track=track, bitrate=42000, duration=43, size=44) expected = { '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': [ { 'id': track.pk, 'isDir': 'false', 'title': track.title, 'coverArt': 'al-{}'.format(album.id), 'album': album.title, 'artist': artist.name, 'track': track.position, 'year': track.album.release_date.year, 'contentType': tf.mimetype, 'suffix': tf.extension or '', 'bitrate': 42, 'duration': 43, 'size': 44, 'created': track.creation_date, 'albumId': album.pk, 'artistId': artist.pk, 'type': 'music', } ] } assert serializers.GetAlbumSerializer(album).data == expected def test_starred_tracks2_serializer(factories): artist = factories['music.Artist']() album = factories['music.Album'](artist=artist) track = factories['music.Track'](album=album) tf = factories['music.TrackFile'](track=track) favorite = factories['favorites.TrackFavorite'](track=track) expected = [serializers.get_track_data(album, track, tf)] expected[0]['starred'] = favorite.creation_date data = serializers.get_starred_tracks_data([favorite]) assert data == expected def test_get_album_list2_serializer(factories): album1 = factories['music.Album']() album2 = factories['music.Album']() 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): plt = factories['playlists.PlaylistTrack']() playlist = plt.playlist qs = music_models.Album.objects.with_tracks_count().order_by('pk') expected = { '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): plt = factories['playlists.PlaylistTrack']() tf = factories['music.TrackFile'](track=plt.track) playlist = plt.playlist qs = music_models.Album.objects.with_tracks_count().order_by('pk') expected = { 'id': playlist.pk, 'name': playlist.name, 'owner': playlist.user.username, 'public': 'false', 'songCount': 1, 'duration': 0, 'created': playlist.creation_date, 'entry': [ serializers.get_track_data(plt.track.album, plt.track, tf) ] } qs = playlist.__class__.objects.with_tracks_count() data = serializers.get_playlist_detail_data(qs.first()) assert data == expected def test_directory_serializer_artist(factories): track = factories['music.Track']() tf = factories['music.TrackFile']( track=track, bitrate=42000, duration=43, size=44) album = track.album artist = track.artist expected = { '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, 'contentType': tf.mimetype, 'suffix': tf.extension or '', '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): tf = factories['music.TrackFile']() track = tf.track 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