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