Coverage for tests / unit_tests / commands / test_apio_packages.py: 100%

52 statements  

« prev     ^ index     » next       coverage.py v7.13.0, created at 2025-12-24 01:53 +0000

1"""Test for the "apio packages" command.""" 

2 

3from os import listdir, rename 

4from tests.conftest import ApioRunner 

5from apio.commands.apio import apio_top_cli as apio 

6from apio.common.apio_console import cunstyle 

7 

8 

9def test_packages(apio_runner: ApioRunner): 

10 """Test "apio packages" with different parameters""" 

11 

12 with apio_runner.in_sandbox() as sb: 

13 

14 # -- Execute "apio packages" 

15 result = sb.invoke_apio_cmd(apio, ["packages"]) 

16 sb.assert_result_ok(result) 

17 assert "Subcommands:" in result.output 

18 assert "apio packages update" in cunstyle(result.output) 

19 assert "apio packages list" in cunstyle(result.output) 

20 assert result.output != cunstyle(result.output) # Colored. 

21 

22 # -- Execute "apio packages list" 

23 result = sb.invoke_apio_cmd(apio, ["packages", "list"]) 

24 sb.assert_result_ok(result) 

25 

26 

27def test_packages_slow(apio_runner: ApioRunner): 

28 """Tests listing, installation and uninstallation of packages.""" 

29 

30 with apio_runner.in_sandbox() as sb: 

31 

32 # -- Run 'apio packages list' 

33 result = sb.invoke_apio_cmd(apio, ["packages", "list"]) 

34 sb.assert_result_ok(result) 

35 assert "definitions" in result.output 

36 assert "examples" in result.output 

37 assert "oss-cad-suite" in result.output 

38 

39 # -- Run 'apio packages update'. 

40 # -- Both 'examples' and 'oss-cad-suite' should exist, and 

41 # -- possibly others, depending on the platform. 

42 result = sb.invoke_apio_cmd(apio, ["packages", "update"]) 

43 sb.assert_result_ok(result) 

44 assert "All Apio packages are installed OK" in result.output 

45 assert listdir(sb.packages_dir / "definitions") 

46 assert listdir(sb.packages_dir / "examples/alhambra-ii") 

47 assert listdir(sb.packages_dir / "oss-cad-suite/bin") 

48 

49 # -- Delete a file from the examples package, we will use it as an 

50 # -- indicator for the reinstallation of the package. 

51 marker_file = sb.packages_dir / "examples/alhambra-ii/ledon/ledon.v" 

52 assert marker_file.is_file() 

53 marker_file.unlink() 

54 assert not marker_file.exists() 

55 

56 # -- Run 'apio packages update'. 

57 # -- This should not do anything since it's considered to be installed. 

58 result = sb.invoke_apio_cmd(apio, ["packages", "update"]) 

59 sb.assert_result_ok(result) 

60 assert "Package 'examples' installed" not in result.output 

61 assert not marker_file.exists() 

62 

63 # -- Run 'apio packages update --force' 

64 # -- This should recover the file. 

65 result = sb.invoke_apio_cmd(apio, ["packages", "update", "--force"]) 

66 sb.assert_result_ok(result) 

67 assert "Package 'examples' installed" in result.output 

68 assert marker_file.is_file() 

69 

70 # -- Break the examples package by renaming it. This also creates an 

71 # -- orphan dir. 

72 example_package_dir = sb.packages_dir / "examples" 

73 bad_package_dir = sb.packages_dir / "unknown-package" 

74 rename(example_package_dir, bad_package_dir) 

75 assert not example_package_dir.exists() 

76 assert bad_package_dir.is_dir() 

77 

78 # -- Run 'apio packages update'. This should fix everything. 

79 result = sb.invoke_apio_cmd(apio, ["packages", "update"]) 

80 sb.assert_result_ok(result) 

81 assert "Uninstalling broken package 'examples'" in result.output 

82 assert ( 

83 "Deleting unknown package dir 'unknown-package'" in result.output 

84 ) 

85 assert "Package 'examples' installed successfully" in result.output 

86 assert example_package_dir.is_dir() 

87 assert marker_file.exists() 

88 assert not bad_package_dir.exists()