test_query.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. from searx import settings
  2. from searx.engines import load_engines
  3. from searx.query import RawTextQuery
  4. from tests import SearxTestCase
  5. TEST_ENGINES = [
  6. {
  7. 'name': 'dummy engine',
  8. 'engine': 'dummy',
  9. 'categories': 'general',
  10. 'shortcut': 'du',
  11. 'timeout': 3.0,
  12. 'tokens': [],
  13. },
  14. ]
  15. class TestQuery(SearxTestCase):
  16. def test_simple_query(self):
  17. query_text = 'the query'
  18. query = RawTextQuery(query_text, [])
  19. self.assertEqual(query.getFullQuery(), query_text)
  20. self.assertEqual(len(query.query_parts), 0)
  21. self.assertEqual(len(query.user_query_parts), 2)
  22. self.assertEqual(len(query.languages), 0)
  23. self.assertFalse(query.specific)
  24. def test_multiple_spaces_query(self):
  25. query_text = '\tthe query'
  26. query = RawTextQuery(query_text, [])
  27. self.assertEqual(query.getFullQuery(), 'the query')
  28. self.assertEqual(len(query.query_parts), 0)
  29. self.assertEqual(len(query.user_query_parts), 2)
  30. self.assertEqual(len(query.languages), 0)
  31. self.assertFalse(query.specific)
  32. def test_str_method(self):
  33. query_text = '<7 the query'
  34. query = RawTextQuery(query_text, [])
  35. self.assertEqual(str(query), '<7 the query')
  36. def test_repr_method(self):
  37. query_text = '<8 the query'
  38. query = RawTextQuery(query_text, [])
  39. r = repr(query)
  40. self.assertTrue(r.startswith(f"<RawTextQuery query='{query_text}' "))
  41. def test_change_query(self):
  42. query_text = '<8 the query'
  43. query = RawTextQuery(query_text, [])
  44. another_query = query.changeQuery('another text')
  45. self.assertEqual(query, another_query)
  46. self.assertEqual(query.getFullQuery(), '<8 another text')
  47. class TestLanguageParser(SearxTestCase):
  48. def test_language_code(self):
  49. language = 'es-ES'
  50. query_text = 'the query'
  51. full_query = ':' + language + ' ' + query_text
  52. query = RawTextQuery(full_query, [])
  53. self.assertEqual(query.getFullQuery(), full_query)
  54. self.assertEqual(len(query.query_parts), 1)
  55. self.assertEqual(len(query.languages), 1)
  56. self.assertIn(language, query.languages)
  57. self.assertFalse(query.specific)
  58. def test_language_name(self):
  59. language = 'english'
  60. query_text = 'the query'
  61. full_query = ':' + language + ' ' + query_text
  62. query = RawTextQuery(full_query, [])
  63. self.assertEqual(query.getFullQuery(), full_query)
  64. self.assertEqual(len(query.query_parts), 1)
  65. self.assertIn('en', query.languages)
  66. self.assertFalse(query.specific)
  67. def test_unlisted_language_code(self):
  68. language = 'all'
  69. query_text = 'the query'
  70. full_query = ':' + language + ' ' + query_text
  71. query = RawTextQuery(full_query, [])
  72. self.assertEqual(query.getFullQuery(), full_query)
  73. self.assertEqual(len(query.query_parts), 1)
  74. self.assertIn('all', query.languages)
  75. self.assertFalse(query.specific)
  76. def test_auto_language_code(self):
  77. language = 'auto'
  78. query_text = 'una consulta'
  79. full_query = ':' + language + ' ' + query_text
  80. query = RawTextQuery(full_query, [])
  81. self.assertEqual(query.getFullQuery(), full_query)
  82. self.assertEqual(len(query.query_parts), 1)
  83. self.assertIn('auto', query.languages)
  84. self.assertFalse(query.specific)
  85. def test_invalid_language_code(self):
  86. language = 'not_a_language'
  87. query_text = 'the query'
  88. full_query = ':' + language + ' ' + query_text
  89. query = RawTextQuery(full_query, [])
  90. self.assertEqual(query.getFullQuery(), full_query)
  91. self.assertEqual(len(query.query_parts), 0)
  92. self.assertEqual(len(query.languages), 0)
  93. self.assertFalse(query.specific)
  94. def test_empty_colon_in_query(self):
  95. query_text = 'the : query'
  96. query = RawTextQuery(query_text, [])
  97. self.assertEqual(query.getFullQuery(), query_text)
  98. self.assertEqual(len(query.query_parts), 0)
  99. self.assertEqual(len(query.languages), 0)
  100. self.assertFalse(query.specific)
  101. def test_autocomplete_empty(self):
  102. query_text = 'the query :'
  103. query = RawTextQuery(query_text, [])
  104. self.assertEqual(query.autocomplete_list, [":en", ":en_us", ":english", ":united_kingdom"])
  105. def test_autocomplete(self):
  106. query = RawTextQuery(':englis', [])
  107. self.assertEqual(query.autocomplete_list, [":english"])
  108. query = RawTextQuery(':deutschla', [])
  109. self.assertEqual(query.autocomplete_list, [":deutschland"])
  110. query = RawTextQuery(':new_zea', [])
  111. self.assertEqual(query.autocomplete_list, [":new_zealand"])
  112. query = RawTextQuery(':hu-H', [])
  113. self.assertEqual(query.autocomplete_list, [":hu-hu"])
  114. query = RawTextQuery(':zh-', [])
  115. self.assertEqual(query.autocomplete_list, [':zh-cn', ':zh-hk', ':zh-tw'])
  116. class TestTimeoutParser(SearxTestCase):
  117. def test_timeout_below100(self):
  118. query_text = '<3 the query'
  119. query = RawTextQuery(query_text, [])
  120. self.assertEqual(query.getFullQuery(), query_text)
  121. self.assertEqual(len(query.query_parts), 1)
  122. self.assertEqual(query.timeout_limit, 3)
  123. self.assertFalse(query.specific)
  124. def test_timeout_above100(self):
  125. query_text = '<350 the query'
  126. query = RawTextQuery(query_text, [])
  127. self.assertEqual(query.getFullQuery(), query_text)
  128. self.assertEqual(len(query.query_parts), 1)
  129. self.assertEqual(query.timeout_limit, 0.35)
  130. self.assertFalse(query.specific)
  131. def test_timeout_above1000(self):
  132. query_text = '<3500 the query'
  133. query = RawTextQuery(query_text, [])
  134. self.assertEqual(query.getFullQuery(), query_text)
  135. self.assertEqual(len(query.query_parts), 1)
  136. self.assertEqual(query.timeout_limit, 3.5)
  137. self.assertFalse(query.specific)
  138. def test_timeout_invalid(self):
  139. # invalid number: it is not bang but it is part of the query
  140. query_text = '<xxx the query'
  141. query = RawTextQuery(query_text, [])
  142. self.assertEqual(query.getFullQuery(), query_text)
  143. self.assertEqual(len(query.query_parts), 0)
  144. self.assertEqual(query.getQuery(), query_text)
  145. self.assertEqual(query.timeout_limit, None)
  146. self.assertFalse(query.specific)
  147. def test_timeout_autocomplete(self):
  148. # invalid number: it is not bang but it is part of the query
  149. query_text = 'the query <'
  150. query = RawTextQuery(query_text, [])
  151. self.assertEqual(query.getFullQuery(), query_text)
  152. self.assertEqual(len(query.query_parts), 0)
  153. self.assertEqual(query.getQuery(), query_text)
  154. self.assertEqual(query.timeout_limit, None)
  155. self.assertFalse(query.specific)
  156. self.assertEqual(query.autocomplete_list, ['<3', '<850'])
  157. class TestExternalBangParser(SearxTestCase):
  158. def test_external_bang(self):
  159. query_text = '!!ddg the query'
  160. query = RawTextQuery(query_text, [])
  161. self.assertEqual(query.getFullQuery(), query_text)
  162. self.assertEqual(len(query.query_parts), 1)
  163. self.assertFalse(query.specific)
  164. def test_external_bang_not_found(self):
  165. query_text = '!!notfoundbang the query'
  166. query = RawTextQuery(query_text, [])
  167. self.assertEqual(query.getFullQuery(), query_text)
  168. self.assertEqual(query.external_bang, None)
  169. self.assertFalse(query.specific)
  170. def test_external_bang_autocomplete(self):
  171. query_text = 'the query !!dd'
  172. query = RawTextQuery(query_text, [])
  173. self.assertEqual(query.getFullQuery(), '!!dd the query')
  174. self.assertEqual(len(query.query_parts), 1)
  175. self.assertFalse(query.specific)
  176. self.assertGreater(len(query.autocomplete_list), 0)
  177. a = query.autocomplete_list[0]
  178. self.assertEqual(query.get_autocomplete_full_query(a), a + ' the query')
  179. def test_external_bang_autocomplete_empty(self):
  180. query_text = 'the query !!'
  181. query = RawTextQuery(query_text, [])
  182. self.assertEqual(query.getFullQuery(), 'the query !!')
  183. self.assertEqual(len(query.query_parts), 0)
  184. self.assertFalse(query.specific)
  185. self.assertGreater(len(query.autocomplete_list), 2)
  186. a = query.autocomplete_list[0]
  187. self.assertEqual(query.get_autocomplete_full_query(a), 'the query ' + a)
  188. class TestBang(SearxTestCase):
  189. SPECIFIC_BANGS = ['!dummy_engine', '!du', '!general']
  190. THE_QUERY = 'the query'
  191. def test_bang(self):
  192. load_engines(TEST_ENGINES)
  193. for bang in TestBang.SPECIFIC_BANGS:
  194. with self.subTest(msg="Check bang", bang=bang):
  195. query_text = TestBang.THE_QUERY + ' ' + bang
  196. query = RawTextQuery(query_text, [])
  197. self.assertEqual(query.getFullQuery(), bang + ' ' + TestBang.THE_QUERY)
  198. self.assertEqual(query.query_parts, [bang])
  199. self.assertEqual(query.user_query_parts, TestBang.THE_QUERY.split(' '))
  200. def test_specific(self):
  201. for bang in TestBang.SPECIFIC_BANGS:
  202. with self.subTest(msg="Check bang is specific", bang=bang):
  203. query_text = TestBang.THE_QUERY + ' ' + bang
  204. query = RawTextQuery(query_text, [])
  205. self.assertTrue(query.specific)
  206. def test_bang_not_found(self):
  207. load_engines(TEST_ENGINES)
  208. query = RawTextQuery('the query !bang_not_found', [])
  209. self.assertEqual(query.getFullQuery(), 'the query !bang_not_found')
  210. def test_bang_autocomplete(self):
  211. load_engines(TEST_ENGINES)
  212. query = RawTextQuery('the query !dum', [])
  213. self.assertEqual(query.autocomplete_list, ['!dummy_engine'])
  214. query = RawTextQuery('!dum the query', [])
  215. self.assertEqual(query.autocomplete_list, [])
  216. self.assertEqual(query.getQuery(), '!dum the query')
  217. def test_bang_autocomplete_empty(self):
  218. load_engines(settings['engines'])
  219. query = RawTextQuery('the query !', [])
  220. self.assertEqual(query.autocomplete_list, ['!images', '!wikipedia', '!osm'])
  221. query = RawTextQuery('the query !', ['osm'])
  222. self.assertEqual(query.autocomplete_list, ['!images', '!wikipedia'])