test: тесты не зависят от LLM-настроек личного .env и сети WSL2
This commit is contained in:
parent
a2ce08f46a
commit
aa6860fc6c
3 changed files with 29 additions and 2 deletions
|
|
@ -12,6 +12,20 @@ from pathlib import Path
|
||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
|
|
||||||
os.environ.setdefault("DEV_AUTH_BYPASS", "true")
|
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
|
import pytest # noqa: E402
|
||||||
|
|
||||||
|
|
@ -36,6 +50,19 @@ def postgres_access():
|
||||||
pytest.skip(f"PostgreSQL unavailable ({exc})")
|
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")
|
@pytest.fixture(autouse=True, scope="session")
|
||||||
def _dev_auth():
|
def _dev_auth():
|
||||||
"""Флаг обхода читается один раз при создании настроек."""
|
"""Флаг обхода читается один раз при создании настроек."""
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ from app.session.hub import hub
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(scope="module")
|
@pytest.fixture(scope="module")
|
||||||
def client():
|
def client(template_caller):
|
||||||
# Доступность базы проверяется подключением к порту: синхронного драйвера
|
# Доступность базы проверяется подключением к порту: синхронного драйвера
|
||||||
# в проекте нет, и попытка проверить им даёт ложный пропуск теста.
|
# в проекте нет, и попытка проверить им даёт ложный пропуск теста.
|
||||||
import socket
|
import socket
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ from app.session.store import MemorySessionStore
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def client(monkeypatch):
|
def client(monkeypatch, template_caller):
|
||||||
async def audit_in_memory(*_args, **_kwargs):
|
async def audit_in_memory(*_args, **_kwargs):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue