diff options
Diffstat (limited to 'tests/check_framework/test_urls.py')
| -rw-r--r-- | tests/check_framework/test_urls.py | 233 |
1 files changed, 134 insertions, 99 deletions
diff --git a/tests/check_framework/test_urls.py b/tests/check_framework/test_urls.py index 663c7a299c..6315f8834d 100644 --- a/tests/check_framework/test_urls.py +++ b/tests/check_framework/test_urls.py @@ -1,7 +1,10 @@ from django.conf import settings from django.core.checks.messages import Error, Warning from django.core.checks.urls import ( - E006, check_url_config, check_url_namespaces_unique, check_url_settings, + E006, + check_url_config, + check_url_namespaces_unique, + check_url_settings, get_warning_for_invalid_pattern, ) from django.test import SimpleTestCase @@ -9,58 +12,67 @@ from django.test.utils import override_settings class CheckUrlConfigTests(SimpleTestCase): - @override_settings(ROOT_URLCONF='check_framework.urls.no_warnings') + @override_settings(ROOT_URLCONF="check_framework.urls.no_warnings") def test_no_warnings(self): result = check_url_config(None) self.assertEqual(result, []) - @override_settings(ROOT_URLCONF='check_framework.urls.no_warnings_i18n') + @override_settings(ROOT_URLCONF="check_framework.urls.no_warnings_i18n") def test_no_warnings_i18n(self): self.assertEqual(check_url_config(None), []) - @override_settings(ROOT_URLCONF='check_framework.urls.warning_in_include') + @override_settings(ROOT_URLCONF="check_framework.urls.warning_in_include") def test_check_resolver_recursive(self): # The resolver is checked recursively (examining URL patterns in include()). result = check_url_config(None) self.assertEqual(len(result), 1) warning = result[0] - self.assertEqual(warning.id, 'urls.W001') + self.assertEqual(warning.id, "urls.W001") - @override_settings(ROOT_URLCONF='check_framework.urls.include_with_dollar') + @override_settings(ROOT_URLCONF="check_framework.urls.include_with_dollar") def test_include_with_dollar(self): result = check_url_config(None) self.assertEqual(len(result), 1) warning = result[0] - self.assertEqual(warning.id, 'urls.W001') - self.assertEqual(warning.msg, ( - "Your URL pattern '^include-with-dollar$' uses include with a " - "route ending with a '$'. Remove the dollar from the route to " - "avoid problems including URLs." - )) + self.assertEqual(warning.id, "urls.W001") + self.assertEqual( + warning.msg, + ( + "Your URL pattern '^include-with-dollar$' uses include with a " + "route ending with a '$'. Remove the dollar from the route to " + "avoid problems including URLs." + ), + ) - @override_settings(ROOT_URLCONF='check_framework.urls.contains_tuple') + @override_settings(ROOT_URLCONF="check_framework.urls.contains_tuple") def test_contains_tuple_not_url_instance(self): result = check_url_config(None) warning = result[0] - self.assertEqual(warning.id, 'urls.E004') - self.assertRegex(warning.msg, ( - r"^Your URL pattern \('\^tuple/\$', <function <lambda> at 0x(\w+)>\) is " - r"invalid. Ensure that urlpatterns is a list of path\(\) and/or re_path\(\) " - r"instances\.$" - )) + self.assertEqual(warning.id, "urls.E004") + self.assertRegex( + warning.msg, + ( + r"^Your URL pattern \('\^tuple/\$', <function <lambda> at 0x(\w+)>\) is " + r"invalid. Ensure that urlpatterns is a list of path\(\) and/or re_path\(\) " + r"instances\.$" + ), + ) - @override_settings(ROOT_URLCONF='check_framework.urls.include_contains_tuple') + @override_settings(ROOT_URLCONF="check_framework.urls.include_contains_tuple") def test_contains_included_tuple(self): result = check_url_config(None) warning = result[0] - self.assertEqual(warning.id, 'urls.E004') - self.assertRegex(warning.msg, ( - r"^Your URL pattern \('\^tuple/\$', <function <lambda> at 0x(\w+)>\) is " - r"invalid. Ensure that urlpatterns is a list of path\(\) and/or re_path\(\) " - r"instances\.$" - )) + self.assertEqual(warning.id, "urls.E004") + self.assertRegex( + warning.msg, + ( + r"^Your URL pattern \('\^tuple/\$', <function <lambda> at 0x(\w+)>\) is " + r"invalid. Ensure that urlpatterns is a list of path\(\) and/or re_path\(\) " + r"instances\.$" + ), + ) - @override_settings(ROOT_URLCONF='check_framework.urls.beginning_with_slash') + @override_settings(ROOT_URLCONF="check_framework.urls.beginning_with_slash") def test_beginning_with_slash(self): msg = ( "Your URL pattern '%s' has a route beginning with a '/'. Remove " @@ -68,13 +80,13 @@ class CheckUrlConfigTests(SimpleTestCase): "an include(), ensure the include() pattern has a trailing '/'." ) warning1, warning2 = check_url_config(None) - self.assertEqual(warning1.id, 'urls.W002') - self.assertEqual(warning1.msg, msg % '/path-starting-with-slash/') - self.assertEqual(warning2.id, 'urls.W002') - self.assertEqual(warning2.msg, msg % '/url-starting-with-slash/$') + self.assertEqual(warning1.id, "urls.W002") + self.assertEqual(warning1.msg, msg % "/path-starting-with-slash/") + self.assertEqual(warning2.id, "urls.W002") + self.assertEqual(warning2.msg, msg % "/url-starting-with-slash/$") @override_settings( - ROOT_URLCONF='check_framework.urls.beginning_with_slash', + ROOT_URLCONF="check_framework.urls.beginning_with_slash", APPEND_SLASH=False, ) def test_beginning_with_slash_append_slash(self): @@ -83,23 +95,25 @@ class CheckUrlConfigTests(SimpleTestCase): result = check_url_config(None) self.assertEqual(result, []) - @override_settings(ROOT_URLCONF='check_framework.urls.name_with_colon') + @override_settings(ROOT_URLCONF="check_framework.urls.name_with_colon") def test_name_with_colon(self): result = check_url_config(None) self.assertEqual(len(result), 1) warning = result[0] - self.assertEqual(warning.id, 'urls.W003') - expected_msg = "Your URL pattern '^$' [name='name_with:colon'] has a name including a ':'." + self.assertEqual(warning.id, "urls.W003") + expected_msg = ( + "Your URL pattern '^$' [name='name_with:colon'] has a name including a ':'." + ) self.assertIn(expected_msg, warning.msg) @override_settings(ROOT_URLCONF=None) def test_no_root_urlconf_in_settings(self): - delattr(settings, 'ROOT_URLCONF') + delattr(settings, "ROOT_URLCONF") result = check_url_config(None) self.assertEqual(result, []) def test_get_warning_for_invalid_pattern_string(self): - warning = get_warning_for_invalid_pattern('')[0] + warning = get_warning_for_invalid_pattern("")[0] self.assertEqual( warning.hint, "Try removing the string ''. The list of urlpatterns should " @@ -107,18 +121,18 @@ class CheckUrlConfigTests(SimpleTestCase): ) def test_get_warning_for_invalid_pattern_tuple(self): - warning = get_warning_for_invalid_pattern((r'^$', lambda x: x))[0] + warning = get_warning_for_invalid_pattern((r"^$", lambda x: x))[0] self.assertEqual(warning.hint, "Try using path() instead of a tuple.") def test_get_warning_for_invalid_pattern_other(self): warning = get_warning_for_invalid_pattern(object())[0] self.assertIsNone(warning.hint) - @override_settings(ROOT_URLCONF='check_framework.urls.non_unique_namespaces') + @override_settings(ROOT_URLCONF="check_framework.urls.non_unique_namespaces") def test_check_non_unique_namespaces(self): result = check_url_namespaces_unique(None) self.assertEqual(len(result), 2) - non_unique_namespaces = ['app-ns1', 'app-1'] + non_unique_namespaces = ["app-ns1", "app-1"] warning_messages = [ "URL namespace '{}' isn't unique. You may not be able to reverse " "all URLs in this namespace".format(namespace) @@ -126,100 +140,117 @@ class CheckUrlConfigTests(SimpleTestCase): ] for warning in result: self.assertIsInstance(warning, Warning) - self.assertEqual('urls.W005', warning.id) + self.assertEqual("urls.W005", warning.id) self.assertIn(warning.msg, warning_messages) - @override_settings(ROOT_URLCONF='check_framework.urls.unique_namespaces') + @override_settings(ROOT_URLCONF="check_framework.urls.unique_namespaces") def test_check_unique_namespaces(self): result = check_url_namespaces_unique(None) self.assertEqual(result, []) - @override_settings(ROOT_URLCONF='check_framework.urls.cbv_as_view') + @override_settings(ROOT_URLCONF="check_framework.urls.cbv_as_view") def test_check_view_not_class(self): - self.assertEqual(check_url_config(None), [ - Error( - "Your URL pattern 'missing_as_view' has an invalid view, pass " - "EmptyCBV.as_view() instead of EmptyCBV.", - id='urls.E009', - ), - ]) + self.assertEqual( + check_url_config(None), + [ + Error( + "Your URL pattern 'missing_as_view' has an invalid view, pass " + "EmptyCBV.as_view() instead of EmptyCBV.", + id="urls.E009", + ), + ], + ) class UpdatedToPathTests(SimpleTestCase): - - @override_settings(ROOT_URLCONF='check_framework.urls.path_compatibility.contains_re_named_group') + @override_settings( + ROOT_URLCONF="check_framework.urls.path_compatibility.contains_re_named_group" + ) def test_contains_re_named_group(self): result = check_url_config(None) self.assertEqual(len(result), 1) warning = result[0] - self.assertEqual(warning.id, '2_0.W001') + self.assertEqual(warning.id, "2_0.W001") expected_msg = "Your URL pattern '(?P<named_group>\\d+)' has a route" self.assertIn(expected_msg, warning.msg) - @override_settings(ROOT_URLCONF='check_framework.urls.path_compatibility.beginning_with_caret') + @override_settings( + ROOT_URLCONF="check_framework.urls.path_compatibility.beginning_with_caret" + ) def test_beginning_with_caret(self): result = check_url_config(None) self.assertEqual(len(result), 1) warning = result[0] - self.assertEqual(warning.id, '2_0.W001') + self.assertEqual(warning.id, "2_0.W001") expected_msg = "Your URL pattern '^beginning-with-caret' has a route" self.assertIn(expected_msg, warning.msg) - @override_settings(ROOT_URLCONF='check_framework.urls.path_compatibility.ending_with_dollar') + @override_settings( + ROOT_URLCONF="check_framework.urls.path_compatibility.ending_with_dollar" + ) def test_ending_with_dollar(self): result = check_url_config(None) self.assertEqual(len(result), 1) warning = result[0] - self.assertEqual(warning.id, '2_0.W001') + self.assertEqual(warning.id, "2_0.W001") expected_msg = "Your URL pattern 'ending-with-dollar$' has a route" self.assertIn(expected_msg, warning.msg) class CheckCustomErrorHandlersTests(SimpleTestCase): - @override_settings( - ROOT_URLCONF='check_framework.urls.bad_function_based_error_handlers', + 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_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', - )) + with self.subTest("handler{}".format(code)): + self.assertEqual( + error, + Error( + "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', + 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 '', + 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", ), - id='urls.E007', - )) + ) - @override_settings(ROOT_URLCONF='check_framework.urls.bad_error_handlers_invalid_path') + @override_settings( + ROOT_URLCONF="check_framework.urls.bad_error_handlers_invalid_path" + ) def test_bad_handlers_invalid_path(self): result = check_url_config(None) paths = [ - 'django.views.bad_handler', - 'django.invalid_module.bad_handler', - 'invalid_module.bad_handler', - 'django', + "django.views.bad_handler", + "django.invalid_module.bad_handler", + "invalid_module.bad_handler", + "django", ] hints = [ "Could not import '{}'. View does not exist in module django.views.", @@ -228,22 +259,27 @@ class CheckCustomErrorHandlersTests(SimpleTestCase): "Could not import '{}'. The path must be fully qualified.", ] for code, path, hint, error in zip([400, 403, 404, 500], paths, hints, result): - with self.subTest('handler{}'.format(code)): - self.assertEqual(error, Error( - "The custom handler{} view '{}' could not be imported.".format(code, path), - hint=hint.format(path), - id='urls.E008', - )) + with self.subTest("handler{}".format(code)): + self.assertEqual( + error, + Error( + "The custom handler{} view '{}' could not be imported.".format( + code, path + ), + hint=hint.format(path), + id="urls.E008", + ), + ) @override_settings( - ROOT_URLCONF='check_framework.urls.good_function_based_error_handlers', + 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', + ROOT_URLCONF="check_framework.urls.good_class_based_error_handlers", ) def test_good_class_based_handlers(self): result = check_url_config(None) @@ -251,25 +287,24 @@ class CheckCustomErrorHandlersTests(SimpleTestCase): class CheckURLSettingsTests(SimpleTestCase): - - @override_settings(STATIC_URL='a/', MEDIA_URL='b/') + @override_settings(STATIC_URL="a/", MEDIA_URL="b/") def test_slash_no_errors(self): self.assertEqual(check_url_settings(None), []) - @override_settings(STATIC_URL='', MEDIA_URL='') + @override_settings(STATIC_URL="", MEDIA_URL="") def test_empty_string_no_errors(self): self.assertEqual(check_url_settings(None), []) - @override_settings(STATIC_URL='noslash') + @override_settings(STATIC_URL="noslash") def test_static_url_no_slash(self): - self.assertEqual(check_url_settings(None), [E006('STATIC_URL')]) + self.assertEqual(check_url_settings(None), [E006("STATIC_URL")]) - @override_settings(STATIC_URL='slashes//') + @override_settings(STATIC_URL="slashes//") def test_static_url_double_slash_allowed(self): # The check allows for a double slash, presuming the user knows what # they are doing. self.assertEqual(check_url_settings(None), []) - @override_settings(MEDIA_URL='noslash') + @override_settings(MEDIA_URL="noslash") def test_media_url_no_slash(self): - self.assertEqual(check_url_settings(None), [E006('MEDIA_URL')]) + self.assertEqual(check_url_settings(None), [E006("MEDIA_URL")]) |
