diff options
| author | Ben Lomax <lomax.on.the.run@gmail.com> | 2023-07-08 22:51:19 +0100 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2023-09-13 11:41:01 +0200 |
| commit | 74f7deec9e334a69bfbfdd068285618534198bd5 (patch) | |
| tree | 44cceda16c83c0eac7512df83ec8bfa4ef05dfee /tests | |
| parent | 059cb0dbc9adc9c330f5fa36ba61acf00a6f259b (diff) | |
Refs #31949 -- Made make_middleware_decorator to work with async functions.
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/decorators/test_csrf.py | 87 | ||||
| -rw-r--r-- | tests/decorators/test_gzip.py | 27 | ||||
| -rw-r--r-- | tests/decorators/test_http.py | 28 |
3 files changed, 142 insertions, 0 deletions
diff --git a/tests/decorators/test_csrf.py b/tests/decorators/test_csrf.py index 213ee7fdd8..c193444864 100644 --- a/tests/decorators/test_csrf.py +++ b/tests/decorators/test_csrf.py @@ -24,6 +24,20 @@ class CsrfTestMixin: class CsrfProtectTests(CsrfTestMixin, SimpleTestCase): + def test_wrapped_sync_function_is_not_coroutine_function(self): + def sync_view(request): + return HttpResponse() + + wrapped_view = csrf_protect(sync_view) + self.assertIs(iscoroutinefunction(wrapped_view), False) + + def test_wrapped_async_function_is_coroutine_function(self): + async def async_view(request): + return HttpResponse() + + wrapped_view = csrf_protect(async_view) + self.assertIs(iscoroutinefunction(wrapped_view), True) + def test_csrf_protect_decorator(self): @csrf_protect def sync_view(request): @@ -39,8 +53,37 @@ class CsrfProtectTests(CsrfTestMixin, SimpleTestCase): response = sync_view(request) self.assertEqual(response.status_code, 403) + async def test_csrf_protect_decorator_async_view(self): + @csrf_protect + async def async_view(request): + return HttpResponse() + + request = self.get_request() + response = await async_view(request) + self.assertEqual(response.status_code, 200) + self.assertIs(request.csrf_processing_done, True) + + with self.assertLogs("django.security.csrf", "WARNING"): + request = self.get_request(token=None) + response = await async_view(request) + self.assertEqual(response.status_code, 403) + class RequiresCsrfTokenTests(CsrfTestMixin, SimpleTestCase): + def test_wrapped_sync_function_is_not_coroutine_function(self): + def sync_view(request): + return HttpResponse() + + wrapped_view = requires_csrf_token(sync_view) + self.assertIs(iscoroutinefunction(wrapped_view), False) + + def test_wrapped_async_function_is_coroutine_function(self): + async def async_view(request): + return HttpResponse() + + wrapped_view = requires_csrf_token(async_view) + self.assertIs(iscoroutinefunction(wrapped_view), True) + def test_requires_csrf_token_decorator(self): @requires_csrf_token def sync_view(request): @@ -56,8 +99,37 @@ class RequiresCsrfTokenTests(CsrfTestMixin, SimpleTestCase): response = sync_view(request) self.assertEqual(response.status_code, 200) + async def test_requires_csrf_token_decorator_async_view(self): + @requires_csrf_token + async def async_view(request): + return HttpResponse() + + request = self.get_request() + response = await async_view(request) + self.assertEqual(response.status_code, 200) + self.assertIs(request.csrf_processing_done, True) + + with self.assertNoLogs("django.security.csrf", "WARNING"): + request = self.get_request(token=None) + response = await async_view(request) + self.assertEqual(response.status_code, 200) + class EnsureCsrfCookieTests(CsrfTestMixin, SimpleTestCase): + def test_wrapped_sync_function_is_not_coroutine_function(self): + def sync_view(request): + return HttpResponse() + + wrapped_view = ensure_csrf_cookie(sync_view) + self.assertIs(iscoroutinefunction(wrapped_view), False) + + def test_wrapped_async_function_is_coroutine_function(self): + async def async_view(request): + return HttpResponse() + + wrapped_view = ensure_csrf_cookie(async_view) + self.assertIs(iscoroutinefunction(wrapped_view), True) + def test_ensure_csrf_cookie_decorator(self): @ensure_csrf_cookie def sync_view(request): @@ -73,6 +145,21 @@ class EnsureCsrfCookieTests(CsrfTestMixin, SimpleTestCase): response = sync_view(request) self.assertEqual(response.status_code, 200) + async def test_ensure_csrf_cookie_decorator_async_view(self): + @ensure_csrf_cookie + async def async_view(request): + return HttpResponse() + + request = self.get_request() + response = await async_view(request) + self.assertEqual(response.status_code, 200) + self.assertIs(request.csrf_processing_done, True) + + with self.assertNoLogs("django.security.csrf", "WARNING"): + request = self.get_request(token=None) + response = await async_view(request) + self.assertEqual(response.status_code, 200) + class CsrfExemptTests(SimpleTestCase): def test_wrapped_sync_function_is_not_coroutine_function(self): diff --git a/tests/decorators/test_gzip.py b/tests/decorators/test_gzip.py index 129befbd1e..87eff0fe77 100644 --- a/tests/decorators/test_gzip.py +++ b/tests/decorators/test_gzip.py @@ -1,3 +1,5 @@ +from asgiref.sync import iscoroutinefunction + from django.http import HttpRequest, HttpResponse from django.test import SimpleTestCase from django.views.decorators.gzip import gzip_page @@ -7,6 +9,20 @@ class GzipPageTests(SimpleTestCase): # Gzip ignores content that is too short. content = "Content " * 100 + def test_wrapped_sync_function_is_not_coroutine_function(self): + def sync_view(request): + return HttpResponse() + + wrapped_view = gzip_page(sync_view) + self.assertIs(iscoroutinefunction(wrapped_view), False) + + def test_wrapped_async_function_is_coroutine_function(self): + async def async_view(request): + return HttpResponse() + + wrapped_view = gzip_page(async_view) + self.assertIs(iscoroutinefunction(wrapped_view), True) + def test_gzip_page_decorator(self): @gzip_page def sync_view(request): @@ -17,3 +33,14 @@ class GzipPageTests(SimpleTestCase): response = sync_view(request) self.assertEqual(response.status_code, 200) self.assertEqual(response.get("Content-Encoding"), "gzip") + + async def test_gzip_page_decorator_async_view(self): + @gzip_page + async def async_view(request): + return HttpResponse(content=self.content) + + request = HttpRequest() + request.META["HTTP_ACCEPT_ENCODING"] = "gzip" + response = await async_view(request) + self.assertEqual(response.status_code, 200) + self.assertEqual(response.get("Content-Encoding"), "gzip") diff --git a/tests/decorators/test_http.py b/tests/decorators/test_http.py index d36e46562c..4b1b81588e 100644 --- a/tests/decorators/test_http.py +++ b/tests/decorators/test_http.py @@ -163,6 +163,20 @@ class ConditionDecoratorTest(SimpleTestCase): class ConditionalPageTests(SimpleTestCase): + def test_wrapped_sync_function_is_not_coroutine_function(self): + def sync_view(request): + return HttpResponse() + + wrapped_view = conditional_page(sync_view) + self.assertIs(iscoroutinefunction(wrapped_view), False) + + def test_wrapped_async_function_is_coroutine_function(self): + async def async_view(request): + return HttpResponse() + + wrapped_view = conditional_page(async_view) + self.assertIs(iscoroutinefunction(wrapped_view), True) + def test_conditional_page_decorator_successful(self): @conditional_page def sync_view(request): @@ -176,3 +190,17 @@ class ConditionalPageTests(SimpleTestCase): response = sync_view(request) self.assertEqual(response.status_code, 200) self.assertIsNotNone(response.get("Etag")) + + async def test_conditional_page_decorator_successful_async_view(self): + @conditional_page + async def async_view(request): + response = HttpResponse() + response.content = b"test" + response["Cache-Control"] = "public" + return response + + request = HttpRequest() + request.method = "GET" + response = await async_view(request) + self.assertEqual(response.status_code, 200) + self.assertIsNotNone(response.get("Etag")) |
