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