Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions tests/test_imports.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# (c) 2009-2026 Martin Wendt and contributors; see WsgiDAV https://github.com/mar10/wsgidav
# Licensed under the MIT license:
# http://www.opensource.org/licenses/mit-license.php
"""Smoke test that asserts that every module can be imported."""

import importlib
import pkgutil

import pytest

import wsgidav


def _reraise(module_name):
raise


MODULE_NAMES = sorted(
info.name
# reraise ensures that import errors of subpackages are not silently ignored
for info in pkgutil.walk_packages(wsgidav.__path__, "wsgidav.", onerror=_reraise)
)


def test_finds_at_least_some_modules():
assert len(MODULE_NAMES) > 10


@pytest.mark.parametrize("module_name", MODULE_NAMES)
def test_module_is_importable(module_name):
try:
importlib.import_module(module_name)
except ImportError as e:
# accept missing optional or platform specific dependencies,
if e.name and e.name.partition(".")[0] == "wsgidav":
raise
pytest.skip(f"missing dependency {e.name!r}")
6 changes: 3 additions & 3 deletions wsgidav/mw/impersonator.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
import os
import pwd
from contextlib import AbstractContextManager
from typing import Tuple
from typing import Optional, Tuple

from wsgidav import util
from wsgidav.mw.base_mw import BaseMiddleware
Expand All @@ -30,7 +30,7 @@


class ImpersonateContext(AbstractContextManager):
def __init__(self, ids: Tuple[int, int] | None) -> None:
def __init__(self, ids: Optional[Tuple[int, int]]) -> None:
if ids is None:
self._enabled = False
return
Expand Down Expand Up @@ -77,7 +77,7 @@ def __call__(self, environ, start_response):
def is_disabled(self): # type: ignore
return not self.get_config("impersonator.enable", False) # type: ignore

def _map_id(self, username: str) -> Tuple[int, int] | None:
def _map_id(self, username: str) -> Optional[Tuple[int, int]]:
if self.is_disabled():
return None

Expand Down
Loading