|
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