Skip to content

Commit 260242e

Browse files
committed
Fix tests by removing app imports via fixture
1 parent 764d8e8 commit 260242e

6 files changed

+71
-6
lines changed

tests/test_cli.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,27 @@
33
import subprocess
44
import sys
55
from pathlib import Path
6-
from typing import Any
6+
from typing import Any, Generator
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
14+
from tests.utils import changing_dir, importing
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+
2127
def test_dev() -> None:
2228
with changing_dir(assets_path):
2329
with patch.object(uvicorn, "run") as mock_run:

tests/test_utils_default_dir.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,22 @@
11
from pathlib import Path
2+
from typing import Generator
23

34
import pytest
45
from fastapi_cli.discover import get_import_string
56
from fastapi_cli.exceptions import FastAPICLIException
67
from pytest import CaptureFixture
78

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

1011
assets_path = Path(__file__).parent / "assets"
1112

1213

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+
1320
def test_app_dir_main(capsys: CaptureFixture[str]) -> None:
1421
with changing_dir(assets_path / "default_files" / "default_app_dir_main"):
1522
import_string = get_import_string()

tests/test_utils_default_file.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,24 @@
11
import importlib
22
import sys
33
from pathlib import Path
4+
from typing import Generator
45

56
import pytest
67
from fastapi_cli.discover import get_import_string
78
from fastapi_cli.exceptions import FastAPICLIException
89
from pytest import CaptureFixture
910

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

1213
assets_path = Path(__file__).parent / "assets"
1314

1415

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+
1522
def test_single_file_main(capsys: CaptureFixture[str]) -> None:
1623
root_path = assets_path / "default_files" / "default_main"
1724
old_sys_path = sys.path.copy()

tests/test_utils_package.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,30 @@
11
from pathlib import Path
2+
from typing import Generator
23

34
import pytest
45
from fastapi_cli.discover import get_import_string
56
from fastapi_cli.exceptions import FastAPICLIException
67
from pytest import CaptureFixture
78

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

1011
assets_path = Path(__file__).parent / "assets"
1112

1213

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+
1328
def test_package_app_root(capsys: CaptureFixture[str]) -> None:
1429
with changing_dir(assets_path):
1530
import_string = get_import_string(path=Path("package/mod/app.py"))

tests/test_utils_single_file.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,22 @@
11
from pathlib import Path
2+
from typing import Generator
23

34
import pytest
45
from fastapi_cli.discover import get_import_string
56
from fastapi_cli.exceptions import FastAPICLIException
67
from pytest import CaptureFixture
78

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

1011
assets_path = Path(__file__).parent / "assets"
1112

1213

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+
1320
def test_single_file_app(capsys: CaptureFixture[str]) -> None:
1421
with changing_dir(assets_path):
1522
import_string = get_import_string(path=Path("single_file_app.py"))

tests/utils.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1+
from __future__ import annotations
2+
13
import os
4+
import sys
5+
import warnings
26
from contextlib import contextmanager
37
from pathlib import Path
48
from typing import Generator, Union
@@ -12,3 +16,22 @@ def changing_dir(directory: Union[str, Path]) -> Generator[None, None, None]:
1216
yield
1317
finally:
1418
os.chdir(initial_dir)
19+
20+
21+
@contextmanager
22+
def importing(names: Union[str, list[str]]) -> Generator[None, None, None]:
23+
for name in names:
24+
if name in sys.modules:
25+
warnings.warn(
26+
f"{name} is already imported",
27+
category=UserWarning,
28+
stacklevel=1,
29+
)
30+
try:
31+
yield
32+
finally:
33+
if isinstance(names, str):
34+
names = [names]
35+
for name in names:
36+
if name in sys.modules:
37+
del sys.modules[name]

0 commit comments

Comments
 (0)