| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 | from searx import settingsfrom searx.engines import load_enginesfrom searx.query import RawTextQueryfrom tests import SearxTestCaseTEST_ENGINES = [    {        'name': 'dummy engine',        'engine': 'dummy',        'categories': 'general',        'shortcut': 'du',        'timeout': 3.0,        'tokens': [],    },]class TestQuery(SearxTestCase):    def test_simple_query(self):        query_text = 'the query'        query = RawTextQuery(query_text, [])        self.assertEqual(query.getFullQuery(), query_text)        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_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'        full_query = ':' + language + ' ' + query_text        query = RawTextQuery(full_query, [])        self.assertEqual(query.getFullQuery(), full_query)        self.assertEqual(len(query.query_parts), 1)        self.assertEqual(len(query.languages), 1)        self.assertIn(language, query.languages)        self.assertFalse(query.specific)    def test_language_name(self):        language = 'english'        query_text = 'the query'        full_query = ':' + language + ' ' + query_text        query = RawTextQuery(full_query, [])        self.assertEqual(query.getFullQuery(), full_query)        self.assertEqual(len(query.query_parts), 1)        self.assertIn('en', query.languages)        self.assertFalse(query.specific)    def test_unlisted_language_code(self):        language = 'all'        query_text = 'the query'        full_query = ':' + language + ' ' + query_text        query = RawTextQuery(full_query, [])        self.assertEqual(query.getFullQuery(), full_query)        self.assertEqual(len(query.query_parts), 1)        self.assertIn('all', query.languages)        self.assertFalse(query.specific)    def test_invalid_language_code(self):        language = 'not_a_language'        query_text = 'the query'        full_query = ':' + language + ' ' + query_text        query = RawTextQuery(full_query, [])        self.assertEqual(query.getFullQuery(), full_query)        self.assertEqual(len(query.query_parts), 0)        self.assertEqual(len(query.languages), 0)        self.assertFalse(query.specific)    def test_empty_colon_in_query(self):        query_text = 'the : query'        query = RawTextQuery(query_text, [])        self.assertEqual(query.getFullQuery(), query_text)        self.assertEqual(len(query.query_parts), 0)        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(':zh-', [])        self.assertEqual(query.autocomplete_list, [':zh-cn', ':zh-hk', ':zh-tw'])class TestTimeoutParser(SearxTestCase):    def test_timeout_below100(self):        query_text = '<3 the query'        query = RawTextQuery(query_text, [])        self.assertEqual(query.getFullQuery(), query_text)        self.assertEqual(len(query.query_parts), 1)        self.assertEqual(query.timeout_limit, 3)        self.assertFalse(query.specific)    def test_timeout_above100(self):        query_text = '<350 the query'        query = RawTextQuery(query_text, [])        self.assertEqual(query.getFullQuery(), query_text)        self.assertEqual(len(query.query_parts), 1)        self.assertEqual(query.timeout_limit, 0.35)        self.assertFalse(query.specific)    def test_timeout_above1000(self):        query_text = '<3500 the query'        query = RawTextQuery(query_text, [])        self.assertEqual(query.getFullQuery(), query_text)        self.assertEqual(len(query.query_parts), 1)        self.assertEqual(query.timeout_limit, 3.5)        self.assertFalse(query.specific)    def test_timeout_invalid(self):        # invalid number: it is not bang but it is part of the query        query_text = '<xxx 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)    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']    THE_QUERY = 'the query'    def test_bang(self):        load_engines(TEST_ENGINES)        for bang in TestBang.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_bang_not_found(self):        load_engines(TEST_ENGINES)        query = RawTextQuery('the query !bang_not_found', [])        self.assertEqual(query.getFullQuery(), 'the query !bang_not_found')    def test_bang_autocomplete(self):        load_engines(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):        load_engines(settings['engines'])        query = RawTextQuery('the query !', [])        self.assertEqual(query.autocomplete_list, ['!images', '!wikipedia', '!osm'])        query = RawTextQuery('the query !', ['osm'])        self.assertEqual(query.autocomplete_list, ['!images', '!wikipedia'])
 |