[tests] Simplify view tests to not mess with time
This commit is contained in:
@ -4,8 +4,9 @@ import pytest
|
|||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
from rest_framework.authtoken.models import Token
|
from rest_framework.authtoken.models import Token
|
||||||
|
|
||||||
from scrobbles.models import Scrobble
|
|
||||||
from boardgames.models import BoardGame
|
from boardgames.models import BoardGame
|
||||||
|
from music.models import Track, Artist
|
||||||
|
from scrobbles.models import Scrobble
|
||||||
|
|
||||||
User = get_user_model()
|
User = get_user_model()
|
||||||
|
|
||||||
@ -27,6 +28,15 @@ def boardgame_scrobble():
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def test_track():
|
||||||
|
Track.objects.create(
|
||||||
|
title="Emotion",
|
||||||
|
artist=Artist.objects.create(name="Carly Rae Jepsen"),
|
||||||
|
run_time_seconds=60,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class MopidyRequest:
|
class MopidyRequest:
|
||||||
name = "Same in the End"
|
name = "Same in the End"
|
||||||
artist = "Sublime"
|
artist = "Sublime"
|
||||||
|
|||||||
@ -76,9 +76,26 @@ def test_scrobble_mopidy_track(
|
|||||||
assert scrobble.media_obj.title == "Same in the End"
|
assert scrobble.media_obj.title == "Same in the End"
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.skip(reason="Allmusic API is unstable")
|
# @pytest.mark.skip(reason="Allmusic API is unstable")
|
||||||
@pytest.mark.django_db
|
@pytest.mark.django_db
|
||||||
|
@patch("music.utils.lookup_artist_from_mb", return_value={})
|
||||||
|
@patch(
|
||||||
|
"music.utils.lookup_album_dict_from_mb",
|
||||||
|
return_value={"year": "1999", "mb_group_id": 1},
|
||||||
|
)
|
||||||
|
@patch("music.utils.lookup_track_from_mb", return_value={})
|
||||||
|
@patch("music.models.lookup_artist_from_tadb", return_value={})
|
||||||
|
@patch("music.models.lookup_album_from_tadb", return_value={"year": "1999"})
|
||||||
|
@patch("music.models.Album.fetch_artwork", return_value=None)
|
||||||
|
@patch("music.models.Album.scrape_allmusic", return_value=None)
|
||||||
def test_scrobble_mopidy_same_track_different_album(
|
def test_scrobble_mopidy_same_track_different_album(
|
||||||
|
mock_lookup_artist,
|
||||||
|
mock_lookup_album,
|
||||||
|
mock_lookup_track,
|
||||||
|
mock_lookup_artist_tadb,
|
||||||
|
mock_lookup_album_tadb,
|
||||||
|
mock_fetch_artwork,
|
||||||
|
mock_scrape_allmusic,
|
||||||
client,
|
client,
|
||||||
mopidy_track,
|
mopidy_track,
|
||||||
mopidy_track_diff_album_request_data,
|
mopidy_track_diff_album_request_data,
|
||||||
@ -177,38 +194,101 @@ def test_scrobble_jellyfin_track(
|
|||||||
assert scrobble.media_obj.__class__ == Track
|
assert scrobble.media_obj.__class__ == Track
|
||||||
assert scrobble.media_obj.title == "Emotion"
|
assert scrobble.media_obj.title == "Emotion"
|
||||||
|
|
||||||
with time_machine.travel(datetime(2024, 1, 14, 12, 0, 58)):
|
|
||||||
jellyfin_track.request_data["UtcTimestamp"] = timezone.now().strftime(
|
|
||||||
"%Y-%m-%d %H:%M:%S"
|
|
||||||
)
|
|
||||||
response = client.post(
|
|
||||||
url,
|
|
||||||
jellyfin_track.request_json,
|
|
||||||
content_type="application/json",
|
|
||||||
headers=headers,
|
|
||||||
)
|
|
||||||
|
|
||||||
assert response.status_code == 200
|
@pytest.mark.django_db
|
||||||
assert response.data == {"scrobble_id": 1}
|
@patch("music.utils.lookup_artist_from_mb", return_value={})
|
||||||
|
@patch(
|
||||||
|
"music.utils.lookup_album_dict_from_mb",
|
||||||
|
return_value={"year": "1999", "mb_group_id": 1},
|
||||||
|
)
|
||||||
|
@patch("music.utils.lookup_track_from_mb", return_value={})
|
||||||
|
@patch("music.models.lookup_artist_from_tadb", return_value={})
|
||||||
|
@patch("music.models.lookup_album_from_tadb", return_value={"year": "1999"})
|
||||||
|
@patch("music.models.Album.fetch_artwork", return_value=None)
|
||||||
|
@patch("music.models.Album.scrape_allmusic", return_value=None)
|
||||||
|
def test_scrobble_jellyfin_track_update(
|
||||||
|
mock_lookup_artist,
|
||||||
|
mock_lookup_album,
|
||||||
|
mock_lookup_track,
|
||||||
|
mock_lookup_artist_tadb,
|
||||||
|
mock_lookup_album_tadb,
|
||||||
|
mock_fetch_artwork,
|
||||||
|
mock_scrape_allmusic,
|
||||||
|
test_track,
|
||||||
|
client,
|
||||||
|
jellyfin_track,
|
||||||
|
valid_auth_token,
|
||||||
|
):
|
||||||
|
Scrobble.objects.create(
|
||||||
|
timestamp=timezone.now() - timedelta(minutes=0.5),
|
||||||
|
track=Track.objects.first(),
|
||||||
|
user_id=1,
|
||||||
|
)
|
||||||
|
url = reverse("scrobbles:jellyfin-webhook")
|
||||||
|
headers = {"Authorization": f"Token {valid_auth_token}"}
|
||||||
|
|
||||||
scrobble = Scrobble.objects.get(id=1)
|
jellyfin_track.request_data["UtcTimestamp"] = timezone.now().strftime(
|
||||||
assert scrobble.media_obj.__class__ == Track
|
"%Y-%m-%d %H:%M:%S"
|
||||||
assert scrobble.media_obj.title == "Emotion"
|
)
|
||||||
|
response = client.post(
|
||||||
|
url,
|
||||||
|
jellyfin_track.request_json,
|
||||||
|
content_type="application/json",
|
||||||
|
headers=headers,
|
||||||
|
)
|
||||||
|
|
||||||
with time_machine.travel(datetime(2024, 1, 14, 12, 1, 10)):
|
assert response.status_code == 200
|
||||||
jellyfin_track.request_data["UtcTimestamp"] = timezone.now().strftime(
|
assert response.data == {"scrobble_id": 1}
|
||||||
"%Y-%m-%d %H:%M:%S"
|
|
||||||
)
|
|
||||||
response = client.post(
|
|
||||||
url,
|
|
||||||
jellyfin_track.request_json,
|
|
||||||
content_type="application/json",
|
|
||||||
headers=headers,
|
|
||||||
)
|
|
||||||
|
|
||||||
assert response.status_code == 200
|
scrobble = Scrobble.objects.get(id=1)
|
||||||
assert response.data == {"scrobble_id": 2}
|
assert scrobble.media_obj.__class__ == Track
|
||||||
|
assert scrobble.media_obj.title == "Emotion"
|
||||||
|
|
||||||
scrobble = Scrobble.objects.get(id=1)
|
|
||||||
assert scrobble.media_obj.__class__ == Track
|
@pytest.mark.django_db
|
||||||
assert scrobble.media_obj.title == "Emotion"
|
@patch("music.utils.lookup_artist_from_mb", return_value={})
|
||||||
|
@patch(
|
||||||
|
"music.utils.lookup_album_dict_from_mb",
|
||||||
|
return_value={"year": "1999", "mb_group_id": 1},
|
||||||
|
)
|
||||||
|
@patch("music.utils.lookup_track_from_mb", return_value={})
|
||||||
|
@patch("music.models.lookup_artist_from_tadb", return_value={})
|
||||||
|
@patch("music.models.lookup_album_from_tadb", return_value={"year": "1999"})
|
||||||
|
@patch("music.models.Album.fetch_artwork", return_value=None)
|
||||||
|
@patch("music.models.Album.scrape_allmusic", return_value=None)
|
||||||
|
def test_scrobble_jellyfin_track_create_new(
|
||||||
|
mock_lookup_artist,
|
||||||
|
mock_lookup_album,
|
||||||
|
mock_lookup_track,
|
||||||
|
mock_lookup_artist_tadb,
|
||||||
|
mock_lookup_album_tadb,
|
||||||
|
mock_fetch_artwork,
|
||||||
|
mock_scrape_allmusic,
|
||||||
|
test_track,
|
||||||
|
client,
|
||||||
|
jellyfin_track,
|
||||||
|
valid_auth_token,
|
||||||
|
):
|
||||||
|
url = reverse("scrobbles:jellyfin-webhook")
|
||||||
|
headers = {"Authorization": f"Token {valid_auth_token}"}
|
||||||
|
Scrobble.objects.create(
|
||||||
|
timestamp=timezone.now() - timedelta(minutes=1),
|
||||||
|
track=Track.objects.first(),
|
||||||
|
user_id=1,
|
||||||
|
)
|
||||||
|
jellyfin_track.request_data["UtcTimestamp"] = timezone.now().strftime(
|
||||||
|
"%Y-%m-%d %H:%M:%S"
|
||||||
|
)
|
||||||
|
response = client.post(
|
||||||
|
url,
|
||||||
|
jellyfin_track.request_json,
|
||||||
|
content_type="application/json",
|
||||||
|
headers=headers,
|
||||||
|
)
|
||||||
|
|
||||||
|
assert response.status_code == 200
|
||||||
|
assert response.data == {"scrobble_id": 2}
|
||||||
|
|
||||||
|
scrobble = Scrobble.objects.get(id=1)
|
||||||
|
assert scrobble.media_obj.__class__ == Track
|
||||||
|
assert scrobble.media_obj.title == "Emotion"
|
||||||
|
|||||||
@ -1034,7 +1034,6 @@ class Scrobble(TimeStampedModel):
|
|||||||
"scrobble_data": scrobble_data,
|
"scrobble_data": scrobble_data,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
scrobble_data["playback_status"] = scrobble_data.pop("status", None)
|
scrobble_data["playback_status"] = scrobble_data.pop("status", None)
|
||||||
# If it's marked as stopped, send it through our update mechanism, which will complete it
|
# If it's marked as stopped, send it through our update mechanism, which will complete it
|
||||||
if scrobble and (
|
if scrobble and (
|
||||||
@ -1140,9 +1139,9 @@ class Scrobble(TimeStampedModel):
|
|||||||
if existing_locations := location.in_proximity(named=True):
|
if existing_locations := location.in_proximity(named=True):
|
||||||
existing_location = existing_locations.first()
|
existing_location = existing_locations.first()
|
||||||
ts = int(pendulum.now().timestamp())
|
ts = int(pendulum.now().timestamp())
|
||||||
scrobble.log[ts] = (
|
scrobble.log[
|
||||||
f"Location {location.id} too close to this scrobble"
|
ts
|
||||||
)
|
] = f"Location {location.id} too close to this scrobble"
|
||||||
scrobble.save(update_fields=["log"])
|
scrobble.save(update_fields=["log"])
|
||||||
logger.info(
|
logger.info(
|
||||||
f"[scrobbling] finished - found existing named location",
|
f"[scrobbling] finished - found existing named location",
|
||||||
|
|||||||
Reference in New Issue
Block a user