summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorth3nn3ss <chuksmcdennis@yahoo.com>2023-04-11 12:40:55 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2023-06-26 09:29:04 +0200
commit3152f9de47a317d658ebee6d5b517b7e1258aa1f (patch)
treededb11cc11fe667cadb940774e7ee392555a2929 /tests
parentcd4c4c1905a838bda63d401bf93cfb77cb97ea95 (diff)
Refs #31949 -- Made http decorators to work with async functions.
Diffstat (limited to 'tests')
-rw-r--r--tests/decorators/test_http.py87
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",
+ )