From aa6860fc6ceb48819caa41273ba18b3e205896e0 Mon Sep 17 00:00:00 2001 From: Ivan Gerasimov Date: Sun, 27 Sep 2026 15:35:21 +0300 Subject: [PATCH] =?UTF-8?q?test:=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=BD?= =?UTF-8?q?=D0=B5=20=D0=B7=D0=B0=D0=B2=D0=B8=D1=81=D1=8F=D1=82=20=D0=BE?= =?UTF-8?q?=D1=82=20LLM-=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BA?= =?UTF-8?q?=20=D0=BB=D0=B8=D1=87=D0=BD=D0=BE=D0=B3=D0=BE=20.env=20=D0=B8?= =?UTF-8?q?=20=D1=81=D0=B5=D1=82=D0=B8=20WSL2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/tests/conftest.py | 27 +++++++++++++++++++++++++++ backend/tests/test_profile.py | 2 +- backend/tests/test_ws.py | 2 +- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/backend/tests/conftest.py b/backend/tests/conftest.py index efd808e..c2caf51 100644 --- a/backend/tests/conftest.py +++ b/backend/tests/conftest.py @@ -12,6 +12,20 @@ from pathlib import Path from urllib.parse import urlparse os.environ.setdefault("DEV_AUTH_BYPASS", "true") +# Тесты ждут локальную модель по умолчанию. Личный backend/.env с облачным +# провайдером иначе валит проверки офлайн-гарда; переменные окружения +# перекрывают .env, а живые проверки test_llm.py выставляют свои поверх. +# Рекомендации Vikhr выключены: на WSL2 подключение к закрытому loopback-порту +# висит до таймаута, и финиш занятия ждал бы 6 с. Тесты рекомендаций +# подменяют coach сами. +os.environ.update({ + "LLM_PROVIDER": "local", + "LLM_BASE_URL": "http://127.0.0.1:18080/v1", + "LLM_API_KEY": "", + "LLM_MODEL_CALLER": "Qwen3-1.7B", + "LLM_MODEL_JUDGE": "", + "ASSESSMENT_FEEDBACK_ENABLED": "false", +}) import pytest # noqa: E402 @@ -36,6 +50,19 @@ def postgres_access(): pytest.skip(f"PostgreSQL unavailable ({exc})") +@pytest.fixture(scope="module") +def template_caller(): + """Звонящий без модели: сквозные тесты занятия ждут заготовки и офлайн- + ответы. С моделью по умолчанию (loopback Qwen) фабрика выбрала бы + LlmCaller и ждала неподнятый сервер.""" + from app.dialog import factory + + settings = get_settings().model_copy(update={"llm_provider": "disabled"}) + with pytest.MonkeyPatch.context() as patch: + patch.setattr(factory, "get_settings", lambda: settings) + yield + + @pytest.fixture(autouse=True, scope="session") def _dev_auth(): """Флаг обхода читается один раз при создании настроек.""" diff --git a/backend/tests/test_profile.py b/backend/tests/test_profile.py index 836ce2d..50ac40e 100644 --- a/backend/tests/test_profile.py +++ b/backend/tests/test_profile.py @@ -21,7 +21,7 @@ from app.session.hub import hub @pytest.fixture(scope="module") -def client(): +def client(template_caller): # Доступность базы проверяется подключением к порту: синхронного драйвера # в проекте нет, и попытка проверить им даёт ложный пропуск теста. import socket diff --git a/backend/tests/test_ws.py b/backend/tests/test_ws.py index fc1a767..793f207 100644 --- a/backend/tests/test_ws.py +++ b/backend/tests/test_ws.py @@ -22,7 +22,7 @@ from app.session.store import MemorySessionStore @pytest.fixture -def client(monkeypatch): +def client(monkeypatch, template_caller): async def audit_in_memory(*_args, **_kwargs): return None