Use our new event system for track favorites
This commit is contained in:
parent
dd5881f2c6
commit
e490284511
|
@ -0,0 +1,17 @@
|
||||||
|
from funkwhale_api.common import channels
|
||||||
|
from funkwhale_api.activity import record
|
||||||
|
|
||||||
|
from . import serializers
|
||||||
|
|
||||||
|
record.registry.register_serializer(
|
||||||
|
serializers.TrackFavoriteActivitySerializer)
|
||||||
|
|
||||||
|
|
||||||
|
@record.registry.register_consumer('favorites.TrackFavorite')
|
||||||
|
def broadcast_track_favorite_to_instance_timeline(data, obj):
|
||||||
|
if obj.user.privacy_level not in ['instance', 'everyone']:
|
||||||
|
return
|
||||||
|
channels.group_send('instance_timeline', {
|
||||||
|
'type': 'event',
|
||||||
|
'data': data
|
||||||
|
})
|
|
@ -4,6 +4,7 @@ from rest_framework.response import Response
|
||||||
from rest_framework import pagination
|
from rest_framework import pagination
|
||||||
from rest_framework.decorators import list_route
|
from rest_framework.decorators import list_route
|
||||||
|
|
||||||
|
from funkwhale_api.activity import record
|
||||||
from funkwhale_api.music.models import Track
|
from funkwhale_api.music.models import Track
|
||||||
from funkwhale_api.common.permissions import ConditionalAuthentication
|
from funkwhale_api.common.permissions import ConditionalAuthentication
|
||||||
|
|
||||||
|
@ -33,6 +34,7 @@ class TrackFavoriteViewSet(mixins.CreateModelMixin,
|
||||||
instance = self.perform_create(serializer)
|
instance = self.perform_create(serializer)
|
||||||
serializer = self.get_serializer(instance=instance)
|
serializer = self.get_serializer(instance=instance)
|
||||||
headers = self.get_success_headers(serializer.data)
|
headers = self.get_success_headers(serializer.data)
|
||||||
|
record.send(instance)
|
||||||
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
|
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
from funkwhale_api.users.serializers import UserActivitySerializer
|
from funkwhale_api.users.serializers import UserActivitySerializer
|
||||||
from funkwhale_api.favorites import serializers
|
from funkwhale_api.favorites import serializers
|
||||||
|
from funkwhale_api.favorites import activities
|
||||||
|
|
||||||
|
|
||||||
def test_get_favorite_activity_url(settings, factories):
|
def test_get_favorite_activity_url(settings, factories):
|
||||||
|
@ -26,3 +27,45 @@ def test_activity_favorite_serializer(factories):
|
||||||
data = serializers.TrackFavoriteActivitySerializer(favorite).data
|
data = serializers.TrackFavoriteActivitySerializer(favorite).data
|
||||||
|
|
||||||
assert data == expected
|
assert data == expected
|
||||||
|
|
||||||
|
|
||||||
|
def test_track_favorite_serializer_is_connected(activity_registry):
|
||||||
|
conf = activity_registry['favorites.TrackFavorite']
|
||||||
|
assert conf['serializer'] == serializers.TrackFavoriteActivitySerializer
|
||||||
|
|
||||||
|
|
||||||
|
def test_track_favorite_serializer_instance_activity_consumer(
|
||||||
|
activity_registry):
|
||||||
|
conf = activity_registry['favorites.TrackFavorite']
|
||||||
|
consumer = activities.broadcast_track_favorite_to_instance_timeline
|
||||||
|
assert consumer in conf['consumers']
|
||||||
|
|
||||||
|
|
||||||
|
def test_broadcast_track_favorite_to_instance_timeline(
|
||||||
|
factories, mocker):
|
||||||
|
p = mocker.patch('funkwhale_api.common.channels.group_send')
|
||||||
|
favorite = factories['favorites.TrackFavorite']()
|
||||||
|
data = serializers.TrackFavoriteActivitySerializer(favorite).data
|
||||||
|
consumer = activities.broadcast_track_favorite_to_instance_timeline
|
||||||
|
message = {
|
||||||
|
"type": 'event',
|
||||||
|
"data": data
|
||||||
|
}
|
||||||
|
consumer(data=data, obj=favorite)
|
||||||
|
p.assert_called_once_with('instance_timeline', message)
|
||||||
|
|
||||||
|
|
||||||
|
def test_broadcast_track_favorite_to_instance_timeline_private(
|
||||||
|
factories, mocker):
|
||||||
|
p = mocker.patch('funkwhale_api.common.channels.group_send')
|
||||||
|
favorite = factories['favorites.TrackFavorite'](
|
||||||
|
user__privacy_level='me'
|
||||||
|
)
|
||||||
|
data = serializers.TrackFavoriteActivitySerializer(favorite).data
|
||||||
|
consumer = activities.broadcast_track_favorite_to_instance_timeline
|
||||||
|
message = {
|
||||||
|
"type": 'event',
|
||||||
|
"data": data
|
||||||
|
}
|
||||||
|
consumer(data=data, obj=favorite)
|
||||||
|
p.assert_not_called()
|
||||||
|
|
|
@ -33,7 +33,8 @@ def test_user_can_get_his_favorites(factories, logged_in_client, client):
|
||||||
assert expected == parsed_json['results']
|
assert expected == parsed_json['results']
|
||||||
|
|
||||||
|
|
||||||
def test_user_can_add_favorite_via_api(factories, logged_in_client, client):
|
def test_user_can_add_favorite_via_api(
|
||||||
|
factories, logged_in_client, activity_muted):
|
||||||
track = factories['music.Track']()
|
track = factories['music.Track']()
|
||||||
url = reverse('api:v1:favorites:tracks-list')
|
url = reverse('api:v1:favorites:tracks-list')
|
||||||
response = logged_in_client.post(url, {'track': track.pk})
|
response = logged_in_client.post(url, {'track': track.pk})
|
||||||
|
@ -51,6 +52,27 @@ def test_user_can_add_favorite_via_api(factories, logged_in_client, client):
|
||||||
assert favorite.user == logged_in_client.user
|
assert favorite.user == logged_in_client.user
|
||||||
|
|
||||||
|
|
||||||
|
def test_adding_favorites_calls_activity_record(
|
||||||
|
factories, logged_in_client, activity_muted):
|
||||||
|
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
|
||||||
|
|
||||||
|
activity_muted.assert_called_once_with(favorite)
|
||||||
|
|
||||||
|
|
||||||
def test_user_can_remove_favorite_via_api(logged_in_client, factories, client):
|
def test_user_can_remove_favorite_via_api(logged_in_client, factories, client):
|
||||||
favorite = factories['favorites.TrackFavorite'](user=logged_in_client.user)
|
favorite = factories['favorites.TrackFavorite'](user=logged_in_client.user)
|
||||||
url = reverse('api:v1:favorites:tracks-detail', kwargs={'pk': favorite.pk})
|
url = reverse('api:v1:favorites:tracks-detail', kwargs={'pk': favorite.pk})
|
||||||
|
|
Loading…
Reference in New Issue