Use our new event system for track favorites

This commit is contained in:
Eliot Berriot 2018-03-01 20:38:48 +01:00
parent dd5881f2c6
commit e490284511
No known key found for this signature in database
GPG Key ID: DD6965E2476E5C27
5 changed files with 85 additions and 1 deletions

View File

@ -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
})

View File

View File

@ -4,6 +4,7 @@ from rest_framework.response import Response
from rest_framework import pagination
from rest_framework.decorators import list_route
from funkwhale_api.activity import record
from funkwhale_api.music.models import Track
from funkwhale_api.common.permissions import ConditionalAuthentication
@ -33,6 +34,7 @@ class TrackFavoriteViewSet(mixins.CreateModelMixin,
instance = self.perform_create(serializer)
serializer = self.get_serializer(instance=instance)
headers = self.get_success_headers(serializer.data)
record.send(instance)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
def get_queryset(self):

View File

@ -1,5 +1,6 @@
from funkwhale_api.users.serializers import UserActivitySerializer
from funkwhale_api.favorites import serializers
from funkwhale_api.favorites import activities
def test_get_favorite_activity_url(settings, factories):
@ -26,3 +27,45 @@ def test_activity_favorite_serializer(factories):
data = serializers.TrackFavoriteActivitySerializer(favorite).data
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()

View File

@ -33,7 +33,8 @@ def test_user_can_get_his_favorites(factories, logged_in_client, client):
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']()
url = reverse('api:v1:favorites:tracks-list')
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
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):
favorite = factories['favorites.TrackFavorite'](user=logged_in_client.user)
url = reverse('api:v1:favorites:tracks-detail', kwargs={'pk': favorite.pk})