test_query.py 10 KB

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