blob: 37b055fdf2d441f21d620d88ddd05493cded07bd (
plain)
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
|
"""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()
|