diff --git a/wagtail/admin/tests/tests.py b/wagtail/admin/tests/tests.py index 7951791ac2..ffe3d08636 100644 --- a/wagtail/admin/tests/tests.py +++ b/wagtail/admin/tests/tests.py @@ -331,17 +331,38 @@ class TestUserHasAnyPagePermission(TestCase, WagtailTestUtils): class Test404(TestCase, WagtailTestUtils): - def test_admin_404_template_used(self): + def test_admin_404_template_used_append_slash_true(self): self.login() - response = self.client.get('/admin/sdfgdsfgdsfgsdf') - self.assertEqual(response.status_code, 404) - self.assertTemplateUsed(response, 'wagtailadmin/404.html') + with self.settings(APPEND_SLASH=True): + response = self.client.get('/admin/sdfgdsfgdsfgsdf', follow=True) + + # Check 404 error after CommonMiddleware redirect + self.assertEqual(response.status_code, 404) + self.assertTemplateUsed(response, 'wagtailadmin/404.html') def test_not_logged_in_redirect(self): - response = self.client.get('/admin/sdfgdsfgdsfgsdf') + response = self.client.get('/admin/sdfgdsfgdsfgsdf/') # Check that the user was redirected to the login page and that next was set correctly - self.assertRedirects(response, reverse('wagtailadmin_login') + '?next=/admin/sdfgdsfgdsfgsdf') + self.assertRedirects(response, reverse('wagtailadmin_login') + '?next=/admin/sdfgdsfgdsfgsdf/') + + +class TestAdminURLAppendSlash(TestCase, WagtailTestUtils): + def setUp(self): + # Find root page + self.root_page = Page.objects.get(id=2) + + def test_return_correct_view_for_correct_url_without_ending_slash(self): + self.login() + with self.settings(APPEND_SLASH=True): + # Remove trailing slash from URL + response = self.client.get(reverse('wagtailadmin_explore_root')[:-1], follow=True) + + # Check that correct page is returned after CommonMiddleware redirect + self.assertEqual(response.status_code, 200) + self.assertTemplateUsed(response, 'wagtailadmin/pages/index.html') + self.assertEqual(Page.objects.get(id=1), response.context['parent_page']) + self.assertTrue(response.context['pages'].paginator.object_list.filter(id=self.root_page.id).exists()) class TestRemoveStaleContentTypes(TestCase): diff --git a/wagtail/admin/urls/__init__.py b/wagtail/admin/urls/__init__.py index 703d8cf20c..f97b09125f 100644 --- a/wagtail/admin/urls/__init__.py +++ b/wagtail/admin/urls/__init__.py @@ -93,13 +93,26 @@ urlpatterns += [ # Password reset path('password_reset/', include(wagtailadmin_password_reset_urls)), - - # Default view (will show 404 page) - # This must be the last URL in this file! - re_path(r'^', home.default), ] +# Default view (will show 404 page) +# This must be the last URL in this file! + +if settings.APPEND_SLASH: + # Only catch unrecognized patterns with a trailing slash + # and let CommonMiddleware handle adding a slash to every other pattern + urlpatterns += [ + re_path(r'^.*/$', home.default), + ] + +else: + # Catch all unrecognized patterns + urlpatterns += [ + re_path(r'^', home.default), + ] + + # Hook in our own 404 handler def display_custom_404(view_func): @functools.wraps(view_func)