diff options
author | Kevin Michel <kevin.michel@sereema.com> | 2020-08-24 22:25:33 +0200 |
---|---|---|
committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2020-08-28 12:33:15 +0200 |
commit | 825ce75faec63ce81601e31152c757a9c28fed13 (patch) | |
tree | 93c89ad774d62f236371ac01a77f85b499782e98 /tests/deprecation | |
parent | ea57a2834fe32d895e6e6b0f3791feb2fec71737 (diff) | |
download | django-825ce75faec63ce81601e31152c757a9c28fed13.tar.gz |
Fixed #31928 -- Fixed detecting an async get_response in various middlewares.
SecurityMiddleware and the three cache middlewares were not calling
super().__init__() during their initialization or calling the required
MiddlewareMixin._async_check() method.
This made the middlewares not properly present as coroutine and
confused the middleware chain when used in a fully async context.
Thanks Kordian Kowalski for the report.
Diffstat (limited to 'tests/deprecation')
-rw-r--r-- | tests/deprecation/test_middleware_mixin.py | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/tests/deprecation/test_middleware_mixin.py b/tests/deprecation/test_middleware_mixin.py index 3e4260b422..fc792e92a3 100644 --- a/tests/deprecation/test_middleware_mixin.py +++ b/tests/deprecation/test_middleware_mixin.py @@ -1,3 +1,4 @@ +import asyncio import threading from asgiref.sync import async_to_sync @@ -69,6 +70,29 @@ class MiddlewareMixinTests(SimpleTestCase): with self.assertRaisesMessage(RemovedInDjango40Warning, self.msg): middleware(None) + def test_coroutine(self): + async def async_get_response(request): + return HttpResponse() + + def sync_get_response(request): + return HttpResponse() + + for middleware in [ + CacheMiddleware, + FetchFromCacheMiddleware, + UpdateCacheMiddleware, + SecurityMiddleware, + ]: + with self.subTest(middleware=middleware.__qualname__): + # Middleware appears as coroutine if get_function is + # a coroutine. + middleware_instance = middleware(async_get_response) + self.assertIs(asyncio.iscoroutinefunction(middleware_instance), True) + # Middleware doesn't appear as coroutine if get_function is not + # a coroutine. + middleware_instance = middleware(sync_get_response) + self.assertIs(asyncio.iscoroutinefunction(middleware_instance), False) + def test_sync_to_async_uses_base_thread_and_connection(self): """ The process_request() and process_response() hooks must be called with |