File: conftest.py

package info (click to toggle)
tmuxp 1.64.0-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 3,500 kB
  • sloc: python: 17,788; sh: 22; makefile: 6
file content (128 lines) | stat: -rw-r--r-- 4,271 bytes parent folder | download | duplicates (3)
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
"""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",
}


@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