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