from __future__ import annotations import pytest from nanobot.config.loader import load_config, save_config from nanobot.config.schema import Config from nanobot.webui.settings_api import WebUISettingsError, create_model_configuration def test_create_model_configuration_writes_label_and_selects( tmp_path, monkeypatch: pytest.MonkeyPatch, ) -> None: config_path = tmp_path / "config.json" config = Config() config.agents.defaults.model = "openai/gpt-4o" config.agents.defaults.provider = "openai" config.providers.openai.api_key = "sk-test" save_config(config, config_path) monkeypatch.setattr("nanobot.config.loader._current_config_path", config_path) payload = create_model_configuration( { "label": ["Fast writing"], "provider": ["openai"], "model": ["openai/gpt-4.1-mini"], } ) assert payload["agent"]["model_preset"] == "fast-writing" assert payload["agent"]["model"] == "openai/gpt-4.1-mini" rows = {row["name"]: row for row in payload["model_presets"]} assert rows["fast-writing"]["label"] == "Fast writing" saved = load_config(config_path) assert saved.agents.defaults.model_preset == "fast-writing" assert saved.model_presets["fast-writing"].label == "Fast writing" assert saved.model_presets["fast-writing"].model == "openai/gpt-4.1-mini" assert saved.model_presets["fast-writing"].provider == "openai" with pytest.raises(WebUISettingsError) as duplicate: create_model_configuration( { "label": ["Fast writing"], "provider": ["openai"], "model": ["openai/gpt-4.1-mini"], } ) assert duplicate.value.status == 409 def test_create_model_configuration_rejects_unconfigured_provider( tmp_path, monkeypatch: pytest.MonkeyPatch, ) -> None: config_path = tmp_path / "config.json" save_config(Config(), config_path) monkeypatch.setattr("nanobot.config.loader._current_config_path", config_path) with pytest.raises(WebUISettingsError, match="provider is not configured"): create_model_configuration( { "label": ["Deep"], "provider": ["openai"], "model": ["openai/gpt-4.1"], } )