Coverage for test/esxport/search_query_test.py: 100%
64 statements
« prev ^ index » next coverage.py v7.3.1, created at 2023-09-22 17:59 +0530
« prev ^ index » next coverage.py v7.3.1, created at 2023-09-22 17:59 +0530
1"""Search API Test cases."""
2import inspect
3import json
4from pathlib import Path
5from test.esxport._export_test import TestExport
6from test.esxport._prepare_search_query_test import TestSearchQuery
7from unittest.mock import Mock, patch
9import pytest
10from typing_extensions import Self
12from src.esxport import EsXport
13from src.exceptions import MetaFieldNotFoundError, ScrollExpiredError
16class TestVSearchQuery:
17 """Search API Test cases."""
19 def test_data_not_flused_when_results_are_zero(self: Self, mocker: Mock, esxport_obj: EsXport) -> None:
20 """Test that export is not called if no of records are zero."""
21 esxport_obj.opts.output_file = f"{inspect.stack()[0].function}.csv"
22 mocker.patch.object(
23 esxport_obj,
24 "_validate_fields",
25 return_value=None,
26 )
27 with patch.object(esxport_obj, "_write_to_temp_file") as mock_write_to_temp_file:
28 esxport_obj.search_query()
29 mock_write_to_temp_file.assert_not_called()
30 assert Path(f"{esxport_obj.opts.output_file}.tmp").exists() is False
32 def test_data_flused_when_results_are_non_zero(self: Self, mocker: Mock, esxport_obj_with_data: EsXport) -> None:
33 """Test that export is not called if no of records are zero."""
34 esxport_obj_with_data.opts.output_file = f"{inspect.stack()[0].function}.csv"
35 mocker.patch.object(
36 esxport_obj_with_data,
37 "_validate_fields",
38 return_value=None,
39 )
40 with patch.object(esxport_obj_with_data, "_write_to_temp_file") as mock_write_to_temp_file:
41 esxport_obj_with_data.search_query()
42 mock_write_to_temp_file.assert_called_once_with(esxport_obj_with_data.es_client.search())
43 TestExport.rm_export_file(f"{inspect.stack()[0].function}.csv")
45 def test_data_flused_when_results_are_non_zero1(self: Self, mocker: Mock, esxport_obj_with_data: EsXport) -> None:
46 """Test that export is not called if no of records are zero."""
47 esxport_obj_with_data.opts.output_file = f"{inspect.stack()[0].function}.csv"
48 mocker.patch.object(
49 esxport_obj_with_data,
50 "_validate_fields",
51 return_value=None,
52 )
53 esxport_obj_with_data.search_query()
54 assert Path(f"{esxport_obj_with_data.opts.output_file}.tmp").exists() is True
55 TestExport.rm_export_file(f"{inspect.stack()[0].function}.csv")
57 def test_meta_fields_are_flushed(self: Self, mocker: Mock, esxport_obj_with_data: EsXport) -> None:
58 """Test that meta fields are dumped."""
59 esxport_obj_with_data.opts.output_file = f"{inspect.stack()[0].function}.csv"
60 esxport_obj_with_data.opts.meta_fields = ["_score", "_id"]
61 mocker.patch.object(
62 esxport_obj_with_data,
63 "_validate_fields",
64 return_value=None,
65 )
66 esxport_obj_with_data.search_query()
67 with Path(f"{inspect.stack()[0].function}.csv.tmp").open() as f:
68 first_line = json.loads(f.readline().strip("\n"))
69 assert first_line.keys() == esxport_obj_with_data.es_client.search()["hits"]["hits"][0]["_source"].keys()
70 TestExport.rm_export_file(f"{inspect.stack()[0].function}.csv")
72 def test_invalid_meta_fields_raises_exception(
73 self: Self,
74 mocker: Mock,
75 esxport_obj_with_data: EsXport,
76 ) -> None:
77 """Test that invalid meta fields raised exception."""
78 esxport_obj_with_data.opts.output_file = f"{inspect.stack()[0].function}.csv"
79 random_strings = [TestSearchQuery.random_string(10) for _ in range(5)]
80 esxport_obj_with_data.opts.meta_fields = random_strings
81 mocker.patch.object(
82 esxport_obj_with_data,
83 "_validate_fields",
84 return_value=None,
85 )
86 with pytest.raises(MetaFieldNotFoundError):
87 esxport_obj_with_data.search_query()
88 TestExport.rm_export_file(f"{inspect.stack()[0].function}.csv")
90 def test_data_is_flused_on_buffer_hit(
91 self: Self,
92 esxport_obj_with_data: EsXport,
93 ) -> None:
94 """Test that invalid meta fields raised exception."""
95 data = esxport_obj_with_data.es_client.search()
96 no_of_records = data["hits"]["total"]["value"]
97 flush_size = 1
98 with patch.object(esxport_obj_with_data, "_flush_to_file") as mock_flush_to_file, patch(
99 "src.esxport.FLUSH_BUFFER",
100 flush_size,
101 ):
102 esxport_obj_with_data.search_query()
103 assert mock_flush_to_file.call_count == no_of_records / flush_size + 1
105 def test_function_exits_when_scroll_expire(self: Self, mocker: Mock, esxport_obj_with_data: EsXport) -> None:
106 """Test function exist when scroll expires."""
107 esxport_obj_with_data.opts.output_file = f"{inspect.stack()[0].function}.csv"
108 flush_size = 1
109 mocker.patch.object(
110 esxport_obj_with_data.es_client,
111 "scroll",
112 side_effect=ScrollExpiredError("abc"),
113 )
114 with patch("src.esxport.FLUSH_BUFFER", flush_size), patch.object(esxport_obj_with_data, "num_results", 4):
115 esxport_obj_with_data.search_query()
116 assert Path(f"{esxport_obj_with_data.opts.output_file}.tmp").exists() is True
117 assert Path(esxport_obj_with_data.opts.output_file).exists() is False
118 TestExport.rm_export_file(f"{inspect.stack()[0].function}.csv")