From 8193782f682a9f99fec634b6dc8603133cc00ab2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Toke=20H=C3=B8iland-J=C3=B8rgensen?= <toke@toke.dk>
Date: Thu, 30 Aug 2018 14:03:56 +0200
Subject: [PATCH] subsonic: Don't crash when serialising artist with no name
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

If the name of an artist is not set, the serialiser will crash. Instead,
just skip such an artist when serialising a list of artists.

Also add test for serialising an artist with an empty name.

Signed-off-by: Toke Høiland-Jørgensen <toke@toke.dk>
---
 api/funkwhale_api/subsonic/serializers.py | 3 ++-
 api/tests/subsonic/test_serializers.py    | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/api/funkwhale_api/subsonic/serializers.py b/api/funkwhale_api/subsonic/serializers.py
index fc21a99f2a..a340a1aad8 100644
--- a/api/funkwhale_api/subsonic/serializers.py
+++ b/api/funkwhale_api/subsonic/serializers.py
@@ -24,7 +24,8 @@ class GetArtistsSerializer(serializers.Serializer):
 
         first_letter_mapping = collections.defaultdict(list)
         for artist in values:
-            first_letter_mapping[artist["name"][0].upper()].append(artist)
+            if artist["name"]:
+                first_letter_mapping[artist["name"][0].upper()].append(artist)
 
         for letter, artists in sorted(first_letter_mapping.items()):
             letter_data = {
diff --git a/api/tests/subsonic/test_serializers.py b/api/tests/subsonic/test_serializers.py
index 6fdf02e2d1..bd07008dfa 100644
--- a/api/tests/subsonic/test_serializers.py
+++ b/api/tests/subsonic/test_serializers.py
@@ -6,6 +6,7 @@ def test_get_artists_serializer(factories):
     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
 
     factories["music.Album"].create_batch(size=3, artist=artist1)
     factories["music.Album"].create_batch(size=2, artist=artist2)
@@ -28,7 +29,7 @@ def test_get_artists_serializer(factories):
     }
 
     queryset = artist1.__class__.objects.filter(
-        pk__in=[artist1.pk, artist2.pk, artist3.pk]
+        pk__in=[artist1.pk, artist2.pk, artist3.pk, artist4.pk]
     )
 
     assert serializers.GetArtistsSerializer(queryset).data == expected
-- 
GitLab