diff options
| author | th3nn3ss <chuksmcdennis@yahoo.com> | 2023-04-11 12:40:55 +0100 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2023-06-26 09:29:04 +0200 |
| commit | 3152f9de47a317d658ebee6d5b517b7e1258aa1f (patch) | |
| tree | dedb11cc11fe667cadb940774e7ee392555a2929 /tests | |
| parent | cd4c4c1905a838bda63d401bf93cfb77cb97ea95 (diff) | |
Refs #31949 -- Made http decorators to work with async functions.
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/decorators/test_http.py | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/tests/decorators/test_http.py b/tests/decorators/test_http.py index 28f13ab8ce..5d3e1d5a9f 100644 --- a/tests/decorators/test_http.py +++ b/tests/decorators/test_http.py @@ -1,11 +1,27 @@ import datetime +from asgiref.sync import iscoroutinefunction + from django.http import HttpRequest, HttpResponse, HttpResponseNotAllowed from django.test import SimpleTestCase from django.views.decorators.http import condition, require_http_methods, require_safe class RequireHttpMethodsTest(SimpleTestCase): + def test_wrapped_sync_function_is_not_coroutine_function(self): + def sync_view(request): + return HttpResponse() + + wrapped_view = require_http_methods(["GET"])(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 = require_http_methods(["GET"])(async_view) + self.assertIs(iscoroutinefunction(wrapped_view), True) + def test_require_http_methods_methods(self): @require_http_methods(["GET", "PUT"]) def my_view(request): @@ -23,6 +39,23 @@ class RequireHttpMethodsTest(SimpleTestCase): request.method = "DELETE" self.assertIsInstance(my_view(request), HttpResponseNotAllowed) + async def test_require_http_methods_methods_async_view(self): + @require_http_methods(["GET", "PUT"]) + async def my_view(request): + return HttpResponse("OK") + + request = HttpRequest() + request.method = "GET" + self.assertIsInstance(await my_view(request), HttpResponse) + request.method = "PUT" + self.assertIsInstance(await my_view(request), HttpResponse) + request.method = "HEAD" + self.assertIsInstance(await my_view(request), HttpResponseNotAllowed) + request.method = "POST" + self.assertIsInstance(await my_view(request), HttpResponseNotAllowed) + request.method = "DELETE" + self.assertIsInstance(await my_view(request), HttpResponseNotAllowed) + class RequireSafeDecoratorTest(SimpleTestCase): def test_require_safe_accepts_only_safe_methods(self): @@ -42,6 +75,23 @@ class RequireSafeDecoratorTest(SimpleTestCase): request.method = "DELETE" self.assertIsInstance(my_safe_view(request), HttpResponseNotAllowed) + async def test_require_safe_accepts_only_safe_methods_async_view(self): + @require_safe + async def async_view(request): + return HttpResponse("OK") + + request = HttpRequest() + request.method = "GET" + self.assertIsInstance(await async_view(request), HttpResponse) + request.method = "HEAD" + self.assertIsInstance(await async_view(request), HttpResponse) + request.method = "POST" + self.assertIsInstance(await async_view(request), HttpResponseNotAllowed) + request.method = "PUT" + self.assertIsInstance(await async_view(request), HttpResponseNotAllowed) + request.method = "DELETE" + self.assertIsInstance(await async_view(request), HttpResponseNotAllowed) + class ConditionDecoratorTest(SimpleTestCase): def etag_func(request, *args, **kwargs): @@ -50,6 +100,24 @@ class ConditionDecoratorTest(SimpleTestCase): def latest_entry(request, *args, **kwargs): return datetime.datetime(2023, 1, 2, 23, 21, 47) + def test_wrapped_sync_function_is_not_coroutine_function(self): + def sync_view(request): + return HttpResponse() + + wrapped_view = condition( + etag_func=self.etag_func, last_modified_func=self.latest_entry + )(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 = condition( + etag_func=self.etag_func, last_modified_func=self.latest_entry + )(async_view) + self.assertIs(iscoroutinefunction(wrapped_view), True) + def test_condition_decorator(self): @condition( etag_func=self.etag_func, @@ -68,3 +136,22 @@ class ConditionDecoratorTest(SimpleTestCase): response.headers["Last-Modified"], "Mon, 02 Jan 2023 23:21:47 GMT", ) + + async def test_condition_decorator_async_view(self): + @condition( + etag_func=self.etag_func, + last_modified_func=self.latest_entry, + ) + async def async_view(request): + return HttpResponse() + + request = HttpRequest() + request.method = "GET" + response = await async_view(request) + + self.assertEqual(response.status_code, 200) + self.assertEqual(response.headers["ETag"], '"b4246ffc4f62314ca13147c9d4f76974"') + self.assertEqual( + response.headers["Last-Modified"], + "Mon, 02 Jan 2023 23:21:47 GMT", + ) |
