/
liquid-g
/
liquid-code
Обзор
Документация
Войти
/
liquid-g
/
liquid-code
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop-0.2.0
tests/test_middleware_static.py
211 строк
8 KB
User
ci: настроен Black и flake8 для автоматического форматирования кода
04 июл 2026, 08:14
04 июл 2026, 08:14
4778ed6
Код
Авторство
О чём код?
"""Тесты для middleware StaticFilesMiddleware.""" import pytest import tempfile import os from unittest.mock import MagicMock from liquidcode.middleware.static import StaticFilesMiddleware class TestStaticFilesMiddleware: """Тесты StaticFilesMiddleware.""" def setup_method(self): """Создание временной директории для статики.""" self.tmpdir = tempfile.mkdtemp() self.static_dir = os.path.join(self.tmpdir, "public") os.makedirs(self.static_dir) def teardown_method(self): """Очистка временной директории.""" import shutil shutil.rmtree(self.tmpdir) def test_init_with_defaults(self): """Инициализация с дефолтными параметрами.""" middleware = StaticFilesMiddleware() assert "public" in middleware.directory assert middleware.prefix == "/static" def test_init_with_custom_params(self): """Инициализация с кастомными параметрами.""" middleware = StaticFilesMiddleware(directory="assets", prefix="/assets") assert "assets" in middleware.directory assert middleware.prefix == "/assets" def test_call_without_prefix(self): """Пропуск запроса без нужного префикса.""" middleware = StaticFilesMiddleware(directory=self.static_dir) mock_request = MagicMock() mock_request.get_path.return_value = "/other/path" mock_call_next = MagicMock() mock_call_next.return_value = "next_response" result = middleware(mock_request, mock_call_next) assert result == "next_response" mock_call_next.assert_called_once_with(mock_request) def test_call_with_empty_path_after_prefix(self): """Путь после префикса пустой.""" middleware = StaticFilesMiddleware(directory=self.static_dir) mock_request = MagicMock() mock_request.get_path.return_value = "/static/" mock_call_next = MagicMock() mock_call_next.return_value = "next_response" result = middleware(mock_request, mock_call_next) assert result == "next_response" def test_call_with_existing_file(self): """Отдача существующего файла.""" # Создаем тестовый файл test_file = os.path.join(self.static_dir, "test.txt") with open(test_file, "w") as f: f.write("Hello World") middleware = StaticFilesMiddleware(directory=self.static_dir) mock_request = MagicMock() mock_request.get_path.return_value = "/static/test.txt" mock_call_next = MagicMock() mock_call_next.return_value = "next_response" result = middleware(mock_request, mock_call_next) assert result.get_status() == 200 assert result.get_content() == b"Hello World" assert "Content-Type" in result.get_headers() def test_call_with_nonexistent_file(self): """Файл не существует.""" middleware = StaticFilesMiddleware(directory=self.static_dir) mock_request = MagicMock() mock_request.get_path.return_value = "/static/nonexistent.txt" mock_call_next = MagicMock() mock_call_next.return_value = "next_response" result = middleware(mock_request, mock_call_next) assert result == "next_response" def test_call_with_nested_file(self): """Отдача вложенного файла.""" subdir = os.path.join(self.static_dir, "subdir") os.makedirs(subdir) test_file = os.path.join(subdir, "nested.txt") with open(test_file, "w") as f: f.write("Nested content") middleware = StaticFilesMiddleware(directory=self.static_dir) mock_request = MagicMock() mock_request.get_path.return_value = "/static/subdir/nested.txt" mock_call_next = MagicMock() mock_call_next.return_value = "next_response" result = middleware(mock_request, mock_call_next) assert result.get_status() == 200 assert result.get_content() == b"Nested content" def test_call_path_traversal_prevention(self): """Предотвращение path traversal.""" # Создаем файл внутри static_dir test_file = os.path.join(self.static_dir, "test.txt") with open(test_file, "w") as f: f.write("Hello") middleware = StaticFilesMiddleware(directory=self.static_dir) mock_request = MagicMock() mock_request.get_path.return_value = "/static/../test.txt" mock_call_next = MagicMock() mock_call_next.return_value = "next_response" result = middleware(mock_request, mock_call_next) # Должен пропустить (не отдавать файл) assert result == "next_response" def test_call_with_html_file(self): """Отдача HTML файла.""" test_file = os.path.join(self.static_dir, "page.html") with open(test_file, "w") as f: f.write("<html></html>") middleware = StaticFilesMiddleware(directory=self.static_dir) mock_request = MagicMock() mock_request.get_path.return_value = "/static/page.html" mock_call_next = MagicMock() mock_call_next.return_value = "next_response" result = middleware(mock_request, mock_call_next) assert result.get_status() == 200 assert "text/html" in result.get_headers().get("Content-Type", "") def test_call_with_unknown_extension(self): """Отдача файла с неизвестным расширением.""" test_file = os.path.join(self.static_dir, "custom.xyz") with open(test_file, "w") as f: f.write("Custom") middleware = StaticFilesMiddleware(directory=self.static_dir) mock_request = MagicMock() mock_request.get_path.return_value = "/static/custom.xyz" mock_call_next = MagicMock() mock_call_next.return_value = "next_response" result = middleware(mock_request, mock_call_next) assert result.get_status() == 200 assert result.get_headers().get("Content-Type") == "application/octet-stream" def test_call_binary_file(self): """Отдача бинарного файла.""" test_file = os.path.join(self.static_dir, "binary.bin") with open(test_file, "wb") as f: f.write(b"\\x00\\x01\\x02\\x03") middleware = StaticFilesMiddleware(directory=self.static_dir) mock_request = MagicMock() mock_request.get_path.return_value = "/static/binary.bin" mock_call_next = MagicMock() mock_call_next.return_value = "next_response" result = middleware(mock_request, mock_call_next) assert result.get_status() == 200 assert result.get_content() == b"\\x00\\x01\\x02\\x03" def test_call_with_exception(self): """Обработка ошибки чтения файла.""" middleware = StaticFilesMiddleware(directory=self.static_dir) mock_request = MagicMock() mock_request.get_path.return_value = "/static/test.txt" mock_call_next = MagicMock() mock_call_next.return_value = "next_response" # Подменяем os.path.isfile чтобы вернуть True, но open выбросит ошибку original_isfile = os.path.isfile os.path.isfile = lambda x: True try: result = middleware(mock_request, mock_call_next) assert result == "next_response" finally: os.path.isfile = original_isfile