import json import pytest from django.urls import reverse from rest_framework.response import Response from funkwhale_api.music import models as music_models from funkwhale_api.music import views as music_views from funkwhale_api.subsonic import renderers from funkwhale_api.subsonic import serializers def render_json(data): return json.loads(renderers.SubsonicJSONRenderer().render(data)) def test_render_content_json(db, api_client): url = reverse('api:subsonic-ping') response = api_client.get(url, {'f': 'json'}) expected = { 'status': 'ok', 'version': '1.16.0' } assert response.status_code == 200 assert json.loads(response.content) == render_json(expected) @pytest.mark.parametrize('f', ['xml', 'json']) def test_exception_wrong_credentials(f, db, api_client): url = reverse('api:subsonic-ping') response = api_client.get(url, {'f': f, 'u': 'yolo'}) expected = { 'status': 'failed', 'error': { 'code': 40, 'message': 'Wrong username or password.' } } assert response.status_code == 200 assert response.data == expected @pytest.mark.parametrize('f', ['xml', 'json']) def test_ping(f, db, api_client): url = reverse('api:subsonic-ping') response = api_client.get(url, {'f': f}) expected = { 'status': 'ok', 'version': '1.16.0', } assert response.status_code == 200 assert response.data == expected @pytest.mark.parametrize('f', ['xml', 'json']) def test_get_artists(f, db, logged_in_api_client, factories): url = reverse('api:subsonic-get-artists') assert url.endswith('getArtists') is True artists = factories['music.Artist'].create_batch(size=10) expected = { 'artists': serializers.GetArtistsSerializer( music_models.Artist.objects.all() ).data } response = logged_in_api_client.get(url) assert response.status_code == 200 assert response.data == expected @pytest.mark.parametrize('f', ['xml', 'json']) def test_get_artist(f, db, logged_in_api_client, factories): url = reverse('api:subsonic-get-artist') assert url.endswith('getArtist') is True artist = factories['music.Artist']() albums = factories['music.Album'].create_batch(size=3, artist=artist) expected = { 'artist': serializers.GetArtistSerializer(artist).data } response = logged_in_api_client.get(url, {'id': artist.pk}) assert response.status_code == 200 assert response.data == expected @pytest.mark.parametrize('f', ['xml', 'json']) def test_get_album(f, db, logged_in_api_client, factories): url = reverse('api:subsonic-get-album') assert url.endswith('getAlbum') is True artist = factories['music.Artist']() album = factories['music.Album'](artist=artist) tracks = factories['music.Track'].create_batch(size=3, album=album) expected = { 'album': serializers.GetAlbumSerializer(album).data } response = logged_in_api_client.get(url, {'f': f, 'id': album.pk}) assert response.status_code == 200 assert response.data == expected @pytest.mark.parametrize('f', ['xml', 'json']) def test_stream(f, db, logged_in_api_client, factories, mocker): url = reverse('api:subsonic-stream') mocked_serve = mocker.spy( music_views, 'handle_serve') assert url.endswith('stream') is True artist = factories['music.Artist']() album = factories['music.Album'](artist=artist) track = factories['music.Track'](album=album) tf = factories['music.TrackFile'](track=track) response = logged_in_api_client.get(url, {'f': f, 'id': track.pk}) mocked_serve.assert_called_once_with( track_file=tf ) assert response.status_code == 200