on engine-data help sign in
searx/tests/unit/test_query.py
285 lines 10 kB history raw
1from searx.search import initialize
2from searx.query import RawTextQuery
3from searx.testing import SearxTestCase
6TEST_ENGINES = [
7 {
8 'name': 'dummy engine',
9 'engine': 'dummy',
10 'categories': 'general',
11 'shortcut': 'du',
12 'timeout': 3.0,
13 'tokens': [],
14 },
18class TestQuery(SearxTestCase):
20 def test_simple_query(self):
21 query_text = 'the query'
22 query = RawTextQuery(query_text, [])
24 self.assertEqual(query.getFullQuery(), query_text)
25 self.assertEqual(len(query.query_parts), 0)
26 self.assertEqual(len(query.user_query_parts), 2)
27 self.assertEqual(len(query.languages), 0)
28 self.assertFalse(query.specific)
30 def test_multiple_spaces_query(self):
31 query_text = '\tthe query'
32 query = RawTextQuery(query_text, [])
34 self.assertEqual(query.getFullQuery(), 'the query')
35 self.assertEqual(len(query.query_parts), 0)
36 self.assertEqual(len(query.user_query_parts), 2)
37 self.assertEqual(len(query.languages), 0)
38 self.assertFalse(query.specific)
40 def test_str_method(self):
41 query_text = '<7 the query'
42 query = RawTextQuery(query_text, [])
43 self.assertEqual(str(query), '<7 the query')
45 def test_repr_method(self):
46 query_text = '<8 the query'
47 query = RawTextQuery(query_text, [])
48 r = repr(query)
49 self.assertTrue(r.startswith(f"<RawTextQuery query='{query_text}' "))
51 def test_change_query(self):
52 query_text = '<8 the query'
53 query = RawTextQuery(query_text, [])
54 another_query = query.changeQuery('another text')
55 self.assertEqual(query, another_query)
56 self.assertEqual(query.getFullQuery(), '<8 another text')
59class TestLanguageParser(SearxTestCase):
61 def test_language_code(self):
62 language = 'es-ES'
63 query_text = 'the query'
64 full_query = ':' + language + ' ' + query_text
65 query = RawTextQuery(full_query, [])
67 self.assertEqual(query.getFullQuery(), full_query)
68 self.assertEqual(len(query.query_parts), 1)
69 self.assertEqual(len(query.languages), 1)
70 self.assertIn(language, query.languages)
71 self.assertFalse(query.specific)
73 def test_language_name(self):
74 language = 'english'
75 query_text = 'the query'
76 full_query = ':' + language + ' ' + query_text
77 query = RawTextQuery(full_query, [])
79 self.assertEqual(query.getFullQuery(), full_query)
80 self.assertEqual(len(query.query_parts), 1)
81 self.assertIn('en', query.languages)
82 self.assertFalse(query.specific)
84 def test_unlisted_language_code(self):
85 language = 'all'
86 query_text = 'the query'
87 full_query = ':' + language + ' ' + query_text
88 query = RawTextQuery(full_query, [])
90 self.assertEqual(query.getFullQuery(), full_query)
91 self.assertEqual(len(query.query_parts), 1)
92 self.assertIn('all', query.languages)
93 self.assertFalse(query.specific)
95 def test_invalid_language_code(self):
96 language = 'not_a_language'
97 query_text = 'the query'
98 full_query = ':' + language + ' ' + query_text
99 query = RawTextQuery(full_query, [])
101 self.assertEqual(query.getFullQuery(), full_query)
102 self.assertEqual(len(query.query_parts), 0)
103 self.assertEqual(len(query.languages), 0)
104 self.assertFalse(query.specific)
106 def test_empty_colon_in_query(self):
107 query_text = 'the : query'
108 query = RawTextQuery(query_text, [])
110 self.assertEqual(query.getFullQuery(), query_text)
111 self.assertEqual(len(query.query_parts), 0)
112 self.assertEqual(len(query.languages), 0)
113 self.assertFalse(query.specific)
115 def test_autocomplete_empty(self):
116 query_text = 'the query :'
117 query = RawTextQuery(query_text, [])
118 self.assertEqual(query.autocomplete_list, [":en", ":en_us", ":english", ":united_kingdom"])
120 def test_autocomplete(self):
121 query = RawTextQuery(':englis', [])
122 self.assertEqual(query.autocomplete_list, [":english"])
124 query = RawTextQuery(':deutschla', [])
125 self.assertEqual(query.autocomplete_list, [":deutschland"])
127 query = RawTextQuery(':new_zea', [])
128 self.assertEqual(query.autocomplete_list, [":new_zealand"])
130 query = RawTextQuery(':hu-H', [])
131 self.assertEqual(query.autocomplete_list, [":hu-hu"])
133 query = RawTextQuery(':v', [])
134 self.assertEqual(query.autocomplete_list, [":vi", ":tiếng việt"])
137class TestTimeoutParser(SearxTestCase):
139 def test_timeout_below100(self):
140 query_text = '<3 the query'
141 query = RawTextQuery(query_text, [])
143 self.assertEqual(query.getFullQuery(), query_text)
144 self.assertEqual(len(query.query_parts), 1)
145 self.assertEqual(query.timeout_limit, 3)
146 self.assertFalse(query.specific)
148 def test_timeout_above100(self):
149 query_text = '<350 the query'
150 query = RawTextQuery(query_text, [])
152 self.assertEqual(query.getFullQuery(), query_text)
153 self.assertEqual(len(query.query_parts), 1)
154 self.assertEqual(query.timeout_limit, 0.35)
155 self.assertFalse(query.specific)
157 def test_timeout_above1000(self):
158 query_text = '<3500 the query'
159 query = RawTextQuery(query_text, [])
161 self.assertEqual(query.getFullQuery(), query_text)
162 self.assertEqual(len(query.query_parts), 1)
163 self.assertEqual(query.timeout_limit, 3.5)
164 self.assertFalse(query.specific)
166 def test_timeout_invalid(self):
167 # invalid number: it is not bang but it is part of the query
168 query_text = '<xxx the query'
169 query = RawTextQuery(query_text, [])
171 self.assertEqual(query.getFullQuery(), query_text)
172 self.assertEqual(len(query.query_parts), 0)
173 self.assertEqual(query.getQuery(), query_text)
174 self.assertEqual(query.timeout_limit, None)
175 self.assertFalse(query.specific)
177 def test_timeout_autocomplete(self):
178 # invalid number: it is not bang but it is part of the query
179 query_text = 'the query <'
180 query = RawTextQuery(query_text, [])
182 self.assertEqual(query.getFullQuery(), query_text)
183 self.assertEqual(len(query.query_parts), 0)
184 self.assertEqual(query.getQuery(), query_text)
185 self.assertEqual(query.timeout_limit, None)
186 self.assertFalse(query.specific)
187 self.assertEqual(query.autocomplete_list, ['<3', '<850'])
190class TestExternalBangParser(SearxTestCase):
192 def test_external_bang(self):
193 query_text = '!!ddg the query'
194 query = RawTextQuery(query_text, [])
196 self.assertEqual(query.getFullQuery(), query_text)
197 self.assertEqual(len(query.query_parts), 1)
198 self.assertFalse(query.specific)
200 def test_external_bang_not_found(self):
201 query_text = '!!notfoundbang the query'
202 query = RawTextQuery(query_text, [])
204 self.assertEqual(query.getFullQuery(), query_text)
205 self.assertEqual(query.external_bang, None)
206 self.assertFalse(query.specific)
208 def test_external_bang_autocomplete(self):
209 query_text = 'the query !!dd'
210 query = RawTextQuery(query_text, [])
212 self.assertEqual(query.getFullQuery(), '!!dd the query')
213 self.assertEqual(len(query.query_parts), 1)
214 self.assertFalse(query.specific)
215 self.assertGreater(len(query.autocomplete_list), 0)
217 a = query.autocomplete_list[0]
218 self.assertEqual(query.get_autocomplete_full_query(a), a + ' the query')
220 def test_external_bang_autocomplete_empty(self):
221 query_text = 'the query !!'
222 query = RawTextQuery(query_text, [])
224 self.assertEqual(query.getFullQuery(), 'the query !!')
225 self.assertEqual(len(query.query_parts), 0)
226 self.assertFalse(query.specific)
227 self.assertGreater(len(query.autocomplete_list), 2)
229 a = query.autocomplete_list[0]
230 self.assertEqual(query.get_autocomplete_full_query(a), 'the query ' + a)
233class TestBang(SearxTestCase):
235 SPECIFIC_BANGS = ['!dummy_engine', '!du', '!general']
236 NOT_SPECIFIC_BANGS = ['?dummy_engine', '?du', '?general']
237 THE_QUERY = 'the query'
239 def test_bang(self):
240 initialize(TEST_ENGINES)
242 for bang in TestBang.SPECIFIC_BANGS + TestBang.NOT_SPECIFIC_BANGS:
243 with self.subTest(msg="Check bang", bang=bang):
244 query_text = TestBang.THE_QUERY + ' ' + bang
245 query = RawTextQuery(query_text, [])
247 self.assertEqual(query.getFullQuery(), bang + ' ' + TestBang.THE_QUERY)
248 self.assertEqual(query.query_parts, [bang])
249 self.assertEqual(query.user_query_parts, TestBang.THE_QUERY.split(' '))
251 def test_specific(self):
252 for bang in TestBang.SPECIFIC_BANGS:
253 with self.subTest(msg="Check bang is specific", bang=bang):
254 query_text = TestBang.THE_QUERY + ' ' + bang
255 query = RawTextQuery(query_text, [])
256 self.assertTrue(query.specific)
258 def test_not_specific(self):
259 for bang in TestBang.NOT_SPECIFIC_BANGS:
260 with self.subTest(msg="Check bang is not specific", bang=bang):
261 query_text = TestBang.THE_QUERY + ' ' + bang
262 query = RawTextQuery(query_text, [])
263 self.assertFalse(query.specific)
265 def test_bang_not_found(self):
266 initialize(TEST_ENGINES)
267 query = RawTextQuery('the query !bang_not_found', [])
268 self.assertEqual(query.getFullQuery(), 'the query !bang_not_found')
270 def test_bang_autocomplete(self):
271 initialize(TEST_ENGINES)
272 query = RawTextQuery('the query !dum', [])
273 self.assertEqual(query.autocomplete_list, ['!dummy_engine'])
275 query = RawTextQuery('!dum the query', [])
276 self.assertEqual(query.autocomplete_list, [])
277 self.assertEqual(query.getQuery(), '!dum the query')
279 def test_bang_autocomplete_empty(self):
280 initialize()
281 query = RawTextQuery('the query !', [])
282 self.assertEqual(query.autocomplete_list, ['!images', '!wikipedia', '!osm'])
284 query = RawTextQuery('the query ?', ['osm'])
285 self.assertEqual(query.autocomplete_list, ['?images', '?wikipedia'])