|
32 | 32 | version_regex = re.compile(r"([0-9]\.[0-9])|(master)")
|
33 | 33 |
|
34 | 34 |
|
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 |
| - |
75 | 35 | def test_has_version() -> None:
|
76 | 36 | """Test has_version()."""
|
77 | 37 | assert has_version(str(get_version()))
|
@@ -404,3 +364,147 @@ def mock_tmux_cmd(*args: t.Any, **kwargs: t.Any) -> MockTmuxOutput:
|
404 | 364 | assert has_minimum_version()
|
405 | 365 | assert has_gte_version(TMUX_MIN_VERSION)
|
406 | 366 | 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