Skip to content
Snippets Groups Projects
test_favorites.py 4.29 KiB
Newer Older
  • Learn to ignore specific revisions
  • import json
    from test_plus.test import TestCase
    
    from django.urls import reverse
    
    
    from funkwhale_api.music.models import Track, Artist
    from funkwhale_api.favorites.models import TrackFavorite
    from funkwhale_api.users.models import User
    
    class TestFavorites(TestCase):
    
        def setUp(self):
            super().setUp()
            self.artist = Artist.objects.create(name='test')
            self.track = Track.objects.create(title='test', artist=self.artist)
            self.user = User.objects.create_user(username='test', email='test@test.com', password='test')
    
        def test_user_can_add_favorite(self):
            TrackFavorite.add(self.track, self.user)
    
            favorite = TrackFavorite.objects.latest('id')
            self.assertEqual(favorite.track, self.track)
            self.assertEqual(favorite.user, self.user)
    
        def test_user_can_get_his_favorites(self):
            favorite = TrackFavorite.add(self.track, self.user)
    
    
            url = reverse('api:v1:favorites:tracks-list')
    
            self.client.login(username=self.user.username, password='test')
    
            response = self.client.get(url)
    
            expected = [
                {
                    'track': self.track.pk,
                    'id': favorite.id,
                    'creation_date': favorite.creation_date.isoformat().replace('+00:00', 'Z'),
                }
            ]
            parsed_json = json.loads(response.content.decode('utf-8'))
    
            self.assertEqual(expected, parsed_json['results'])
    
        def test_user_can_add_favorite_via_api(self):
    
            url = reverse('api:v1:favorites:tracks-list')
    
            self.client.login(username=self.user.username, password='test')
            response = self.client.post(url, {'track': self.track.pk})
    
            favorite = TrackFavorite.objects.latest('id')
            expected = {
                'track': self.track.pk,
                'id': favorite.id,
                'creation_date': favorite.creation_date.isoformat().replace('+00:00', 'Z'),
            }
            parsed_json = json.loads(response.content.decode('utf-8'))
    
            self.assertEqual(expected, parsed_json)
            self.assertEqual(favorite.track, self.track)
            self.assertEqual(favorite.user, self.user)
    
        def test_user_can_remove_favorite_via_api(self):
            favorite = TrackFavorite.add(self.track, self.user)
    
    
            url = reverse('api:v1:favorites:tracks-detail', kwargs={'pk': favorite.pk})
    
            self.client.login(username=self.user.username, password='test')
            response = self.client.delete(url, {'track': self.track.pk})
            self.assertEqual(response.status_code, 204)
            self.assertEqual(TrackFavorite.objects.count(), 0)
    
        def test_user_can_remove_favorite_via_api_using_track_id(self):
            favorite = TrackFavorite.add(self.track, self.user)
    
    
            url = reverse('api:v1:favorites:tracks-remove')
    
            self.client.login(username=self.user.username, password='test')
            response = self.client.delete(
                url, json.dumps({'track': self.track.pk}),
                content_type='application/json'
            )
    
            self.assertEqual(response.status_code, 204)
            self.assertEqual(TrackFavorite.objects.count(), 0)
    
        from funkwhale_api.users.models import User
    
        def test_can_restrict_api_views_to_authenticated_users(self):
            urls = [
    
                ('api:v1:favorites:tracks-list', 'get'),
    
            ]
    
            for route_name, method in urls:
                url = self.reverse(route_name)
                with self.settings(API_AUTHENTICATION_REQUIRED=True):
                    response = getattr(self.client, method)(url)
                self.assertEqual(response.status_code, 401)
    
            self.client.login(username=self.user.username, password='test')
    
            for route_name, method in urls:
                url = self.reverse(route_name)
                with self.settings(API_AUTHENTICATION_REQUIRED=False):
                    response = getattr(self.client, method)(url)
                self.assertEqual(response.status_code, 200)
    
        def test_can_filter_tracks_by_favorites(self):
            favorite = TrackFavorite.add(self.track, self.user)
    
    
            url = reverse('api:v1:tracks-list')
    
            self.client.login(username=self.user.username, password='test')
    
            response = self.client.get(url, data={'favorites': True})
    
            parsed_json = json.loads(response.content.decode('utf-8'))
            self.assertEqual(parsed_json['count'], 1)
            self.assertEqual(parsed_json['results'][0]['id'], self.track.id)