3from searx.search import initialize
4from searx.query import RawTextQuery
5from searx.testing import SearxTestCase
12 'name': 'dummy engine',
14 'categories': 'general',
22class TestQuery(SearxTestCase):
24 def test_simple_query(self):
25 query_text = 'the query'
26 query = RawTextQuery(query_text, [])
28 self.assertEqual(query.getFullQuery(), query_text)
29 self.assertEqual(len(query.query_parts), 0)
30 self.assertEqual(len(query.user_query_parts), 2)
31 self.assertEqual(len(query.languages), 0)
32 self.assertFalse(query.specific)
34 def test_multiple_spaces_query(self):
35 query_text = '\tthe query'
36 query = RawTextQuery(query_text, [])
38 self.assertEqual(query.getFullQuery(), 'the query')
39 self.assertEqual(len(query.query_parts), 0)
40 self.assertEqual(len(query.user_query_parts), 2)
41 self.assertEqual(len(query.languages), 0)
42 self.assertFalse(query.specific)
44 def test_str_method(self):
45 query_text = '<7 the query'
46 query = RawTextQuery(query_text, [])
47 self.assertEqual(str(query), '<7 the query')
49 def test_repr_method(self):
50 query_text = '<8 the query'
51 query = RawTextQuery(query_text, [])
53 self.assertTrue(r.startswith(f"<RawTextQuery query='{query_text}' "))
55 def test_change_query(self):
56 query_text = '<8 the query'
57 query = RawTextQuery(query_text, [])
58 another_query = query.changeQuery('another text')
59 self.assertEqual(query, another_query)
60 self.assertEqual(query.getFullQuery(), '<8 another text')
63class TestLanguageParser(SearxTestCase):
65 def test_language_code(self):
67 query_text = 'the query'
68 full_query = ':' + language + ' ' + query_text
69 query = RawTextQuery(full_query, [])
71 self.assertEqual(query.getFullQuery(), full_query)
72 self.assertEqual(len(query.query_parts), 1)
73 self.assertEqual(len(query.languages), 1)
74 self.assertIn(language, query.languages)
75 self.assertFalse(query.specific)
77 def test_language_name(self):
79 query_text = 'the query'
80 full_query = ':' + language + ' ' + query_text
81 query = RawTextQuery(full_query, [])
83 self.assertEqual(query.getFullQuery(), full_query)
84 self.assertEqual(len(query.query_parts), 1)
85 self.assertIn('en', query.languages)
86 self.assertFalse(query.specific)
88 def test_unlisted_language_code(self):
90 query_text = 'the query'
91 full_query = ':' + language + ' ' + query_text
92 query = RawTextQuery(full_query, [])
94 self.assertEqual(query.getFullQuery(), full_query)
95 self.assertEqual(len(query.query_parts), 1)
96 self.assertIn('all', query.languages)
97 self.assertFalse(query.specific)
99 def test_invalid_language_code(self):
100 language = 'not_a_language'
101 query_text = 'the query'
102 full_query = ':' + language + ' ' + query_text
103 query = RawTextQuery(full_query, [])
105 self.assertEqual(query.getFullQuery(), full_query)
106 self.assertEqual(len(query.query_parts), 0)
107 self.assertEqual(len(query.languages), 0)
108 self.assertFalse(query.specific)
110 def test_empty_colon_in_query(self):
111 query_text = 'the : query'
112 query = RawTextQuery(query_text, [])
114 self.assertEqual(query.getFullQuery(), query_text)
115 self.assertEqual(len(query.query_parts), 0)
116 self.assertEqual(len(query.languages), 0)
117 self.assertFalse(query.specific)
119 def test_autocomplete_empty(self):
120 query_text = 'the query :'
121 query = RawTextQuery(query_text, [])
122 self.assertEqual(query.autocomplete_list, [":en", ":en_us", ":english", ":united_kingdom"])
124 def test_autocomplete(self):
125 query = RawTextQuery(':englis', [])
126 self.assertEqual(query.autocomplete_list, [":english"])
128 query = RawTextQuery(':deutschla', [])
129 self.assertEqual(query.autocomplete_list, [":deutschland"])
131 query = RawTextQuery(':new_zea', [])
132 self.assertEqual(query.autocomplete_list, [":new_zealand"])
134 query = RawTextQuery(':hu-H', [])
135 self.assertEqual(query.autocomplete_list, [":hu-hu"])
137 query = RawTextQuery(':v', [])
138 self.assertEqual(query.autocomplete_list, [":vi", ":tiếng việt"])
141class TestTimeoutParser(SearxTestCase):
143 def test_timeout_below100(self):
144 query_text = '<3 the query'
145 query = RawTextQuery(query_text, [])
147 self.assertEqual(query.getFullQuery(), query_text)
148 self.assertEqual(len(query.query_parts), 1)
149 self.assertEqual(query.timeout_limit, 3)
150 self.assertFalse(query.specific)
152 def test_timeout_above100(self):
153 query_text = '<350 the query'
154 query = RawTextQuery(query_text, [])
156 self.assertEqual(query.getFullQuery(), query_text)
157 self.assertEqual(len(query.query_parts), 1)
158 self.assertEqual(query.timeout_limit, 0.35)
159 self.assertFalse(query.specific)
161 def test_timeout_above1000(self):
162 query_text = '<3500 the query'
163 query = RawTextQuery(query_text, [])
165 self.assertEqual(query.getFullQuery(), query_text)
166 self.assertEqual(len(query.query_parts), 1)
167 self.assertEqual(query.timeout_limit, 3.5)
168 self.assertFalse(query.specific)
170 def test_timeout_invalid(self):
171 # invalid number: it is not bang but it is part of the query
172 query_text = '<xxx the query'
173 query = RawTextQuery(query_text, [])
175 self.assertEqual(query.getFullQuery(), query_text)
176 self.assertEqual(len(query.query_parts), 0)
177 self.assertEqual(query.getQuery(), query_text)
178 self.assertEqual(query.timeout_limit, None)
179 self.assertFalse(query.specific)
181 def test_timeout_autocomplete(self):
182 # invalid number: it is not bang but it is part of the query
183 query_text = 'the query <'
184 query = RawTextQuery(query_text, [])
186 self.assertEqual(query.getFullQuery(), query_text)
187 self.assertEqual(len(query.query_parts), 0)
188 self.assertEqual(query.getQuery(), query_text)
189 self.assertEqual(query.timeout_limit, None)
190 self.assertFalse(query.specific)
191 self.assertEqual(query.autocomplete_list, ['<3', '<850'])
194class TestExternalBangParser(SearxTestCase):
196 def test_external_bang(self):
197 query_text = '!!ddg the query'
198 query = RawTextQuery(query_text, [])
200 self.assertEqual(query.getFullQuery(), query_text)
201 self.assertEqual(len(query.query_parts), 1)
202 self.assertFalse(query.specific)
204 def test_external_bang_not_found(self):
205 query_text = '!!notfoundbang the query'
206 query = RawTextQuery(query_text, [])
208 self.assertEqual(query.getFullQuery(), query_text)
209 self.assertEqual(query.external_bang, None)
210 self.assertFalse(query.specific)
212 def test_external_bang_autocomplete(self):
213 query_text = 'the query !!dd'
214 query = RawTextQuery(query_text, [])
216 self.assertEqual(query.getFullQuery(), '!!dd the query')
217 self.assertEqual(len(query.query_parts), 1)
218 self.assertFalse(query.specific)
219 self.assertGreater(len(query.autocomplete_list), 0)
221 a = query.autocomplete_list[0]
222 self.assertEqual(query.get_autocomplete_full_query(a), a + ' the query')
224 def test_external_bang_autocomplete_empty(self):
225 query_text = 'the query !!'
226 query = RawTextQuery(query_text, [])
228 self.assertEqual(query.getFullQuery(), 'the query !!')
229 self.assertEqual(len(query.query_parts), 0)
230 self.assertFalse(query.specific)
231 self.assertGreater(len(query.autocomplete_list), 2)
233 a = query.autocomplete_list[0]
234 self.assertEqual(query.get_autocomplete_full_query(a), 'the query ' + a)
237class TestBang(SearxTestCase):
239 SPECIFIC_BANGS = ['!dummy_engine', '!du', '!general']
240 NOT_SPECIFIC_BANGS = ['?dummy_engine', '?du', '?general']
241 THE_QUERY = 'the query'
244 initialize(TEST_ENGINES)
246 for bang in TestBang.SPECIFIC_BANGS + TestBang.NOT_SPECIFIC_BANGS:
247 with self.subTest(msg="Check bang", bang=bang):
248 query_text = TestBang.THE_QUERY + ' ' + bang
249 query = RawTextQuery(query_text, [])
251 self.assertEqual(query.getFullQuery(), bang + ' ' + TestBang.THE_QUERY)
252 self.assertEqual(query.query_parts, [bang])
253 self.assertEqual(query.user_query_parts, TestBang.THE_QUERY.split(' '))
255 def test_specific(self):
256 for bang in TestBang.SPECIFIC_BANGS:
257 with self.subTest(msg="Check bang is specific", bang=bang):
258 query_text = TestBang.THE_QUERY + ' ' + bang
259 query = RawTextQuery(query_text, [])
260 self.assertTrue(query.specific)
262 def test_not_specific(self):
263 for bang in TestBang.NOT_SPECIFIC_BANGS:
264 with self.subTest(msg="Check bang is not specific", bang=bang):
265 query_text = TestBang.THE_QUERY + ' ' + bang
266 query = RawTextQuery(query_text, [])
267 self.assertFalse(query.specific)
269 def test_bang_not_found(self):
270 initialize(TEST_ENGINES)
271 query = RawTextQuery('the query !bang_not_found', [])
272 self.assertEqual(query.getFullQuery(), 'the query !bang_not_found')
274 def test_bang_autocomplete(self):
275 initialize(TEST_ENGINES)
276 query = RawTextQuery('the query !dum', [])
277 self.assertEqual(query.autocomplete_list, ['!dummy_engine'])
279 query = RawTextQuery('!dum the query', [])
280 self.assertEqual(query.autocomplete_list, [])
281 self.assertEqual(query.getQuery(), '!dum the query')
283 def test_bang_autocomplete_empty(self):
284 with patch.object(searx.engines, 'initialize_engines', searx.engines.load_engines):
286 query = RawTextQuery('the query !', [])
287 self.assertEqual(query.autocomplete_list, ['!images', '!wikipedia', '!osm'])
289 query = RawTextQuery('the query ?', ['osm'])
290 self.assertEqual(query.autocomplete_list, ['?images', '?wikipedia'])
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list