Skip to content

Commit

Permalink
Simplify test import clearner
Browse files Browse the repository at this point in the history
  • Loading branch information
killjoy1221 committed May 16, 2024
1 parent 0830161 commit 52a9adf
Show file tree
Hide file tree
Showing 7 changed files with 30 additions and 69 deletions.
24 changes: 24 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
import inspect
import sys
from pathlib import Path
from typing import Generator

import pytest
from fastapi_cli.logging import setup_logging
from typer import rich_utils

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


@pytest.fixture(autouse=True)
def reset_syspath() -> Generator[None, None, None]:
Expand All @@ -21,3 +25,23 @@ def setup_terminal() -> None:
rich_utils.FORCE_TERMINAL = False
setup_logging(terminal_width=3000)
return


@pytest.fixture(autouse=True)
def asset_import_cleaner() -> Generator[None, None, None]:
existing_imports = set(sys.modules.keys())
try:
yield
finally:
# clean up imports
new_imports = set(sys.modules.keys()) ^ existing_imports
for name in new_imports:
try:
mod_file = inspect.getfile(sys.modules[name])
except TypeError:
# builtin, ignore
pass
else:
# only clean up imports from the test directory
if mod_file.startswith(str(assets_path)):
del sys.modules[name]
10 changes: 2 additions & 8 deletions tests/test_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,21 @@
import subprocess
import sys
from pathlib import Path
from typing import Any, Generator
from typing import Any
from unittest.mock import patch

import pytest
import uvicorn
from fastapi_cli.cli import app
from typer.testing import CliRunner

from tests.utils import changing_dir, importing
from tests.utils import changing_dir

runner = CliRunner()

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


@pytest.fixture(autouse=True)
def single_file_app_fixture() -> Generator[None, None, None]:
with importing(["single_file_app", "server", "app"]):
yield


def test_dev() -> None:
with changing_dir(assets_path):
with patch.object(uvicorn, "run") as mock_run:
Expand Down
9 changes: 1 addition & 8 deletions tests/test_utils_default_dir.py
Original file line number Diff line number Diff line change
@@ -1,22 +1,15 @@
from pathlib import Path
from typing import Generator

import pytest
from fastapi_cli.discover import get_import_string
from fastapi_cli.exceptions import FastAPICLIException
from pytest import CaptureFixture

from .utils import changing_dir, importing
from .utils import changing_dir

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


@pytest.fixture(autouse=True)
def single_file_app_fixture() -> Generator[None, None, None]:
with importing(["app", "app.main", "app.app", "app.api"]):
yield


def test_app_dir_main(capsys: CaptureFixture[str]) -> None:
with changing_dir(assets_path / "default_files" / "default_app_dir_main"):
import_string = get_import_string()
Expand Down
9 changes: 1 addition & 8 deletions tests/test_utils_default_file.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,17 @@
import importlib
import sys
from pathlib import Path
from typing import Generator

import pytest
from fastapi_cli.discover import get_import_string
from fastapi_cli.exceptions import FastAPICLIException
from pytest import CaptureFixture

from .utils import changing_dir, importing
from .utils import changing_dir

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


@pytest.fixture(autouse=True)
def single_file_app_fixture() -> Generator[None, None, None]:
with importing(["app", "api", "main"]):
yield


def test_single_file_main(capsys: CaptureFixture[str]) -> None:
root_path = assets_path / "default_files" / "default_main"
old_sys_path = sys.path.copy()
Expand Down
17 changes: 1 addition & 16 deletions tests/test_utils_package.py
Original file line number Diff line number Diff line change
@@ -1,30 +1,15 @@
from pathlib import Path
from typing import Generator

import pytest
from fastapi_cli.discover import get_import_string
from fastapi_cli.exceptions import FastAPICLIException
from pytest import CaptureFixture

from tests.utils import changing_dir, importing
from tests.utils import changing_dir

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


@pytest.fixture(autouse=True)
def single_file_app_fixture() -> Generator[None, None, None]:
with importing(
[
"package",
"package.mod",
"package.mod.app",
"package.mod.api",
"package.mod.other",
]
):
yield


def test_package_app_root(capsys: CaptureFixture[str]) -> None:
with changing_dir(assets_path):
import_string = get_import_string(path=Path("package/mod/app.py"))
Expand Down
9 changes: 1 addition & 8 deletions tests/test_utils_single_file.py
Original file line number Diff line number Diff line change
@@ -1,22 +1,15 @@
from pathlib import Path
from typing import Generator

import pytest
from fastapi_cli.discover import get_import_string
from fastapi_cli.exceptions import FastAPICLIException
from pytest import CaptureFixture

from .utils import changing_dir, importing
from .utils import changing_dir

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


@pytest.fixture(autouse=True)
def single_file_app_fixture() -> Generator[None, None, None]:
with importing(["single_file_app", "single_file_api", "single_file_other"]):
yield


def test_single_file_app(capsys: CaptureFixture[str]) -> None:
with changing_dir(assets_path):
import_string = get_import_string(path=Path("single_file_app.py"))
Expand Down
21 changes: 0 additions & 21 deletions tests/utils.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,4 @@
from __future__ import annotations

import os
import sys
import warnings
from contextlib import contextmanager
from pathlib import Path
from typing import Generator, Union
Expand All @@ -16,20 +12,3 @@ def changing_dir(directory: Union[str, Path]) -> Generator[None, None, None]:
yield
finally:
os.chdir(initial_dir)


@contextmanager
def importing(names: list[str]) -> Generator[None, None, None]:
for name in names:
if name in sys.modules: # pragma: no cover
warnings.warn(
f"{name} is already imported",
category=UserWarning,
stacklevel=1,
)
try:
yield
finally:
for name in names:
if name in sys.modules:
del sys.modules[name]

0 comments on commit 52a9adf

Please sign in to comment.