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

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 

8 

9import pytest 

10from typing_extensions import Self 

11 

12from src.esxport import EsXport 

13from src.exceptions import MetaFieldNotFoundError, ScrollExpiredError 

14 

15 

16class TestVSearchQuery: 

17 """Search API Test cases.""" 

18 

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 

31 

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") 

44 

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") 

56 

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") 

71 

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") 

89 

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 

104 

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")