summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorMariusz Felisiak <felisiak.mariusz@gmail.com>2021-12-16 20:13:17 +0100
committerGitHub <noreply@github.com>2021-12-16 20:13:17 +0100
commit40165eecc40f9e223702a41a0cb0958515bb1f82 (patch)
tree458f84b4290c76141dc496a1eef395c9dbca71fe /tests
parent068b2c072b0d28cbd5ea63811779629cdaad8638 (diff)
Fixed #33350 -- Reallowed using cache decorators with duck-typed HttpRequest.
Regression in 3fd82a62415e748002435e7bad06b5017507777c. Thanks Terence Honles for the report.
Diffstat (limited to 'tests')
-rw-r--r--tests/decorators/tests.py41
1 files changed, 39 insertions, 2 deletions
diff --git a/tests/decorators/tests.py b/tests/decorators/tests.py
index de0edaa787..b9d16f9a1b 100644
--- a/tests/decorators/tests.py
+++ b/tests/decorators/tests.py
@@ -493,6 +493,15 @@ class XFrameOptionsDecoratorsTests(TestCase):
self.assertIsNone(r.get('X-Frame-Options', None))
+class HttpRequestProxy:
+ def __init__(self, request):
+ self._request = request
+
+ def __getattr__(self, attr):
+ """Proxy to the underlying HttpRequest object."""
+ return getattr(self._request, attr)
+
+
class NeverCacheDecoratorTest(SimpleTestCase):
@mock.patch('time.time')
@@ -525,12 +534,27 @@ class NeverCacheDecoratorTest(SimpleTestCase):
@never_cache
def a_view(self, request):
return HttpResponse()
+
+ request = HttpRequest()
msg = (
"never_cache didn't receive an HttpRequest. If you are decorating "
"a classmethod, be sure to use @method_decorator."
)
with self.assertRaisesMessage(TypeError, msg):
- MyClass().a_view(HttpRequest())
+ MyClass().a_view(request)
+ with self.assertRaisesMessage(TypeError, msg):
+ MyClass().a_view(HttpRequestProxy(request))
+
+ def test_never_cache_decorator_http_request_proxy(self):
+ class MyClass:
+ @method_decorator(never_cache)
+ def a_view(self, request):
+ return HttpResponse()
+
+ request = HttpRequest()
+ response = MyClass().a_view(HttpRequestProxy(request))
+ self.assertIn('Cache-Control', response.headers)
+ self.assertIn('Expires', response.headers)
class CacheControlDecoratorTest(SimpleTestCase):
@@ -544,5 +568,18 @@ class CacheControlDecoratorTest(SimpleTestCase):
"cache_control didn't receive an HttpRequest. If you are "
"decorating a classmethod, be sure to use @method_decorator."
)
+ request = HttpRequest()
with self.assertRaisesMessage(TypeError, msg):
- MyClass().a_view(HttpRequest())
+ MyClass().a_view(request)
+ with self.assertRaisesMessage(TypeError, msg):
+ MyClass().a_view(HttpRequestProxy(request))
+
+ def test_cache_control_decorator_http_request_proxy(self):
+ class MyClass:
+ @method_decorator(cache_control(a='b'))
+ def a_view(self, request):
+ return HttpResponse()
+
+ request = HttpRequest()
+ response = MyClass().a_view(HttpRequestProxy(request))
+ self.assertEqual(response.headers['Cache-Control'], 'a=b')