Modernize provider support
This commit is contained in:
@@ -199,6 +199,28 @@ class TestRunCommand:
|
||||
captured = capsys.readouterr()
|
||||
assert 'MOCK' in captured.out
|
||||
|
||||
def test_run_with_tool_specific_args_after_separator(self, temp_tools_dir, capsys):
|
||||
"""cmdforge run should parse tool args with the wrapper parser."""
|
||||
from cmdforge.tool import save_tool
|
||||
|
||||
tool = Tool(
|
||||
name="greet",
|
||||
arguments=[
|
||||
ToolArgument(flag="--name", variable="name", default="World")
|
||||
],
|
||||
output="Hello, {name}!"
|
||||
)
|
||||
save_tool(tool)
|
||||
|
||||
with patch('sys.argv', ['cmdforge', 'run', 'greet', '--', '--name', 'Alice']):
|
||||
with patch('sys.stdin', StringIO("")):
|
||||
with patch('sys.stdin.isatty', return_value=True):
|
||||
result = main()
|
||||
|
||||
assert result == 0
|
||||
captured = capsys.readouterr()
|
||||
assert 'Hello, Alice!' in captured.out
|
||||
|
||||
def test_run_nonexistent_tool(self, temp_tools_dir, capsys):
|
||||
"""Running nonexistent tool should fail."""
|
||||
with patch('sys.argv', ['cmdforge', 'run', 'nonexistent']):
|
||||
@@ -272,6 +294,71 @@ class TestProvidersCommand:
|
||||
assert provider is not None
|
||||
assert provider.command == 'my-ai --prompt'
|
||||
|
||||
def test_providers_add_api_configuration(self, temp_providers_file, capsys):
|
||||
with patch('sys.argv', [
|
||||
'cmdforge', 'providers', 'add', 'custom-api',
|
||||
'https://example.test/v1',
|
||||
'--type', 'api',
|
||||
'--model', 'example/model',
|
||||
'--api-key-env', 'CUSTOM_API_KEY',
|
||||
'--tag', 'api',
|
||||
'--fallback-chain', 'free',
|
||||
]):
|
||||
result = main()
|
||||
|
||||
assert result == 0
|
||||
from cmdforge.providers import PRESET_CHAINS, get_provider
|
||||
provider = get_provider('custom-api')
|
||||
assert provider.type == 'api'
|
||||
assert provider.model == 'example/model'
|
||||
assert provider.api_key_env == 'CUSTOM_API_KEY'
|
||||
assert provider.tags == ['api']
|
||||
assert provider.fallback_chain == PRESET_CHAINS['free']
|
||||
|
||||
def test_providers_list_reports_missing_api_key(self, temp_providers_file, capsys):
|
||||
from cmdforge.providers import Provider, save_providers
|
||||
|
||||
save_providers([
|
||||
Provider(
|
||||
'custom-api',
|
||||
'https://example.test/v1',
|
||||
type='api',
|
||||
model='example/model',
|
||||
api_key_env='MISSING_CUSTOM_API_KEY',
|
||||
)
|
||||
])
|
||||
|
||||
with patch.dict('os.environ', {'MISSING_CUSTOM_API_KEY': ''}):
|
||||
with patch('sys.argv', ['cmdforge', 'providers', 'list']):
|
||||
result = main()
|
||||
|
||||
assert result == 0
|
||||
captured = capsys.readouterr()
|
||||
assert 'API KEY NOT SET (MISSING_CUSTOM_API_KEY)' in captured.out
|
||||
assert 'NOT FOUND (https://' not in captured.out
|
||||
|
||||
def test_providers_discover_adds_new_provider(self, temp_providers_file, capsys):
|
||||
discovered = [{
|
||||
'source': 'cli',
|
||||
'binary': 'example-ai',
|
||||
'path': '/usr/bin/example-ai',
|
||||
'name': 'example-ai',
|
||||
'command': 'example-ai --print',
|
||||
'description': 'Example provider',
|
||||
'tags': ['test'],
|
||||
}]
|
||||
|
||||
with patch('cmdforge.providers.discover_installed_providers', return_value=discovered):
|
||||
with patch('sys.argv', ['cmdforge', 'providers', 'discover', '--add']):
|
||||
result = main()
|
||||
|
||||
assert result == 0
|
||||
from cmdforge.providers import get_provider
|
||||
provider = get_provider('example-ai')
|
||||
assert provider is not None
|
||||
assert provider.command == 'example-ai --print'
|
||||
assert provider.tags == ['test']
|
||||
|
||||
def test_providers_remove(self, temp_providers_file, capsys):
|
||||
"""Remove a provider."""
|
||||
from cmdforge.providers import add_provider, Provider
|
||||
|
||||
Reference in New Issue
Block a user