feat(config): default to WebSocket and migrate saved HTTP settings

This commit is contained in:
chenmingxuan committed 2026-11-04 17:45:52 +08:00
1 parent 2a3f43fb60
commit 04022f2eaf
18 files changed
+244 -58

No files matched your search

+117
View File
@@ -0,0 +1,117 @@
import json
import os
from pathlib import Path
import subprocess
import sys
from dotenv import dotenv_values
import pytest
from artemis.config.environment import (
migrate_transport_default,
persist_environment,
TRANSPORT_DEFAULT_VERSION_KEY,
)
@pytest.fixture(autouse=True)
def isolate_transport(monkeypatch):
monkeypatch.setenv("OPENAI_TRANSPORT", "http")
monkeypatch.delenv(TRANSPORT_DEFAULT_VERSION_KEY, raising=False)
@pytest.mark.parametrize("old", ["", "OPENAI_TRANSPORT=http\n", "OPENAI_TRANSPORT=websocket\n"])
def test_upgrade_migrates_legacy_preferences_once_and_preserves_config(tmp_path, old):
path = tmp_path / ".env"
preserved = (
"# 用户注释\nOPENAI_API_KEY='test-secret'\nOPENAI_BASE_URL=https://test.invalid/v1\n"
)
path.write_text(preserved + old, encoding="utf-8")
assert migrate_transport_default(path) is True
saved = dotenv_values(path)
assert saved["OPENAI_TRANSPORT"] == os.environ["OPENAI_TRANSPORT"] == "websocket"
assert saved[TRANSPORT_DEFAULT_VERSION_KEY] == "1"
assert path.read_text(encoding="utf-8").startswith(preserved)
previous = path.read_bytes()
assert migrate_transport_default(path) is False
assert path.read_bytes() == previous
persist_environment(path, {"OPENAI_TRANSPORT": "http"})
assert migrate_transport_default(path) is False
assert dotenv_values(path)["OPENAI_TRANSPORT"] == "http"
def test_failed_replace_preserves_original_and_can_retry(tmp_path, monkeypatch):
from artemis.config import environment
path = tmp_path / ".env"
original = "OPENAI_TRANSPORT=http\nUNRELATED=keep\n"
path.write_text(original, encoding="utf-8")
def fail(*_):
raise OSError("simulated disk error")
with monkeypatch.context() as patch:
patch.setattr(environment.os, "replace", fail)
with pytest.raises(OSError):
migrate_transport_default(path)
assert path.read_text(encoding="utf-8") == original
assert os.environ["OPENAI_TRANSPORT"] == "http"
assert not list(tmp_path.glob(".env-*"))
assert migrate_transport_default(path) is True
@pytest.mark.parametrize("version", [1, 2])
def test_completed_migration_preserves_http_without_write_access(tmp_path, monkeypatch, version):
from artemis.config import environment
path = tmp_path / ".env"
path.write_text(
f"OPENAI_TRANSPORT=http\n{TRANSPORT_DEFAULT_VERSION_KEY}={version}\n", encoding="utf-8"
)
def denied(*_, **__):
raise PermissionError("read-only deployment")
monkeypatch.setattr(environment, "FileLock", denied)
assert migrate_transport_default(path) is False
assert dotenv_values(path)["OPENAI_TRANSPORT"] == "http"
@pytest.mark.parametrize("new_install", [False, True])
def test_fresh_process_defaults_and_saved_opt_out(tmp_path, new_install):
path = tmp_path / ".env"
if not new_install:
path.write_text("OPENAI_TRANSPORT=http\n", encoding="utf-8")
env = {
k: v
for k, v in os.environ.items()
if k not in {"OPENAI_TRANSPORT", TRANSPORT_DEFAULT_VERSION_KEY}
}
env["ARTEMIS_APP_DIR"] = str(tmp_path)
env["PYTHONUTF8"] = "1"
env["PYTHONPATH"] = str(Path(__file__).resolve().parents[3])
code = """
import json
from artemis.config.settings import settings
from artemis.config.llm import LLM, parse_llm_config
from artemis.llm.router import ModelEndpoint
print(json.dumps([settings.OPENAI_TRANSPORT, LLM().transport, ModelEndpoint().transport, parse_llm_config().operator.transport]))
"""
def start():
result = subprocess.run(
[sys.executable, "-c", code],
cwd=tmp_path,
env=env,
capture_output=True,
text=True,
encoding="utf-8",
timeout=20,
check=True,
)
return json.loads(result.stdout.splitlines()[-1])
assert start() == ["websocket"] * 4
assert dotenv_values(path)[TRANSPORT_DEFAULT_VERSION_KEY] == "1"
persist_environment(path, {"OPENAI_TRANSPORT": "http"})
assert start() == ["http"] * 4