"""Test OAuth store integration with config loading.""" import json import pytest import tempfile from pathlib import Path from nanobot.config.loader import load_config from nanobot.config.oauth_store import OAuthStore from nanobot.config.schema import OAuthCredentials def test_oauth_token_injected_into_config(tmp_path, monkeypatch): """OAuth token from store should be injected into provider api_key.""" # Create a minimal config file (no api key set) config_path = tmp_path / "config.json" config_path.write_text(json.dumps({ "agents": {"defaults": {"model": "anthropic/claude-opus-4-5"}}, "providers": {"anthropic": {"apiKey": ""}} })) # Save OAuth credentials store = OAuthStore(tmp_path) creds = OAuthCredentials(access_token="sk-ant-oat01-test-inject") store.save("anthropic", creds) # Monkeypatch get_config_path to use our tmp dir monkeypatch.setattr("nanobot.config.loader.get_config_path", lambda: config_path) # Monkeypatch the OAuth store path monkeypatch.setattr("nanobot.config.loader._get_oauth_store_dir", lambda: tmp_path) config = load_config(config_path) assert config.providers.anthropic.api_key == "sk-ant-oat01-test-inject" def test_config_without_oauth_unchanged(tmp_path, monkeypatch): """Config without OAuth store should load normally.""" config_path = tmp_path / "config.json" config_path.write_text(json.dumps({ "providers": {"anthropic": {"apiKey": "sk-ant-api03-regular"}} })) monkeypatch.setattr("nanobot.config.loader._get_oauth_store_dir", lambda: tmp_path / "nonexistent") config = load_config(config_path) assert config.providers.anthropic.api_key == "sk-ant-api03-regular" def test_oauth_does_not_overwrite_existing_key(tmp_path, monkeypatch): """If user already has an API key, OAuth should still override (OAuth takes priority).""" config_path = tmp_path / "config.json" config_path.write_text(json.dumps({ "providers": {"anthropic": {"apiKey": "sk-ant-api03-existing"}} })) store = OAuthStore(tmp_path) creds = OAuthCredentials(access_token="sk-ant-oat01-oauth-wins") store.save("anthropic", creds) monkeypatch.setattr("nanobot.config.loader._get_oauth_store_dir", lambda: tmp_path) config = load_config(config_path) # OAuth token takes priority over existing API key assert config.providers.anthropic.api_key == "sk-ant-oat01-oauth-wins"