Skip to content

Commit 135f9ab

Browse files
committed
test(common): Convert version validation tests to use NamedTuple fixture
1 parent d2e3aea commit 135f9ab

File tree

1 file changed

+144
-40
lines changed

1 file changed

+144
-40
lines changed

tests/test_common.py

+144-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,147 @@ 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+
# Additional test cases for version validation
432+
VersionValidationFixture(
433+
test_id="accepts_master_version",
434+
mock_min_version=None,
435+
mock_version="master",
436+
check_type="type_check",
437+
raises=False,
438+
exc_msg_regex=None,
439+
),
440+
VersionValidationFixture(
441+
test_id="accepts_next_version",
442+
mock_min_version=None,
443+
mock_version="next-3.4",
444+
check_type="type_check",
445+
raises=False,
446+
exc_msg_regex=None,
447+
),
448+
VersionValidationFixture(
449+
test_id="accepts_openbsd_version",
450+
mock_min_version=None,
451+
mock_version="3.3-openbsd",
452+
check_type="type_check",
453+
raises=False,
454+
exc_msg_regex=None,
455+
),
456+
VersionValidationFixture(
457+
test_id="accepts_dev_version",
458+
mock_min_version=None,
459+
mock_version="3.3-dev",
460+
check_type="type_check",
461+
raises=False,
462+
exc_msg_regex=None,
463+
),
464+
VersionValidationFixture(
465+
test_id="accepts_rc_version",
466+
mock_min_version=None,
467+
mock_version="3.3-rc2",
468+
check_type="type_check",
469+
raises=False,
470+
exc_msg_regex=None,
471+
),
472+
]
473+
474+
475+
@pytest.mark.parametrize(
476+
list(VersionValidationFixture._fields),
477+
VERSION_VALIDATION_FIXTURES,
478+
ids=[test.test_id for test in VERSION_VALIDATION_FIXTURES],
479+
)
480+
def test_version_validation(
481+
monkeypatch: pytest.MonkeyPatch,
482+
test_id: str,
483+
mock_min_version: str | None,
484+
mock_version: str | None,
485+
check_type: t.Literal["min_version", "has_version", "type_check"],
486+
raises: bool,
487+
exc_msg_regex: str | None,
488+
) -> None:
489+
"""Test version validation."""
490+
if mock_min_version is not None:
491+
monkeypatch.setattr(libtmux.common, "TMUX_MIN_VERSION", mock_min_version)
492+
493+
if mock_version is not None:
494+
495+
def mock_get_version() -> LooseVersion:
496+
return LooseVersion(mock_version)
497+
498+
monkeypatch.setattr(libtmux.common, "get_version", mock_get_version)
499+
500+
if check_type == "min_version":
501+
if raises:
502+
with pytest.raises(LibTmuxException) as exc_info:
503+
has_minimum_version()
504+
if exc_msg_regex is not None:
505+
exc_info.match(exc_msg_regex)
506+
else:
507+
assert has_minimum_version()
508+
elif check_type == "type_check":
509+
assert mock_version is not None # For type checker
510+
assert isinstance(has_version(mock_version), bool)

0 commit comments

Comments
 (0)