Skip to content

Commit e721b6c

Browse files
committed
tests/_internal/subprocess(test[typing]): Refine SubprocessCommand test types
why: Reduce broad typing in test fixtures without changing behavior. what: - Replace varargs fixture shape with explicit cmd_args - Type expected_result as SubprocessCommand - Add CmdArgs alias for clearer argument intent
1 parent 5d6e126 commit e721b6c

1 file changed

Lines changed: 60 additions & 47 deletions

File tree

tests/_internal/subprocess/test_SubprocessCommand.py

Lines changed: 60 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,17 @@
88
import pytest
99

1010
from libvcs._internal.subprocess import SubprocessCommand
11+
from libvcs._internal.types import StrOrBytesPath
1112

1213
if t.TYPE_CHECKING:
1314
import pathlib
1415

1516

16-
def idfn(val: t.Any) -> str:
17+
CmdArgs = StrOrBytesPath | t.Sequence[StrOrBytesPath]
18+
Kwargs = dict[str, t.Any]
19+
20+
21+
def idfn(val: CmdArgs | Kwargs | SubprocessCommand | None) -> str:
1722
"""Test ID naming function for SubprocessCommand py.test parametrize."""
1823
if isinstance(val, list):
1924
if len(val):
@@ -24,28 +29,36 @@ def idfn(val: t.Any) -> str:
2429

2530

2631
@pytest.mark.parametrize(
27-
("args", "kwargs", "expected_result"),
32+
("cmd_args", "kwargs", "expected_result"),
2833
[
29-
(["ls"], {}, SubprocessCommand("ls")),
30-
([["ls", "-l"]], {}, SubprocessCommand(["ls", "-l"])),
31-
([], {"args": ["ls", "-l"]}, SubprocessCommand(["ls", "-l"])),
32-
(["ls -l"], {"shell": True}, SubprocessCommand("ls -l", shell=True)),
33-
([], {"args": "ls -l", "shell": True}, SubprocessCommand("ls -l", shell=True)),
34+
("ls", {}, SubprocessCommand("ls")),
35+
(["ls", "-l"], {}, SubprocessCommand(["ls", "-l"])),
36+
(None, {"args": ["ls", "-l"]}, SubprocessCommand(["ls", "-l"])),
37+
("ls -l", {"shell": True}, SubprocessCommand("ls -l", shell=True)),
38+
(
39+
None,
40+
{"args": "ls -l", "shell": True},
41+
SubprocessCommand("ls -l", shell=True),
42+
),
3443
(
35-
[],
44+
None,
3645
{"args": ["ls", "-l"], "shell": True},
3746
SubprocessCommand(["ls", "-l"], shell=True),
3847
),
3948
],
4049
ids=idfn,
4150
)
4251
def test_init(
43-
args: list[t.Any],
44-
kwargs: dict[str, t.Any],
45-
expected_result: t.Any,
52+
cmd_args: CmdArgs | None,
53+
kwargs: Kwargs,
54+
expected_result: SubprocessCommand,
4655
) -> None:
4756
"""Test SubprocessCommand via list + kwargs, assert attributes."""
48-
cmd = SubprocessCommand(*args, **kwargs)
57+
cmd = (
58+
SubprocessCommand(cmd_args, **kwargs)
59+
if cmd_args is not None
60+
else SubprocessCommand(**kwargs)
61+
)
4962
assert cmd == expected_result
5063

