feat: add branded error pages
Some checks failed
CI / python-validation (push) Has been cancelled
CI / docker-release-gate (push) Has been cancelled
i18n / compile-translations (push) Has been cancelled

This commit is contained in:
Md Bayazid Bostame
2026-04-01 17:34:27 +02:00
parent baf53a3274
commit 6b305e930d
11 changed files with 233 additions and 6 deletions

View File

@@ -0,0 +1,28 @@
from django.core.exceptions import PermissionDenied
from django.http import HttpResponse
from django.urls import include, path
def ok_view(request):
return HttpResponse('ok')
def deny_view(request):
raise PermissionDenied('forbidden')
def explode_view(request):
raise RuntimeError('boom')
handler400 = 'workflows.error_views.bad_request'
handler403 = 'workflows.error_views.permission_denied'
handler404 = 'workflows.error_views.not_found'
handler500 = 'workflows.error_views.server_error'
urlpatterns = [
path('healthz/', ok_view, name='healthz'),
path('raise-403/', deny_view, name='raise_403'),
path('raise-500/', explode_view, name='raise_500'),
path('', include('workflows.urls')),
]

View File

@@ -0,0 +1,62 @@
from django.test import Client, RequestFactory, TestCase, override_settings
from workflows.error_views import csrf_failure
@override_settings(
DEBUG=False,
ROOT_URLCONF='workflows.tests.error_test_urls',
ALLOWED_HOSTS=['testserver'],
)
class ErrorPageTests(TestCase):
def setUp(self):
self.client = Client()
self.client.raise_request_exception = False
def test_custom_404_page_is_rendered(self):
response = self.client.get('/missing-page/')
self.assertEqual(response.status_code, 404)
self.assertTemplateUsed(response, 'workflows/errors/error_page.html')
self.assertContains(response, '404', status_code=404)
def test_custom_403_page_is_rendered(self):
response = self.client.get('/raise-403/')
self.assertEqual(response.status_code, 403)
self.assertTemplateUsed(response, 'workflows/errors/error_page.html')
self.assertContains(response, '403', status_code=403)
def test_custom_500_page_is_rendered(self):
response = self.client.get('/raise-500/')
self.assertEqual(response.status_code, 500)
self.assertTemplateUsed(response, 'workflows/errors/error_page.html')
self.assertContains(response, '500', status_code=500)
def test_csrf_failure_view_uses_custom_400_page(self):
request = RequestFactory().post('/test/')
response = csrf_failure(request)
self.assertEqual(response.status_code, 400)
self.assertContains(response, '400', status_code=400)
@override_settings(
DEBUG=True,
FORCE_BRANDED_ERROR_PAGES=True,
ROOT_URLCONF='workflows.tests.error_test_urls',
ALLOWED_HOSTS=['testserver'],
)
class ForcedBrandedErrorPageTests(TestCase):
def setUp(self):
self.client = Client()
self.client.raise_request_exception = False
def test_missing_url_uses_branded_404_even_with_debug_enabled(self):
response = self.client.get('/missing-page/')
self.assertEqual(response.status_code, 404)
self.assertTemplateUsed(response, 'workflows/errors/error_page.html')
self.assertContains(response, '404', status_code=404)