test_aggregators.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. from datetime import datetime, timedelta
  2. from unittest import mock
  3. from unittest.mock import patch
  4. import pytest
  5. import time_machine
  6. from django.contrib.auth import get_user_model
  7. from django.urls import reverse
  8. from django.utils import timezone
  9. from music.aggregators import live_charts, scrobble_counts, week_of_scrobbles
  10. from music.models import Album, Artist
  11. from profiles.models import UserProfile
  12. from scrobbles.models import Scrobble
  13. def build_scrobbles(client, request_data, num=7, spacing=2):
  14. url = reverse("scrobbles:mopidy-webhook")
  15. user = get_user_model().objects.create(username="Test User")
  16. UserProfile.objects.create(user=user, timezone="US/Eastern")
  17. for i in range(num):
  18. client.post(url, request_data, content_type="application/json")
  19. s = Scrobble.objects.last()
  20. s.user = user
  21. s.timestamp = timezone.now() - timedelta(days=i * spacing)
  22. s.played_to_completion = True
  23. s.save()
  24. @pytest.mark.django_db
  25. @time_machine.travel(datetime(2022, 3, 4, 1, 24))
  26. def test_scrobble_counts_data(client, mopidy_track_request_data):
  27. build_scrobbles(client, mopidy_track_request_data)
  28. user = get_user_model().objects.first()
  29. count_dict = scrobble_counts(user)
  30. assert count_dict == {
  31. "alltime": 7,
  32. "month": 2,
  33. "today": 1,
  34. "week": 3,
  35. "year": 7,
  36. }
  37. @pytest.mark.django_db
  38. def test_week_of_scrobbles_data(client, mopidy_track_request_data):
  39. build_scrobbles(client, mopidy_track_request_data, 7, 1)
  40. user = get_user_model().objects.first()
  41. week = week_of_scrobbles(user)
  42. assert list(week.values()) == [1, 1, 1, 1, 1, 1, 1]
  43. @pytest.mark.django_db
  44. @time_machine.travel(datetime(2022, 3, 4, 1, 24))
  45. def test_top_tracks_by_day(client, mopidy_track_request_data):
  46. build_scrobbles(client, mopidy_track_request_data, 7, 1)
  47. user = get_user_model().objects.first()
  48. tops = live_charts(user)
  49. assert tops[0].title == "Same in the End"
  50. @pytest.mark.django_db
  51. @time_machine.travel(datetime(2022, 3, 4, 1, 24))
  52. def test_top_tracks_by_week(client, mopidy_track_request_data):
  53. build_scrobbles(client, mopidy_track_request_data, 7, 1)
  54. user = get_user_model().objects.first()
  55. tops = live_charts(user, chart_period="week")
  56. assert tops[0].title == "Same in the End"
  57. @pytest.mark.django_db
  58. @time_machine.travel(datetime(2022, 3, 4, 1, 24))
  59. def test_top_tracks_by_month(client, mopidy_track_request_data, mocker):
  60. build_scrobbles(client, mopidy_track_request_data, 7, 1)
  61. user = get_user_model().objects.get(id=1)
  62. tops = live_charts(user, chart_period="month")
  63. assert tops[0].title == "Same in the End"
  64. @pytest.mark.django_db
  65. @time_machine.travel(datetime(2022, 3, 4, 1, 24))
  66. def test_top_tracks_by_year(client, mopidy_track_request_data):
  67. build_scrobbles(client, mopidy_track_request_data, 7, 1)
  68. user = get_user_model().objects.first()
  69. tops = live_charts(user, chart_period="year")
  70. assert tops[0].title == "Same in the End"
  71. @pytest.mark.django_db
  72. @time_machine.travel(datetime(2022, 3, 4, 1, 24))
  73. def test_top_artists_by_week(client, mopidy_track_request_data):
  74. build_scrobbles(client, mopidy_track_request_data, 7, 1)
  75. user = get_user_model().objects.first()
  76. tops = live_charts(user, chart_period="week", media_type="Artist")
  77. assert tops[0].name == "Sublime"
  78. @pytest.mark.django_db
  79. def test_top__artists_by_month(client, mopidy_track_request_data):
  80. build_scrobbles(client, mopidy_track_request_data, 7, 1)
  81. user = get_user_model().objects.first()
  82. tops = live_charts(user, chart_period="month", media_type="Artist")
  83. assert tops[0].name == "Sublime"
  84. @pytest.mark.django_db
  85. def test_top__artists_by_year(client, mopidy_track_request_data):
  86. build_scrobbles(client, mopidy_track_request_data, 7, 1)
  87. user = get_user_model().objects.first()
  88. tops = live_charts(user, chart_period="year", media_type="Artist")
  89. assert tops[0].name == "Sublime"