Activity stream representations for user and favorites
This commit is contained in:
parent
93e4a4f123
commit
691665e3cf
12 changed files with 159 additions and 0 deletions
28
api/tests/favorites/test_activity.py
Normal file
28
api/tests/favorites/test_activity.py
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
from funkwhale_api.users.serializers import UserActivitySerializer
|
||||
from funkwhale_api.favorites import serializers
|
||||
|
||||
|
||||
def test_get_favorite_activity_url(settings, factories):
|
||||
favorite = factories['favorites.TrackFavorite']()
|
||||
user_url = favorite.user.get_activity_url()
|
||||
expected = '{}/favorites/tracks/{}'.format(
|
||||
user_url, favorite.pk)
|
||||
assert favorite.get_activity_url() == expected
|
||||
|
||||
|
||||
def test_activity_favorite_serializer(factories):
|
||||
favorite = factories['favorites.TrackFavorite']()
|
||||
|
||||
actor = UserActivitySerializer(favorite.user).data
|
||||
field = serializers.serializers.DateTimeField()
|
||||
expected = {
|
||||
"type": "Like",
|
||||
"id": favorite.get_activity_url(),
|
||||
"actor": actor,
|
||||
"object": favorite.track.get_activity_url(),
|
||||
"published": field.to_representation(favorite.creation_date),
|
||||
}
|
||||
|
||||
data = serializers.TrackFavoriteActivitySerializer(favorite).data
|
||||
|
||||
assert data == expected
|
||||
95
api/tests/favorites/test_favorites.py
Normal file
95
api/tests/favorites/test_favorites.py
Normal file
|
|
@ -0,0 +1,95 @@
|
|||
import json
|
||||
import pytest
|
||||
from django.urls import reverse
|
||||
|
||||
from funkwhale_api.music.models import Track, Artist
|
||||
from funkwhale_api.favorites.models import TrackFavorite
|
||||
|
||||
|
||||
|
||||
def test_user_can_add_favorite(factories):
|
||||
track = factories['music.Track']()
|
||||
user = factories['users.User']()
|
||||
f = TrackFavorite.add(track, user)
|
||||
|
||||
assert f.track == track
|
||||
assert f.user == user
|
||||
|
||||
|
||||
def test_user_can_get_his_favorites(factories, logged_in_client, client):
|
||||
favorite = factories['favorites.TrackFavorite'](user=logged_in_client.user)
|
||||
url = reverse('api:v1:favorites:tracks-list')
|
||||
response = logged_in_client.get(url)
|
||||
|
||||
expected = [
|
||||
{
|
||||
'track': favorite.track.pk,
|
||||
'id': favorite.id,
|
||||
'creation_date': favorite.creation_date.isoformat().replace('+00:00', 'Z'),
|
||||
}
|
||||
]
|
||||
parsed_json = json.loads(response.content.decode('utf-8'))
|
||||
|
||||
assert expected == parsed_json['results']
|
||||
|
||||
|
||||
def test_user_can_add_favorite_via_api(factories, logged_in_client, client):
|
||||
track = factories['music.Track']()
|
||||
url = reverse('api:v1:favorites:tracks-list')
|
||||
response = logged_in_client.post(url, {'track': track.pk})
|
||||
|
||||
favorite = TrackFavorite.objects.latest('id')
|
||||
expected = {
|
||||
'track': track.pk,
|
||||
'id': favorite.id,
|
||||
'creation_date': favorite.creation_date.isoformat().replace('+00:00', 'Z'),
|
||||
}
|
||||
parsed_json = json.loads(response.content.decode('utf-8'))
|
||||
|
||||
assert expected == parsed_json
|
||||
assert favorite.track == track
|
||||
assert favorite.user == logged_in_client.user
|
||||
|
||||
|
||||
def test_user_can_remove_favorite_via_api(logged_in_client, factories, client):
|
||||
favorite = factories['favorites.TrackFavorite'](user=logged_in_client.user)
|
||||
url = reverse('api:v1:favorites:tracks-detail', kwargs={'pk': favorite.pk})
|
||||
response = client.delete(url, {'track': favorite.track.pk})
|
||||
assert response.status_code == 204
|
||||
assert TrackFavorite.objects.count() == 0
|
||||
|
||||
|
||||
@pytest.mark.parametrize('method', ['delete', 'post'])
|
||||
def test_user_can_remove_favorite_via_api_using_track_id(
|
||||
method, factories, logged_in_client):
|
||||
favorite = factories['favorites.TrackFavorite'](user=logged_in_client.user)
|
||||
|
||||
url = reverse('api:v1:favorites:tracks-remove')
|
||||
response = getattr(logged_in_client, method)(
|
||||
url, json.dumps({'track': favorite.track.pk}),
|
||||
content_type='application/json'
|
||||
)
|
||||
|
||||
assert response.status_code == 204
|
||||
assert TrackFavorite.objects.count() == 0
|
||||
|
||||
|
||||
@pytest.mark.parametrize('url,method', [
|
||||
('api:v1:favorites:tracks-list', 'get'),
|
||||
])
|
||||
def test_url_require_auth(url, method, db, settings, client):
|
||||
settings.API_AUTHENTICATION_REQUIRED = True
|
||||
url = reverse(url)
|
||||
response = getattr(client, method)(url)
|
||||
assert response.status_code == 401
|
||||
|
||||
|
||||
def test_can_filter_tracks_by_favorites(factories, logged_in_client):
|
||||
favorite = factories['favorites.TrackFavorite'](user=logged_in_client.user)
|
||||
|
||||
url = reverse('api:v1:tracks-list')
|
||||
response = logged_in_client.get(url, data={'favorites': True})
|
||||
|
||||
parsed_json = json.loads(response.content.decode('utf-8'))
|
||||
assert parsed_json['count'] == 1
|
||||
assert parsed_json['results'][0]['id'] == favorite.track.id
|
||||
Loading…
Add table
Add a link
Reference in a new issue