0057f367a2
Единый стиль портала (логотип, тема, кнопки) через error_base.html: - 404 — страница не найдена - 403 — доступ запрещён (+ ссылка на IT-поддержку) - 500 — внутренняя ошибка (автономна: без request/context-процессоров) - 503 — технические работы MaintenanceModeMiddleware: при MAINTENANCE_MODE=True отдаёт 503 всем, кроме суперпользователей и путей входа/админки/статики (чтобы админ мог войти и выключить режим). По умолчанию выключен — поведение не меняется. - tests: рендер всех шаблонов, кастомный 404, режим техработ вкл/выкл/супер Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
64 lines
2.4 KiB
Python
64 lines
2.4 KiB
Python
from django.template.loader import render_to_string
|
|
from django.test import TestCase, override_settings
|
|
|
|
from core.test_utils import login_2fa
|
|
from core.tests_portal_access import make_employee
|
|
|
|
|
|
class ErrorTemplateRenderTests(TestCase):
|
|
"""Шаблоны ошибок валидны и содержат свой код/заголовок (500 рендерится
|
|
без request/context-процессоров — проверяем автономность)."""
|
|
|
|
def test_403_template(self):
|
|
html = render_to_string('403.html')
|
|
self.assertIn('403', html)
|
|
self.assertIn('Доступ запрещён', html)
|
|
|
|
def test_500_template(self):
|
|
html = render_to_string('500.html')
|
|
self.assertIn('500', html)
|
|
self.assertIn('Внутренняя ошибка сервера', html)
|
|
|
|
def test_503_template(self):
|
|
html = render_to_string('503.html')
|
|
self.assertIn('503', html)
|
|
self.assertIn('технические работы', html)
|
|
|
|
def test_404_template(self):
|
|
html = render_to_string('404.html')
|
|
self.assertIn('404', html)
|
|
self.assertIn('Страница не найдена', html)
|
|
|
|
|
|
class Custom404Tests(TestCase):
|
|
def test_unknown_url_uses_custom_404(self):
|
|
resp = self.client.get('/no-such-page-xyz-42/')
|
|
self.assertEqual(resp.status_code, 404)
|
|
self.assertContains(resp, 'Страница не найдена', status_code=404)
|
|
|
|
|
|
@override_settings(MAINTENANCE_MODE=True)
|
|
class MaintenanceModeTests(TestCase):
|
|
def test_anonymous_gets_503(self):
|
|
resp = self.client.get('/dashboard/')
|
|
self.assertEqual(resp.status_code, 503)
|
|
self.assertContains(resp, 'технические работы', status_code=503)
|
|
|
|
def test_login_path_allowed(self):
|
|
resp = self.client.get('/accounts/login/')
|
|
self.assertNotEqual(resp.status_code, 503)
|
|
|
|
def test_superuser_bypasses(self):
|
|
admin = make_employee(username='maint.super', is_staff=True, is_superuser=True)
|
|
login_2fa(self.client, admin)
|
|
resp = self.client.get('/dashboard/')
|
|
self.assertNotEqual(resp.status_code, 503)
|
|
|
|
|
|
class MaintenanceOffByDefaultTests(TestCase):
|
|
def test_no_503_when_flag_off(self):
|
|
user = make_employee()
|
|
login_2fa(self.client, user)
|
|
resp = self.client.get('/dashboard/', HTTP_HX_REQUEST='true')
|
|
self.assertEqual(resp.status_code, 200)
|