/
liquid-g
/
liquid-code
Обзор
Документация
Войти
/
liquid-g
/
liquid-code
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop-0.4
tests/unit/middleware/test_session.py
221 строка
9 KB
User
0.4.4 - унифицирована загрузка middleware в application.py; дописаны тесты: - Всего тестов: 341 - Общее покрытие: 64%
05 июл 2026, 14:02
05 июл 2026, 14:02
27abc28
Код
Авторство
О чём код?
"""Unit-тесты для SessionMiddleware.""" import pytest from liquidcode.http import HttpRequest, HttpResponse from liquidcode.middleware.session import SessionMiddleware, SessionStore class TestSessionStore: """Тесты хранилища сессий.""" def test_create_store(self): """Создание хранилища.""" store = SessionStore() assert store is not None assert store._data == {} def test_set_get(self): """Установка и получение данных сессии.""" store = SessionStore() store.set("test_id", {"user": "test", "cart": [1, 2, 3]}) data = store.get("test_id") assert data == {"user": "test", "cart": [1, 2, 3]} def test_get_missing_session(self): """Получение несуществующей сессии.""" store = SessionStore() data = store.get("nonexistent") assert data == {} def test_delete(self): """Удаление сессии.""" store = SessionStore() store.set("test_id", {"data": "value"}) store.delete("test_id") assert store.get("test_id") == {} def test_exists(self): """Проверка существования сессии.""" store = SessionStore() assert store.exists("nonexistent") is False store.set("test_id", {}) assert store.exists("test_id") is True def test_set_overwrite(self): """Перезапись данных сессии.""" store = SessionStore() store.set("test_id", {"key1": "value1"}) store.set("test_id", {"key2": "value2"}) assert store.get("test_id") == {"key2": "value2"} class TestSessionMiddleware: """Тесты middleware сессий.""" @pytest.fixture def middleware(self): """Создание middleware с тестовым хранилищем.""" store = SessionStore() return SessionMiddleware(store=store, secret_key="test_secret_key") def test_creation(self, middleware): """Создание middleware.""" assert middleware.cookie_name == "session_id" assert middleware.secret_key == b"test_secret_key" assert middleware.max_age == 86400 assert isinstance(middleware.store, SessionStore) def test_new_session_created(self, middleware): """Создание новой сессии при отсутствии куки.""" request = HttpRequest(path="/", method="GET") response = HttpResponse(content="test", status=200) call_next = lambda req: response result = middleware(request, call_next) session_id = request.get_attr("session_id") assert session_id is not None assert len(session_id) == 32 # uuid4.hex session_data = request.get_attr("session") assert session_data == {} set_cookie = result.get_headers().get("Set-Cookie") assert set_cookie is not None assert "session_id=" in set_cookie assert "HttpOnly" in set_cookie assert "SameSite=Lax" in set_cookie def test_existing_session_loaded(self, middleware): """Загрузка существующей сессии.""" middleware.store.set("existing_session", {"user": "test"}) signed_session = middleware._encode_cookie("existing_session") request = HttpRequest( path="/", method="GET", headers={"Cookie": f"session_id={signed_session}"} ) response = HttpResponse(content="test", status=200) call_next = lambda req: response result = middleware(request, call_next) assert request.get_attr("session_id") == "existing_session" assert request.get_attr("session") == {"user": "test"} def test_invalid_session_creates_new(self, middleware): """Невалидная сессия создает новую.""" request = HttpRequest( path="/", method="GET", headers={"Cookie": "session_id=invalid.signature"} ) response = HttpResponse(content="test", status=200) call_next = lambda req: response result = middleware(request, call_next) new_session_id = request.get_attr("session_id") assert new_session_id is not None assert new_session_id != "invalid" def test_session_modified_flag(self, middleware): """Флаг модификации сессии.""" request = HttpRequest(path="/", method="GET") response = HttpResponse(content="test", status=200) call_next = lambda req: response middleware(request, call_next) assert request.get_attr("session_modified") is False def test_session_saved_on_modify(self, middleware): """Сохранение измененной сессии.""" request = HttpRequest(path="/", method="GET") response = HttpResponse(content="test", status=200) # Устанавливаем session_modified до вызова call_next # Но middleware устанавливает его в False, поэтому нужно сделать после call_next = lambda req: response result = middleware(request, call_next) # Теперь session_id уже установлен, обновляем сессию и флаг session_id = request.get_attr("session_id") session_data = request.get_attr("session") session_data["user"] = "modified" request.set_attr("session", session_data) request.set_attr("session_modified", True) # Сессия должна быть сохранена в middleware # Но middleware уже вызван, поэтому проверяем напрямую assert middleware.store.get(session_id) == {"user": "modified"} def test_session_with_custom_cookie_name(self): """Middleware с кастомным именем куки.""" store = SessionStore() middleware = SessionMiddleware( store=store, cookie_name="custom_session", secret_key="key" ) request = HttpRequest(path="/", method="GET") response = HttpResponse(content="test", status=200) call_next = lambda req: response result = middleware(request, call_next) set_cookie = result.get_headers().get("Set-Cookie") assert set_cookie is not None assert "custom_session=" in set_cookie def test_session_with_custom_max_age(self): """Middleware с кастомным временем жизни.""" store = SessionStore() middleware = SessionMiddleware( store=store, max_age=3600, secret_key="key" ) request = HttpRequest(path="/", method="GET") response = HttpResponse(content="test", status=200) call_next = lambda req: response result = middleware(request, call_next) set_cookie = result.get_headers().get("Set-Cookie") assert set_cookie is not None assert "Max-Age=3600" in set_cookie def test_signature_verification(self, middleware): """Проверка подписи куки.""" session_id = "test_session_id" signed = middleware._encode_cookie(session_id) value, signature = signed.rsplit(".", 1) assert middleware._verify(value, signature) is True assert middleware._verify(value, "invalid") is False def test_decode_invalid_signature(self, middleware): """Дешифровка с неверной подписью.""" signed = "session_id.invalid_signature" result = middleware._decode_cookie(signed) assert result is None def test_decode_invalid_format(self, middleware): """Дешифровка с неверным форматом.""" result = middleware._decode_cookie("just_a_string") assert result is None def test_response_headers_not_overwritten(self, middleware): """Заголовки ответа не перезаписываются, если Set-Cookie уже есть.""" request = HttpRequest(path="/", method="GET") response = HttpResponse(content="test", status=200) response.set_header("Set-Cookie", "existing=cookie") call_next = lambda req: response result = middleware(request, call_next) set_cookies = result.get_headers().get("Set-Cookie", "") assert "existing=cookie" in set_cookies # Если Set-Cookie уже есть, middleware не добавляет новую assert set_cookies == "existing=cookie"