from unittest.mock import call
from unittest.mock import patch
import pytest
from django.core.exceptions import ImproperlyConfigured
from django.test import RequestFactory
from django.test import TestCase
from django_renderpdf.views import PDFView
from testapp import views
factory = RequestFactory()
class PromptDownloadTestCase(TestCase):
def test_prompt_download(self):
request = factory.get("/some_view")
response = views.PromptDownloadView.as_view()(request)
self.assertEqual(response.status_code, 200)
self.assertIn(
b"Content-Type: application/pdf", response.serialize_headers().splitlines()
)
self.assertIn(
b'Content-Disposition: attachment; filename="myfile.pdf"',
response.serialize_headers().splitlines(),
)
# Assert that response looks like a PDF
self.assertTrue(response.content.startswith(b"%PDF-1."))
def test_dont_prompt_download(self):
request = factory.get("/some_view")
response = views.NoPromptDownloadView.as_view()(request)
self.assertEqual(response.status_code, 200)
self.assertIn(
b"Content-Type: application/pdf", response.serialize_headers().splitlines()
)
self.assertNotIn(b"Content-Disposition:", response.serialize_headers())
# Assert that response looks like a PDF
self.assertTrue(response.content.startswith(b"%PDF-1."))
class ForceHTMLTestCase(TestCase):
def test_force_html_allowed(self):
request = factory.get("/some_view?html=true")
response = views.AllowForceHtmlView.as_view()(request)
self.assertEqual(response.status_code, 200)
self.assertEqual(b"Hi!\n", response.content)
self.assertIn(
b"Content-Type: text/html; charset=utf-8",
response.serialize_headers().splitlines(),
)
def test_no_force_html_allowed(self):
request = factory.get("/some_view")
response = views.AllowForceHtmlView.as_view()(request)
self.assertEqual(response.status_code, 200)
self.assertIn(
b"Content-Type: application/pdf", response.serialize_headers().splitlines()
)
# Assert that response looks like a PDF
self.assertTrue(response.content.startswith(b"%PDF-1."))
def test_force_html_disallowed(self):
request = factory.get("/some_view?html=true")
response = views.DisallowForceHtmlView.as_view()(request)
self.assertEqual(response.status_code, 200)
self.assertIn(
b"Content-Type: application/pdf", response.serialize_headers().splitlines()
)
# Assert that response looks like a PDF
self.assertTrue(response.content.startswith(b"%PDF-1."))
def test_no_force_html_disallowed(self):
request = factory.get("/some_view")
response = views.DisallowForceHtmlView.as_view()(request)
self.assertEqual(response.status_code, 200)
self.assertIn(
b"Content-Type: application/pdf", response.serialize_headers().splitlines()
)
# Assert that response looks like a PDF
self.assertTrue(response.content.startswith(b"%PDF-1."))
class CustomUrlFetcherTestCase(TestCase):
pass # TODO
class StaticFileResolutionTestCase(TestCase):
def test_url_fetcher_used(self):
request = factory.get("/some_view")
with patch(
"django_renderpdf.helpers.django_url_fetcher",
return_value={
"string": "html { margin: 0; }",
"mime_type": "text/css",
},
spec=True,
) as fetcher:
response = views.TemplateWithStaticFileView.as_view()(request)
self.assertEqual(response.status_code, 200)
self.assertEqual(fetcher.call_count, 1)
self.assertEqual(
fetcher.call_args,
call("/static/path/not/relevant.css"),
)
def test_view_with_no_template(rf):
request = factory.get("/test")
with pytest.raises(
ImproperlyConfigured,
match=r"requires either a definition of.*template_name.*get_template_names",
):
views.NoTemplateDefinedView.as_view()(request)
def test_view_with_missing_download_name(rf):
request = factory.get("/test")
with pytest.raises(
ImproperlyConfigured,
match=r"requires.*download_name",
):
views.PromptWithMissingDownloadNameView.as_view()(request)
def test_view_with_multiple_template_names(rf):
class TestView(PDFView):
def get_template_names(self):
return [
"test_template.html",
"test_template.html",
]
request = factory.get("/test")
response = TestView.as_view()(request)
assert response.status_code == 200
from __future__ import absolute_import
from six.moves import reload_module
from django.conf import settings
from django.http import HttpResponseNotFound
from django.test import TestCase
from django.test.client import RequestFactory
from django.contrib.sites.shortcuts import get_current_site
from django.urls import clear_url_caches
from robustredirects.middleware import RedirectMiddleware
from robustredirects.models import Redirect
class TestRedirectMiddleWare(TestCase):
def setUp(self):
super(TestRedirectMiddleWare, self).setUp()
# Every test needs access to the request factory.
self.factory = RequestFactory()
# tests should start with an empty url cache
clear_url_caches()
settings.ROBUST_REDIRECTS_IGNORED_URL_PATHS = None
@staticmethod
def run_redirect(request):
from robustredirects import dynamic_urls
reload_module(dynamic_urls)
middleware = RedirectMiddleware()
response = HttpResponseNotFound()
new_response = middleware.process_response(request, response)
return new_response
def test_redirect_request_permanent(self):
# Create a redirect
request = self.factory.get('/test/123/')
redirect = Redirect(from_url=r'test/(?P<pk>\d+)/', to_url=r'somethingelse/(?P<pk>\d+)/',
site=get_current_site(request), uses_regex=True)
redirect.save()
new_response = self.run_redirect(request)
self.assertEqual(new_response.status_code, 301)
self.assertIn(b"somethingelse", new_response.serialize_headers())
def test_redirect_request_gone(self):
# Create a redirect
request = self.factory.get('/test/123/')
redirect = Redirect(from_url=r'test/(?P<pk>\d+)/', to_url='',
site=get_current_site(request), uses_regex=True)
redirect.save()
new_response = self.run_redirect(request)
self.assertEqual(new_response.status_code, 410)
def test_redirect_request_temporary(self):
# Create a redirect
request = self.factory.get('/test/123/')
redirect = Redirect(from_url=r'test/(?P<pk>\d+)/', to_url=r'somethingelse/(?P<pk>\d+)/',
site=get_current_site(request), http_status=302, uses_regex=True)
redirect.save()
new_response = self.run_redirect(request)
self.assertEqual(new_response.status_code, 302)
self.assertIn(b"somethingelse", new_response.serialize_headers())
def test_redirect_request_partial_temporary(self):
# Create a redirect
request = self.factory.get('/test/123/')
redirect = Redirect(from_url='/test/', to_url='/partialtest/', is_partial=True,
site=get_current_site(request), http_status=302)
redirect.save()
new_response = self.run_redirect(request)
self.assertEqual(new_response.status_code, 302)
self.assertIn(b"partialtest", new_response.serialize_headers())
def test_redirect_request_partial_permanent(self):
# Create a redirect
request = self.factory.get('/test/123/')
redirect = Redirect(from_url='/test/', to_url='/partialtest/', is_partial=True,
site=get_current_site(request), http_status=301)
redirect.save()
new_response = self.run_redirect(request)
self.assertEqual(new_response.status_code, 301)
self.assertIn(b"partialtest", new_response.serialize_headers())
def test_redirect_request_two_partial_entries_permanent(self):
# Create a redirect
old_route = '/invalidroot/partialtest'
redirected_route = '/test/partialtest'
request = self.factory.get(old_route)
redirect = Redirect(from_url='/invalidroot', to_url=redirected_route, is_partial=True,
site=get_current_site(request), http_status=301)
redirect.save()
redirect2 = Redirect(from_url=old_route, to_url=redirected_route, is_partial=True,
site=get_current_site(request), http_status=301)
redirect2.save()
new_response = self.run_redirect(request)
self.assertEqual(new_response.status_code, 301)
self.assertEqual(new_response.url, redirected_route)
def test_redirect_request_partial_gone(self):
# Create a redirect
request = self.factory.get('/test/123/')
redirect = Redirect(from_url='/test/', to_url='', is_partial=True,
site=get_current_site(request), http_status=301)
redirect.save()
new_response = self.run_redirect(request)
self.assertEqual(new_response.status_code, 410)
def test_redirect_request_partial_prepend_slash(self):
# Create a redirect
request = self.factory.get('/test/123/')
redirect = Redirect(from_url='/test/', to_url='partialtest/', is_partial=True,
site=get_current_site(request), http_status=302)
redirect.save()
new_response = self.run_redirect(request)
self.assertEqual(new_response.status_code, 302)
self.assertIn(b"/partialtest/123/", new_response.serialize_headers())
def test_redirect_exclusion(self):
# Create a redirect
request = self.factory.get('/api/test/123/')
settings.ROBUST_REDIRECTS_IGNORED_PREFIXES = '/api'
redirect = Redirect(from_url='/test/', to_url='partialtest/', is_partial=True,
site=get_current_site(request), http_status=302)
redirect.save()
redirect2 = Redirect(from_url=r'/api/test/(?P<pk>\d+)/', to_url=r'somethingelse/(?P<pk>\d+)/',
site=get_current_site(request), http_status=302, uses_regex=True)
redirect2.save()
new_response = self.run_redirect(request)
# no redirect should happen
self.assertEqual(new_response.status_code, 404)
import pytest
import os
from django.conf import settings
from django.conf import urls
from django.test.utils import override_settings
from unittest import mock
current_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
folder_name = os.path.join(current_dir, 'fileserve')
FOLDERVIEW_FOLDERS = [folder_name]
# setattr(settings, 'FOLDERVIEW_FOLDERS', [folder_name])
@pytest.fixture
def index():
global folder_name
file_name = os.path.join(folder_name, 'index.html')
os.mkdir(folder_name)
with open(file_name, 'w') as f:
f.write('Hello Folder View')
yield file_name
os.remove(file_name)
os.rmdir(folder_name)
@pytest.fixture
def favicon():
global folder_name, current_dir
file_name = os.path.join(folder_name, 'favicon.ico')
favicon_file = os.path.join(current_dir, 'tests/favicon.ico')
os.mkdir(folder_name)
os.system('cp {} {}'.format(favicon_file, file_name))
yield file_name
os.remove(file_name)
os.rmdir(folder_name)
class TestViews:
@mock.patch.object(settings, 'FOLDERVIEW_FOLDERS', FOLDERVIEW_FOLDERS)
def test_can_serve_test_file(self, index, client):
location = index.split(os.path.sep)[-1]
folder = index.split(os.path.sep)[:-1]
resp = client.get('/{}'.format(location))
assert resp.status_code == 200
assert resp.getvalue() == b'Hello Folder View'
@mock.patch.object(settings, 'FOLDERVIEW_FOLDERS', FOLDERVIEW_FOLDERS)
def test_can_serve_index_file(self, index, client):
location = index.split(os.path.sep)[-1]
folder = index.split(os.path.sep)[:-1]
resp = client.get('/')
assert resp.status_code == 200
assert resp.getvalue() == b'Hello Folder View'
@mock.patch.object(settings, 'FOLDERVIEW_FOLDERS', FOLDERVIEW_FOLDERS)
def test_404_on_unknown_file(self, client):
resp = client.get('/hello.test')
assert resp.status_code == 404
assert b'The requested URL /hello.test was not found on this server.' \
in resp.content
@mock.patch.object(settings, 'FOLDERVIEW_FOLDERS', [])
def test_404_on_unknown_folder(self, index, client):
resp = client.get('/')
assert resp.status_code == 404
assert b'The requested URL / was not found on this server.' \
in resp.content
@mock.patch.object(settings, 'FOLDERVIEW_FOLDERS', FOLDERVIEW_FOLDERS)
def test_can_serve_favicon(self, favicon, client):
location = favicon.split(os.path.sep)[-1]
folder = favicon.split(os.path.sep)[:-1]
resp = client.get('/{}'.format(location))
assert resp.status_code == 200
@mock.patch('mimetypes.guess_type')
@mock.patch.object(settings, 'FOLDERVIEW_FOLDERS', FOLDERVIEW_FOLDERS)
def test_can_serve_favicon(self, mock_guess_type, favicon, client):
mock_guess_type.return_value = ('image/vnd.microsoft.icon', 'utf-8')
location = favicon.split(os.path.sep)[-1]
folder = favicon.split(os.path.sep)[:-1]
resp = client.get('/{}'.format(location))
assert resp.status_code == 200
assert b'Content-Type: image/vnd.microsoft.icon' \
in resp.serialize_headers()
assert b'Content-Encoding: utf-8' in resp.serialize_headers()
assert b'Content-Length: 5430' in resp.serialize_headers()
@mock.patch('django.views.static.was_modified_since')
@mock.patch.object(settings, 'FOLDERVIEW_FOLDERS', FOLDERVIEW_FOLDERS)
def test_can_serve_favicon_not_modified(self, mock_mod, favicon, client):
mock_mod.return_value = False
location = favicon.split(os.path.sep)[-1]
folder = favicon.split(os.path.sep)[:-1]
resp = client.get('/{}'.format(location))
assert resp.status_code == 304
Accelerate Your Automation Test Cycles With LambdaTest
Leverage LambdaTest’s cloud-based platform to execute your automation tests in parallel and trim down your test execution time significantly. Your first 100 automation testing minutes are on us.