Skip to content

Commit 52a9adf

Browse files
committed
Simplify test import clearner
1 parent 0830161 commit 52a9adf

7 files changed

+30
-69
lines changed

tests/conftest.py

+24
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
1+
import inspect
12
import sys
3+
from pathlib import Path
24
from typing import Generator
35

46
import pytest
57
from fastapi_cli.logging import setup_logging
68
from typer import rich_utils
79

10+
assets_path = Path(__file__).parent / "assets"
11+
812

913
@pytest.fixture(autouse=True)
1014
def reset_syspath() -> Generator[None, None, None]:
@@ -21,3 +25,23 @@ def setup_terminal() -> None:
2125
rich_utils.FORCE_TERMINAL = False
2226
setup_logging(terminal_width=3000)
2327
return
28+
29+
30+
@pytest.fixture(autouse=True)
31+
def asset_import_cleaner() -> Generator[None, None, None]:
32+
existing_imports = set(sys.modules.keys())
33+
try:
34+
yield
35+
finally:
36+
# clean up imports
37+
new_imports = set(sys.modules.keys()) ^ existing_imports
38+
for name in new_imports:
39+
try:
40+
mod_file = inspect.getfile(sys.modules[name])
41+
except TypeError:
42+
# builtin, ignore
43+
pass
44+
else:
45+
# only clean up imports from the test directory
46+
if mod_file.startswith(str(assets_path)):
47+
del sys.modules[name]

tests/test_cli.py

+2-8
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,21 @@
33
import subprocess
44
import sys
55
from pathlib import Path
6-
from typing import Any, Generator
6+
from typing import Any
77
from unittest.mock import patch
88

99
import pytest
1010
import uvicorn
1111
from fastapi_cli.cli import app
1212
from typer.testing import CliRunner
1313

14-
from tests.utils import changing_dir, importing
14+
from tests.utils import changing_dir
1515

1616
runner = CliRunner()
1717

1818
assets_path = Path(__file__).parent / "assets"
1919

2020

21-
@pytest.fixture(autouse=True)
22-
def single_file_app_fixture() -> Generator[None, None, None]:
23-
with importing(["single_file_app", "server", "app"]):
24-
yield
25-
26-
2721
def test_dev() -> None:
2822
with changing_dir(assets_path):
2923
with patch.object(uvicorn, "run") as mock_run:

tests/test_utils_default_dir.py

+1-8
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,15 @@
11
from pathlib import Path
2-
from typing import Generator
32

43
import pytest
54
from fastapi_cli.discover import get_import_string
65
from fastapi_cli.exceptions import FastAPICLIException
76
from pytest import CaptureFixture
87

9-
from .utils import changing_dir, importing
8+
from .utils import changing_dir
109

1110
assets_path = Path(__file__).parent / "assets"
1211

1312

14-
@pytest.fixture(autouse=True)
15-
def single_file_app_fixture() -> Generator[None, None, None]:
16-
with importing(["app", "app.main", "app.app", "app.api"]):
17-
yield
18-
19-
2013
def test_app_dir_main(capsys: CaptureFixture[str]) -> None:
2114
with changing_dir(assets_path / "default_files" / "default_app_dir_main"):
2215
import_string = get_import_string()

tests/test_utils_default_file.py

+1-8
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,17 @@
11
import importlib
22
import sys
33
from pathlib import Path
4-
from typing import Generator
54

65
import pytest
76
from fastapi_cli.discover import get_import_string
87
from fastapi_cli.exceptions import FastAPICLIException
98
from pytest import CaptureFixture
109

11-
from .utils import changing_dir, importing
10+
from .utils import changing_dir
1211

1312
assets_path = Path(__file__).parent / "assets"
1413

1514

16-
@pytest.fixture(autouse=True)
17-
def single_file_app_fixture() -> Generator[None, None, None]:
18-
with importing(["app", "api", "main"]):
19-
yield
20-
21-
2215
def test_single_file_main(capsys: CaptureFixture[str]) -> None:
2316
root_path = assets_path / "default_files" / "default_main"
2417
old_sys_path = sys.path.copy()

tests/test_utils_package.py

+1-16
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,15 @@
11
from pathlib import Path
2-
from typing import Generator
32

43
import pytest
54
from fastapi_cli.discover import get_import_string
65
from fastapi_cli.exceptions import FastAPICLIException
76
from pytest import CaptureFixture
87

9-
from tests.utils import changing_dir, importing
8+
from tests.utils import changing_dir
109

1110
assets_path = Path(__file__).parent / "assets"
1211

1312

14-
@pytest.fixture(autouse=True)
15-
def single_file_app_fixture() -> Generator[None, None, None]:
16-
with importing(
17-
[
18-
"package",
19-
"package.mod",
20-
"package.mod.app",
21-
"package.mod.api",
22-
"package.mod.other",
23-
]
24-
):
25-
yield
26-
27-
2813
def test_package_app_root(capsys: CaptureFixture[str]) -> None:
2914
with changing_dir(assets_path):
3015
import_string = get_import_string(path=Path("package/mod/app.py"))

tests/test_utils_single_file.py

+1-8
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,15 @@
11
from pathlib import Path
2-
from typing import Generator
32

43
import pytest
54
from fastapi_cli.discover import get_import_string
65
from fastapi_cli.exceptions import FastAPICLIException
76
from pytest import CaptureFixture
87

9-
from .utils import changing_dir, importing
8+
from .utils import changing_dir
109

1110
assets_path = Path(__file__).parent / "assets"
1211

1312

14-
@pytest.fixture(autouse=True)
15-
def single_file_app_fixture() -> Generator[None, None, None]:
16-
with importing(["single_file_app", "single_file_api", "single_file_other"]):
17-
yield
18-
19-
2013
def test_single_file_app(capsys: CaptureFixture[str]) -> None:
2114
with changing_dir(assets_path):
2215
import_string = get_import_string(path=Path("single_file_app.py"))

tests/utils.py

-21
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
1-
from __future__ import annotations
2-
31
import os
4-
import sys
5-
import warnings
62
from contextlib import contextmanager
73
from pathlib import Path
84
from typing import Generator, Union
@@ -16,20 +12,3 @@ def changing_dir(directory: Union[str, Path]) -> Generator[None, None, None]:
1612
yield
1713
finally:
1814
os.chdir(initial_dir)
19-
20-
21-
@contextmanager
22-
def importing(names: list[str]) -> Generator[None, None, None]:
23-
for name in names:
24-
if name in sys.modules: # pragma: no cover
25-
warnings.warn(
26-
f"{name} is already imported",
27-
category=UserWarning,
28-
stacklevel=1,
29-
)
30-
try:
31-
yield
32-
finally:
33-
for name in names:
34-
if name in sys.modules:
35-
del sys.modules[name]

0 commit comments

Comments
 (0)