mirror of
https://github.com/jazzband/django-downloadview.git
synced 2026-03-16 22:40:25 +00:00
136 lines
5.4 KiB
Python
136 lines
5.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""Test suite around :mod:`django_downloadview.api` and deprecation plan."""
|
|
import unittest
|
|
from six.moves import reload_module as reload
|
|
import warnings
|
|
|
|
from django.core.exceptions import ImproperlyConfigured
|
|
import django.test
|
|
from django.test.utils import override_settings
|
|
from django.utils.importlib import import_module
|
|
|
|
|
|
class APITestCase(unittest.TestCase):
|
|
"""Make sure django_downloadview exposes API."""
|
|
def assert_module_attributes(self, module_path, attribute_names):
|
|
"""Assert imported ``module_path`` has ``attribute_names``."""
|
|
module = import_module(module_path)
|
|
missing_attributes = []
|
|
for attribute_name in attribute_names:
|
|
if not hasattr(module, attribute_name):
|
|
missing_attributes.append(attribute_name)
|
|
if missing_attributes:
|
|
self.fail('Missing attributes in "{module}": {attributes}'.format(
|
|
module=module_path, attributes=', '.join(missing_attributes)))
|
|
|
|
def test_root_attributes(self):
|
|
"""API is exposed in django_downloadview root package.
|
|
|
|
The goal of this test is to make sure that main items of project's API
|
|
are easy to import... and prevent refactoring from breaking main API.
|
|
|
|
If this test is broken by refactoring, a :class:`DeprecationWarning` or
|
|
simimar should be raised.
|
|
|
|
"""
|
|
api = [
|
|
# Views:
|
|
'ObjectDownloadView',
|
|
'StorageDownloadView',
|
|
'PathDownloadView',
|
|
'HTTPDownloadView',
|
|
'VirtualDownloadView',
|
|
'BaseDownloadView',
|
|
'DownloadMixin',
|
|
# File wrappers:
|
|
'StorageFile',
|
|
'HTTPFile',
|
|
'VirtualFile',
|
|
# Responses:
|
|
'DownloadResponse',
|
|
'ProxiedDownloadResponse',
|
|
# Middlewares:
|
|
'BaseDownloadMiddleware',
|
|
'DownloadDispatcherMiddleware',
|
|
'SmartDownloadMiddleware',
|
|
# Testing:
|
|
'assert_download_response',
|
|
'setup_view',
|
|
'temporary_media_root',
|
|
# Utilities:
|
|
'StringIteratorIO',
|
|
'sendfile']
|
|
self.assert_module_attributes('django_downloadview', api)
|
|
|
|
def test_nginx_attributes(self):
|
|
"""Nginx-related API is exposed in django_downloadview.nginx."""
|
|
api = [
|
|
'XAccelRedirectResponse',
|
|
'XAccelRedirectMiddleware',
|
|
'x_accel_redirect',
|
|
'assert_x_accel_redirect']
|
|
self.assert_module_attributes('django_downloadview.nginx', api)
|
|
|
|
def test_apache_attributes(self):
|
|
"""Apache-related API is exposed in django_downloadview.apache."""
|
|
api = [
|
|
'XSendfileResponse',
|
|
'XSendfileMiddleware',
|
|
'x_sendfile',
|
|
'assert_x_sendfile']
|
|
self.assert_module_attributes('django_downloadview.apache', api)
|
|
|
|
def test_lighttpd_attributes(self):
|
|
"""Lighttpd-related API is exposed in django_downloadview.lighttpd."""
|
|
api = [
|
|
'XSendfileResponse',
|
|
'XSendfileMiddleware',
|
|
'x_sendfile',
|
|
'assert_x_sendfile']
|
|
self.assert_module_attributes('django_downloadview.lighttpd', api)
|
|
|
|
|
|
class DeprecatedAPITestCase(django.test.SimpleTestCase):
|
|
"""Make sure using deprecated items raise DeprecationWarning."""
|
|
def test_nginx_x_accel_redirect_middleware(self):
|
|
"XAccelRedirectMiddleware in settings triggers ImproperlyConfigured."
|
|
with override_settings(
|
|
MIDDLEWARE_CLASSES=[
|
|
'django_downloadview.nginx.XAccelRedirectMiddleware']):
|
|
with self.assertRaises(ImproperlyConfigured):
|
|
import django_downloadview.nginx.settings
|
|
reload(django_downloadview.nginx.settings)
|
|
|
|
def test_nginx_x_accel_redirect_global_settings(self):
|
|
"""Global settings for Nginx middleware are deprecated."""
|
|
settings_overrides = {
|
|
'NGINX_DOWNLOAD_MIDDLEWARE_WITH_BUFFERING': True,
|
|
'NGINX_DOWNLOAD_MIDDLEWARE_LIMIT_RATE': 32,
|
|
'NGINX_DOWNLOAD_MIDDLEWARE_EXPIRES': 3600,
|
|
'NGINX_DOWNLOAD_MIDDLEWARE_MEDIA_ROOT': '/',
|
|
'NGINX_DOWNLOAD_MIDDLEWARE_SOURCE_DIR': '/',
|
|
'NGINX_DOWNLOAD_MIDDLEWARE_SOURCE_URL': '/',
|
|
'NGINX_DOWNLOAD_MIDDLEWARE_MEDIA_URL': '/',
|
|
'NGINX_DOWNLOAD_MIDDLEWARE_DESTINATION_URL': '/',
|
|
}
|
|
import django_downloadview.nginx.settings
|
|
missed_warnings = []
|
|
for setting_name, setting_value in settings_overrides.items():
|
|
warnings.resetwarnings()
|
|
warnings.simplefilter("always")
|
|
with warnings.catch_warnings(record=True) as warning_list:
|
|
with override_settings(**{setting_name: setting_value}):
|
|
reload(django_downloadview.nginx.settings)
|
|
caught = False
|
|
for warning_item in warning_list:
|
|
if warning_item.category == DeprecationWarning:
|
|
if 'deprecated' in str(warning_item.message):
|
|
if setting_name in str(warning_item.message):
|
|
caught = True
|
|
break
|
|
if not caught:
|
|
missed_warnings.append(setting_name)
|
|
if missed_warnings:
|
|
self.fail(
|
|
'No DeprecationWarning raised about following settings: '
|
|
'{settings}.'.format(settings=', '.join(missed_warnings)))
|