mirror of
https://github.com/BerriAI/litellm.git
synced 2026-10-02 02:11:58 +00:00
* test(proxy): move auth, hooks, policy_engine and client tests into tests/unit/proxy Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * test(proxy): stub HIBP through respx by disabling the aiohttp transport Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * test(proxy): share the httpx transport fixture across proxy unit tests Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * test(proxy): restore proxy globals without a missing-value sentinel Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * test(proxy): package moved dirs and stub the login breach check at the HTTP boundary Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * test(proxy): isolate the mcp server manager per test Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --------- Co-authored-by: yuneng <yuneng@berri.ai> Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
217 lines
6.2 KiB
Python
217 lines
6.2 KiB
Python
import json
|
|
from unittest.mock import MagicMock
|
|
|
|
import pytest
|
|
import requests
|
|
from click.testing import CliRunner
|
|
|
|
|
|
|
|
from litellm.proxy.client.cli.main import cli
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_credentials_client(monkeypatch):
|
|
"""Patch the CredentialsManagementClient used by the CLI commands."""
|
|
mock_client = MagicMock()
|
|
monkeypatch.setattr(
|
|
"litellm.proxy.client.credentials.CredentialsManagementClient",
|
|
mock_client,
|
|
)
|
|
monkeypatch.setattr(
|
|
"litellm.proxy.client.cli.commands.credentials.CredentialsManagementClient",
|
|
mock_client,
|
|
)
|
|
return mock_client
|
|
|
|
|
|
@pytest.fixture
|
|
def cli_runner():
|
|
return CliRunner()
|
|
|
|
|
|
def test_alist_credentials_table_format(cli_runner, mock_credentials_client):
|
|
# Mock response data
|
|
mock_response = {
|
|
"credentials": [
|
|
{
|
|
"credential_name": "test-cred-1",
|
|
"credential_info": {"custom_llm_provider": "azure"},
|
|
},
|
|
{
|
|
"credential_name": "test-cred-2",
|
|
"credential_info": {"custom_llm_provider": "anthropic"},
|
|
},
|
|
]
|
|
}
|
|
mock_instance = mock_credentials_client.return_value
|
|
mock_instance.list.return_value = mock_response
|
|
|
|
# Run command
|
|
result = cli_runner.invoke(cli, ["credentials", "list"])
|
|
|
|
# Verify
|
|
assert result.exit_code == 0
|
|
assert "test-cred-1" in result.output
|
|
assert "azure" in result.output
|
|
assert "test-cred-2" in result.output
|
|
assert "anthropic" in result.output
|
|
|
|
|
|
def test_alist_credentials_json_format(cli_runner, mock_credentials_client):
|
|
# Mock response data
|
|
mock_response = {
|
|
"credentials": [
|
|
{
|
|
"credential_name": "test-cred",
|
|
"credential_info": {"custom_llm_provider": "azure"},
|
|
}
|
|
]
|
|
}
|
|
mock_instance = mock_credentials_client.return_value
|
|
mock_instance.list.return_value = mock_response
|
|
|
|
# Run command
|
|
result = cli_runner.invoke(cli, ["credentials", "list", "--format", "json"])
|
|
|
|
# Verify
|
|
assert result.exit_code == 0
|
|
output_data = json.loads(result.output)
|
|
assert output_data == mock_response
|
|
|
|
|
|
def test_acreate_credential_success(cli_runner, mock_credentials_client):
|
|
# Mock response data
|
|
mock_response = {"status": "success", "credential_name": "test-cred"}
|
|
mock_instance = mock_credentials_client.return_value
|
|
mock_instance.create.return_value = mock_response
|
|
|
|
# Run command
|
|
result = cli_runner.invoke(
|
|
cli,
|
|
[
|
|
"credentials",
|
|
"create",
|
|
"test-cred",
|
|
"--info",
|
|
'{"custom_llm_provider": "azure"}',
|
|
"--values",
|
|
'{"api_key": "test-key"}',
|
|
],
|
|
)
|
|
|
|
# Verify
|
|
assert result.exit_code == 0
|
|
output_data = json.loads(result.output)
|
|
assert output_data == mock_response
|
|
mock_instance.create.assert_called_once_with(
|
|
"test-cred",
|
|
{"custom_llm_provider": "azure"},
|
|
{"api_key": "test-key"},
|
|
)
|
|
|
|
|
|
def test_acreate_credential_invalid_json(cli_runner, mock_credentials_client):
|
|
# Run command with invalid JSON
|
|
result = cli_runner.invoke(
|
|
cli,
|
|
[
|
|
"credentials",
|
|
"create",
|
|
"test-cred",
|
|
"--info",
|
|
"invalid-json",
|
|
"--values",
|
|
'{"api_key": "test-key"}',
|
|
],
|
|
)
|
|
|
|
# Verify
|
|
assert result.exit_code == 2
|
|
assert "Invalid JSON" in result.output
|
|
mock_instance = mock_credentials_client.return_value
|
|
mock_instance.create.assert_not_called()
|
|
|
|
|
|
def test_acreate_credential_http_error(cli_runner, mock_credentials_client):
|
|
# Mock HTTP error
|
|
mock_instance = mock_credentials_client.return_value
|
|
mock_error_response = MagicMock()
|
|
mock_error_response.status_code = 400
|
|
mock_error_response.json.return_value = {"error": "Invalid request"}
|
|
mock_instance.create.side_effect = requests.exceptions.HTTPError(
|
|
response=mock_error_response
|
|
)
|
|
|
|
# Run command
|
|
result = cli_runner.invoke(
|
|
cli,
|
|
[
|
|
"credentials",
|
|
"create",
|
|
"test-cred",
|
|
"--info",
|
|
'{"custom_llm_provider": "azure"}',
|
|
"--values",
|
|
'{"api_key": "test-key"}',
|
|
],
|
|
)
|
|
|
|
# Verify
|
|
assert result.exit_code == 1
|
|
assert "Error: HTTP 400" in result.output
|
|
assert "Invalid request" in result.output
|
|
|
|
|
|
def test_adelete_credential_success(cli_runner, mock_credentials_client):
|
|
# Mock response data
|
|
mock_response = {"status": "success", "message": "Credential deleted"}
|
|
mock_instance = mock_credentials_client.return_value
|
|
mock_instance.delete.return_value = mock_response
|
|
|
|
# Run command
|
|
result = cli_runner.invoke(cli, ["credentials", "delete", "test-cred"])
|
|
|
|
# Verify
|
|
assert result.exit_code == 0
|
|
output_data = json.loads(result.output)
|
|
assert output_data == mock_response
|
|
mock_instance.delete.assert_called_once_with("test-cred")
|
|
|
|
|
|
def test_adelete_credential_http_error(cli_runner, mock_credentials_client):
|
|
# Mock HTTP error
|
|
mock_instance = mock_credentials_client.return_value
|
|
mock_error_response = MagicMock()
|
|
mock_error_response.status_code = 404
|
|
mock_error_response.json.return_value = {"error": "Credential not found"}
|
|
mock_instance.delete.side_effect = requests.exceptions.HTTPError(
|
|
response=mock_error_response
|
|
)
|
|
|
|
# Run command
|
|
result = cli_runner.invoke(cli, ["credentials", "delete", "test-cred"])
|
|
|
|
# Verify
|
|
assert result.exit_code == 1
|
|
assert "Error: HTTP 404" in result.output
|
|
assert "Credential not found" in result.output
|
|
|
|
|
|
def test_aget_credential_success(cli_runner, mock_credentials_client):
|
|
# Mock response data
|
|
mock_response = {
|
|
"credential_name": "test-cred",
|
|
"credential_info": {"custom_llm_provider": "azure"},
|
|
}
|
|
mock_instance = mock_credentials_client.return_value
|
|
mock_instance.get.return_value = mock_response
|
|
|
|
# Run command
|
|
result = cli_runner.invoke(cli, ["credentials", "get", "test-cred"])
|
|
|
|
# Verify
|
|
assert result.exit_code == 0
|
|
output_data = json.loads(result.output)
|
|
assert output_data == mock_response
|
|
mock_instance.get.assert_called_once_with("test-cred")
|