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
« prev ^ index » next coverage.py v7.7.1, created at 2025-03-26 18:22 -0600
1"""Unit tests for commands.py"""
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)
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 }
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 }
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# )
41def test_format_delimiter():
42 assert format_delimiter(':') == ': '
43 assert format_delimiter('=') == ' = '
44 assert format_delimiter(',') == ','
45 assert format_delimiter(' ') == ' '
48def test_header_msg():
49 assert header_msg("Test message", True) == "Test message"
50 assert header_msg("Test message", False) == ""
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
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
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
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']
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']
84def test_output_generator_custom_delimiter():
85 data = {'field1': 1}
86 gen = output_generator(data, True, ',')
87 assert list(gen) == ['field1,1\n']
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'
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'
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}
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()
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
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# )
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
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
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
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