from datetime import datetime, timedelta from unittest.mock import patch import pytest import time_machine from django.contrib.auth import get_user_model from django.urls import reverse from django.utils import timezone from music.aggregators import live_charts, scrobble_counts, week_of_scrobbles from music.models import Album, Artist from profiles.models import UserProfile from scrobbles.models import Scrobble def build_scrobbles(client, request_json, num=7, spacing=2): url = reverse("scrobbles:mopidy-webhook") user = get_user_model().objects.create(username="Test User") user.profile.timezone = "US/Eastern" user.profile.save() for i in range(num): client.post(url, request_json, content_type="application/json") s = Scrobble.objects.last() s.user = user s.timestamp = timezone.now() - timedelta(days=i * spacing) s.played_to_completion = True s.save() @pytest.mark.django_db @patch("music.models.get_album_metadata_with_artist", return_value={}) @patch("music.models.get_track_metadata_with_artist", return_value={}) @patch("music.models.get_recording_mbid_exact", return_value=(None, None)) @patch("music.models.lookup_artist_from_tadb", return_value={}) @patch("music.models.lookup_album_from_tadb", return_value={}) @time_machine.travel(datetime(2022, 3, 4, 1, 24)) def test_scrobble_counts_data( mock_lookup_album_tadb, mock_lookup_artist_tadb, mock_get_recording, mock_get_track, mock_get_album, client, mopidy_track ): build_scrobbles(client, mopidy_track.request_json) user = get_user_model().objects.first() count_dict = scrobble_counts(user) assert count_dict == { "alltime": 7, "month": 2, "today": 1, "week": 3, "year": 7, } @pytest.mark.django_db @patch("music.models.get_album_metadata_with_artist", return_value={}) @patch("music.models.get_track_metadata_with_artist", return_value={}) @patch("music.models.get_recording_mbid_exact", return_value=(None, None)) @patch("music.models.lookup_artist_from_tadb", return_value={}) @patch("music.models.lookup_album_from_tadb", return_value={}) @time_machine.travel(datetime(2022, 3, 4, 1, 24)) def test_live_charts( mock_lookup_album_tadb, mock_lookup_artist_tadb, mock_get_recording, mock_get_track, mock_get_album, client, mopidy_track ): build_scrobbles(client, mopidy_track.request_json, 7, 1) user = get_user_model().objects.first() week = week_of_scrobbles(user) assert list(week.values()) == [1, 1, 1, 1, 1, 1, 1] tops = live_charts(user) assert tops[0].title == "Same in the End" tops = live_charts(user, chart_period="week") assert tops[0].title == "Same in the End" tops = live_charts(user, chart_period="month") assert tops[0].title == "Same in the End" tops = live_charts(user, chart_period="year") assert tops[0].title == "Same in the End" tops = live_charts(user, chart_period="week", media_type="Artist") assert tops[0].name == "Sublime" tops = live_charts(user, chart_period="month", media_type="Artist") assert tops[0].name == "Sublime" tops = live_charts(user, chart_period="year", media_type="Artist") assert tops[0].name == "Sublime"