176 lines
7.2 KiB
Python
176 lines
7.2 KiB
Python
"""Unit tests for utils.provider_presets."""
|
|
|
|
import os
|
|
import unittest
|
|
from unittest.mock import patch
|
|
|
|
from utils.provider_presets import (
|
|
PROVIDER_PRESETS,
|
|
resolve_chat_model_config,
|
|
detect_provider_from_env,
|
|
)
|
|
|
|
|
|
class TestProviderPresets(unittest.TestCase):
|
|
"""Tests for the PROVIDER_PRESETS registry."""
|
|
|
|
def test_minimax_preset_exists(self):
|
|
self.assertIn("minimax", PROVIDER_PRESETS)
|
|
|
|
def test_minimax_preset_base_url(self):
|
|
self.assertEqual(
|
|
PROVIDER_PRESETS["minimax"]["base_url"],
|
|
"https://api.minimax.io/v1",
|
|
)
|
|
|
|
def test_minimax_preset_env_key(self):
|
|
self.assertEqual(PROVIDER_PRESETS["minimax"]["env_key"], "MINIMAX_API_KEY")
|
|
|
|
def test_minimax_preset_default_model(self):
|
|
self.assertEqual(PROVIDER_PRESETS["minimax"]["default_model"], "MiniMax-M3")
|
|
|
|
def test_minimax_preset_has_models_list(self):
|
|
models = PROVIDER_PRESETS["minimax"]["models"]
|
|
self.assertIn("MiniMax-M3", models)
|
|
self.assertIn("MiniMax-M2.7", models)
|
|
self.assertIn("MiniMax-M2.7-highspeed", models)
|
|
|
|
def test_minimax_preset_temperature_range(self):
|
|
lo, hi = PROVIDER_PRESETS["minimax"]["temperature_range"]
|
|
self.assertEqual(lo, 0.0)
|
|
self.assertEqual(hi, 1.0)
|
|
|
|
|
|
class TestResolveChatModelConfig(unittest.TestCase):
|
|
"""Tests for resolve_chat_model_config()."""
|
|
|
|
def test_unknown_provider_passes_through(self):
|
|
args = {"model_provider": "openai", "model": "gpt-4", "base_url": "https://example.com"}
|
|
result = resolve_chat_model_config(args)
|
|
self.assertEqual(result["model_provider"], "openai")
|
|
self.assertEqual(result["model"], "gpt-4")
|
|
self.assertEqual(result["base_url"], "https://example.com")
|
|
|
|
def test_no_model_provider_passes_through(self):
|
|
args = {"model": "gpt-4"}
|
|
result = resolve_chat_model_config(args)
|
|
self.assertEqual(result["model"], "gpt-4")
|
|
|
|
def test_minimax_rewrites_provider_to_openai(self):
|
|
args = {"model_provider": "minimax", "model": "MiniMax-M3", "api_key": "sk-test"}
|
|
result = resolve_chat_model_config(args)
|
|
self.assertEqual(result["model_provider"], "openai")
|
|
|
|
def test_minimax_sets_base_url(self):
|
|
args = {"model_provider": "minimax", "model": "MiniMax-M3", "api_key": "sk-test"}
|
|
result = resolve_chat_model_config(args)
|
|
self.assertEqual(result["base_url"], "https://api.minimax.io/v1")
|
|
|
|
def test_minimax_preserves_custom_base_url(self):
|
|
args = {
|
|
"model_provider": "minimax",
|
|
"model": "MiniMax-M3",
|
|
"api_key": "sk-test",
|
|
"base_url": "https://custom-proxy.example.com/v1",
|
|
}
|
|
result = resolve_chat_model_config(args)
|
|
self.assertEqual(result["base_url"], "https://custom-proxy.example.com/v1")
|
|
|
|
def test_minimax_defaults_model(self):
|
|
args = {"model_provider": "minimax", "api_key": "sk-test"}
|
|
result = resolve_chat_model_config(args)
|
|
self.assertEqual(result["model"], "MiniMax-M3")
|
|
|
|
def test_minimax_preserves_explicit_model(self):
|
|
args = {"model_provider": "minimax", "model": "MiniMax-M2.7-highspeed", "api_key": "sk-test"}
|
|
result = resolve_chat_model_config(args)
|
|
self.assertEqual(result["model"], "MiniMax-M2.7-highspeed")
|
|
|
|
@patch.dict(os.environ, {"MINIMAX_API_KEY": "env-key-123"})
|
|
def test_minimax_reads_api_key_from_env(self):
|
|
args = {"model_provider": "minimax", "model": "MiniMax-M3"}
|
|
result = resolve_chat_model_config(args)
|
|
self.assertEqual(result["api_key"], "env-key-123")
|
|
|
|
def test_minimax_prefers_explicit_api_key_over_env(self):
|
|
args = {"model_provider": "minimax", "model": "MiniMax-M3", "api_key": "explicit-key"}
|
|
with patch.dict(os.environ, {"MINIMAX_API_KEY": "env-key"}):
|
|
result = resolve_chat_model_config(args)
|
|
self.assertEqual(result["api_key"], "explicit-key")
|
|
|
|
def test_minimax_clamps_temperature_above_max(self):
|
|
args = {"model_provider": "minimax", "model": "MiniMax-M3", "api_key": "sk", "temperature": 1.5}
|
|
result = resolve_chat_model_config(args)
|
|
self.assertEqual(result["temperature"], 1.0)
|
|
|
|
def test_minimax_clamps_temperature_below_min(self):
|
|
args = {"model_provider": "minimax", "model": "MiniMax-M3", "api_key": "sk", "temperature": -0.5}
|
|
result = resolve_chat_model_config(args)
|
|
self.assertEqual(result["temperature"], 0.0)
|
|
|
|
def test_minimax_passes_valid_temperature(self):
|
|
args = {"model_provider": "minimax", "model": "MiniMax-M3", "api_key": "sk", "temperature": 0.7}
|
|
result = resolve_chat_model_config(args)
|
|
self.assertEqual(result["temperature"], 0.7)
|
|
|
|
def test_minimax_temperature_zero_allowed(self):
|
|
args = {"model_provider": "minimax", "model": "MiniMax-M3", "api_key": "sk", "temperature": 0.0}
|
|
result = resolve_chat_model_config(args)
|
|
self.assertEqual(result["temperature"], 0.0)
|
|
|
|
def test_minimax_no_temperature_key(self):
|
|
args = {"model_provider": "minimax", "model": "MiniMax-M3", "api_key": "sk"}
|
|
result = resolve_chat_model_config(args)
|
|
self.assertNotIn("temperature", result)
|
|
|
|
def test_minimax_temperature_none_ignored(self):
|
|
args = {"model_provider": "minimax", "model": "MiniMax-M3", "api_key": "sk", "temperature": None}
|
|
result = resolve_chat_model_config(args)
|
|
self.assertIsNone(result["temperature"])
|
|
|
|
def test_original_dict_not_mutated(self):
|
|
args = {"model_provider": "minimax", "model": "MiniMax-M3", "api_key": "sk"}
|
|
resolve_chat_model_config(args)
|
|
self.assertEqual(args["model_provider"], "minimax")
|
|
|
|
def test_empty_model_string_gets_default(self):
|
|
args = {"model_provider": "minimax", "model": "", "api_key": "sk"}
|
|
result = resolve_chat_model_config(args)
|
|
self.assertEqual(result["model"], "MiniMax-M3")
|
|
|
|
|
|
class TestDetectProviderFromEnv(unittest.TestCase):
|
|
"""Tests for detect_provider_from_env()."""
|
|
|
|
@patch.dict(os.environ, {"MINIMAX_API_KEY": "test-key"}, clear=False)
|
|
def test_detects_minimax(self):
|
|
self.assertEqual(detect_provider_from_env(), "minimax")
|
|
|
|
@patch.dict(os.environ, {}, clear=True)
|
|
def test_returns_none_when_no_keys(self):
|
|
self.assertIsNone(detect_provider_from_env())
|
|
|
|
|
|
class TestConfigYAMLLoading(unittest.TestCase):
|
|
"""Test that MiniMax example config files are valid YAML."""
|
|
|
|
def test_idea2video_minimax_yaml(self):
|
|
import yaml
|
|
path = os.path.join(os.path.dirname(__file__), "..", "configs", "idea2video_minimax.yaml")
|
|
with open(path) as f:
|
|
config = yaml.safe_load(f)
|
|
self.assertEqual(config["chat_model"]["init_args"]["model_provider"], "minimax")
|
|
self.assertEqual(config["chat_model"]["init_args"]["model"], "MiniMax-M3")
|
|
|
|
def test_script2video_minimax_yaml(self):
|
|
import yaml
|
|
path = os.path.join(os.path.dirname(__file__), "..", "configs", "script2video_minimax.yaml")
|
|
with open(path) as f:
|
|
config = yaml.safe_load(f)
|
|
self.assertEqual(config["chat_model"]["init_args"]["model_provider"], "minimax")
|
|
self.assertEqual(config["chat_model"]["init_args"]["model"], "MiniMax-M3")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|