Coverage for tests/unit/test_commands.py: 100%

59 statements  

« prev     ^ index     » next       coverage.py v7.7.1, created at 2025-03-26 18:22 -0600

1"""Unit tests for commands.py""" 

2 

3# pylint: disable=C0116 

4from unittest.mock import patch 

5from es_fieldusage.commands import ( 

6 get_per_index, 

7 format_delimiter, 

8 header_msg, 

9 is_docker, 

10 output_generator, 

11 printout, 

12 override_filepath, 

13 FILEPATH_OVERRIDE, 

14) 

15 

16 

17def test_get_per_index_per_index_true(mock_field_usage): 

18 result = get_per_index(mock_field_usage, True) 

19 assert result == { 

20 'index1': {'accessed': {'field1': 1}, 'unaccessed': {'field2': 0}} 

21 } 

22 

23 

24def test_get_per_index_per_index_false(mock_field_usage): 

25 result = get_per_index(mock_field_usage, False) 

26 assert result == { 

27 'all_indices': {'accessed': {'field1': 1}, 'unaccessed': {'field2': 0}} 

28 } 

29 

30 

31# def test_get_per_index_exception(mock_field_usage): 

32# mock_field_usage.per_index_report.return_value = 123.456 

33# with patch('logging.getLogger') as mock_logger: 

34# with pytest.raises(FatalException): 

35# get_per_index(mock_field_usage, True) 

36# mock_logger.return_value.critical.assert_called_once_with( 

37# 'Unable to get per_index_report data: Test exception' 

38# ) 

39 

40 

41def test_format_delimiter(): 

42 assert format_delimiter(':') == ': ' 

43 assert format_delimiter('=') == ' = ' 

44 assert format_delimiter(',') == ',' 

45 assert format_delimiter(' ') == ' ' 

46 

47 

48def test_header_msg(): 

49 assert header_msg("Test message", True) == "Test message" 

50 assert header_msg("Test message", False) == "" 

51 

52 

53@patch('pathlib.Path.is_file') 

54def test_is_docker_dockerenv_exists(mock_is_file): 

55 mock_is_file.return_value = True 

56 assert is_docker() is True 

57 

58 

59@patch('pathlib.Path.is_file') 

60def test_is_docker_cgroup_docker(mock_is_file): 

61 mock_is_file.side_effect = [False, True] # /.dockerenv, /proc/self/cgroup 

62 with patch('pathlib.Path.read_text', return_value="docker"): 

63 assert is_docker() is True 

64 

65 

66@patch('pathlib.Path.is_file') 

67def test_is_docker_not_in_docker(mock_is_file): 

68 mock_is_file.side_effect = [False, False] # Neither condition met 

69 assert is_docker() is False 

70 

71 

72def test_output_generator_show_counts_true(): 

73 data = {'field1': 1, 'field2': 2} 

74 gen = output_generator(data, True, ':') 

75 assert list(gen) == ['field1: 1\n', 'field2: 2\n'] 

76 

77 

78def test_output_generator_show_counts_false(): 

79 data = {'field1': 1, 'field2': 2} 

80 gen = output_generator(data, False, ':') 

81 assert list(gen) == ['field1\n', 'field2\n'] 

82 

83 

84def test_output_generator_custom_delimiter(): 

85 data = {'field1': 1} 

86 gen = output_generator(data, True, ',') 

87 assert list(gen) == ['field1,1\n'] 

88 

89 

90def test_printout_show_counts_true(capsys): 

91 data = {'field1': 1, 'field2': 2} 

92 printout(data, True, ':') 

93 captured = capsys.readouterr() 

94 assert captured.out == 'field1: 1\nfield2: 2\n' 

95 

96 

97def test_printout_show_counts_false(capsys): 

98 data = {'field1': 1, 'field2': 2} 

99 printout(data, False, ':') 

100 captured = capsys.readouterr() 

101 assert captured.out == 'field1\nfield2\n' 

102 

103 

104@patch('es_fieldusage.commands.is_docker') 

105def test_override_filepath_in_docker(mock_is_docker): 

106 mock_is_docker.return_value = True 

107 assert override_filepath() == {'default': FILEPATH_OVERRIDE} 

108 

109 

110@patch('es_fieldusage.commands.is_docker') 

111def test_override_filepath_not_in_docker(mock_is_docker): 

