def test_get_with_serve_action(self): signature = generate_signature(self.image.id, 'fill-800x600') response = self.client.get(reverse('wagtailimages_serve_action_serve', args=(signature, self.image.id, 'fill-800x600'))) self.assertEqual(response.status_code, 200) self.assertTrue(response.streaming) self.assertEqual(response['Content-Type'], 'image/png')
def test_sendfile_nobackend(self): signature = generate_signature(self.image.id, 'fill-800x600') response = self.client.get(reverse('wagtailimages_sendfile', args=(signature, self.image.id, 'fill-800x600'))) self.assertEqual(response.status_code, 200) self.assertEqual(response['Content-Type'], 'image/png')
def test_sendfile_dummy_backend(self): signature = generate_signature(self.image.id, 'fill-800x600') response = self.client.get(reverse('wagtailimages_sendfile_dummy', args=(signature, self.image.id, 'fill-800x600'))) self.assertEqual(response.status_code, 200) self.assertTrue(response.content, 'Dummy backend response')
def generate_image_url(image, filter_spec, viewname="wagtailimages_serve", key=None): signature = generate_signature(image.id, filter_spec, key) url = reverse(viewname, args=(signature, image.id, filter_spec)) url += image.file.name[len("original_images/"):] return url
def test_get_with_redirect_action(self): signature = generate_signature(self.image.id, 'fill-800x600') response = self.client.get(reverse('wagtailimages_serve_action_redirect', args=(signature, self.image.id, 'fill-800x600'))) expected_redirect_url = '/media/images/{filename[0]}.2e16d0ba.fill-800x600{filename[1]}'.format( filename=os.path.splitext(os.path.basename(self.image.file.path)) ) self.assertRedirects(response, expected_redirect_url, status_code=301, fetch_redirect_response=False)
def test_sendfile_nobackend(self): signature = generate_signature(self.image.id, "fill-800x600") response = self.client.get( reverse( "wagtailimages_sendfile", args=(signature, self.image.id, "fill-800x600"), )) self.assertEqual(response.status_code, 200) self.assertEqual(response["Content-Type"], "image/png")
def test_get_with_serve_action(self): signature = generate_signature(self.image.id, "fill-800x600") response = self.client.get( reverse( "wagtailimages_serve_action_serve", args=(signature, self.image.id, "fill-800x600"), )) self.assertEqual(response.status_code, 200) self.assertTrue(response.streaming) self.assertEqual(response["Content-Type"], "image/png")
def test_get_with_custom_key(self): """ Test that that the key can be changed on the view """ # Generate signature signature = generate_signature(self.image.id, 'fill-800x600', key='custom') # Get the image response = self.client.get(reverse('wagtailimages_serve_custom_key', args=(signature, self.image.id, 'fill-800x600')) + 'test.png') # Check response self.assertEqual(response.status_code, 200)
def test_get_with_too_many_extra_components(self): """ A filename can be appended to the end of the URL, but it must not contain a '/' """ # Generate signature signature = generate_signature(self.image.id, 'fill-800x600') # Get the image response = self.client.get(reverse('wagtailimages_serve', args=(signature, self.image.id, 'fill-800x600')) + 'test/test.png') # URL pattern should not match self.assertEqual(response.status_code, 404)
def test_get_invalid_signature(self): """ Test that an invalid signature returns a 403 response """ # Generate a signature for the incorrect image id signature = generate_signature(self.image.id + 1, 'fill-800x600') # Get the image response = self.client.get(reverse('wagtailimages_serve', args=(signature, self.image.id, 'fill-800x600'))) # Check response self.assertEqual(response.status_code, 403)
def test_get_with_extra_component(self): """ Test that a filename can be optionally added to the end of the URL. """ # Generate signature signature = generate_signature(self.image.id, 'fill-800x600') # Get the image response = self.client.get(reverse('wagtailimages_serve', args=(signature, self.image.id, 'fill-800x600')) + 'test.png') # Check response self.assertEqual(response.status_code, 200) self.assertTrue(response.streaming) self.assertEqual(response['Content-Type'], 'image/png')
def test_get(self): """ Test a valid GET request to the view """ # Generate signature signature = generate_signature(self.image.id, 'fill-800x600') # Get the image response = self.client.get(reverse('wagtailimages_serve', args=(signature, self.image.id, 'fill-800x600'))) # Check response self.assertEqual(response.status_code, 200) self.assertTrue(response.streaming) self.assertEqual(response['Content-Type'], 'image/png')
def test_get_with_custom_key_using_default_key(self): """ Test that that the key can be changed on the view This tests that the default key no longer works when the key is changed on the view """ # Generate signature signature = generate_signature(self.image.id, 'fill-800x600') # Get the image response = self.client.get(reverse('wagtailimages_serve_custom_key', args=(signature, self.image.id, 'fill-800x600')) + 'test.png') # Check response self.assertEqual(response.status_code, 403)
def test_get_missing_source_image_file(self): """ Test that a missing image file gives a 410 response When the source image file is missing, it is presumed deleted so we return a 410 "Gone" response. """ # Delete the image file os.remove(self.image.file.path) # Get the image signature = generate_signature(self.image.id, 'fill-800x600') response = self.client.get(reverse('wagtailimages_serve', args=(signature, self.image.id, 'fill-800x600'))) # Check response self.assertEqual(response.status_code, 410)
def test_get_invalid_filter_spec(self): """ Test that an invalid filter spec returns a 400 response This is very unlikely to happen in reality. A user would have to create signature for the invalid filter spec which can't be done with Wagtails built in URL generator. We should test it anyway though. """ # Generate a signature with the invalid filterspec signature = generate_signature(self.image.id, 'bad-filter-spec') # Get the image response = self.client.get(reverse('wagtailimages_serve', args=(signature, self.image.id, 'bad-filter-spec'))) # Check response self.assertEqual(response.status_code, 400)
def generate_url(request, image_id, filter_spec): # Get the image Image = get_image_model() try: image = Image.objects.get(id=image_id) except Image.DoesNotExist: return JsonResponse({"error": "Cannot find image."}, status=404) # Check if this user has edit permission on this image if not permission_policy.user_has_permission_for_instance( request.user, "change", image): return JsonResponse( { "error": "You do not have permission to generate a URL for this image." }, status=403, ) # Parse the filter spec to make sure its valid try: Filter(spec=filter_spec).operations except InvalidFilterSpecError: return JsonResponse({"error": "Invalid filter spec."}, status=400) # Generate url signature = generate_signature(image_id, filter_spec) url = reverse("wagtailimages_serve", args=(signature, image_id, filter_spec)) # Get site root url try: site_root_url = Site.objects.get(is_default_site=True).root_url except Site.DoesNotExist: site_root_url = Site.objects.first().root_url # Generate preview url preview_url = reverse("wagtailimages:preview", args=(image_id, filter_spec)) return JsonResponse( { "url": site_root_url + url, "preview_url": preview_url }, status=200)
def test_image_version_url(settings, full_url): """image_version_url should produce an image URL with the file hash set as the file version in the querystring""" settings.SITE_BASE_URL = BASE_URL view_name = "wagtailimages_serve" image_id = 1 file_hash = "abcdefg" image_filter = "fill-75x75" image = ImageFactory.build(id=image_id, file_hash=file_hash) expected_signature = generate_signature(image_id, image_filter, key=None) result_url = image_version_url( image, image_filter, full_url=full_url, viewname=view_name ) relative_url = ( f"/images/{expected_signature}/{image_id}/{image_filter}/?v={file_hash}" ) expected_result_url = ( relative_url if full_url is False else urljoin(BASE_URL, relative_url) ) assert result_url == expected_result_url
def test_signature_generation(self): self.assertEqual(generate_signature(100, "fill-800x600"), "xnZOzQyUg6pkfciqcfRJRosOrGg=")