funquail/api/tests/favorites/test_favorites.py

121 lines
4.2 KiB
Python
Raw Normal View History

import json
2018-06-10 10:55:16 +02:00
import pytest
from django.urls import reverse
from funkwhale_api.favorites.models import TrackFavorite
2018-07-17 11:09:13 +00:00
from funkwhale_api.music import serializers as music_serializers
from funkwhale_api.users import serializers as users_serializers
def test_user_can_add_favorite(factories):
2018-06-09 15:36:16 +02:00
track = factories["music.Track"]()
user = factories["users.User"]()
f = TrackFavorite.add(track, user)
assert f.track == track
assert f.user == user
2018-07-17 11:09:13 +00:00
def test_user_can_get_his_favorites(api_request, factories, logged_in_client, client):
r = api_request.get("/")
2018-06-09 15:36:16 +02:00
favorite = factories["favorites.TrackFavorite"](user=logged_in_client.user)
factories["favorites.TrackFavorite"]()
2018-06-09 15:36:16 +02:00
url = reverse("api:v1:favorites:tracks-list")
response = logged_in_client.get(url, {"user": logged_in_client.user.pk})
expected = [
{
2018-07-17 11:09:13 +00:00
"user": users_serializers.UserBasicSerializer(
favorite.user, context={"request": r}
).data,
"track": music_serializers.TrackSerializer(
favorite.track, context={"request": r}
).data,
2018-06-09 15:36:16 +02:00
"id": favorite.id,
"creation_date": favorite.creation_date.isoformat().replace("+00:00", "Z"),
}
]
2018-07-17 11:09:13 +00:00
assert response.status_code == 200
assert response.data["results"] == expected
2018-06-09 15:36:16 +02:00
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})
2018-06-09 15:36:16 +02:00
favorite = TrackFavorite.objects.latest("id")
expected = {
2018-06-09 15:36:16 +02:00
"track": track.pk,
"id": favorite.id,
"creation_date": favorite.creation_date.isoformat().replace("+00:00", "Z"),
}
2018-06-09 15:36:16 +02:00
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_adding_favorites_calls_activity_record(
2018-06-09 15:36:16 +02:00
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})
2018-06-09 15:36:16 +02:00
favorite = TrackFavorite.objects.latest("id")
expected = {
2018-06-09 15:36:16 +02:00
"track": track.pk,
"id": favorite.id,
"creation_date": favorite.creation_date.isoformat().replace("+00:00", "Z"),
}
2018-06-09 15:36:16 +02:00
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):
2018-06-09 15:36:16 +02:00
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
2018-01-11 21:35:51 +01:00
2018-06-09 15:36:16 +02:00
@pytest.mark.parametrize("method", ["delete", "post"])
2018-01-11 21:35:51 +01:00
def test_user_can_remove_favorite_via_api_using_track_id(
2018-06-09 15:36:16 +02:00
method, factories, logged_in_client
):
favorite = factories["favorites.TrackFavorite"](user=logged_in_client.user)
2018-06-09 15:36:16 +02:00
url = reverse("api:v1:favorites:tracks-remove")
2018-01-11 21:35:51 +01:00
response = getattr(logged_in_client, method)(
2018-06-09 15:36:16 +02:00
url, json.dumps({"track": favorite.track.pk}), content_type="application/json"
)
assert response.status_code == 204
assert TrackFavorite.objects.count() == 0
2018-06-09 15:36:16 +02:00
@pytest.mark.parametrize("url,method", [("api:v1:favorites:tracks-list", "get")])
def test_url_require_auth(url, method, db, preferences, client):
2018-06-09 15:36:16 +02:00
preferences["common__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):
2018-06-09 15:36:16 +02:00
favorite = factories["favorites.TrackFavorite"](user=logged_in_client.user)
2018-06-09 15:36:16 +02:00
url = reverse("api:v1:tracks-list")
response = logged_in_client.get(url, data={"favorites": True})
2018-06-09 15:36:16 +02:00
parsed_json = json.loads(response.content.decode("utf-8"))
assert parsed_json["count"] == 1
assert parsed_json["results"][0]["id"] == favorite.track.id