2021-09-21 21:42:57 +02:00
|
|
|
from datetime import datetime, timedelta, timezone
|
2021-06-03 15:20:39 +02:00
|
|
|
|
2020-01-30 14:47:36 +01:00
|
|
|
from django.conf import settings
|
2021-08-10 16:30:02 +02:00
|
|
|
from django.utils import dateparse
|
2021-06-03 15:20:39 +02:00
|
|
|
from model_bakery import baker
|
2022-04-04 14:38:50 +02:00
|
|
|
from rest_framework.test import APITestCase
|
2020-01-30 14:47:36 +01:00
|
|
|
|
2022-04-18 20:34:38 +02:00
|
|
|
from ...._fixtures import AUDIO_FILENAME
|
2021-08-10 16:30:02 +02:00
|
|
|
|
|
|
|
|
|
|
|
class TestScheduleViewSet(APITestCase):
|
|
|
|
@classmethod
|
|
|
|
def setUpTestData(cls):
|
2022-07-22 17:34:09 +02:00
|
|
|
cls.path = "/api/v2/schedule"
|
2022-03-01 13:22:24 +01:00
|
|
|
cls.token = settings.CONFIG.general.api_key
|
2021-08-10 16:30:02 +02:00
|
|
|
|
|
|
|
def test_schedule_item_full_length(self):
|
2022-04-01 17:29:11 +02:00
|
|
|
file = baker.make(
|
2022-04-04 14:38:50 +02:00
|
|
|
"storage.File",
|
2021-08-10 16:30:02 +02:00
|
|
|
mime="audio/mp3",
|
2022-04-04 14:38:50 +02:00
|
|
|
filepath=AUDIO_FILENAME,
|
2021-08-10 16:30:02 +02:00
|
|
|
length=timedelta(seconds=40.86),
|
2022-06-28 10:21:36 +02:00
|
|
|
cue_in=timedelta(seconds=0),
|
|
|
|
cue_out=timedelta(seconds=40.8131),
|
2021-08-10 16:30:02 +02:00
|
|
|
)
|
|
|
|
show = baker.make(
|
2022-04-04 14:38:50 +02:00
|
|
|
"schedule.ShowInstance",
|
2022-07-17 22:27:57 +02:00
|
|
|
starts_at=datetime.now(tz=timezone.utc) - timedelta(minutes=5),
|
|
|
|
ends_at=datetime.now(tz=timezone.utc) + timedelta(minutes=5),
|
2021-08-10 16:30:02 +02:00
|
|
|
)
|
2022-04-01 17:29:11 +02:00
|
|
|
schedule_item = baker.make(
|
2022-04-04 14:38:50 +02:00
|
|
|
"schedule.Schedule",
|
2022-07-17 22:27:57 +02:00
|
|
|
starts_at=datetime.now(tz=timezone.utc),
|
|
|
|
ends_at=datetime.now(tz=timezone.utc) + file.length,
|
2022-06-28 10:21:36 +02:00
|
|
|
cue_out=file.cue_out,
|
2021-08-10 16:30:02 +02:00
|
|
|
instance=show,
|
2022-04-01 17:29:11 +02:00
|
|
|
file=file,
|
2021-08-10 16:30:02 +02:00
|
|
|
)
|
2022-01-25 23:45:00 +01:00
|
|
|
self.client.credentials(HTTP_AUTHORIZATION=f"Api-Key {self.token}")
|
2021-08-10 16:30:02 +02:00
|
|
|
response = self.client.get(self.path)
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
result = response.json()
|
2022-04-01 17:29:11 +02:00
|
|
|
self.assertEqual(
|
2022-07-17 22:27:57 +02:00
|
|
|
dateparse.parse_datetime(result[0]["ends_at"]), schedule_item.ends_at
|
2022-04-01 17:29:11 +02:00
|
|
|
)
|
2022-06-28 10:21:36 +02:00
|
|
|
self.assertEqual(dateparse.parse_duration(result[0]["cue_out"]), file.cue_out)
|
2021-08-10 16:30:02 +02:00
|
|
|
|
|
|
|
def test_schedule_item_trunc(self):
|
2022-04-01 17:29:11 +02:00
|
|
|
file = baker.make(
|
2022-04-04 14:38:50 +02:00
|
|
|
"storage.File",
|
2021-08-10 16:30:02 +02:00
|
|
|
mime="audio/mp3",
|
2022-04-04 14:38:50 +02:00
|
|
|
filepath=AUDIO_FILENAME,
|
2021-08-10 16:30:02 +02:00
|
|
|
length=timedelta(seconds=40.86),
|
2022-06-28 10:21:36 +02:00
|
|
|
cue_in=timedelta(seconds=0),
|
|
|
|
cue_out=timedelta(seconds=40.8131),
|
2021-08-10 16:30:02 +02:00
|
|
|
)
|
|
|
|
show = baker.make(
|
2022-04-04 14:38:50 +02:00
|
|
|
"schedule.ShowInstance",
|
2022-07-17 22:27:57 +02:00
|
|
|
starts_at=datetime.now(tz=timezone.utc) - timedelta(minutes=5),
|
|
|
|
ends_at=datetime.now(tz=timezone.utc) + timedelta(seconds=20),
|
2021-08-10 16:30:02 +02:00
|
|
|
)
|
2022-04-01 17:29:11 +02:00
|
|
|
schedule_item = baker.make(
|
2022-04-04 14:38:50 +02:00
|
|
|
"schedule.Schedule",
|
2022-07-17 22:27:57 +02:00
|
|
|
starts_at=datetime.now(tz=timezone.utc),
|
|
|
|
ends_at=datetime.now(tz=timezone.utc) + file.length,
|
2021-08-10 16:30:02 +02:00
|
|
|
instance=show,
|
2022-04-01 17:29:11 +02:00
|
|
|
file=file,
|
2021-08-10 16:30:02 +02:00
|
|
|
)
|
2022-01-25 23:45:00 +01:00
|
|
|
self.client.credentials(HTTP_AUTHORIZATION=f"Api-Key {self.token}")
|
2021-08-10 16:30:02 +02:00
|
|
|
response = self.client.get(self.path)
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
result = response.json()
|
2022-07-17 22:27:57 +02:00
|
|
|
self.assertEqual(dateparse.parse_datetime(result[0]["ends_at"]), show.ends_at)
|
|
|
|
expected = show.ends_at - schedule_item.starts_at
|
2021-08-10 16:30:02 +02:00
|
|
|
self.assertEqual(dateparse.parse_duration(result[0]["cue_out"]), expected)
|
|
|
|
self.assertNotEqual(
|
2022-07-17 22:27:57 +02:00
|
|
|
dateparse.parse_datetime(result[0]["ends_at"]), schedule_item.ends_at
|
2021-08-10 16:30:02 +02:00
|
|
|
)
|
2021-09-21 21:42:57 +02:00
|
|
|
|
|
|
|
def test_schedule_item_invalid(self):
|
2022-04-01 17:29:11 +02:00
|
|
|
file = baker.make(
|
2022-04-04 14:38:50 +02:00
|
|
|
"storage.File",
|
2021-09-21 21:42:57 +02:00
|
|
|
mime="audio/mp3",
|
2022-04-04 14:38:50 +02:00
|
|
|
filepath=AUDIO_FILENAME,
|
2021-09-21 21:42:57 +02:00
|
|
|
length=timedelta(seconds=40.86),
|
2022-06-28 10:21:36 +02:00
|
|
|
cue_in=timedelta(seconds=0),
|
|
|
|
cue_out=timedelta(seconds=40.8131),
|
2021-09-21 21:42:57 +02:00
|
|
|
)
|
|
|
|
show = baker.make(
|
2022-04-04 14:38:50 +02:00
|
|
|
"schedule.ShowInstance",
|
2022-07-17 22:27:57 +02:00
|
|
|
starts_at=datetime.now(tz=timezone.utc) - timedelta(minutes=5),
|
|
|
|
ends_at=datetime.now(tz=timezone.utc) + timedelta(minutes=5),
|
2021-09-21 21:42:57 +02:00
|
|
|
)
|
2022-04-04 14:38:50 +02:00
|
|
|
schedule_item = baker.make(
|
|
|
|
"schedule.Schedule",
|
2022-07-17 22:27:57 +02:00
|
|
|
starts_at=datetime.now(tz=timezone.utc),
|
|
|
|
ends_at=datetime.now(tz=timezone.utc) + file.length,
|
2022-06-28 10:21:36 +02:00
|
|
|
cue_out=file.cue_out,
|
2021-09-21 21:42:57 +02:00
|
|
|
instance=show,
|
2022-04-01 17:29:11 +02:00
|
|
|
file=file,
|
2021-09-21 21:42:57 +02:00
|
|
|
)
|
2022-06-22 13:27:10 +02:00
|
|
|
invalid_schedule_item = baker.make( # pylint: disable=unused-variable
|
2022-04-04 14:38:50 +02:00
|
|
|
"schedule.Schedule",
|
2022-07-17 22:27:57 +02:00
|
|
|
starts_at=show.ends_at + timedelta(minutes=1),
|
|
|
|
ends_at=show.ends_at + timedelta(minutes=1) + file.length,
|
2022-06-28 10:21:36 +02:00
|
|
|
cue_out=file.cue_out,
|
2021-09-21 21:42:57 +02:00
|
|
|
instance=show,
|
2022-04-01 17:29:11 +02:00
|
|
|
file=file,
|
2021-09-21 21:42:57 +02:00
|
|
|
)
|
2022-01-25 23:45:00 +01:00
|
|
|
self.client.credentials(HTTP_AUTHORIZATION=f"Api-Key {self.token}")
|
2022-07-17 22:27:57 +02:00
|
|
|
response = self.client.get(self.path, {"overbooked": False})
|
2021-09-21 21:42:57 +02:00
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
result = response.json()
|
|
|
|
# The invalid item should be filtered out and not returned
|
|
|
|
self.assertEqual(len(result), 1)
|
2022-04-04 14:38:50 +02:00
|
|
|
self.assertEqual(
|
2022-07-17 22:27:57 +02:00
|
|
|
dateparse.parse_datetime(result[0]["ends_at"]), schedule_item.ends_at
|
2022-04-04 14:38:50 +02:00
|
|
|
)
|
2022-06-28 10:21:36 +02:00
|
|
|
self.assertEqual(dateparse.parse_duration(result[0]["cue_out"]), file.cue_out)
|
2021-10-16 20:34:03 +02:00
|
|
|
|
|
|
|
def test_schedule_item_range(self):
|
2022-04-01 17:29:11 +02:00
|
|
|
file = baker.make(
|
2022-04-04 14:38:50 +02:00
|
|
|
"storage.File",
|
2021-10-16 20:34:03 +02:00
|
|
|
mime="audio/mp3",
|
2022-04-04 14:38:50 +02:00
|
|
|
filepath=AUDIO_FILENAME,
|
2021-10-16 20:34:03 +02:00
|
|
|
length=timedelta(seconds=40.86),
|
2022-06-28 10:21:36 +02:00
|
|
|
cue_in=timedelta(seconds=0),
|
|
|
|
cue_out=timedelta(seconds=40.8131),
|
2021-10-16 20:34:03 +02:00
|
|
|
)
|
|
|
|
filter_point = datetime.now(tz=timezone.utc)
|
|
|
|
|
|
|
|
show = baker.make(
|
2022-04-04 14:38:50 +02:00
|
|
|
"schedule.ShowInstance",
|
2022-07-17 22:27:57 +02:00
|
|
|
starts_at=filter_point - timedelta(minutes=5),
|
|
|
|
ends_at=filter_point + timedelta(minutes=5),
|
2021-10-16 20:34:03 +02:00
|
|
|
)
|
|
|
|
schedule_item = baker.make(
|
2022-04-04 14:38:50 +02:00
|
|
|
"schedule.Schedule",
|
2022-07-17 22:27:57 +02:00
|
|
|
starts_at=filter_point,
|
|
|
|
ends_at=filter_point + file.length,
|
2022-06-28 10:21:36 +02:00
|
|
|
cue_out=file.cue_out,
|
2021-10-16 20:34:03 +02:00
|
|
|
instance=show,
|
2022-04-01 17:29:11 +02:00
|
|
|
file=file,
|
2021-10-16 20:34:03 +02:00
|
|
|
)
|
2022-06-22 13:27:10 +02:00
|
|
|
previous_item = baker.make( # pylint: disable=unused-variable
|
2022-04-04 14:38:50 +02:00
|
|
|
"schedule.Schedule",
|
2022-07-17 22:27:57 +02:00
|
|
|
starts_at=filter_point - timedelta(minutes=5),
|
|
|
|
ends_at=filter_point - timedelta(minutes=5) + file.length,
|
2022-06-28 10:21:36 +02:00
|
|
|
cue_out=file.cue_out,
|
2021-10-16 20:34:03 +02:00
|
|
|
instance=show,
|
2022-04-01 17:29:11 +02:00
|
|
|
file=file,
|
2021-10-16 20:34:03 +02:00
|
|
|
)
|
2022-01-25 23:45:00 +01:00
|
|
|
self.client.credentials(HTTP_AUTHORIZATION=f"Api-Key {self.token}")
|
2021-10-16 20:34:03 +02:00
|
|
|
range_start = (filter_point - timedelta(minutes=1)).isoformat(
|
|
|
|
timespec="seconds"
|
|
|
|
)
|
|
|
|
range_end = (filter_point + timedelta(minutes=1)).isoformat(timespec="seconds")
|
|
|
|
response = self.client.get(
|
2022-07-17 22:27:57 +02:00
|
|
|
self.path,
|
|
|
|
{"starts_after": range_start, "starts_before": range_end},
|
2021-10-16 20:34:03 +02:00
|
|
|
)
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
result = response.json()
|
|
|
|
# The previous_item should be filtered out and not returned
|
|
|
|
self.assertEqual(len(result), 1)
|
|
|
|
self.assertEqual(
|
2022-07-17 22:27:57 +02:00
|
|
|
dateparse.parse_datetime(result[0]["starts_at"]), schedule_item.starts_at
|
2021-10-16 20:34:03 +02:00
|
|
|
)
|