Coverage for tests / test_tutorial / test_parameter_types / test_number / test_tutorial001.py: 100%

67 statements  

« prev     ^ index     » next       coverage.py v7.13.1, created at 2026-11-09 00:15 +0000

1import importlib 1abcdefg

2import subprocess 1abcdefg

3import sys 1abcdefg

4from types import ModuleType 1abcdefg

5 

6import pytest 1abcdefg

7import typer 1abcdefg

8import typer.core 1abcdefg

9from typer.testing import CliRunner 1abcdefg

10 

11runner = CliRunner() 1abcdefg

12 

13 

14@pytest.fixture( 1abcdefg

15 name="mod", 

16 params=[ 

17 pytest.param("tutorial001_py310"), 

18 pytest.param("tutorial001_an_py310"), 

19 ], 

20) 

21def get_mod(request: pytest.FixtureRequest) -> ModuleType: 1abcdefg

22 module_name = f"docs_src.parameter_types.number.{request.param}" 1abcdefg

23 mod = importlib.import_module(module_name) 1abcdefg

24 return mod 1abcdefg

25 

26 

27def test_type_repr(mod: ModuleType): 1abcdefg

28 command = typer.main.get_command(mod.app) 1abcdefg

29 

30 id_param = next(param for param in command.params if param.name == "ID") 1abcdefg

31 assert repr(id_param.type) == "<IntRange 0<=x<=1000>" 1abcdefg

32 

33 age_param = next(param for param in command.params if param.name == "age") 1abcdefg

34 assert repr(age_param.type) == "<IntRange x>=18>" 1abcdefg

35 

36 score_param = next(param for param in command.params if param.name == "score") 1abcdefg

37 assert repr(score_param.type) == "<FloatRange x<=100>" 1abcdefg

38 

39 

40def test_help(mod: ModuleType): 1abcdefg

41 result = runner.invoke(mod.app, ["--help"]) 1abcdefg

42 assert result.exit_code == 0 1abcdefg

43 assert "--age" in result.output 1abcdefg

44 assert "int range" in result.output 1abcdefg

45 assert "--score" in result.output 1abcdefg

46 assert "float range" in result.output 1abcdefg

47 

48 

49def test_help_no_rich(monkeypatch: pytest.MonkeyPatch, mod: ModuleType): 1abcdefg

50 monkeypatch.setattr(typer.core, "HAS_RICH", False) 1abcdefg

51 result = runner.invoke(mod.app, ["--help"]) 1abcdefg

52 assert result.exit_code == 0 1abcdefg

53 assert "--age" in result.output 1abcdefg

54 assert "int range" in result.output 1abcdefg

55 assert "--score" in result.output 1abcdefg

56 assert "float range" in result.output 1abcdefg

57 

58 

59def test_params(mod: ModuleType): 1abcdefg

60 result = runner.invoke(mod.app, ["5", "--age", "20", "--score", "90"]) 1abcdefg

61 assert result.exit_code == 0 1abcdefg

62 assert "ID is 5" in result.output 1abcdefg

63 assert "--age is 20" in result.output 1abcdefg

64 assert "--score is 90.0" in result.output 1abcdefg

65 

66 

67def test_invalid_id(mod: ModuleType): 1abcdefg

68 result = runner.invoke(mod.app, ["1002"]) 1abcdefg

69 assert result.exit_code != 0 1abcdefg

70 assert ( 1abcdefg

71 "Invalid value for 'ID': 1002 is not in the range 0<=x<=1000." in result.output 

72 ) 

73 

74 

75def test_invalid_age(mod: ModuleType): 1abcdefg

76 result = runner.invoke(mod.app, ["5", "--age", "15"]) 1abcdefg

77 assert result.exit_code != 0 1abcdefg

78 assert "Invalid value for '--age'" in result.output 1abcdefg

79 assert "15 is not in the range x>=18" in result.output 1abcdefg

80 

81 

82def test_invalid_score(monkeypatch: pytest.MonkeyPatch, mod: ModuleType): 1abcdefg

83 monkeypatch.setattr(typer.core, "HAS_RICH", False) 1abcdefg

84 result = runner.invoke(mod.app, ["5", "--age", "20", "--score", "100.5"]) 1abcdefg

85 assert result.exit_code != 0 1abcdefg

86 assert "Invalid value for '--score'" in result.output 1abcdefg

87 assert "100.5 is not in the range x<=100." in result.output 1abcdefg

88 

89 

90def test_negative_score(mod: ModuleType): 1abcdefg

91 result = runner.invoke(mod.app, ["5", "--age", "20", "--score", "-5"]) 1abcdefg

92 assert result.exit_code == 0 1abcdefg

93 assert "ID is 5" in result.output 1abcdefg

94 assert "--age is 20" in result.output 1abcdefg

95 assert "--score is -5.0" in result.output 1abcdefg

96 

97 

98def test_script(mod: ModuleType): 1abcdefg

99 result = subprocess.run( 1abcdefg

100 [sys.executable, "-m", "coverage", "run", mod.__file__, "--help"], 

101 capture_output=True, 

102 encoding="utf-8", 

103 ) 

104 assert "Usage" in result.stdout 1abcdefg