1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
"""A pytest plugin for using pyfakefs as a fixture
When pyfakefs is installed, the "fs" fixture becomes available.
:Usage:
def my_fakefs_test(fs):
fs.create_file('/var/data/xx1.txt')
assert os.path.exists('/var/data/xx1.txt')
"""
import py
import pytest
from _pytest import capture
from pyfakefs.fake_filesystem_unittest import Patcher
try:
from _pytest import pathlib
except ImportError:
pathlib = None # type:ignore[assignment]
Patcher.SKIPMODULES.add(py)
Patcher.SKIPMODULES.add(pytest)
Patcher.SKIPMODULES.add(capture)
if pathlib is not None:
Patcher.SKIPMODULES.add(pathlib)
@pytest.fixture
def fs(request):
"""Fake filesystem."""
if hasattr(request, "param"):
# pass optional parameters via @pytest.mark.parametrize
patcher = Patcher(*request.param)
else:
patcher = Patcher()
patcher.setUp()
yield patcher.fs
patcher.tearDown()
@pytest.fixture(scope="class")
def fs_class(request):
"""Class-scoped fake filesystem fixture."""
if hasattr(request, "param"):
patcher = Patcher(*request.param)
else:
patcher = Patcher()
patcher.setUp()
yield patcher.fs
patcher.tearDown()
@pytest.fixture(scope="module")
def fs_module(request):
"""Module-scoped fake filesystem fixture."""
if hasattr(request, "param"):
patcher = Patcher(*request.param)
else:
patcher = Patcher()
patcher.setUp()
yield patcher.fs
patcher.tearDown()
@pytest.fixture(scope="session")
def fs_session(request):
"""Session-scoped fake filesystem fixture."""
if hasattr(request, "param"):
patcher = Patcher(*request.param)
else:
patcher = Patcher()
patcher.setUp()
yield patcher.fs
patcher.tearDown()
@pytest.hookimpl(tryfirst=True)
def pytest_sessionfinish(session, exitstatus):
"""Make sure that the cache is cleared before the final test shutdown."""
Patcher.clear_fs_cache()
@pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_runtest_logreport(report):
"""Make sure that patching is not active during reporting."""
pause = Patcher.PATCHER is not None and report.when == "call"
if pause:
Patcher.PATCHER.pause()
yield
@pytest.hookimpl(hookwrapper=True, trylast=True)
def pytest_runtest_setup(item):
if Patcher.PATCHER is not None:
Patcher.PATCHER.resume()
yield
@pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_runtest_teardown(item, nextitem):
"""Make sure that patching is not active during reporting."""
if Patcher.PATCHER is not None:
Patcher.PATCHER.pause()
yield
|