diff --git a/tests/test_litellm/proxy/openai_files_endpoint/test_files_endpoint.py b/tests/test_litellm/proxy/openai_files_endpoint/test_files_endpoint.py index 837ae79bffc..9c6182493d0 100644 --- a/tests/test_litellm/proxy/openai_files_endpoint/test_files_endpoint.py +++ b/tests/test_litellm/proxy/openai_files_endpoint/test_files_endpoint.py @@ -232,6 +232,9 @@ def test_target_storage_invokes_storage_backend( """ Ensure target_storage is parsed and invokes the storage backend service. """ + monkeypatch.setattr("litellm.proxy.proxy_server.master_key", None) + monkeypatch.setattr("litellm.proxy.proxy_server.prisma_client", None) + monkeypatch.setattr("litellm.proxy.proxy_server.llm_router", llm_router) setup_proxy_logging_object(monkeypatch, llm_router) async_mock = mocker.AsyncMock( @@ -277,6 +280,9 @@ def test_target_storage_with_target_models( """ Ensure target_storage and target_model_names are parsed and passed through. """ + monkeypatch.setattr("litellm.proxy.proxy_server.master_key", None) + monkeypatch.setattr("litellm.proxy.proxy_server.prisma_client", None) + monkeypatch.setattr("litellm.proxy.proxy_server.llm_router", llm_router) setup_proxy_logging_object(monkeypatch, llm_router) async_mock = mocker.AsyncMock( @@ -869,7 +875,7 @@ def test_managed_files_with_loadbalancing(mocker: MockerFixture, monkeypatch, ll """ from litellm.llms.base_llm.files.transformation import BaseFileEndpoints from litellm.types.llms.openai import OpenAIFileObject - + # Enable loadbalancing on batch endpoints monkeypatch.setattr("litellm.enable_loadbalancing_on_batch_endpoints", True) diff --git a/tests/test_litellm/secret_managers/test_aws_secret_manager_v2.py b/tests/test_litellm/secret_managers/test_aws_secret_manager_v2.py new file mode 100644 index 00000000000..1e0e72c9ac6 --- /dev/null +++ b/tests/test_litellm/secret_managers/test_aws_secret_manager_v2.py @@ -0,0 +1,85 @@ +""" +Unit tests for AWSSecretsManagerV2 - mocked, no real AWS credentials required. + +Tests the write/read/delete cycle for JSON and simple string secrets. +""" + +import json +from unittest.mock import AsyncMock, patch + +import pytest + +from litellm.secret_managers.aws_secret_manager_v2 import AWSSecretsManagerV2 + + +@pytest.mark.asyncio +async def test_write_and_read_json_secret(): + """Test writing and reading a JSON structured secret (mocked)""" + test_secret_name = "litellm_test_abc12345_json" + test_secret_value = { + "api_key": "test_key", + "model": "gpt-4", + "temperature": 0.7, + "metadata": {"team": "ml", "project": "litellm"}, + } + json_secret_value = json.dumps(test_secret_value) + + write_response = { + "ARN": f"arn:aws:secretsmanager:us-east-1:123456789012:secret:{test_secret_name}", + "Name": test_secret_name, + "VersionId": "mock-version-id", + } + delete_response = { + "ARN": write_response["ARN"], + "Name": test_secret_name, + "DeletionDate": "2099-01-01T00:00:00Z", + } + + with patch.object( + AWSSecretsManagerV2, + "async_write_secret", + new_callable=AsyncMock, + return_value=write_response, + ): + with patch.object( + AWSSecretsManagerV2, + "async_read_secret", + new_callable=AsyncMock, + return_value=json_secret_value, + ): + with patch.object( + AWSSecretsManagerV2, + "async_delete_secret", + new_callable=AsyncMock, + return_value=delete_response, + ): + secret_manager = AWSSecretsManagerV2() + + # Write JSON secret + response = await secret_manager.async_write_secret( + secret_name=test_secret_name, + secret_value=json_secret_value, + description="LiteLLM JSON Test Secret", + ) + + assert response is not None + assert "ARN" in response + assert "Name" in response + assert response["Name"] == test_secret_name + + # Read and parse JSON secret + read_value = await secret_manager.async_read_secret( + secret_name=test_secret_name + ) + assert read_value is not None + parsed_value = json.loads(read_value) + + assert parsed_value == test_secret_value + assert parsed_value["api_key"] == "test_key" + assert parsed_value["metadata"]["team"] == "ml" + + # Cleanup + delete_resp = await secret_manager.async_delete_secret( + secret_name=test_secret_name + ) + assert delete_resp is not None