112 mock_is_docker.return_value = False 

113 assert not override_filepath() 

114 

115 

116# def test_stdout_command(click_context, mock_field_usage): 

117# runner = CliRunner() 

118# with patch('es_fieldusage.main.FieldUsage', return_value=mock_field_usage): 

119# result = runner.invoke( 

120# stdout, 

121# ['--show-report', '--show-accessed', '--show-unaccessed', 'test_pattern'], 

122# obj=click_context, 

123# ) 

124# assert result.exit_code == 0 

125# assert 'Accessed Fields' in result.output 

126# assert 'Unaccessed Fields' in result.output 

127# assert 'field1: 1' in result.output 

128# assert 'field2' in result.output 

129 

130 

131# def test_stdout_exception(click_context): 

132# with patch( 

133# 'es_fieldusage.main.FieldUsage', side_effect=Exception("Test exception") 

134# ): 

135# runner = CliRunner() 

136# with patch('logging.getLogger') as mock_logger: 

137# result = runner.invoke(stdout, ['test_pattern'], obj=click_context) 

138# assert result.exit_code != 0 

139# mock_logger.return_value.critical.assert_called_once_with( 

140# 'Exception encountered: Test exception' 

141# ) 

142 

143 

144# def test_file_command(click_context, mock_field_usage, tmp_path): 

145# runner = CliRunner() 

146# filepath = str(tmp_path) 

147# with patch('es_fieldusage.main.FieldUsage', return_value=mock_field_usage): 

148# result = runner.invoke( 

149# file, 

150# [ 

151# '--show-accessed', 

152# '--show-unaccessed', 

153# '--per-index', 

154# f'--filepath={filepath}', 

155# '--prefix=test', 

156# '--suffix=txt', 

157# 'test_pattern', 

158# ], 

159# obj=click_context, 

160# ) 

161# assert result.exit_code == 0 

162# assert 'Number of files written: 1' in result.output 

163# assert os.path.exists(os.path.join(filepath, 'test-index1.txt')) 

164# with open(os.path.join( 

165# filepath, 'test-index1.txt'), 'r', encoding='utf8') as f: 

166# content = f.read() 

167# assert 'field1: 1' in content 

168# assert 'field2' in content 

169 

170 

171# def test_file_json_output(click_context, mock_field_usage, tmp_path): 

172# runner = CliRunner() 

173# filepath = str(tmp_path) 

174# with patch('es_fieldusage.main.FieldUsage', return_value=mock_field_usage): 

175# result = runner.invoke( 

176# file, 

177# [ 

178# '--show-accessed', 

179# f'--filepath={filepath}', 

180# '--prefix=test', 

181# '--suffix=json', 

182# 'test_pattern', 

183# ], 

184# obj=click_context, 

185# ) 

186# assert result.exit_code == 0 

187# with open( 

188# os.path.join(filepath, 'test-all_indices.json'), 'r', encoding='utf8' 

189# ) as f: 

190# content = f.read() 

191# assert '"field1": 1' in content 

192 

193 

194# def test_index_command(click_context, mock_field_usage, tmp_path): 

195# runner = CliRunner() 

196# os.chdir(tmp_path) 

197# with patch('es_fieldusage.main.FieldUsage', return_value=mock_field_usage): 

198# result = runner.invoke( 

199# index, 

200# ['--show-accessed', '--per-index', 

201# '--indexname=test_idx', 'test_pattern'], 

202# obj=click_context, 

203# ) 

204# assert result.exit_code == 0 

205# with open('testing', 'r', encoding='utf8') as f: 

206# content = f.read() 

207# assert '"index": "index1"' in content 

208# assert '"field": {"name": "field1", "count": 1}' in content 

209 

210 

211# def test_show_indices_command(click_context): 

212# mock_client = MagicMock() 

213# mock_client.cat.indices.return_value = [{'index': 'index1'}, {'index': 'index2'}] 

214# with patch('es_client.helpers.config.get_client', return_value=mock_client): 

215# runner = CliRunner() 

216# result = runner.invoke(show_indices, ['test-*'], obj=click_context) 

217# assert result.exit_code == 0 

218# assert 'Search Pattern: test-*' in result.output 

219# assert '2 Indices Found' in result.output 

220# assert 'index1' in result.output 

221# assert 'index2' in result.output