diff --git a/tests/scrobbles_tests/conftest.py b/tests/scrobbles_tests/conftest.py index e854911..7d3644f 100644 --- a/tests/scrobbles_tests/conftest.py +++ b/tests/scrobbles_tests/conftest.py @@ -1,37 +1,54 @@ import json import pytest +from scrobbles.models import Scrobble + class MopidyRequest: + name = "Same in the End" + artist = "Sublime" + album = "Sublime" + track_number = 4 + run_time_ticks = 156604 + run_time = "156" + playback_time_ticks = 15045 + musicbrainz_track_id = "54214d63-5adf-4909-87cd-c65c37a6d558" + musicbrainz_album_id = "03b864cd-7761-314c-a892-05a89ddff00d" + musicbrainz_artist_id = "95f5b748-d370-47fe-85bd-0af2dc450bc0" + mopidy_uri = "local:track:Sublime%20-%20Sublime/Disc%201%20-%2004%20-%20Same%20in%20the%20End.mp3" + status = "resumed" + def __init__(self, **kwargs): self.request_data = { - "name": kwargs.get('name', "Same in the End"), - "artist": kwargs.get("artist", "Sublime"), - "album": kwargs.get("album", "Sublime"), - "track_number": int(kwargs.get("track_number", 4)), - "run_time_ticks": int(kwargs.get("run_time_ticks", 156604)), - "run_time": int(kwargs.get("run_time", "156")), + "name": kwargs.get('name', self.name), + "artist": kwargs.get("artist", self.artist), + "album": kwargs.get("album", self.album), + "track_number": int(kwargs.get("track_number", self.track_number)), + "run_time_ticks": int( + kwargs.get("run_time_ticks", self.run_time_ticks) + ), + "run_time": int(kwargs.get("run_time", self.run_time)), "playback_time_ticks": int( - kwargs.get("playback_time_ticks", 15045) + kwargs.get("playback_time_ticks", self.playback_time_ticks) ), "musicbrainz_track_id": kwargs.get( - "musicbrainz_track_id", "54214d63-5adf-4909-87cd-c65c37a6d558" + "musicbrainz_track_id", self.musicbrainz_track_id ), "musicbrainz_album_id": kwargs.get( - "musicbrainz_album_id", "03b864cd-7761-314c-a892-05a89ddff00d" + "musicbrainz_album_id", self.musicbrainz_album_id ), "musicbrainz_artist_id": kwargs.get( - "musicbrainz_artist_id", "95f5b748-d370-47fe-85bd-0af2dc450bc0" + "musicbrainz_artist_id", self.musicbrainz_artist_id ), - "mopidy_uri": kwargs.get( - "mopidy_uri", - "local:track:Sublime%20-%20Sublime/Disc%201%20-%2004%20-%20Same%20in%20the%20End.mp3", - ), - "status": kwargs.get("status", "resumed"), + "mopidy_uri": kwargs.get("mopidy_uri", self.mopidy_uri), + "status": kwargs.get("status", self.status), } def __eq__(self, other): - return self.name == other.name + for key in self.request_data.keys(): + if self.request_data[key] != getattr(self, key): + return False + return True @property def request_json(self): diff --git a/tests/scrobbles_tests/test_aggregators.py b/tests/scrobbles_tests/test_aggregators.py new file mode 100644 index 0000000..85d8acd --- /dev/null +++ b/tests/scrobbles_tests/test_aggregators.py @@ -0,0 +1,37 @@ +from datetime import timedelta + +import pytest +from django.urls import reverse +from django.utils import timezone +from music.aggregators import scrobble_counts, week_of_scrobbles +from scrobbles.models import Scrobble + + +def build_scrobbles(client, request_data, num=7, spacing=2): + url = reverse('scrobbles:mopidy-websocket') + for i in range(num): + client.post(url, request_data, content_type='application/json') + s = Scrobble.objects.last() + s.timestamp = timezone.now() - timedelta(days=i * spacing) + s.played_to_completion = True + s.save() + + +@pytest.mark.django_db +def test_scrobble_counts_data(client, mopidy_track_request_data): + build_scrobbles(client, mopidy_track_request_data) + count_dict = scrobble_counts() + assert count_dict == { + 'alltime': 7, + 'month': 7, + 'today': 1, + 'week': 2, + 'year': 7, + } + + +@pytest.mark.django_db +def test_scrobble_counts_data(client, mopidy_track_request_data): + build_scrobbles(client, mopidy_track_request_data, 7, 1) + week = week_of_scrobbles() + assert list(week.values()) == [1, 1, 1, 1, 1, 1, 1] diff --git a/vrobbler/apps/music/aggregators.py b/vrobbler/apps/music/aggregators.py index 098519f..440c768 100644 --- a/vrobbler/apps/music/aggregators.py +++ b/vrobbler/apps/music/aggregators.py @@ -18,11 +18,11 @@ STARTING_DAY_OF_CURRENT_MONTH = NOW.date().replace(day=1) STARTING_DAY_OF_CURRENT_YEAR = NOW.date().replace(month=1, day=1) -def scrobble_counts(user): +def scrobble_counts(user=None): now = timezone.now() user_filter = Q() - if user.is_authenticated: + if user and user.is_authenticated: now = now_user_timezone(user.profile) user_filter = Q(user=user) @@ -59,7 +59,7 @@ def week_of_scrobbles(user=None, media: str = 'tracks') -> dict[str, int]: now = timezone.now() user_filter = Q() - if user.is_authenticated: + if user and user.is_authenticated: now = now_user_timezone(user.profile) user_filter = Q(user=user)