NarratoAI/app/config/test_config_bootstrap_unittest.py
linyq 16dbbf3461 refactor(config): 重构配置系统以支持默认值和模型名称规范化
- 新增 defaults.py 提供共享默认配置和模型名称处理工具
- 重构 config.py 使用默认值填充缺失配置
- 修改 openai_compatible_provider.py 简化模型名称处理逻辑
- 更新 WebUI 组件使用新的默认值系统
- 添加测试用例验证配置引导和模型名称处理
2026-03-28 00:34:01 +08:00

84 lines
3.0 KiB
Python

import tempfile
import unittest
from pathlib import Path
import tomllib
from app.config import config as cfg
from app.config.defaults import (
get_openai_compatible_ui_values,
normalize_openai_compatible_model_name,
)
class ConfigBootstrapDefaultsTests(unittest.TestCase):
def test_load_config_bootstraps_webui_llm_defaults(self):
original_root_dir = cfg.root_dir
original_config_file = cfg.config_file
with tempfile.TemporaryDirectory() as tmp_dir:
tmp_path = Path(tmp_dir)
example_file = tmp_path / "config.example.toml"
example_file.write_text(
"""
[app]
vision_llm_provider = "openai"
vision_openai_model_name = "gemini/gemini-2.0-flash-lite"
vision_openai_api_key = ""
vision_openai_base_url = ""
text_llm_provider = "openai"
text_openai_model_name = "deepseek/deepseek-chat"
text_openai_api_key = ""
text_openai_base_url = ""
hide_config = true
""".strip()
+ "\n",
encoding="utf-8",
)
config_path = tmp_path / "config.toml"
try:
cfg.root_dir = str(tmp_path)
cfg.config_file = str(config_path)
config_data = cfg.load_config()
saved_config = tomllib.loads(config_path.read_text(encoding="utf-8"))
finally:
cfg.root_dir = original_root_dir
cfg.config_file = original_config_file
self.assertEqual("openai", config_data["app"]["vision_llm_provider"])
self.assertEqual("Qwen/Qwen3.5-122B-A10B", config_data["app"]["vision_openai_model_name"])
self.assertEqual("https://api.siliconflow.cn/v1", config_data["app"]["vision_openai_base_url"])
self.assertEqual("openai", config_data["app"]["text_llm_provider"])
self.assertEqual("Pro/zai-org/GLM-5", config_data["app"]["text_openai_model_name"])
self.assertEqual("https://api.siliconflow.cn/v1", config_data["app"]["text_openai_base_url"])
self.assertEqual("Qwen/Qwen3.5-122B-A10B", saved_config["app"]["vision_openai_model_name"])
self.assertEqual("Pro/zai-org/GLM-5", saved_config["app"]["text_openai_model_name"])
self.assertTrue(saved_config["app"]["hide_config"])
class OpenAICompatibleModelDefaultsTests(unittest.TestCase):
def test_ui_keeps_full_model_name_and_openai_provider(self):
provider, model_name = get_openai_compatible_ui_values(
"Qwen/Qwen3.5-122B-A10B",
"fallback-model",
)
self.assertEqual("openai", provider)
self.assertEqual("Qwen/Qwen3.5-122B-A10B", model_name)
def test_normalize_only_strips_openai_prefix(self):
self.assertEqual(
"Qwen/Qwen3.5-122B-A10B",
normalize_openai_compatible_model_name("openai/Qwen/Qwen3.5-122B-A10B"),
)
self.assertEqual(
"Qwen/Qwen3.5-122B-A10B",
normalize_openai_compatible_model_name("Qwen/Qwen3.5-122B-A10B"),
)
if __name__ == "__main__":
unittest.main()