| 
									
										
										
										
											2017-12-24 18:15:21 +00:00
										 |  |  | import json | 
					
						
							| 
									
										
										
										
											2018-06-10 08:55:16 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-24 18:15:21 +00:00
										 |  |  | import pytest | 
					
						
							|  |  |  | from django.urls import reverse | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-09 09:10:25 +00:00
										 |  |  | from funkwhale_api.favorites import serializers | 
					
						
							| 
									
										
										
										
											2022-11-23 11:11:36 +00:00
										 |  |  | from funkwhale_api.favorites.models import TrackFavorite | 
					
						
							| 
									
										
										
										
											2017-12-24 18:15:21 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_user_can_add_favorite(factories): | 
					
						
							| 
									
										
										
										
											2018-06-09 13:36:16 +00:00
										 |  |  |     track = factories["music.Track"]() | 
					
						
							|  |  |  |     user = factories["users.User"]() | 
					
						
							| 
									
										
										
										
											2017-12-24 18:15:21 +00:00
										 |  |  |     f = TrackFavorite.add(track, user) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assert f.track == track | 
					
						
							|  |  |  |     assert f.user == user | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-25 16:02:51 +00:00
										 |  |  | def test_user_can_get_his_favorites( | 
					
						
							|  |  |  |     api_request, factories, logged_in_api_client, client | 
					
						
							|  |  |  | ): | 
					
						
							| 
									
										
										
										
											2019-09-09 09:10:25 +00:00
										 |  |  |     request = api_request.get("/") | 
					
						
							| 
									
										
										
										
											2020-08-03 13:47:14 +00:00
										 |  |  |     logged_in_api_client.user.create_actor() | 
					
						
							| 
									
										
										
										
											2019-03-25 16:02:51 +00:00
										 |  |  |     favorite = factories["favorites.TrackFavorite"](user=logged_in_api_client.user) | 
					
						
							| 
									
										
										
										
											2018-07-22 09:56:25 +00:00
										 |  |  |     factories["favorites.TrackFavorite"]() | 
					
						
							| 
									
										
										
										
											2018-06-09 13:36:16 +00:00
										 |  |  |     url = reverse("api:v1:favorites:tracks-list") | 
					
						
							| 
									
										
										
										
											2020-08-03 13:47:14 +00:00
										 |  |  |     response = logged_in_api_client.get(url, {"scope": "me"}) | 
					
						
							| 
									
										
										
										
											2017-12-24 18:15:21 +00:00
										 |  |  |     expected = [ | 
					
						
							| 
									
										
										
										
											2019-09-09 09:10:25 +00:00
										 |  |  |         serializers.UserTrackFavoriteSerializer( | 
					
						
							|  |  |  |             favorite, context={"request": request} | 
					
						
							|  |  |  |         ).data | 
					
						
							| 
									
										
										
										
											2017-12-24 18:15:21 +00:00
										 |  |  |     ] | 
					
						
							| 
									
										
										
										
											2020-02-05 14:06:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-17 11:09:13 +00:00
										 |  |  |     assert response.status_code == 200 | 
					
						
							| 
									
										
										
										
											2019-01-10 10:58:18 +00:00
										 |  |  |     assert response.data["results"] == expected | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_user_can_retrieve_all_favorites_at_once( | 
					
						
							| 
									
										
										
										
											2019-03-25 16:02:51 +00:00
										 |  |  |     api_request, factories, logged_in_api_client, client | 
					
						
							| 
									
										
										
										
											2019-01-10 10:58:18 +00:00
										 |  |  | ): | 
					
						
							| 
									
										
										
										
											2019-03-25 16:02:51 +00:00
										 |  |  |     favorite = factories["favorites.TrackFavorite"](user=logged_in_api_client.user) | 
					
						
							| 
									
										
										
										
											2019-01-10 10:58:18 +00:00
										 |  |  |     factories["favorites.TrackFavorite"]() | 
					
						
							|  |  |  |     url = reverse("api:v1:favorites:tracks-all") | 
					
						
							| 
									
										
										
										
											2019-03-25 16:02:51 +00:00
										 |  |  |     response = logged_in_api_client.get(url, {"user": logged_in_api_client.user.pk}) | 
					
						
							| 
									
										
										
										
											2019-01-10 10:58:18 +00:00
										 |  |  |     expected = [{"track": favorite.track.id, "id": favorite.id}] | 
					
						
							|  |  |  |     assert response.status_code == 200 | 
					
						
							| 
									
										
										
										
											2018-07-17 11:09:13 +00:00
										 |  |  |     assert response.data["results"] == expected | 
					
						
							| 
									
										
										
										
											2017-12-24 18:15:21 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-25 16:02:51 +00:00
										 |  |  | def test_user_can_add_favorite_via_api(factories, logged_in_api_client, activity_muted): | 
					
						
							| 
									
										
										
										
											2018-06-09 13:36:16 +00:00
										 |  |  |     track = factories["music.Track"]() | 
					
						
							|  |  |  |     url = reverse("api:v1:favorites:tracks-list") | 
					
						
							| 
									
										
										
										
											2019-03-25 16:02:51 +00:00
										 |  |  |     response = logged_in_api_client.post(url, {"track": track.pk}) | 
					
						
							| 
									
										
										
										
											2017-12-24 18:15:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-09 13:36:16 +00:00
										 |  |  |     favorite = TrackFavorite.objects.latest("id") | 
					
						
							| 
									
										
										
										
											2017-12-24 18:15:21 +00:00
										 |  |  |     expected = { | 
					
						
							| 
									
										
										
										
											2018-06-09 13:36:16 +00:00
										 |  |  |         "track": track.pk, | 
					
						
							|  |  |  |         "id": favorite.id, | 
					
						
							|  |  |  |         "creation_date": favorite.creation_date.isoformat().replace("+00:00", "Z"), | 
					
						
							| 
									
										
										
										
											2017-12-24 18:15:21 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-06-09 13:36:16 +00:00
										 |  |  |     parsed_json = json.loads(response.content.decode("utf-8")) | 
					
						
							| 
									
										
										
										
											2017-12-24 18:15:21 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     assert expected == parsed_json | 
					
						
							|  |  |  |     assert favorite.track == track | 
					
						
							| 
									
										
										
										
											2019-03-25 16:02:51 +00:00
										 |  |  |     assert favorite.user == logged_in_api_client.user | 
					
						
							| 
									
										
										
										
											2017-12-24 18:15:21 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-01 19:38:48 +00:00
										 |  |  | def test_adding_favorites_calls_activity_record( | 
					
						
							| 
									
										
										
										
											2019-03-25 16:02:51 +00:00
										 |  |  |     factories, logged_in_api_client, activity_muted | 
					
						
							| 
									
										
										
										
											2018-06-09 13:36:16 +00:00
										 |  |  | ): | 
					
						
							|  |  |  |     track = factories["music.Track"]() | 
					
						
							|  |  |  |     url = reverse("api:v1:favorites:tracks-list") | 
					
						
							| 
									
										
										
										
											2019-03-25 16:02:51 +00:00
										 |  |  |     response = logged_in_api_client.post(url, {"track": track.pk}) | 
					
						
							| 
									
										
										
										
											2018-03-01 19:38:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-09 13:36:16 +00:00
										 |  |  |     favorite = TrackFavorite.objects.latest("id") | 
					
						
							| 
									
										
										
										
											2018-03-01 19:38:48 +00:00
										 |  |  |     expected = { | 
					
						
							| 
									
										
										
										
											2018-06-09 13:36:16 +00:00
										 |  |  |         "track": track.pk, | 
					
						
							|  |  |  |         "id": favorite.id, | 
					
						
							|  |  |  |         "creation_date": favorite.creation_date.isoformat().replace("+00:00", "Z"), | 
					
						
							| 
									
										
										
										
											2018-03-01 19:38:48 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-06-09 13:36:16 +00:00
										 |  |  |     parsed_json = json.loads(response.content.decode("utf-8")) | 
					
						
							| 
									
										
										
										
											2018-03-01 19:38:48 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     assert expected == parsed_json | 
					
						
							|  |  |  |     assert favorite.track == track | 
					
						
							| 
									
										
										
										
											2019-03-25 16:02:51 +00:00
										 |  |  |     assert favorite.user == logged_in_api_client.user | 
					
						
							| 
									
										
										
										
											2018-03-01 19:38:48 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     activity_muted.assert_called_once_with(favorite) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-25 16:02:51 +00:00
										 |  |  | def test_user_can_remove_favorite_via_api(logged_in_api_client, factories): | 
					
						
							|  |  |  |     favorite = factories["favorites.TrackFavorite"](user=logged_in_api_client.user) | 
					
						
							| 
									
										
										
										
											2018-06-09 13:36:16 +00:00
										 |  |  |     url = reverse("api:v1:favorites:tracks-detail", kwargs={"pk": favorite.pk}) | 
					
						
							| 
									
										
										
										
											2019-03-25 16:02:51 +00:00
										 |  |  |     response = logged_in_api_client.delete(url, {"track": favorite.track.pk}) | 
					
						
							| 
									
										
										
										
											2017-12-24 18:15:21 +00:00
										 |  |  |     assert response.status_code == 204 | 
					
						
							|  |  |  |     assert TrackFavorite.objects.count() == 0 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-11 20:35:51 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-09 13:36:16 +00:00
										 |  |  | @pytest.mark.parametrize("method", ["delete", "post"]) | 
					
						
							| 
									
										
										
										
											2018-01-11 20:35:51 +00:00
										 |  |  | def test_user_can_remove_favorite_via_api_using_track_id( | 
					
						
							| 
									
										
										
										
											2019-03-25 16:02:51 +00:00
										 |  |  |     method, factories, logged_in_api_client | 
					
						
							| 
									
										
										
										
											2018-06-09 13:36:16 +00:00
										 |  |  | ): | 
					
						
							| 
									
										
										
										
											2019-03-25 16:02:51 +00:00
										 |  |  |     favorite = factories["favorites.TrackFavorite"](user=logged_in_api_client.user) | 
					
						
							| 
									
										
										
										
											2017-12-24 18:15:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-09 13:36:16 +00:00
										 |  |  |     url = reverse("api:v1:favorites:tracks-remove") | 
					
						
							| 
									
										
										
										
											2019-03-25 16:02:51 +00:00
										 |  |  |     response = getattr(logged_in_api_client, method)( | 
					
						
							| 
									
										
										
										
											2018-06-09 13:36:16 +00:00
										 |  |  |         url, json.dumps({"track": favorite.track.pk}), content_type="application/json" | 
					
						
							| 
									
										
										
										
											2017-12-24 18:15:21 +00:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assert response.status_code == 204 | 
					
						
							|  |  |  |     assert TrackFavorite.objects.count() == 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-09 13:36:16 +00:00
										 |  |  | @pytest.mark.parametrize("url,method", [("api:v1:favorites:tracks-list", "get")]) | 
					
						
							| 
									
										
										
										
											2018-04-28 04:11:50 +00:00
										 |  |  | def test_url_require_auth(url, method, db, preferences, client): | 
					
						
							| 
									
										
										
										
											2018-06-09 13:36:16 +00:00
										 |  |  |     preferences["common__api_authentication_required"] = True | 
					
						
							| 
									
										
										
										
											2017-12-24 18:15:21 +00:00
										 |  |  |     url = reverse(url) | 
					
						
							|  |  |  |     response = getattr(client, method)(url) | 
					
						
							|  |  |  |     assert response.status_code == 401 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-25 16:02:51 +00:00
										 |  |  | def test_can_filter_tracks_by_favorites(factories, logged_in_api_client): | 
					
						
							|  |  |  |     favorite = factories["favorites.TrackFavorite"](user=logged_in_api_client.user) | 
					
						
							| 
									
										
										
										
											2017-12-24 18:15:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-09 13:36:16 +00:00
										 |  |  |     url = reverse("api:v1:tracks-list") | 
					
						
							| 
									
										
										
										
											2019-03-25 16:02:51 +00:00
										 |  |  |     response = logged_in_api_client.get(url, data={"favorites": True}) | 
					
						
							| 
									
										
										
										
											2017-12-24 18:15:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-09 13:36:16 +00:00
										 |  |  |     parsed_json = json.loads(response.content.decode("utf-8")) | 
					
						
							|  |  |  |     assert parsed_json["count"] == 1 | 
					
						
							|  |  |  |     assert parsed_json["results"][0]["id"] == favorite.track.id |