Skip to content

Commit 3625f75

Browse files
committed
test(common): Convert version validation tests to use NamedTuple fixture
1 parent a21fd04 commit 3625f75

File tree

1 file changed

+101
-40
lines changed

1 file changed

+101
-40
lines changed

tests/test_common.py

+101-40
Original file line numberDiff line numberDiff line change
@@ -32,46 +32,6 @@
3232
version_regex = re.compile(r"([0-9]\.[0-9])|(master)")
3333

3434

35-
def test_ignores_letter_versions(monkeypatch: pytest.MonkeyPatch) -> None:
36-
"""Tests version utilities ignores letters such as 1.8b.
37-
38-
See ticket https://github.com/tmux-python/tmuxp/issues/55.
39-
40-
In version 0.1.7 this is adjusted to use LooseVersion, in order to
41-
allow letters.
42-
43-
"""
44-
monkeypatch.setattr(libtmux.common, "TMUX_MIN_VERSION", "1.9a")
45-
result = has_minimum_version()
46-
assert result
47-
48-
monkeypatch.setattr(libtmux.common, "TMUX_MIN_VERSION", "1.8a")
49-
result = has_minimum_version()
50-
assert result
51-
52-
# Should not throw
53-
assert isinstance(has_version("1.8"), bool)
54-
assert isinstance(has_version("1.8a"), bool)
55-
assert isinstance(has_version("1.9a"), bool)
56-
57-
58-
def test_error_version_less_1_7(monkeypatch: pytest.MonkeyPatch) -> None:
59-
"""Test raises if tmux version less than 1.7."""
60-
61-
def mock_get_version() -> LooseVersion:
62-
return LooseVersion("1.7")
63-
64-
monkeypatch.setattr(libtmux.common, "get_version", mock_get_version)
65-
with pytest.raises(LibTmuxException) as excinfo:
66-
has_minimum_version()
67-
excinfo.match(r"libtmux only supports")
68-
69-
with pytest.raises(LibTmuxException) as excinfo:
70-
has_minimum_version()
71-
72-
excinfo.match(r"libtmux only supports")
73-
74-
7535
def test_has_version() -> None:
7636
"""Test has_version()."""
7737
assert has_version(str(get_version()))
@@ -404,3 +364,104 @@ def mock_tmux_cmd(*args: t.Any, **kwargs: t.Any) -> MockTmuxOutput:
404364
assert has_minimum_version()
405365
assert has_gte_version(TMUX_MIN_VERSION)
406366
assert has_gt_version(TMUX_MAX_VERSION)
367+
368+
369+
class VersionValidationFixture(t.NamedTuple):
370+
"""Test fixture for version validation tests."""
371+
372+
test_id: str
373+
mock_min_version: str | None
374+
mock_version: str | None
375+
check_type: t.Literal["min_version", "has_version", "type_check"]
376+
raises: bool
377+
exc_msg_regex: str | None
378+
379+
380+
VERSION_VALIDATION_FIXTURES: list[VersionValidationFixture] = [
381+
# Letter version tests
382+
VersionValidationFixture(
383+
test_id="accepts_letter_in_min_version_1_9a",
384+
mock_min_version="1.9a",
385+
mock_version=None,
386+
check_type="min_version",
387+
raises=False,
388+
exc_msg_regex=None,
389+
),
390+
VersionValidationFixture(
391+
test_id="accepts_letter_in_min_version_1_8a",
392+
mock_min_version="1.8a",
393+
mock_version=None,
394+
check_type="min_version",
395+
raises=False,
396+
exc_msg_regex=None,
397+
),
398+
VersionValidationFixture(
399+
test_id="accepts_version_1_8",
400+
mock_min_version=None,
401+
mock_version="1.8",
402+
check_type="type_check",
403+
raises=False,
404+
exc_msg_regex=None,
405+
),
406+
VersionValidationFixture(
407+
test_id="accepts_version_1_8a",
408+
mock_min_version=None,
409+
mock_version="1.8a",
410+
check_type="type_check",
411+
raises=False,
412+
exc_msg_regex=None,
413+
),
414+
VersionValidationFixture(
415+
test_id="accepts_version_1_9a",
416+
mock_min_version=None,
417+
mock_version="1.9a",
418+
check_type="type_check",
419+
raises=False,
420+
exc_msg_regex=None,
421+
),
422+
# Version too low tests
423+
VersionValidationFixture(
424+
test_id="rejects_version_1_7",
425+
mock_min_version=None,
426+
mock_version="1.7",
427+
check_type="min_version",
428+
raises=True,
429+
exc_msg_regex=r"libtmux only supports",
430+
),
431+
]
432+
433+
434+
@pytest.mark.parametrize(
435+
list(VersionValidationFixture._fields),
436+
VERSION_VALIDATION_FIXTURES,
437+
ids=[test.test_id for test in VERSION_VALIDATION_FIXTURES],
438+
)
439+
def test_version_validation(
440+
monkeypatch: pytest.MonkeyPatch,
441+
test_id: str,
442+
mock_min_version: str | None,
443+
mock_version: str | None,
444+
check_type: t.Literal["min_version", "has_version", "type_check"],
445+
raises: bool,
446+
exc_msg_regex: str | None,
447+
) -> None:
448+
"""Test version validation."""
449+
if mock_min_version is not None:
450+
monkeypatch.setattr(libtmux.common, "TMUX_MIN_VERSION", mock_min_version)
451+
452+
if mock_version is not None:
453+
def mock_get_version() -> LooseVersion:
454+
return LooseVersion(mock_version)
455+
monkeypatch.setattr(libtmux.common, "get_version", mock_get_version)
456+
457+
if check_type == "min_version":
458+
if raises:
459+
with pytest.raises(LibTmuxException) as exc_info:
460+
has_minimum_version()
461+
if exc_msg_regex is not None:
462+
exc_info.match(exc_msg_regex)
463+
else:
464+
assert has_minimum_version()
465+
elif check_type == "type_check":
466+
assert mock_version is not None # For type checker
467+
assert isinstance(has_version(mock_version), bool)

0 commit comments

Comments
 (0)