Files
vrobbler/vrobbler/apps/charts/tests/test_utils.py
2026-03-23 12:35:52 -04:00

269 lines
6.9 KiB
Python

import datetime
import pytest
from django.contrib.auth import get_user_model
from django.utils import timezone
from charts.models import ChartRecord
from charts.utils import build_charts
User = get_user_model()
@pytest.fixture
def user(db):
return User.objects.create_user(username="charttester", password="testpass123")
@pytest.fixture
def scrobble_data(user, db):
from scrobbles.models import Scrobble
from music.models import Track, Artist, Album
artist = Artist.objects.create(name="Test Artist")
album = Album.objects.create(name="Test Album", album_artist=artist)
track = Track.objects.create(title="Test Track", artist=artist, album=album)
return {
"user": user,
"track": track,
}
@pytest.mark.django_db
def test_build_daily_charts_creates_daily_record(user, scrobble_data):
from scrobbles.models import Scrobble
Scrobble.objects.create(
user=user,
track=scrobble_data["track"],
played_to_completion=True,
timestamp=timezone.make_aware(datetime.datetime(2024, 3, 15, 10, 0)),
)
build_charts(user, year=2024, month=3, day=15)
daily = ChartRecord.objects.filter(
user=user,
year=2024,
month=3,
day=15,
week__isnull=True,
track__isnull=False,
)
assert daily.exists()
assert daily.first().track == scrobble_data["track"]
@pytest.mark.django_db
def test_build_monthly_charts_creates_monthly_record(user, scrobble_data):
from scrobbles.models import Scrobble
Scrobble.objects.create(
user=user,
track=scrobble_data["track"],
played_to_completion=True,
timestamp=timezone.make_aware(datetime.datetime(2024, 3, 15, 10, 0)),
)
build_charts(user, year=2024, month=3)
monthly = ChartRecord.objects.filter(
user=user,
year=2024,
month=3,
week__isnull=True,
day__isnull=True,
track__isnull=False,
)
assert monthly.exists()
assert monthly.first().track == scrobble_data["track"]
@pytest.mark.django_db
def test_build_weekly_charts_creates_weekly_record(user, scrobble_data):
from scrobbles.models import Scrobble
Scrobble.objects.create(
user=user,
track=scrobble_data["track"],
played_to_completion=True,
timestamp=timezone.make_aware(datetime.datetime(2024, 3, 15, 10, 0)),
)
build_charts(user, year=2024, week=11)
weekly = ChartRecord.objects.filter(
user=user,
year=2024,
week=11,
month__isnull=True,
day__isnull=True,
track__isnull=False,
)
assert weekly.exists()
assert weekly.first().track == scrobble_data["track"]
@pytest.mark.django_db
def test_build_yearly_charts_creates_yearly_record(user, scrobble_data):
from scrobbles.models import Scrobble
Scrobble.objects.create(
user=user,
track=scrobble_data["track"],
played_to_completion=True,
timestamp=timezone.make_aware(datetime.datetime(2024, 3, 15, 10, 0)),
)
build_charts(user, year=2024)
yearly = ChartRecord.objects.filter(
user=user,
year=2024,
month__isnull=True,
week__isnull=True,
day__isnull=True,
track__isnull=False,
)
assert yearly.exists()
assert yearly.first().track == scrobble_data["track"]
@pytest.mark.django_db
def test_build_charts_ranks_by_count(user, scrobble_data):
from scrobbles.models import Scrobble
from music.models import Track, Artist
track1 = scrobble_data["track"]
track2 = Track.objects.create(
title="Test Track 2",
artist=track1.artist,
album=track1.album,
)
Scrobble.objects.create(
user=user,
track=track1,
played_to_completion=True,
timestamp=timezone.make_aware(datetime.datetime(2024, 3, 15, 10, 0)),
)
Scrobble.objects.create(
user=user,
track=track1,
played_to_completion=True,
timestamp=timezone.make_aware(datetime.datetime(2024, 3, 15, 11, 0)),
)
Scrobble.objects.create(
user=user,
track=track2,
played_to_completion=True,
timestamp=timezone.make_aware(datetime.datetime(2024, 3, 15, 12, 0)),
)
build_charts(user, year=2024, month=3, day=15)
daily = ChartRecord.objects.filter(
user=user,
year=2024,
month=3,
day=15,
track__isnull=False,
).order_by("rank")
assert daily.count() == 2
assert daily[0].track == track1
assert daily[0].rank == 1
assert daily[0].count == 2
assert daily[1].track == track2
assert daily[1].rank == 2
assert daily[1].count == 1
@pytest.mark.django_db
def test_build_daily_charts_deletes_existing_daily_record(user, scrobble_data):
from scrobbles.models import Scrobble
from music.models import Track, Artist
track1 = scrobble_data["track"]
track2 = Track.objects.create(
title="Test Track 2",
artist=track1.artist,
album=track1.album,
)
Scrobble.objects.create(
user=user,
track=track1,
played_to_completion=True,
timestamp=timezone.make_aware(datetime.datetime(2024, 3, 15, 10, 0)),
)
build_charts(user, year=2024, month=3, day=15)
assert ChartRecord.objects.filter(
user=user, year=2024, month=3, day=15, track=track1
).exists()
Scrobble.objects.create(
user=user,
track=track2,
played_to_completion=True,
timestamp=timezone.make_aware(datetime.datetime(2024, 3, 15, 11, 0)),
)
build_charts(user, year=2024, month=3, day=15)
daily = ChartRecord.objects.filter(
user=user,
year=2024,
month=3,
day=15,
track__isnull=False,
)
assert daily.count() == 2
assert daily.filter(track=track1).exists()
assert daily.filter(track=track2).exists()
@pytest.mark.django_db
def test_build_monthly_charts_deletes_existing_monthly_record(user, scrobble_data):
from scrobbles.models import Scrobble
from music.models import Track, Artist
track1 = scrobble_data["track"]
track2 = Track.objects.create(
title="Test Track 2",
artist=track1.artist,
album=track1.album,
)
Scrobble.objects.create(
user=user,
track=track1,
played_to_completion=True,
timestamp=timezone.make_aware(datetime.datetime(2024, 3, 15, 10, 0)),
)
build_charts(user, year=2024, month=3)
ChartRecord.objects.filter(user=user, year=2024, month=3, track=track1).delete()
Scrobble.objects.create(
user=user,
track=track2,
played_to_completion=True,
timestamp=timezone.make_aware(datetime.datetime(2024, 3, 16, 11, 0)),
)
build_charts(user, year=2024, month=3)
monthly = ChartRecord.objects.filter(
user=user,
year=2024,
month=3,
week__isnull=True,
day__isnull=True,
track__isnull=False,
)
assert monthly.count() == 2