def test_get(self): """ This tests that the view responds correctly for a user with edit permissions on this image """ # Get response = self.client.get( reverse('tuiuiuimages:generate_url', args=(self.image.id, 'fill-800x600'))) # Check response self.assertEqual(response.status_code, 200) self.assertEqual(response['Content-Type'], 'application/json') # Check JSON content_json = json.loads(response.content.decode()) self.assertEqual(set(content_json.keys()), set(['url', 'preview_url'])) expected_url = 'http://localhost/images/%(signature)s/%(image_id)d/fill-800x600/' % { 'signature': urlquote(generate_signature(self.image.id, 'fill-800x600').decode(), safe=urlquote_safechars), 'image_id': self.image.id, } self.assertEqual(content_json['url'], expected_url) expected_preview_url = reverse('tuiuiuimages:preview', args=(self.image.id, 'fill-800x600')) self.assertEqual(content_json['preview_url'], expected_preview_url)
def test_sendfile_dummy_backend(self): signature = generate_signature(self.image.id, 'fill-800x600') response = self.client.get( reverse('tuiuiuimages_sendfile_dummy', args=(signature, self.image.id, 'fill-800x600'))) self.assertEqual(response.status_code, 200) self.assertTrue(response.content, 'Dummy backend response')
def test_sendfile_nobackend(self): signature = generate_signature(self.image.id, 'fill-800x600') response = self.client.get( reverse('tuiuiuimages_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('tuiuiuimages_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_redirect_action(self): signature = generate_signature(self.image.id, 'fill-800x600') response = self.client.get( reverse('tuiuiuimages_serve_action_redirect', args=(signature, self.image.id, 'fill-800x600'))) expected_redirect_url = 'http://testserver/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_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('tuiuiuimages_serve', args=(signature, self.image.id, 'fill-800x600'))) # Check response self.assertEqual(response.status_code, 403)
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('tuiuiuimages_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(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('tuiuiuimages_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('tuiuiuimages_serve_custom_key', args=(signature, self.image.id, 'fill-800x600')) + 'test.png') # Check response self.assertEqual(response.status_code, 403)
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('tuiuiuimages_serve_custom_key', args=(signature, self.image.id, 'fill-800x600')) + 'test.png') # Check response self.assertEqual(response.status_code, 200)
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('tuiuiuimages_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_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('tuiuiuimages_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 Tuiuius 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('tuiuiuimages_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('tuiuiuimages_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('tuiuiuimages:preview', args=(image_id, filter_spec)) return JsonResponse( { 'url': site_root_url + url, 'preview_url': preview_url }, status=200)
def test_signature_generation(self): self.assertEqual(generate_signature(100, 'fill-800x600'), b'xnZOzQyUg6pkfciqcfRJRosOrGg=')