-
Notifications
You must be signed in to change notification settings - Fork 236
Expand file tree
/
Copy pathconftest.py
More file actions
137 lines (106 loc) · 4.55 KB
/
conftest.py
File metadata and controls
137 lines (106 loc) · 4.55 KB
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
"""Conftest.py (root-level).
We keep this in root pytest fixtures in pytest's doctest plugin to be available, as well
as avoiding conftest.py from being included in the wheel, in addition to pytest_plugin
for pytester only being available via the root directory.
See "pytest_plugins in non-top-level conftest files" in
https://docs.pytest.org/en/stable/deprecations.html
"""
from __future__ import annotations
import logging
import os
import pathlib
import shutil
import typing as t
import pytest
from _pytest.doctest import DoctestItem
from libtmux.test.random import namer
from tests.fixtures import utils as test_utils
from tmuxp.workspace.finders import get_workspace_dir
if t.TYPE_CHECKING:
from libtmux.session import Session
logger = logging.getLogger(__name__)
USING_ZSH = "zsh" in os.getenv("SHELL", "")
@pytest.fixture(autouse=USING_ZSH, scope="session")
def zshrc(user_path: pathlib.Path) -> pathlib.Path | None:
"""Quiets ZSH default message.
Needs a startup file .zshenv, .zprofile, .zshrc, .zlogin.
"""
if not USING_ZSH:
return None
p = user_path / ".zshrc"
p.touch()
return p
@pytest.fixture(autouse=True)
def home_path_default(monkeypatch: pytest.MonkeyPatch, user_path: pathlib.Path) -> None:
"""Set HOME to user_path (random, temporary directory)."""
monkeypatch.setenv("HOME", str(user_path))
@pytest.fixture
def tmuxp_configdir(user_path: pathlib.Path) -> pathlib.Path:
"""Ensure and return tmuxp config directory."""
xdg_config_dir = user_path / ".config"
xdg_config_dir.mkdir(exist_ok=True)
tmuxp_configdir = xdg_config_dir / "tmuxp"
tmuxp_configdir.mkdir(exist_ok=True)
return tmuxp_configdir
@pytest.fixture
def tmuxp_configdir_default(
monkeypatch: pytest.MonkeyPatch,
tmuxp_configdir: pathlib.Path,
) -> None:
"""Set tmuxp configuration directory for ``TMUXP_CONFIGDIR``."""
monkeypatch.setenv("TMUXP_CONFIGDIR", str(tmuxp_configdir))
assert get_workspace_dir() == str(tmuxp_configdir)
@pytest.fixture
def monkeypatch_plugin_test_packages(monkeypatch: pytest.MonkeyPatch) -> None:
"""Monkeypatch tmuxp plugin fixtures to python path."""
paths = [
"tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/",
"tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/",
"tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/",
"tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/",
"tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/",
"tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/",
]
for path in paths:
monkeypatch.syspath_prepend(str(pathlib.Path(path).resolve()))
@pytest.fixture
def session_params(session_params: dict[str, t.Any]) -> dict[str, t.Any]:
"""Terminal-friendly tmuxp session_params for dimensions."""
session_params.update({"x": 800, "y": 600})
return session_params
@pytest.fixture
def socket_name(request: pytest.FixtureRequest) -> str:
"""Random socket name for tmuxp."""
return f"tmuxp_test{next(namer)}"
# Modules that actually need tmux fixtures in their doctests
DOCTEST_NEEDS_TMUX = {
"tmuxp.workspace.builder",
}
def pytest_collection_modifyitems(items: list[pytest.Item]) -> None:
"""Add rerun markers to tmux-dependent doctests for flaky shell timing."""
for item in items:
if isinstance(item, DoctestItem):
module_name = item.dtest.globs.get("__name__", "")
if module_name in DOCTEST_NEEDS_TMUX:
item.add_marker(pytest.mark.flaky(reruns=2))
@pytest.fixture(autouse=True)
def add_doctest_fixtures(
request: pytest.FixtureRequest,
doctest_namespace: dict[str, t.Any],
tmp_path: pathlib.Path,
monkeypatch: pytest.MonkeyPatch,
) -> None:
"""Harness pytest fixtures to doctests namespace."""
if isinstance(request._pyfuncitem, DoctestItem):
# Always provide lightweight fixtures
doctest_namespace["test_utils"] = test_utils
doctest_namespace["tmp_path"] = tmp_path
doctest_namespace["monkeypatch"] = monkeypatch
# Only load expensive tmux fixtures for modules that need them
module_name = request._pyfuncitem.dtest.globs.get("__name__", "")
if module_name in DOCTEST_NEEDS_TMUX and shutil.which("tmux"):
doctest_namespace["server"] = request.getfixturevalue("server")
session: Session = request.getfixturevalue("session")
doctest_namespace["session"] = session
doctest_namespace["window"] = session.active_window
doctest_namespace["pane"] = session.active_pane