Coverage for tests/test_annotated.py: 100%

54 statements  

« prev     ^ index     » next       coverage.py v7.6.1, created at 2025-04-14 00:18 +0000

1import typer 1iabgcdhef

2from typer.testing import CliRunner 1iabgcdhef

3from typing_extensions import Annotated 1iabgcdhef

4 

5from .utils import needs_py310 1iabgcdhef

6 

7runner = CliRunner() 1iabgcdhef

8 

9 

10def test_annotated_argument_with_default(): 1iabgcdhef

11 app = typer.Typer() 1iabgcdhef

12 

13 @app.command() 1iabgcdhef

14 def cmd(val: Annotated[int, typer.Argument()] = 0): 1iabgcdhef

15 print(f"hello {val}") 1iabgcdhef

16 

17 result = runner.invoke(app) 1iabgcdhef

18 assert result.exit_code == 0, result.output 1iabgcdhef

19 assert "hello 0" in result.output 1iabgcdhef

20 

21 result = runner.invoke(app, ["42"]) 1iabgcdhef

22 assert result.exit_code == 0, result.output 1iabgcdhef

23 assert "hello 42" in result.output 1iabgcdhef

24 

25 

26@needs_py310 1iabgcdhef

27def test_annotated_argument_in_string_type_with_default(): 1abgcdhef

28 app = typer.Typer() 1abcdef

29 

30 @app.command() 1abcdef

31 def cmd(val: "Annotated[int, typer.Argument()]" = 0): 1abcdef

32 print(f"hello {val}") 1abcdef

33 

34 result = runner.invoke(app) 1abcdef

35 assert result.exit_code == 0, result.output 1abcdef

36 assert "hello 0" in result.output 1abcdef

37 

38 result = runner.invoke(app, ["42"]) 1abcdef

39 assert result.exit_code == 0, result.output 1abcdef

40 assert "hello 42" in result.output 1abcdef

41 

42 

43def test_annotated_argument_with_default_factory(): 1iabgcdhef

44 app = typer.Typer() 1iabgcdhef

45 

46 def make_string(): 1iabgcdhef

47 return "I made it" 1iabgcdhef

48 

49 @app.command() 1iabgcdhef

50 def cmd(val: Annotated[str, typer.Argument(default_factory=make_string)]): 1iabgcdhef

51 print(val) 1iabgcdhef

52 

53 result = runner.invoke(app) 1iabgcdhef

54 assert result.exit_code == 0, result.output 1iabgcdhef

55 assert "I made it" in result.output 1iabgcdhef

56 

57 result = runner.invoke(app, ["overridden"]) 1iabgcdhef

58 assert result.exit_code == 0, result.output 1iabgcdhef

59 assert "overridden" in result.output 1iabgcdhef

60 

61 

62def test_annotated_option_with_argname_doesnt_mutate_multiple_calls(): 1iabgcdhef

63 app = typer.Typer() 1iabgcdhef

64 

65 @app.command() 1iabgcdhef

66 def cmd(force: Annotated[bool, typer.Option("--force")] = False): 1iabgcdhef

67 if force: 1iabgcdhef

68 print("Forcing operation") 1iabgcdhef

69 else: 

70 print("Not forcing") 1iabgcdhef

71 

72 result = runner.invoke(app) 1iabgcdhef

73 assert result.exit_code == 0, result.output 1iabgcdhef

74 assert "Not forcing" in result.output 1iabgcdhef

75 

76 result = runner.invoke(app, ["--force"]) 1iabgcdhef

77 assert result.exit_code == 0, result.output 1iabgcdhef

78 assert "Forcing operation" in result.output 1iabgcdhef