Fixed #32260 -- Made View.as_view() do not use update_wrapper().

View.as_view() should not use update_wrapper() for copying attributes
it's unintended and have side-effects such as adding `self` to the
signature.

This also fixes system check for arguments of custom error handler
views with class-based views.

Co-authored-by: Nick Pope <nick.pope@flightdataservices.com>
This commit is contained in:
Daniyal 2020-12-12 01:00:50 +05:30 committed by Mariusz Felisiak
parent 0c0b87725b
commit 7c08f26bf0
7 changed files with 79 additions and 17 deletions

View file

@ -167,20 +167,41 @@ class UpdatedToPathTests(SimpleTestCase):
class CheckCustomErrorHandlersTests(SimpleTestCase):
@override_settings(ROOT_URLCONF='check_framework.urls.bad_error_handlers')
def test_bad_handlers(self):
@override_settings(
ROOT_URLCONF='check_framework.urls.bad_function_based_error_handlers',
)
def test_bad_function_based_handlers(self):
result = check_url_config(None)
self.assertEqual(len(result), 4)
for code, num_params, error in zip([400, 403, 404, 500], [2, 2, 2, 1], result):
with self.subTest('handler{}'.format(code)):
self.assertEqual(error, Error(
"The custom handler{} view "
"'check_framework.urls.bad_error_handlers.bad_handler' "
"The custom handler{} view 'check_framework.urls."
"bad_function_based_error_handlers.bad_handler' "
"does not take the correct number of arguments (request{})."
.format(code, ', exception' if num_params == 2 else ''),
id='urls.E007',
))
@override_settings(
ROOT_URLCONF='check_framework.urls.bad_class_based_error_handlers',
)
def test_bad_class_based_handlers(self):
result = check_url_config(None)
self.assertEqual(len(result), 4)
for code, num_params, error in zip([400, 403, 404, 500], [2, 2, 2, 1], result):
with self.subTest('handler%s' % code):
self.assertEqual(error, Error(
"The custom handler%s view 'check_framework.urls."
"bad_class_based_error_handlers.HandlerView.as_view."
"<locals>.view' does not take the correct number of "
"arguments (request%s)." % (
code,
', exception' if num_params == 2 else '',
),
id='urls.E007',
))
@override_settings(ROOT_URLCONF='check_framework.urls.bad_error_handlers_invalid_path')
def test_bad_handlers_invalid_path(self):
result = check_url_config(None)
@ -204,8 +225,17 @@ class CheckCustomErrorHandlersTests(SimpleTestCase):
id='urls.E008',
))
@override_settings(ROOT_URLCONF='check_framework.urls.good_error_handlers')
def test_good_handlers(self):
@override_settings(
ROOT_URLCONF='check_framework.urls.good_function_based_error_handlers',
)
def test_good_function_based_handlers(self):
result = check_url_config(None)
self.assertEqual(result, [])
@override_settings(
ROOT_URLCONF='check_framework.urls.good_class_based_error_handlers',
)
def test_good_class_based_handlers(self):
result = check_url_config(None)
self.assertEqual(result, [])