|
32 | 32 | version_regex = re.compile(r"([0-9]\.[0-9])|(master)")
|
33 | 33 |
|
34 | 34 |
|
35 |
| -def test_allows_master_version(monkeypatch: pytest.MonkeyPatch) -> None: |
36 |
| - """Assert get_version() works with builds from git trunk.""" |
37 |
| - |
38 |
| - class Hi: |
39 |
| - stdout: t.ClassVar = ["tmux master"] |
40 |
| - stderr = None |
41 |
| - |
42 |
| - def mock_tmux_cmd(*args: t.Any, **kwargs: t.Any) -> Hi: |
43 |
| - return Hi() |
44 |
| - |
45 |
| - monkeypatch.setattr(libtmux.common, "tmux_cmd", mock_tmux_cmd) |
46 |
| - |
47 |
| - assert has_minimum_version() |
48 |
| - assert has_gte_version(TMUX_MIN_VERSION) |
49 |
| - assert has_gt_version(TMUX_MAX_VERSION), "Greater than the max-supported version" |
50 |
| - assert get_version() == f"{TMUX_MAX_VERSION}-master", ( |
51 |
| - "Is the latest supported version with -master appended" |
52 |
| - ) |
53 |
| - |
54 |
| - |
55 |
| -def test_allows_next_version(monkeypatch: pytest.MonkeyPatch) -> None: |
56 |
| - """Assert get_version() supports next version.""" |
57 |
| - TMUX_NEXT_VERSION = str(float(TMUX_MAX_VERSION) + 0.1) |
58 |
| - |
59 |
| - class Hi: |
60 |
| - stdout: t.ClassVar = [f"tmux next-{TMUX_NEXT_VERSION}"] |
61 |
| - stderr = None |
62 |
| - |
63 |
| - def mock_tmux_cmd(*args: t.Any, **kwargs: t.Any) -> Hi: |
64 |
| - return Hi() |
65 |
| - |
66 |
| - monkeypatch.setattr(libtmux.common, "tmux_cmd", mock_tmux_cmd) |
67 |
| - |
68 |
| - assert has_minimum_version() |
69 |
| - assert has_gte_version(TMUX_MIN_VERSION) |
70 |
| - assert has_gt_version(TMUX_MAX_VERSION), "Greater than the max-supported version" |
71 |
| - assert get_version() == TMUX_NEXT_VERSION |
72 |
| - |
73 |
| - |
74 |
| -def test_get_version_openbsd(monkeypatch: pytest.MonkeyPatch) -> None: |
75 |
| - """Assert get_version() with OpenBSD versions.""" |
76 |
| - |
77 |
| - class Hi: |
78 |
| - stderr: t.ClassVar = ["tmux: unknown option -- V"] |
79 |
| - |
80 |
| - def mock_tmux_cmd(*args: t.Any, **kwargs: t.Any) -> Hi: |
81 |
| - return Hi() |
82 |
| - |
83 |
| - monkeypatch.setattr(libtmux.common, "tmux_cmd", mock_tmux_cmd) |
84 |
| - monkeypatch.setattr(sys, "platform", "openbsd 5.2") |
85 |
| - assert has_minimum_version() |
86 |
| - assert has_gte_version(TMUX_MIN_VERSION) |
87 |
| - assert has_gt_version(TMUX_MAX_VERSION), "Greater than the max-supported version" |
88 |
| - assert get_version() == f"{TMUX_MAX_VERSION}-openbsd", ( |
89 |
| - "Is the latest supported version with -openbsd appended" |
90 |
| - ) |
91 |
| - |
92 |
| - |
93 |
| -def test_get_version_too_low(monkeypatch: pytest.MonkeyPatch) -> None: |
94 |
| - """Assert get_version() raises if tmux version too low.""" |
95 |
| - |
96 |
| - class Hi: |
97 |
| - stderr: t.ClassVar = ["tmux: unknown option -- V"] |
98 |
| - |
99 |
| - def mock_tmux_cmd(*args: t.Any, **kwargs: t.Any) -> Hi: |
100 |
| - return Hi() |
101 |
| - |
102 |
| - monkeypatch.setattr(libtmux.common, "tmux_cmd", mock_tmux_cmd) |
103 |
| - with pytest.raises(LibTmuxException) as exc_info: |
104 |
| - get_version() |
105 |
| - exc_info.match("is running tmux 1.3 or earlier") |
106 |
| - |
107 |
| - |
108 | 35 | def test_ignores_letter_versions(monkeypatch: pytest.MonkeyPatch) -> None:
|
109 | 36 | """Tests version utilities ignores letters such as 1.8b.
|
110 | 37 |
|
@@ -385,3 +312,95 @@ def test_version_comparison(
|
385 | 312 | "lte": has_lte_version,
|
386 | 313 | }
|
387 | 314 | assert comparison_funcs[comparison_type](version) == expected
|
| 315 | + |
| 316 | + |
| 317 | +class VersionParsingFixture(t.NamedTuple): |
| 318 | + """Test fixture for version parsing and validation.""" |
| 319 | + |
| 320 | + test_id: str |
| 321 | + mock_stdout: list[str] | None |
| 322 | + mock_stderr: list[str] | None |
| 323 | + mock_platform: str | None |
| 324 | + expected_version: str | None |
| 325 | + raises: bool |
| 326 | + exc_msg_regex: str | None |
| 327 | + |
| 328 | + |
| 329 | +VERSION_PARSING_FIXTURES: list[VersionParsingFixture] = [ |
| 330 | + VersionParsingFixture( |
| 331 | + test_id="master_version", |
| 332 | + mock_stdout=["tmux master"], |
| 333 | + mock_stderr=None, |
| 334 | + mock_platform=None, |
| 335 | + expected_version=f"{TMUX_MAX_VERSION}-master", |
| 336 | + raises=False, |
| 337 | + exc_msg_regex=None, |
| 338 | + ), |
| 339 | + VersionParsingFixture( |
| 340 | + test_id="next_version", |
| 341 | + mock_stdout=[f"tmux next-{float(TMUX_MAX_VERSION) + 0.1!s}"], |
| 342 | + mock_stderr=None, |
| 343 | + mock_platform=None, |
| 344 | + expected_version=str(float(TMUX_MAX_VERSION) + 0.1), |
| 345 | + raises=False, |
| 346 | + exc_msg_regex=None, |
| 347 | + ), |
| 348 | + VersionParsingFixture( |
| 349 | + test_id="openbsd_version", |
| 350 | + mock_stdout=None, |
| 351 | + mock_stderr=["tmux: unknown option -- V"], |
| 352 | + mock_platform="openbsd 5.2", |
| 353 | + expected_version=f"{TMUX_MAX_VERSION}-openbsd", |
| 354 | + raises=False, |
| 355 | + exc_msg_regex=None, |
| 356 | + ), |
| 357 | + VersionParsingFixture( |
| 358 | + test_id="too_low_version", |
| 359 | + mock_stdout=None, |
| 360 | + mock_stderr=["tmux: unknown option -- V"], |
| 361 | + mock_platform=None, |
| 362 | + expected_version=None, |
| 363 | + raises=True, |
| 364 | + exc_msg_regex="is running tmux 1.3 or earlier", |
| 365 | + ), |
| 366 | +] |
| 367 | + |
| 368 | + |
| 369 | +@pytest.mark.parametrize( |
| 370 | + list(VersionParsingFixture._fields), |
| 371 | + VERSION_PARSING_FIXTURES, |
| 372 | + ids=[test.test_id for test in VERSION_PARSING_FIXTURES], |
| 373 | +) |
| 374 | +def test_version_parsing( |
| 375 | + monkeypatch: pytest.MonkeyPatch, |
| 376 | + test_id: str, |
| 377 | + mock_stdout: list[str] | None, |
| 378 | + mock_stderr: list[str] | None, |
| 379 | + mock_platform: str | None, |
| 380 | + expected_version: str | None, |
| 381 | + raises: bool, |
| 382 | + exc_msg_regex: str | None, |
| 383 | +) -> None: |
| 384 | + """Test version parsing and validation.""" |
| 385 | + |
| 386 | + class MockTmuxOutput: |
| 387 | + stdout = mock_stdout |
| 388 | + stderr = mock_stderr |
| 389 | + |
| 390 | + def mock_tmux_cmd(*args: t.Any, **kwargs: t.Any) -> MockTmuxOutput: |
| 391 | + return MockTmuxOutput() |
| 392 | + |
| 393 | + monkeypatch.setattr(libtmux.common, "tmux_cmd", mock_tmux_cmd) |
| 394 | + if mock_platform is not None: |
| 395 | + monkeypatch.setattr(sys, "platform", mock_platform) |
| 396 | + |
| 397 | + if raises: |
| 398 | + with pytest.raises(LibTmuxException) as exc_info: |
| 399 | + get_version() |
| 400 | + if exc_msg_regex is not None: |
| 401 | + exc_info.match(exc_msg_regex) |
| 402 | + else: |
| 403 | + assert get_version() == expected_version |
| 404 | + assert has_minimum_version() |
| 405 | + assert has_gte_version(TMUX_MIN_VERSION) |
| 406 | + assert has_gt_version(TMUX_MAX_VERSION) |
0 commit comments