Browse Source

Handle ImportError for optional JSON response imports

pull/15536/head
cyphercodes 3 weeks ago
parent
commit
dcea3ba062
  1. 4
      fastapi/responses.py
  2. 40
      tests/test_responses_import.py

4
fastapi/responses.py

@ -26,13 +26,13 @@ class _OrjsonModule(Protocol):
try:
ujson = cast(_UjsonModule, importlib.import_module("ujson"))
except ModuleNotFoundError: # pragma: nocover
except ImportError: # pragma: nocover
ujson = None # type: ignore[assignment]
try:
orjson = cast(_OrjsonModule, importlib.import_module("orjson"))
except ModuleNotFoundError: # pragma: nocover
except ImportError: # pragma: nocover
orjson = None # type: ignore[assignment]

40
tests/test_responses_import.py

@ -0,0 +1,40 @@
import subprocess
import sys
import textwrap
from pathlib import Path
import pytest
REPO_ROOT = Path(__file__).resolve().parents[1]
@pytest.mark.parametrize("optional_module_name", ("ujson", "orjson"))
def test_responses_imports_when_optional_json_import_raises_import_error(
optional_module_name: str,
) -> None:
code = textwrap.dedent(
f"""
import importlib
real_import_module = importlib.import_module
def fake_import_module(name, package=None):
if name == {optional_module_name!r}:
raise ImportError("simulated optional dependency load failure")
return real_import_module(name, package)
importlib.import_module = fake_import_module
import fastapi.responses as responses
assert getattr(responses, {optional_module_name!r}) is None
"""
)
result = subprocess.run(
[sys.executable, "-c", code],
capture_output=True,
cwd=REPO_ROOT,
text=True,
)
assert result.returncode == 0, result.stderr + result.stdout
Loading…
Cancel
Save