diff --git a/tests/test_webui_env_preflight.py b/tests/test_webui_env_preflight.py new file mode 100644 index 0000000..5b84d86 --- /dev/null +++ b/tests/test_webui_env_preflight.py @@ -0,0 +1,89 @@ +import pytest +import yaml + +pytest.importorskip("gradio") + +from skillopt_webui import app as webui_app + + +def _write_config(tmp_path, model): + config_path = tmp_path / "config.yaml" + config_path.write_text( + yaml.safe_dump({ + "model": model, + "env": {"name": "searchqa"}, + }), + encoding="utf-8", + ) + return str(config_path) + + +def test_build_training_env_loads_project_dotenv(tmp_path, monkeypatch): + monkeypatch.setattr(webui_app, "PROJECT_ROOT", tmp_path) + (tmp_path / ".env").write_text( + "\n".join([ + "export QWEN_CHAT_BASE_URL=http://qwen.example/v1", + "QWEN_CHAT_MODEL=test-model", + "QWEN_CHAT_API_KEY='secret-value'", + ]), + encoding="utf-8", + ) + + env = webui_app.build_training_env() + + assert env["QWEN_CHAT_BASE_URL"] == "http://qwen.example/v1" + assert env["QWEN_CHAT_MODEL"] == "test-model" + assert env["QWEN_CHAT_API_KEY"] == "secret-value" + + +def test_preflight_reports_missing_openai_chat_endpoint(tmp_path, monkeypatch): + monkeypatch.delenv("AZURE_OPENAI_ENDPOINT", raising=False) + monkeypatch.delenv("OPTIMIZER_AZURE_OPENAI_ENDPOINT", raising=False) + monkeypatch.delenv("TARGET_AZURE_OPENAI_ENDPOINT", raising=False) + config_path = _write_config( + tmp_path, + { + "backend": "qwen", + "optimizer_backend": "openai_chat", + "target_backend": "openai_chat", + }, + ) + + error = webui_app.validate_training_config(config_path, {}) + + assert "missing Azure/OpenAI-compatible endpoint for optimizer, target" in error + assert "model.backend is qwen" in error + + +def test_preflight_reports_unreachable_qwen_endpoint(tmp_path, monkeypatch): + monkeypatch.setattr(webui_app, "_can_connect_to_url", lambda _url: False) + config_path = _write_config( + tmp_path, + { + "backend": "qwen", + "optimizer_backend": "qwen_chat", + "target_backend": "qwen_chat", + "qwen_chat_base_url": "http://127.0.0.1:9/v1", + }, + ) + + error = webui_app.validate_training_config(config_path, {}) + + assert "cannot connect to qwen_chat endpoint" in error + assert "127.0.0.1:9" in error + + +def test_preflight_accepts_reachable_qwen_endpoint(tmp_path, monkeypatch): + seen_urls = [] + monkeypatch.setattr(webui_app, "_can_connect_to_url", lambda url: seen_urls.append(url) or True) + config_path = _write_config( + tmp_path, + { + "optimizer_backend": "qwen_chat", + "target_backend": "qwen_chat", + "qwen_chat_base_url": "http://qwen.example/v1", + }, + ) + + assert webui_app.validate_training_config(config_path, {}) is None + assert seen_urls == ["http://qwen.example/v1", "http://qwen.example/v1"]