diff --git a/lib/crewai-files/src/crewai_files/uploaders/factory.py b/lib/crewai-files/src/crewai_files/uploaders/factory.py index 3c79ce5cf3..41ca3c4872 100644 --- a/lib/crewai-files/src/crewai_files/uploaders/factory.py +++ b/lib/crewai-files/src/crewai_files/uploaders/factory.py @@ -7,6 +7,7 @@ from typing_extensions import NotRequired, Unpack +from crewai_files.processing.exceptions import PermanentUploadError from crewai_files.uploaders.anthropic import AnthropicFileUploader from crewai_files.uploaders.bedrock import BedrockFileUploader from crewai_files.uploaders.gemini import GeminiFileUploader @@ -196,7 +197,11 @@ def get_uploader( "Bedrock S3 uploader not configured. " "Set CREWAI_BEDROCK_S3_BUCKET environment variable to enable." ) - raise + raise PermanentUploadError( + "Bedrock S3 uploader not configured. Set the " + "CREWAI_BEDROCK_S3_BUCKET environment variable or pass " + "bucket_name to enable it." + ) try: from crewai_files.uploaders.bedrock import BedrockFileUploader @@ -213,4 +218,4 @@ def get_uploader( raise logger.debug(f"No file uploader available for provider: {provider}") - raise + raise PermanentUploadError(f"No file uploader available for provider: {provider}") diff --git a/lib/crewai-files/tests/uploaders/test_factory.py b/lib/crewai-files/tests/uploaders/test_factory.py new file mode 100644 index 0000000000..b15ba01e2e --- /dev/null +++ b/lib/crewai-files/tests/uploaders/test_factory.py @@ -0,0 +1,30 @@ +"""Tests for get_uploader error handling.""" + +import pytest + +from crewai_files.processing.exceptions import PermanentUploadError +from crewai_files.uploaders.factory import get_uploader + + +def test_get_uploader_unsupported_provider_raises_permanent_upload_error() -> None: + """ + An unsupported provider must raise PermanentUploadError, not a bare + ``RuntimeError: No active exception to re-raise``. + + The final ``raise`` in get_uploader was a bare re-raise outside any + except block, so Python raised RuntimeError instead of a meaningful error. + """ + with pytest.raises(PermanentUploadError, match="not-a-real-provider"): + get_uploader("not-a-real-provider") + + +def test_get_uploader_bedrock_without_bucket_raises_permanent_upload_error( + monkeypatch: pytest.MonkeyPatch, +) -> None: + """ + Requesting the Bedrock uploader without a configured bucket must raise + PermanentUploadError (a config error), not a bare RuntimeError. + """ + monkeypatch.delenv("CREWAI_BEDROCK_S3_BUCKET", raising=False) + with pytest.raises(PermanentUploadError, match="CREWAI_BEDROCK_S3_BUCKET"): + get_uploader("bedrock")