diff --git a/spiderweb/tests/test_middleware.py b/spiderweb/tests/test_middleware.py index e2c4199..5ffedaa 100644 --- a/spiderweb/tests/test_middleware.py +++ b/spiderweb/tests/test_middleware.py @@ -23,8 +23,9 @@ from spiderweb.tests.views_for_tests import ( form_csrf_exempt, form_view_without_csrf, text_view, - unauthorized_view, + unauthorized_view, file_view, ) +from spiderweb.middleware.gzip import GzipMiddleware, CheckValidGzipMinimumLength, CheckValidGzipCompressionLevel def index(request): @@ -349,6 +350,67 @@ def test_unused_post_process_middleware(): assert len(app.middleware) == 0 +class TestGzipMiddleware: + middleware = {"middleware": ["spiderweb.middleware.gzip.GzipMiddleware"]} + + def test_not_enabled_on_small_response(self): + app, environ, start_response = setup( + **self.middleware, + gzip_minimum_response_length=500, + ) + app.add_route("/", text_view) + + environ["HTTP_USER_AGENT"] = "hi" + environ["REMOTE_ADDR"] = "/" + environ["REQUEST_METHOD"] = "GET" + + assert app(environ, start_response) == [bytes("Hi!", DEFAULT_ENCODING)] + assert "Content-Encoding" not in start_response.get_headers() + + def test_changing_minimum_response_length(self): + app, environ, start_response = setup( + **self.middleware, + gzip_minimum_response_length=1, + ) + app.add_route("/", text_view) + + environ["HTTP_ACCEPT_ENCODING"] = "gzip" + environ["HTTP_USER_AGENT"] = "hi" + environ["REMOTE_ADDR"] = "/" + environ["REQUEST_METHOD"] = "GET" + assert str(app(environ, start_response)[0]).startswith("b'\\x1f\\x8b\\x08") + assert "content-encoding" in start_response.get_headers() + + def test_not_enabled_on_error_response(self): + app, environ, start_response = setup( + **self.middleware, + gzip_minimum_response_length=1, + ) + app.add_route("/", unauthorized_view) + + environ["HTTP_ACCEPT_ENCODING"] = "gzip" + environ["HTTP_USER_AGENT"] = "hi" + environ["REMOTE_ADDR"] = "/" + environ["REQUEST_METHOD"] = "GET" + assert app(environ, start_response) == [bytes("Unauthorized", DEFAULT_ENCODING)] + assert "content-encoding" not in start_response.get_headers() + + def test_not_enabled_on_bytes_response(self): + app, environ, start_response = setup( + **self.middleware, + gzip_minimum_response_length=1, + ) + # send a file that's already in bytes form + app.add_route("/", file_view) + + environ["HTTP_ACCEPT_ENCODING"] = "gzip" + environ["HTTP_USER_AGENT"] = "hi" + environ["REMOTE_ADDR"] = "/" + environ["REQUEST_METHOD"] = "GET" + assert app(environ, start_response) == [bytes("hi", DEFAULT_ENCODING)] + assert "content-encoding" not in start_response.get_headers() + + class TestCorsMiddleware: # adapted from: # https://github.com/adamchainz/django-cors-headers/blob/main/tests/test_middleware.py diff --git a/spiderweb/tests/views_for_tests.py b/spiderweb/tests/views_for_tests.py index 3ae8990..dd8b0a3 100644 --- a/spiderweb/tests/views_for_tests.py +++ b/spiderweb/tests/views_for_tests.py @@ -1,7 +1,6 @@ from spiderweb import HttpResponse from spiderweb.decorators import csrf_exempt -from spiderweb.response import JsonResponse, TemplateResponse - +from spiderweb.response import JsonResponse, TemplateResponse, FileResponse EXAMPLE_HTML_FORM = """
@@ -47,3 +46,7 @@ def text_view(request): def unauthorized_view(request): return HttpResponse("Unauthorized", status_code=401) + + +def file_view(request): + return FileResponse("spiderweb/tests/staticfiles/file_for_testing_fileresponse.txt")