feat(frontend): configure vendor build scripts and fallback templates

Co-authored-by: Junie <junie@jetbrains.com>
This commit is contained in:
2026-10-04 23:04:45 +03:00
co-authored by Junie
parent 73f68e9a2f
commit 1cc070b7c0
7 changed files with 305 additions and 28 deletions
+102
View File
@@ -0,0 +1,102 @@
from pathlib import Path
from django.test import TestCase, Client, override_settings
from django.urls import reverse
from django.conf import settings
@override_settings(SECURE_SSL_REDIRECT=False)
class VendorAssetsAndFallbackTestCase(TestCase):
"""
Тестирование наличия вендорных ассетов и корректности подключения fallback в шаблоне base.html.
"""
def setUp(self):
self.client = Client()
def test_vendor_static_files_exist(self):
"""Проверяем, что все скомпилированные/скопированные локальные файлы присутствуют в статике."""
static_dir = settings.BASE_DIR.parent / 'public' / 'static'
required_files = [
'vendor/bootstrap/bootstrap.min.css',
'vendor/bootstrap/bootstrap.bundle.min.js',
'vendor/bootstrap-icons/bootstrap-icons.min.css',
'vendor/bootstrap-icons/fonts/bootstrap-icons.woff2',
'vendor/bootstrap-icons/fonts/bootstrap-icons.woff',
'vendor/htmx/htmx.min.js',
'vendor/alpinejs/cdn.min.js',
'codemirror/editor.js',
]
for rel_path in required_files:
file_path = static_dir / rel_path
self.assertTrue(
file_path.exists(),
f"Файл вендора не найден в статике: {rel_path} (ожидался по пути {file_path})"
)
self.assertGreater(
file_path.stat().st_size,
0,
f"Файл вендора пуст: {rel_path}"
)
def test_base_template_fallback_tags(self):
"""Проверяем, что главная страница отдает теги с fallback-обработкой ошибок загрузки с CDN."""
response = self.client.get(reverse('index'))
self.assertEqual(response.status_code, 200)
content = response.content.decode('utf-8')
# Проверка fallback для Bootstrap CSS
self.assertIn('bootstrap.min.css', content)
self.assertIn("vendor/bootstrap/bootstrap.min.css", content)
# Проверка fallback для Bootstrap Icons
self.assertIn('bootstrap-icons.min.css', content)
self.assertIn("vendor/bootstrap-icons/bootstrap-icons.min.css", content)
# Проверка fallback для HTMX
self.assertIn('htmx.org', content)
self.assertIn('window.htmx || document.write', content)
self.assertIn('vendor/htmx/htmx.min.js', content)
# Проверка fallback для Alpine.js
self.assertIn('alpinejs', content)
self.assertIn('vendor/alpinejs/cdn.min.js', content)
# Проверка fallback для Bootstrap JS
self.assertIn('bootstrap.bundle.min.js', content)
self.assertIn('window.bootstrap || document.write', content)
self.assertIn('vendor/bootstrap/bootstrap.bundle.min.js', content)
@override_settings(SECURE_SSL_REDIRECT=False)
class TypographViewsTestCase(TestCase):
"""
Базовые тесты функциональности представлений типографа.
"""
def setUp(self):
self.client = Client()
def test_process_text_endpoint(self):
"""Проверка эндпоинта типографирования текста."""
response = self.client.post(
reverse('process_text'),
data={
'text': 'Тест "кавычек" и предлога в тексте.',
'langs': 'ru',
'quotes': 'on',
'unbreakables': 'on',
}
)
self.assertEqual(response.status_code, 200)
self.assertIn('X-Processing-Time', response.headers)
content = response.content.decode('utf-8')
# Проверяем типографирование кавычек «ёлочки»
self.assertIn('«кавычек»', content)
def test_stats_summary_endpoint(self):
"""Проверка эндпоинта сводной статистики."""
response = self.client.get(reverse('stats_summary'))
self.assertEqual(response.status_code, 200)