diff options
| author | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2021-12-16 20:13:17 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-12-16 20:13:17 +0100 |
| commit | 40165eecc40f9e223702a41a0cb0958515bb1f82 (patch) | |
| tree | 458f84b4290c76141dc496a1eef395c9dbca71fe /tests | |
| parent | 068b2c072b0d28cbd5ea63811779629cdaad8638 (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.py | 41 |
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') |
