summaryrefslogtreecommitdiff
path: root/tests/unit/test_query.py
diff options
context:
space:
mode:
authorAlexandre Flament <alex@al-f.net>2021-02-22 18:13:50 +0100
committerAlexandre Flament <alex@al-f.net>2021-03-01 19:12:32 +0100
commit63f17d2e4c735767bfcb2d4fdb77d8c9ad8d9265 (patch)
tree4a4b3cae4bc9223949694d77c98e6e7443c04a65 /tests/unit/test_query.py
parent4fa1290c11402f173c39a89324fe45c1b659fd9d (diff)
downloadsearxng-63f17d2e4c735767bfcb2d4fdb77d8c9ad8d9265.tar.gz
searxng-63f17d2e4c735767bfcb2d4fdb77d8c9ad8d9265.zip
[enh] autocomplete refactoring, autocomplete on external bangs
Diffstat (limited to 'tests/unit/test_query.py')
-rw-r--r--tests/unit/test_query.py178
1 files changed, 178 insertions, 0 deletions
diff --git a/tests/unit/test_query.py b/tests/unit/test_query.py
index 0176f735e..6bbfdb1e2 100644
--- a/tests/unit/test_query.py
+++ b/tests/unit/test_query.py
@@ -1,7 +1,20 @@
+from searx.search import initialize
from searx.query import RawTextQuery
from searx.testing import SearxTestCase
+TEST_ENGINES = [
+ {
+ 'name': 'dummy engine',
+ 'engine': 'dummy',
+ 'categories': 'general',
+ 'shortcut': 'du',
+ 'timeout': 3.0,
+ 'tokens': [],
+ },
+]
+
+
class TestQuery(SearxTestCase):
def test_simple_query(self):
@@ -14,6 +27,37 @@ class TestQuery(SearxTestCase):
self.assertEqual(len(query.languages), 0)
self.assertFalse(query.specific)
+ def test_multiple_spaces_query(self):
+ query_text = '\tthe query'
+ query = RawTextQuery(query_text, [])
+
+ self.assertEqual(query.getFullQuery(), 'the query')
+ self.assertEqual(len(query.query_parts), 0)
+ self.assertEqual(len(query.user_query_parts), 2)
+ self.assertEqual(len(query.languages), 0)
+ self.assertFalse(query.specific)
+
+ def test_str_method(self):
+ query_text = '<7 the query'
+ query = RawTextQuery(query_text, [])
+ self.assertEqual(str(query), '<7 the query')
+
+ def test_repr_method(self):
+ query_text = '<8 the query'
+ query = RawTextQuery(query_text, [])
+ r = repr(query)
+ self.assertTrue(r.startswith(f"<RawTextQuery query='{query_text}' "))
+
+ def test_change_query(self):
+ query_text = '<8 the query'
+ query = RawTextQuery(query_text, [])
+ another_query = query.changeQuery('another text')
+ self.assertEqual(query, another_query)
+ self.assertEqual(query.getFullQuery(), '<8 another text')
+
+
+class TestLanguageParser(SearxTestCase):
+
def test_language_code(self):
language = 'es-ES'
query_text = 'the query'
@@ -68,6 +112,30 @@ class TestQuery(SearxTestCase):
self.assertEqual(len(query.languages), 0)
self.assertFalse(query.specific)
+ def test_autocomplete_empty(self):
+ query_text = 'the query :'
+ query = RawTextQuery(query_text, [])
+ self.assertEqual(query.autocomplete_list, [":en", ":en_us", ":english", ":united_kingdom"])
+
+ def test_autocomplete(self):
+ query = RawTextQuery(':englis', [])
+ self.assertEqual(query.autocomplete_list, [":english"])
+
+ query = RawTextQuery(':deutschla', [])
+ self.assertEqual(query.autocomplete_list, [":deutschland"])
+
+ query = RawTextQuery(':new_zea', [])
+ self.assertEqual(query.autocomplete_list, [":new_zealand"])
+
+ query = RawTextQuery(':hu-H', [])
+ self.assertEqual(query.autocomplete_list, [":hu-hu"])
+
+ query = RawTextQuery(':v', [])
+ self.assertEqual(query.autocomplete_list, [":vi", ":tiếng việt"])
+
+
+class TestTimeoutParser(SearxTestCase):
+
def test_timeout_below100(self):
query_text = '<3 the query'
query = RawTextQuery(query_text, [])
@@ -105,3 +173,113 @@ class TestQuery(SearxTestCase):
self.assertEqual(query.getQuery(), query_text)
self.assertEqual(query.timeout_limit, None)
self.assertFalse(query.specific)
+
+ def test_timeout_autocomplete(self):
+ # invalid number: it is not bang but it is part of the query
+ query_text = 'the query <'
+ query = RawTextQuery(query_text, [])
+
+ self.assertEqual(query.getFullQuery(), query_text)
+ self.assertEqual(len(query.query_parts), 0)
+ self.assertEqual(query.getQuery(), query_text)
+ self.assertEqual(query.timeout_limit, None)
+ self.assertFalse(query.specific)
+ self.assertEqual(query.autocomplete_list, ['<3', '<850'])
+
+
+class TestExternalBangParser(SearxTestCase):
+
+ def test_external_bang(self):
+ query_text = '!!ddg the query'
+ query = RawTextQuery(query_text, [])
+
+ self.assertEqual(query.getFullQuery(), query_text)
+ self.assertEqual(len(query.query_parts), 1)
+ self.assertFalse(query.specific)
+
+ def test_external_bang_not_found(self):
+ query_text = '!!notfoundbang the query'
+ query = RawTextQuery(query_text, [])
+
+ self.assertEqual(query.getFullQuery(), query_text)
+ self.assertEqual(query.external_bang, None)
+ self.assertFalse(query.specific)
+
+ def test_external_bang_autocomplete(self):
+ query_text = 'the query !!dd'
+ query = RawTextQuery(query_text, [])
+
+ self.assertEqual(query.getFullQuery(), '!!dd the query')
+ self.assertEqual(len(query.query_parts), 1)
+ self.assertFalse(query.specific)
+ self.assertGreater(len(query.autocomplete_list), 0)
+
+ a = query.autocomplete_list[0]
+ self.assertEqual(query.get_autocomplete_full_query(a), a + ' the query')
+
+ def test_external_bang_autocomplete_empty(self):
+ query_text = 'the query !!'
+ query = RawTextQuery(query_text, [])
+
+ self.assertEqual(query.getFullQuery(), 'the query !!')
+ self.assertEqual(len(query.query_parts), 0)
+ self.assertFalse(query.specific)
+ self.assertGreater(len(query.autocomplete_list), 2)
+
+ a = query.autocomplete_list[0]
+ self.assertEqual(query.get_autocomplete_full_query(a), 'the query ' + a)
+
+
+class TestBang(SearxTestCase):
+
+ SPECIFIC_BANGS = ['!dummy_engine', '!du', '!general']
+ NOT_SPECIFIC_BANGS = ['?dummy_engine', '?du', '?general']
+ THE_QUERY = 'the query'
+
+ def test_bang(self):
+ initialize(TEST_ENGINES)
+
+ for bang in TestBang.SPECIFIC_BANGS + TestBang.NOT_SPECIFIC_BANGS:
+ with self.subTest(msg="Check bang", bang=bang):
+ query_text = TestBang.THE_QUERY + ' ' + bang
+ query = RawTextQuery(query_text, [])
+
+ self.assertEqual(query.getFullQuery(), bang + ' ' + TestBang.THE_QUERY)
+ self.assertEqual(query.query_parts, [bang])
+ self.assertEqual(query.user_query_parts, TestBang.THE_QUERY.split(' '))
+
+ def test_specific(self):
+ for bang in TestBang.SPECIFIC_BANGS:
+ with self.subTest(msg="Check bang is specific", bang=bang):
+ query_text = TestBang.THE_QUERY + ' ' + bang
+ query = RawTextQuery(query_text, [])
+ self.assertTrue(query.specific)
+
+ def test_not_specific(self):
+ for bang in TestBang.NOT_SPECIFIC_BANGS:
+ with self.subTest(msg="Check bang is not specific", bang=bang):
+ query_text = TestBang.THE_QUERY + ' ' + bang
+ query = RawTextQuery(query_text, [])
+ self.assertFalse(query.specific)
+
+ def test_bang_not_found(self):
+ initialize(TEST_ENGINES)
+ query = RawTextQuery('the query !bang_not_found', [])
+ self.assertEqual(query.getFullQuery(), 'the query !bang_not_found')
+
+ def test_bang_autocomplete(self):
+ initialize(TEST_ENGINES)
+ query = RawTextQuery('the query !dum', [])
+ self.assertEqual(query.autocomplete_list, ['!dummy_engine'])
+
+ query = RawTextQuery('!dum the query', [])
+ self.assertEqual(query.autocomplete_list, [])
+ self.assertEqual(query.getQuery(), '!dum the query')
+
+ def test_bang_autocomplete_empty(self):
+ initialize()
+ query = RawTextQuery('the query !', [])
+ self.assertEqual(query.autocomplete_list, ['!images', '!wikipedia', '!osm'])
+
+ query = RawTextQuery('the query ?', ['osm'])
+ self.assertEqual(query.autocomplete_list, ['?images', '?wikipedia'])