5164
# Attributes in cmd should match what's passed in
@@ -57,116 +70,116 @@ def test_init(
5770
assert proc.returncode == 0
5871

5972

60-
FIXTURES = [
61-
[["ls"], {}, SubprocessCommand("ls")],
62-
[[["ls", "-l"]], {}, SubprocessCommand(["ls", "-l"])],
73+
FIXTURES: list[tuple[CmdArgs, Kwargs, SubprocessCommand]] = [
74+
("ls", {}, SubprocessCommand("ls")),
75+
(["ls", "-l"], {}, SubprocessCommand(["ls", "-l"])),
6376
]
6477

6578

6679
@pytest.mark.parametrize(
67-
("args", "kwargs", "expected_result"),
80+
("cmd_args", "kwargs", "expected_result"),
6881
FIXTURES,
6982
ids=idfn,
7083
)
7184
def test_init_and_Popen(
72-
args: list[t.Any],
73-
kwargs: dict[str, t.Any],
74-
expected_result: t.Any,
85+
cmd_args: CmdArgs,
86+
kwargs: Kwargs,
87+
expected_result: SubprocessCommand,
7588
) -> None:
7689
"""Test SubprocessCommand with Popen."""
77-
cmd = SubprocessCommand(*args, **kwargs)
90+
cmd = SubprocessCommand(cmd_args, **kwargs)
7891
assert cmd == expected_result
7992

8093
cmd_proc = cmd.Popen()
8194
cmd_proc.communicate()
8295
assert cmd_proc.returncode == 0
8396

84-
proc = subprocess.Popen(*args, **kwargs)
97+
proc = subprocess.Popen(cmd_args, **kwargs)
8598
proc.communicate()
8699
assert proc.returncode == 0
87100

88101

89102
@pytest.mark.parametrize(
90-
("args", "kwargs", "expected_result"),
103+
("cmd_args", "kwargs", "expected_result"),
91104
FIXTURES,
92105
ids=idfn,
93106
)
94107
def test_init_and_Popen_run(
95-
args: list[t.Any],
96-
kwargs: dict[str, t.Any],
97-
expected_result: t.Any,
108+
cmd_args: CmdArgs,
109+
kwargs: Kwargs,
110+
expected_result: SubprocessCommand,
98111
) -> None:
99112
"""Test SubprocessCommand with run."""
100-
cmd = SubprocessCommand(*args, **kwargs)
113+
cmd = SubprocessCommand(cmd_args, **kwargs)
101114
assert cmd == expected_result
102115

103116
cmd_proc = cmd.Popen()
104117
cmd_proc.communicate()
105118
assert cmd_proc.returncode == 0
106119

107-
proc = subprocess.run(*args, **kwargs, check=False)
120+
proc = subprocess.run(cmd_args, **kwargs, check=False)
108121
assert proc.returncode == 0
109122

110123

111124
@pytest.mark.parametrize(
112-
("args", "kwargs", "expected_result"),
125+
("cmd_args", "kwargs", "expected_result"),
113126
FIXTURES,
114127
ids=idfn,
115128
)
116129
def test_init_and_check_call(
117-
args: list[t.Any],
118-
kwargs: dict[str, t.Any],
119-
expected_result: t.Any,
130+
cmd_args: CmdArgs,
131+
kwargs: Kwargs,
132+
expected_result: SubprocessCommand,
120133
) -> None:
121134
"""Test SubprocessCommand with Popen.check_call."""
122-
cmd = SubprocessCommand(*args, **kwargs)
135+
cmd = SubprocessCommand(cmd_args, **kwargs)
123136
assert cmd == expected_result
124137

125138
return_code = cmd.check_call()
126139
assert return_code == 0
127140

128-
proc = subprocess.check_call(*args, **kwargs)
141+
proc = subprocess.check_call(cmd_args, **kwargs)
129142
assert proc == return_code
130143

131144

132145
@pytest.mark.parametrize(
133-
("args", "kwargs", "expected_result"),
146+
("cmd_args", "kwargs", "expected_result"),
134147
FIXTURES,
135148
)
136149
def test_init_and_check_output(
137-
args: list[t.Any],
138-
kwargs: dict[str, t.Any],
139-
expected_result: t.Any,
150+
cmd_args: CmdArgs,
151+
kwargs: Kwargs,
152+
expected_result: SubprocessCommand,
140153
) -> None:
141154
"""Test SubprocessCommand with Popen.check_output."""
142-
cmd = SubprocessCommand(*args, **kwargs)
155+
cmd = SubprocessCommand(cmd_args, **kwargs)
143156
assert cmd == expected_result
144157

145158
return_output = cmd.check_output()
146159
assert isinstance(return_output, bytes)
147160

148-
proc = subprocess.check_output(*args, **kwargs)
161+
proc = subprocess.check_output(cmd_args, **kwargs)
149162
assert proc == return_output
150163

151164

152165
@pytest.mark.parametrize(
153-
("args", "kwargs", "run_kwargs"),
166+
("cmd_args", "kwargs", "run_kwargs"),
154167
[
155-
(["ls"], {}, {}),
156-
([["ls", "-l"]], {}, {}),
157-
([["ls", "-al"]], {}, {"stdout": subprocess.DEVNULL}),
168+
("ls", {}, {}),
169+
(["ls", "-l"], {}, {}),
170+
(["ls", "-al"], {}, {"stdout": subprocess.DEVNULL}),
158171
],
159172
ids=idfn,
160173
)
161174
def test_run(
162175
tmp_path: pathlib.Path,
163-
args: list[t.Any],
164-
kwargs: dict[str, t.Any],
165-
run_kwargs: dict[str, t.Any],
176+
cmd_args: CmdArgs,
177+
kwargs: Kwargs,
178+
run_kwargs: Kwargs,
166179
) -> None:
167180
"""Test SubprocessCommand.run()."""
168181
kwargs["cwd"] = tmp_path
169-
cmd = SubprocessCommand(*args, **kwargs)
182+
cmd = SubprocessCommand(cmd_args, **kwargs)
170183
response = cmd.run(**run_kwargs)
171184

172185
assert response.returncode == 0

0 commit comments

Comments
 (0)