from datetime import timedelta from tempfile import TemporaryDirectory from django.core.files.uploadedfile import SimpleUploadedFile from django.test import override_settings from django.urls import reverse from django.utils import timezone from rest_framework import status from rest_framework.test import APITestCase from shows.models import Performance, Show, Venue SMALL_GIF = ( b"GIF89a\x01\x00\x01\x00\x80\x00\x00" b"\x00\x00\x00\xff\xff\xff!\xf9\x04\x01" b"\x00\x00\x00\x00,\x00\x00\x00\x00\x01" b"\x00\x01\x00\x00\x02\x02D\x01\x00;" ) class ShowApiTests(APITestCase): def setUp(self): self.temp_media = TemporaryDirectory() self.addCleanup(self.temp_media.cleanup) self.settings_override = override_settings(MEDIA_ROOT=self.temp_media.name) self.settings_override.enable() self.addCleanup(self.settings_override.disable) self.show = Show.objects.create( title="Open Stage", slug="open-stage-media", summary="A contemporary theatre performance.", description="Full public show description.", poster_image="https://cdn.example.com/open-stage-poster.jpg", is_published=True, ) self.external_only_show = Show.objects.create( title="External Poster Stage", slug="external-poster-stage", summary="External image only.", description="External image only.", poster_image="https://cdn.example.com/external-only.jpg", is_published=True, ) self.venue = Venue.objects.create( name="AzioneLab Theatre", slug="azionelab-theatre-show-api", address="Via Example 1", city="Rome", ) self.performance = Performance.objects.create( show=self.show, venue=self.venue, starts_at=timezone.now() + timedelta(days=7), room_capacity=20, ) def test_show_list_prefers_uploaded_image_url_when_present(self): self.show.uploaded_image.save( "open-stage.gif", SimpleUploadedFile("open-stage.gif", SMALL_GIF, content_type="image/gif"), save=True, ) response = self.client.get(reverse("api-show-list")) self.assertEqual(response.status_code, status.HTTP_200_OK) list_item = next(item for item in response.data["results"] if item["slug"] == self.show.slug) self.assertTrue(list_item["image_url"].endswith("/media/shows/open-stage.gif")) self.assertEqual(list_item["poster_image"], "https://cdn.example.com/open-stage-poster.jpg") def test_show_detail_falls_back_to_existing_external_image_url(self): response = self.client.get(reverse("api-show-detail", kwargs={"slug": self.external_only_show.slug})) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data["image_url"], "https://cdn.example.com/external-only.jpg")