-
Notifications
You must be signed in to change notification settings - Fork 237
Expand file tree
/
Copy pathtest_debug_info.py
More file actions
169 lines (136 loc) · 4.7 KB
/
test_debug_info.py
File metadata and controls
169 lines (136 loc) · 4.7 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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
"""CLI tests for tmuxp debug-info."""
from __future__ import annotations
import json
import typing as t
import pytest
from tmuxp import cli
if t.TYPE_CHECKING:
import pathlib
class DebugInfoOutputFixture(t.NamedTuple):
"""Test fixture for debug-info output modes."""
test_id: str
args: list[str]
expected_keys: list[str]
is_json: bool
DEBUG_INFO_OUTPUT_FIXTURES: list[DebugInfoOutputFixture] = [
DebugInfoOutputFixture(
test_id="human_output_has_labels",
args=["debug-info"],
expected_keys=["environment", "python version", "tmux version"],
is_json=False,
),
DebugInfoOutputFixture(
test_id="json_output_valid",
args=["debug-info", "--json"],
expected_keys=["environment", "python_version", "tmux_version"],
is_json=True,
),
]
@pytest.mark.parametrize(
DEBUG_INFO_OUTPUT_FIXTURES[0]._fields,
[pytest.param(*f, id=f.test_id) for f in DEBUG_INFO_OUTPUT_FIXTURES],
)
def test_debug_info_output_modes(
monkeypatch: pytest.MonkeyPatch,
capsys: pytest.CaptureFixture[str],
test_id: str,
args: list[str],
expected_keys: list[str],
is_json: bool,
) -> None:
"""Test debug-info output modes (human and JSON)."""
monkeypatch.setenv("SHELL", "/bin/bash")
cli.cli(args)
output = capsys.readouterr().out
if is_json:
data = json.loads(output)
for key in expected_keys:
assert key in data, f"Expected key '{key}' in JSON output"
else:
for key in expected_keys:
assert key in output, f"Expected '{key}' in human output"
def test_debug_info_cli(
monkeypatch: pytest.MonkeyPatch,
tmp_path: pathlib.Path,
capsys: pytest.CaptureFixture[str],
) -> None:
"""Basic CLI test for tmuxp debug-info (human output)."""
monkeypatch.setenv("SHELL", "/bin/bash")
cli.cli(["debug-info"])
cli_output = capsys.readouterr().out
assert "environment" in cli_output
assert "python version" in cli_output
assert "system PATH" in cli_output
assert "tmux version" in cli_output
assert "libtmux version" in cli_output
assert "tmuxp version" in cli_output
assert "tmux path" in cli_output
assert "tmuxp path" in cli_output
assert "shell" in cli_output
assert "tmux session" in cli_output
assert "tmux windows" in cli_output
assert "tmux panes" in cli_output
assert "tmux global options" in cli_output
assert "tmux window options" in cli_output
def test_debug_info_json_output(
monkeypatch: pytest.MonkeyPatch,
capsys: pytest.CaptureFixture[str],
) -> None:
"""JSON output is valid JSON with expected structure."""
monkeypatch.setenv("SHELL", "/bin/bash")
cli.cli(["debug-info", "--json"])
output = capsys.readouterr().out
data = json.loads(output)
# Top-level keys
assert "environment" in data
assert "python_version" in data
assert "system_path" in data
assert "tmux_version" in data
assert "libtmux_version" in data
assert "tmuxp_version" in data
assert "tmux_path" in data
assert "tmuxp_path" in data
assert "shell" in data
assert "tmux" in data
# Environment structure
env = data["environment"]
assert "dist" in env
assert "arch" in env
assert "uname" in env
assert "version" in env
assert isinstance(env["uname"], list)
# Tmux structure
tmux = data["tmux"]
assert "sessions" in tmux
assert "windows" in tmux
assert "panes" in tmux
assert "global_options" in tmux
assert "window_options" in tmux
assert isinstance(tmux["sessions"], list)
def test_debug_info_json_no_ansi(
monkeypatch: pytest.MonkeyPatch,
capsys: pytest.CaptureFixture[str],
) -> None:
"""JSON output should not contain ANSI escape codes."""
monkeypatch.setenv("SHELL", "/bin/bash")
cli.cli(["debug-info", "--json"])
output = capsys.readouterr().out
# ANSI escape codes start with \x1b[ or \033[
assert "\x1b[" not in output, "JSON output contains ANSI escape codes"
assert "\033[" not in output, "JSON output contains ANSI escape codes"
def test_debug_info_json_paths_use_private_path(
monkeypatch: pytest.MonkeyPatch,
capsys: pytest.CaptureFixture[str],
) -> None:
"""JSON output should mask home directory with ~."""
import pathlib
# Set SHELL to a path under home directory
shell_path = pathlib.Path.home() / ".local" / "bin" / "zsh"
monkeypatch.setenv("SHELL", str(shell_path))
cli.cli(["debug-info", "--json"])
output = capsys.readouterr().out
data = json.loads(output)
# The shell path should be masked with ~
assert data["shell"] == "~/.local/bin/zsh", (
f"Expected shell path to be masked with ~, got: {data['shell']}"
)