from unittest.mock import patch import os from django.conf import settings from django.core.cache import cache from django.core.files.uploadedfile import SimpleUploadedFile from django.test import TestCase, override_settings from django.urls import reverse from sorl.thumbnail import get_thumbnail from parameterized import parameterized from core_images.services.internal_data.service import InternalDataService from core_images.models import LabelImage from core_images.headers import CacheHeaderValues, CACHE_HEADER from core_images.consts import ( SMALL_RESOLUTION, MEDIUM_RESOLUTION, LARGE_RESOLUTION, ) TEST_IMAGE_PATH = os.path.join( settings.BASE_DIR, "tests", "fixtures", "test_image.png" ) @override_settings(DJANGO_REDIS_IS_ASYNC=False) class LabelByLabelId(TestCase): def setUp(self): cache.clear() @parameterized.expand( [ SMALL_RESOLUTION, MEDIUM_RESOLUTION, LARGE_RESOLUTION, ] ) def test_image_redirect(self, resolution): with open(TEST_IMAGE_PATH, "rb") as test_file: test_image = SimpleUploadedFile( name="test_image.jpg", content=test_file.read(), content_type="image/png", ) label_image = LabelImage.objects.create( label_id="test_id", image=test_image ) thumbnail = get_thumbnail( label_image.image, InternalDataService.RESOLUTION_MAPPING.get(resolution), upscale=False, crop=False, ) path = reverse("label_by_label_id", args=["test_id"]) response = self.client.get( path, {"resolution": resolution}, HTTP_ACCEPT="image/*" ) image_url = thumbnail.url self.assertEqual(response.status_code, 302) self.assertEqual(response["Location"], image_url) self.assertEqual(response[CACHE_HEADER], CacheHeaderValues.MISS.value) def test_no_image(self): LabelImage.objects.create( label_id="test_id", image="test_image_location" ) path = reverse("label_by_label_id", args=["wrong_id"]) response = self.client.get(path, {}, HTTP_ACCEPT="image/*") self.assertEqual(response.status_code, 404) @parameterized.expand( [ SMALL_RESOLUTION, MEDIUM_RESOLUTION, LARGE_RESOLUTION, ] ) def test_cached_image(self, resolution): with open(TEST_IMAGE_PATH, "rb") as test_file: test_image = SimpleUploadedFile( name="test_image.jpg", content=test_file.read(), content_type="image/png", ) label_image = LabelImage.objects.create( label_id="test_id", image=test_image ) thumbnail = get_thumbnail( label_image.image, InternalDataService.RESOLUTION_MAPPING.get(resolution), upscale=False, crop=False, ) path = reverse("label_by_label_id", args=["test_id"]) response = self.client.get( path, {"resolution": resolution}, HTTP_ACCEPT="image/*" ) image_url = thumbnail.url self.assertEqual(response.status_code, 302) self.assertEqual(response["Location"], image_url) self.assertEqual(response["X-Images-Cache"], "MISS") with patch( "core_images.services.internal_data.service.InternalDataService.cache_set" # noqa ) as mocked_cache_set: response = self.client.get( path, {"resolution": resolution}, HTTP_ACCEPT="image/*" ) self.assertFalse(mocked_cache_set.called) self.assertEqual(response.status_code, 302) self.assertEqual(response["Location"], image_url) self.assertEqual(response[CACHE_HEADER], CacheHeaderValues.HIT.value)