diff options
Diffstat (limited to 'tests/unit')
| -rw-r--r-- | tests/unit/engines/test_command.py | 241 | ||||
| -rw-r--r-- | tests/unit/test_answerers.py | 4 | ||||
| -rw-r--r-- | tests/unit/test_plugins.py | 34 | ||||
| -rw-r--r-- | tests/unit/test_preferences.py | 32 | ||||
| -rw-r--r-- | tests/unit/test_query.py | 61 | ||||
| -rw-r--r-- | tests/unit/test_search.py | 37 | ||||
| -rw-r--r-- | tests/unit/test_utils.py | 29 | ||||
| -rw-r--r-- | tests/unit/test_webapp.py | 9 |
8 files changed, 353 insertions, 94 deletions
diff --git a/tests/unit/engines/test_command.py b/tests/unit/engines/test_command.py new file mode 100644 index 000000000..0aa1c6201 --- /dev/null +++ b/tests/unit/engines/test_command.py @@ -0,0 +1,241 @@ +''' +searx is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +searx is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with searx. If not, see < http://www.gnu.org/licenses/ >. + +''' + +from sys import version_info + +from searx.engines import command as command_engine +from searx.testing import SearxTestCase + + +class TestCommandEngine(SearxTestCase): + def test_basic_seq_command_engine(self): + ls_engine = command_engine + ls_engine.command = ['seq', '{{QUERY}}'] + ls_engine.delimiter = {'chars': ' ', 'keys': ['number']} + expected_results = [ + {'number': '1', 'template': 'key-value.html'}, + {'number': '2', 'template': 'key-value.html'}, + {'number': '3', 'template': 'key-value.html'}, + {'number': '4', 'template': 'key-value.html'}, + {'number': '5', 'template': 'key-value.html'}, + ] + results = ls_engine.search('5'.encode('utf-8'), {'pageno': 1}) + self.assertEqual(results, expected_results) + + def test_delimiter_parsing_command_engine(self): + searx_logs = '''DEBUG:searx.webapp:static directory is /home/n/p/searx/searx/static +DEBUG:searx.webapp:templates directory is /home/n/p/searx/searx/templates +DEBUG:searx.engines:soundcloud engine: Starting background initialization +DEBUG:searx.engines:wolframalpha engine: Starting background initialization +DEBUG:searx.engines:locate engine: Starting background initialization +DEBUG:searx.engines:regex search in files engine: Starting background initialization +DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): www.wolframalpha.com +DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): soundcloud.com +DEBUG:searx.engines:find engine: Starting background initialization +DEBUG:searx.engines:pattern search in files engine: Starting background initialization +DEBUG:searx.webapp:starting webserver on 127.0.0.1:8888 +WARNING:werkzeug: * Debugger is active! +INFO:werkzeug: * Debugger PIN: 299-578-362''' + echo_engine = command_engine + echo_engine.command = ['echo', searx_logs] + echo_engine.delimiter = {'chars': ':', 'keys': ['level', 'component', 'message']} + + expected_results_by_page = [ + [ + { + 'component': 'searx.webapp', + 'message': 'static directory is /home/n/p/searx/searx/static', + 'template': 'key-value.html', + 'level': 'DEBUG', + }, + { + 'component': 'searx.webapp', + 'message': 'templates directory is /home/n/p/searx/searx/templates', + 'template': 'key-value.html', + 'level': 'DEBUG', + }, + { + 'component': 'searx.engines', + 'message': 'soundcloud engine: Starting background initialization', + 'template': 'key-value.html', + 'level': 'DEBUG', + }, + { + 'component': 'searx.engines', + 'message': 'wolframalpha engine: Starting background initialization', + 'template': 'key-value.html', + 'level': 'DEBUG', + }, + { + 'component': 'searx.engines', + 'message': 'locate engine: Starting background initialization', + 'template': 'key-value.html', + 'level': 'DEBUG', + }, + { + 'component': 'searx.engines', + 'message': 'regex search in files engine: Starting background initialization', + 'template': 'key-value.html', + 'level': 'DEBUG', + }, + { + 'component': 'urllib3.connectionpool', + 'message': 'Starting new HTTPS connection (1): www.wolframalpha.com', + 'template': 'key-value.html', + 'level': 'DEBUG', + }, + { + 'component': 'urllib3.connectionpool', + 'message': 'Starting new HTTPS connection (1): soundcloud.com', + 'template': 'key-value.html', + 'level': 'DEBUG', + }, + { + 'component': 'searx.engines', + 'message': 'find engine: Starting background initialization', + 'template': 'key-value.html', + 'level': 'DEBUG', + }, + { + 'component': 'searx.engines', + 'message': 'pattern search in files engine: Starting background initialization', + 'template': 'key-value.html', + 'level': 'DEBUG', + }, + + ], + [ + { + 'component': 'searx.webapp', + 'message': 'starting webserver on 127.0.0.1:8888', + 'template': 'key-value.html', + 'level': 'DEBUG', + }, + { + 'component': 'werkzeug', + 'message': ' * Debugger is active!', + 'template': 'key-value.html', + 'level': 'WARNING', + }, + { + 'component': 'werkzeug', + 'message': ' * Debugger PIN: 299-578-362', + 'template': 'key-value.html', + 'level': 'INFO', + }, + ], + + ] + + for i in [0, 1]: + results = echo_engine.search(''.encode('utf-8'), {'pageno': i + 1}) + self.assertEqual(results, expected_results_by_page[i]) + + def test_regex_parsing_command_engine(self): + txt = '''commit 35f9a8c81d162a361b826bbcd4a1081a4fbe76a7 +Author: Noémi Ványi <sitbackandwait@gmail.com> +Date: Tue Oct 15 11:31:33 2019 +0200 + +first interesting message + +commit 6c3c206316153ccc422755512bceaa9ab0b14faa +Author: Noémi Ványi <sitbackandwait@gmail.com> +Date: Mon Oct 14 17:10:08 2019 +0200 + +second interesting message + +commit d8594d2689b4d5e0d2f80250223886c3a1805ef5 +Author: Noémi Ványi <sitbackandwait@gmail.com> +Date: Mon Oct 14 14:45:05 2019 +0200 + +third interesting message + +commit ''' + git_log_engine = command_engine + git_log_engine.command = ['echo', txt] + git_log_engine.result_separator = '\n\ncommit ' + git_log_engine.delimiter = {} + git_log_engine.parse_regex = { + 'commit': '\w{40}', + 'author': '[\w* ]* <\w*@?\w*\.?\w*>', + 'date': 'Date: .*', + 'message': '\n\n.*$' + } + expected_results = [ + { + 'commit': '35f9a8c81d162a361b826bbcd4a1081a4fbe76a7', + 'author': ' Noémi Ványi <sitbackandwait@gmail.com>', + 'date': 'Date: Tue Oct 15 11:31:33 2019 +0200', + 'message': '\n\nfirst interesting message', + 'template': 'key-value.html', + }, + { + 'commit': '6c3c206316153ccc422755512bceaa9ab0b14faa', + 'author': ' Noémi Ványi <sitbackandwait@gmail.com>', + 'date': 'Date: Mon Oct 14 17:10:08 2019 +0200', + 'message': '\n\nsecond interesting message', + 'template': 'key-value.html', + }, + { + 'commit': 'd8594d2689b4d5e0d2f80250223886c3a1805ef5', + 'author': ' Noémi Ványi <sitbackandwait@gmail.com>', + 'date': 'Date: Mon Oct 14 14:45:05 2019 +0200', + 'message': '\n\nthird interesting message', + 'template': 'key-value.html', + }, + + ] + + results = git_log_engine.search(''.encode('utf-8'), {'pageno': 1}) + self.assertEqual(results, expected_results) + + def test_working_dir_path_query(self): + ls_engine = command_engine + ls_engine.command = ['ls', '{{QUERY}}'] + ls_engine.result_separator = '\n' + ls_engine.delimiter = {'chars': ' ', 'keys': ['file']} + ls_engine.query_type = 'path' + + results = ls_engine.search('.'.encode(), {'pageno': 1}) + self.assertTrue(len(results) != 0) + + forbidden_paths = [ + '..', + '../..', + './..', + '~', + '/var', + ] + for forbidden_path in forbidden_paths: + self.assertRaises(ValueError, ls_engine.search, '..'.encode(), {'pageno': 1}) + + def test_enum_queries(self): + echo_engine = command_engine + echo_engine.command = ['echo', '{{QUERY}}'] + echo_engine.query_type = 'enum' + echo_engine.query_enum = ['i-am-allowed-to-say-this', 'and-that'] + + for allowed in echo_engine.query_enum: + results = echo_engine.search(allowed.encode(), {'pageno': 1}) + self.assertTrue(len(results) != 0) + + forbidden_queries = [ + 'forbidden', + 'banned', + 'prohibited', + ] + for forbidden in forbidden_queries: + self.assertRaises(ValueError, echo_engine.search, forbidden.encode(), {'pageno': 1}) diff --git a/tests/unit/test_answerers.py b/tests/unit/test_answerers.py index bd8789a7e..73d8d26f2 100644 --- a/tests/unit/test_answerers.py +++ b/tests/unit/test_answerers.py @@ -10,7 +10,7 @@ class AnswererTest(SearxTestCase): def test_unicode_input(self): query = Mock() - unicode_payload = u'árvíztűrő tükörfúrógép' + unicode_payload = 'árvíztűrő tükörfúrógép' for answerer in answerers: - query.query = u'{} {}'.format(answerer.keywords[0], unicode_payload) + query.query = '{} {}'.format(answerer.keywords[0], unicode_payload) self.assertTrue(isinstance(answerer.answer(query), list)) diff --git a/tests/unit/test_plugins.py b/tests/unit/test_plugins.py index e497371f8..838c1d574 100644 --- a/tests/unit/test_plugins.py +++ b/tests/unit/test_plugins.py @@ -7,7 +7,7 @@ from mock import Mock def get_search_mock(query, **kwargs): return Mock(search_query=Mock(query=query, **kwargs), - result_container=Mock(answers=set())) + result_container=Mock(answers=dict())) class PluginStoreTest(SearxTestCase): @@ -48,38 +48,38 @@ class SelfIPTest(SearxTestCase): # IP test request = Mock(remote_addr='127.0.0.1') request.headers.getlist.return_value = [] - search = get_search_mock(query=b'ip', pageno=1) + search = get_search_mock(query='ip', pageno=1) store.call(store.plugins, 'post_search', request, search) - self.assertTrue('127.0.0.1' in search.result_container.answers) + self.assertTrue('127.0.0.1' in search.result_container.answers["ip"]["answer"]) - search = get_search_mock(query=b'ip', pageno=2) + search = get_search_mock(query='ip', pageno=2) store.call(store.plugins, 'post_search', request, search) - self.assertFalse('127.0.0.1' in search.result_container.answers) + self.assertFalse('ip' in search.result_container.answers) # User agent test request = Mock(user_agent='Mock') request.headers.getlist.return_value = [] - search = get_search_mock(query=b'user-agent', pageno=1) + search = get_search_mock(query='user-agent', pageno=1) store.call(store.plugins, 'post_search', request, search) - self.assertTrue('Mock' in search.result_container.answers) + self.assertTrue('Mock' in search.result_container.answers["user-agent"]["answer"]) - search = get_search_mock(query=b'user-agent', pageno=2) + search = get_search_mock(query='user-agent', pageno=2) store.call(store.plugins, 'post_search', request, search) - self.assertFalse('Mock' in search.result_container.answers) + self.assertFalse('user-agent' in search.result_container.answers) - search = get_search_mock(query=b'user-agent', pageno=1) + search = get_search_mock(query='user-agent', pageno=1) store.call(store.plugins, 'post_search', request, search) - self.assertTrue('Mock' in search.result_container.answers) + self.assertTrue('Mock' in search.result_container.answers["user-agent"]["answer"]) - search = get_search_mock(query=b'user-agent', pageno=2) + search = get_search_mock(query='user-agent', pageno=2) store.call(store.plugins, 'post_search', request, search) - self.assertFalse('Mock' in search.result_container.answers) + self.assertFalse('user-agent' in search.result_container.answers) - search = get_search_mock(query=b'What is my User-Agent?', pageno=1) + search = get_search_mock(query='What is my User-Agent?', pageno=1) store.call(store.plugins, 'post_search', request, search) - self.assertTrue('Mock' in search.result_container.answers) + self.assertTrue('Mock' in search.result_container.answers["user-agent"]["answer"]) - search = get_search_mock(query=b'What is my User-Agent?', pageno=2) + search = get_search_mock(query='What is my User-Agent?', pageno=2) store.call(store.plugins, 'post_search', request, search) - self.assertFalse('Mock' in search.result_container.answers) + self.assertFalse('user-agent' in search.result_container.answers) diff --git a/tests/unit/test_preferences.py b/tests/unit/test_preferences.py index 61ac0e8e4..32f50c60b 100644 --- a/tests/unit/test_preferences.py +++ b/tests/unit/test_preferences.py @@ -3,7 +3,7 @@ from searx.preferences import (EnumStringSetting, MapSetting, MissingArgumentExc from searx.testing import SearxTestCase -class PluginStub(object): +class PluginStub: def __init__(self, id, default_on): self.id = id @@ -28,13 +28,13 @@ class TestSettings(SearxTestCase): def test_map_setting_valid_default(self): setting = MapSetting(3, map={'dog': 1, 'bat': 2, 'cat': 3}) - self.assertEquals(setting.get_value(), 3) + self.assertEqual(setting.get_value(), 3) def test_map_setting_valid_choice(self): setting = MapSetting(3, map={'dog': 1, 'bat': 2, 'cat': 3}) - self.assertEquals(setting.get_value(), 3) + self.assertEqual(setting.get_value(), 3) setting.parse('bat') - self.assertEquals(setting.get_value(), 2) + self.assertEqual(setting.get_value(), 2) def test_enum_setting_invalid_initialization(self): with self.assertRaises(MissingArgumentException): @@ -56,13 +56,13 @@ class TestSettings(SearxTestCase): def test_enum_setting_valid_default(self): setting = EnumStringSetting(3, choices=[1, 2, 3]) - self.assertEquals(setting.get_value(), 3) + self.assertEqual(setting.get_value(), 3) def test_enum_setting_valid_choice(self): setting = EnumStringSetting(3, choices=[1, 2, 3]) - self.assertEquals(setting.get_value(), 3) + self.assertEqual(setting.get_value(), 3) setting.parse(2) - self.assertEquals(setting.get_value(), 2) + self.assertEqual(setting.get_value(), 2) # multiple choice settings def test_multiple_setting_invalid_initialization(self): @@ -80,48 +80,48 @@ class TestSettings(SearxTestCase): def test_multiple_setting_valid_default(self): setting = MultipleChoiceSetting(['3'], choices=['1', '2', '3']) - self.assertEquals(setting.get_value(), ['3']) + self.assertEqual(setting.get_value(), ['3']) def test_multiple_setting_valid_choice(self): setting = MultipleChoiceSetting(['3'], choices=['1', '2', '3']) - self.assertEquals(setting.get_value(), ['3']) + self.assertEqual(setting.get_value(), ['3']) setting.parse('2') - self.assertEquals(setting.get_value(), ['2']) + self.assertEqual(setting.get_value(), ['2']) # search language settings def test_lang_setting_valid_choice(self): setting = SearchLanguageSetting('all', choices=['all', 'de', 'en']) setting.parse('de') - self.assertEquals(setting.get_value(), 'de') + self.assertEqual(setting.get_value(), 'de') def test_lang_setting_invalid_choice(self): setting = SearchLanguageSetting('all', choices=['all', 'de', 'en']) setting.parse('xx') - self.assertEquals(setting.get_value(), 'all') + self.assertEqual(setting.get_value(), 'all') def test_lang_setting_old_cookie_choice(self): setting = SearchLanguageSetting('all', choices=['all', 'es', 'es-ES']) setting.parse('es_XA') - self.assertEquals(setting.get_value(), 'es') + self.assertEqual(setting.get_value(), 'es') def test_lang_setting_old_cookie_format(self): setting = SearchLanguageSetting('all', choices=['all', 'es', 'es-ES']) setting.parse('es_ES') - self.assertEquals(setting.get_value(), 'es-ES') + self.assertEqual(setting.get_value(), 'es-ES') # plugins settings def test_plugins_setting_all_default_enabled(self): plugin1 = PluginStub('plugin1', True) plugin2 = PluginStub('plugin2', True) setting = PluginsSetting(['3'], choices=[plugin1, plugin2]) - self.assertEquals(setting.get_enabled(), set(['plugin1', 'plugin2'])) + self.assertEqual(setting.get_enabled(), set(['plugin1', 'plugin2'])) def test_plugins_setting_few_default_enabled(self): plugin1 = PluginStub('plugin1', True) plugin2 = PluginStub('plugin2', False) plugin3 = PluginStub('plugin3', True) setting = PluginsSetting('name', choices=[plugin1, plugin2, plugin3]) - self.assertEquals(setting.get_enabled(), set(['plugin1', 'plugin3'])) + self.assertEqual(setting.get_enabled(), set(['plugin1', 'plugin3'])) class TestPreferences(SearxTestCase): diff --git a/tests/unit/test_query.py b/tests/unit/test_query.py index e4c0bdeed..f2cf842a4 100644 --- a/tests/unit/test_query.py +++ b/tests/unit/test_query.py @@ -7,11 +7,10 @@ class TestQuery(SearxTestCase): def test_simple_query(self): query_text = 'the query' query = RawTextQuery(query_text, []) - query.parse_query() - self.assertEquals(query.getFullQuery(), query_text) - self.assertEquals(len(query.query_parts), 1) - self.assertEquals(len(query.languages), 0) + self.assertEqual(query.getFullQuery(), query_text) + self.assertEqual(len(query.query_parts), 1) + self.assertEqual(len(query.languages), 0) self.assertFalse(query.specific) def test_language_code(self): @@ -19,11 +18,10 @@ class TestQuery(SearxTestCase): query_text = 'the query' full_query = ':' + language + ' ' + query_text query = RawTextQuery(full_query, []) - query.parse_query() - self.assertEquals(query.getFullQuery(), full_query) - self.assertEquals(len(query.query_parts), 3) - self.assertEquals(len(query.languages), 1) + self.assertEqual(query.getFullQuery(), full_query) + self.assertEqual(len(query.query_parts), 3) + self.assertEqual(len(query.languages), 1) self.assertIn(language, query.languages) self.assertFalse(query.specific) @@ -32,10 +30,9 @@ class TestQuery(SearxTestCase): query_text = 'the query' full_query = ':' + language + ' ' + query_text query = RawTextQuery(full_query, []) - query.parse_query() - self.assertEquals(query.getFullQuery(), full_query) - self.assertEquals(len(query.query_parts), 3) + self.assertEqual(query.getFullQuery(), full_query) + self.assertEqual(len(query.query_parts), 3) self.assertIn('en', query.languages) self.assertFalse(query.specific) @@ -44,10 +41,9 @@ class TestQuery(SearxTestCase): query_text = 'the query' full_query = ':' + language + ' ' + query_text query = RawTextQuery(full_query, []) - query.parse_query() - self.assertEquals(query.getFullQuery(), full_query) - self.assertEquals(len(query.query_parts), 3) + self.assertEqual(query.getFullQuery(), full_query) + self.assertEqual(len(query.query_parts), 3) self.assertIn('all', query.languages) self.assertFalse(query.specific) @@ -56,51 +52,46 @@ class TestQuery(SearxTestCase): query_text = 'the query' full_query = ':' + language + ' ' + query_text query = RawTextQuery(full_query, []) - query.parse_query() - self.assertEquals(query.getFullQuery(), full_query) - self.assertEquals(len(query.query_parts), 1) - self.assertEquals(len(query.languages), 0) + self.assertEqual(query.getFullQuery(), full_query) + self.assertEqual(len(query.query_parts), 1) + self.assertEqual(len(query.languages), 0) self.assertFalse(query.specific) def test_timeout_below100(self): query_text = '<3 the query' query = RawTextQuery(query_text, []) - query.parse_query() - self.assertEquals(query.getFullQuery(), query_text) - self.assertEquals(len(query.query_parts), 3) - self.assertEquals(query.timeout_limit, 3) + self.assertEqual(query.getFullQuery(), query_text) + self.assertEqual(len(query.query_parts), 3) + self.assertEqual(query.timeout_limit, 3) self.assertFalse(query.specific) def test_timeout_above100(self): query_text = '<350 the query' query = RawTextQuery(query_text, []) - query.parse_query() - self.assertEquals(query.getFullQuery(), query_text) - self.assertEquals(len(query.query_parts), 3) - self.assertEquals(query.timeout_limit, 0.35) + self.assertEqual(query.getFullQuery(), query_text) + self.assertEqual(len(query.query_parts), 3) + 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, []) - query.parse_query() - self.assertEquals(query.getFullQuery(), query_text) - self.assertEquals(len(query.query_parts), 3) - self.assertEquals(query.timeout_limit, 3.5) + self.assertEqual(query.getFullQuery(), query_text) + self.assertEqual(len(query.query_parts), 3) + 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, []) - query.parse_query() - self.assertEquals(query.getFullQuery(), query_text) - self.assertEquals(len(query.query_parts), 1) - self.assertEquals(query.query_parts[0], query_text) - self.assertEquals(query.timeout_limit, None) + self.assertEqual(query.getFullQuery(), query_text) + self.assertEqual(len(query.query_parts), 1) + self.assertEqual(query.query_parts[0], query_text) + self.assertEqual(query.timeout_limit, None) self.assertFalse(query.specific) diff --git a/tests/unit/test_search.py b/tests/unit/test_search.py index 18c221954..a15d2c899 100644 --- a/tests/unit/test_search.py +++ b/tests/unit/test_search.py @@ -45,7 +45,7 @@ class SearchTestCase(SearxTestCase): preferences=Preferences(['oscar'], ['general'], engines, [])) search = searx.search.Search(search_query) search.search() - self.assertEquals(search.actual_timeout, 3.0) + self.assertEqual(search.actual_timeout, 3.0) def test_timeout_query_above_default_nomax(self): searx.search.max_request_timeout = None @@ -54,7 +54,7 @@ class SearchTestCase(SearxTestCase): preferences=Preferences(['oscar'], ['general'], engines, [])) search = searx.search.Search(search_query) search.search() - self.assertEquals(search.actual_timeout, 3.0) + self.assertEqual(search.actual_timeout, 3.0) def test_timeout_query_below_default_nomax(self): searx.search.max_request_timeout = None @@ -63,7 +63,7 @@ class SearchTestCase(SearxTestCase): preferences=Preferences(['oscar'], ['general'], engines, [])) search = searx.search.Search(search_query) search.search() - self.assertEquals(search.actual_timeout, 1.0) + self.assertEqual(search.actual_timeout, 1.0) def test_timeout_query_below_max(self): searx.search.max_request_timeout = 10.0 @@ -72,7 +72,7 @@ class SearchTestCase(SearxTestCase): preferences=Preferences(['oscar'], ['general'], engines, [])) search = searx.search.Search(search_query) search.search() - self.assertEquals(search.actual_timeout, 5.0) + self.assertEqual(search.actual_timeout, 5.0) def test_timeout_query_above_max(self): searx.search.max_request_timeout = 10.0 @@ -81,7 +81,7 @@ class SearchTestCase(SearxTestCase): preferences=Preferences(['oscar'], ['general'], engines, [])) search = searx.search.Search(search_query) search.search() - self.assertEquals(search.actual_timeout, 10.0) + self.assertEqual(search.actual_timeout, 10.0) def test_query_private_engine_without_token(self): search_query = searx.query.SearchQuery('test', [{'category': 'general', 'name': PRIVATE_ENGINE_NAME}], @@ -89,7 +89,7 @@ class SearchTestCase(SearxTestCase): preferences=Preferences(['oscar'], ['general'], engines, [])) search = searx.search.Search(search_query) results = search.search() - self.assertEquals(results.results_length(), 0) + self.assertEqual(results.results_length(), 0) def test_query_private_engine_with_incorrect_token(self): preferences_with_tokens = Preferences(['oscar'], ['general'], engines, []) @@ -99,7 +99,7 @@ class SearchTestCase(SearxTestCase): preferences=preferences_with_tokens) search = searx.search.Search(search_query) results = search.search() - self.assertEquals(results.results_length(), 0) + self.assertEqual(results.results_length(), 0) def test_query_private_engine_with_correct_token(self): preferences_with_tokens = Preferences(['oscar'], ['general'], engines, []) @@ -109,4 +109,25 @@ class SearchTestCase(SearxTestCase): preferences=preferences_with_tokens) search = searx.search.Search(search_query) results = search.search() - self.assertEquals(results.results_length(), 1) + self.assertEqual(results.results_length(), 1) + + def test_external_bang(self): + search_query = searx.query.SearchQuery('yes yes', + [{'category': 'general', 'name': PUBLIC_ENGINE_NAME}], + ['general'], 'en-US', SAFESEARCH, PAGENO, None, None, + preferences=Preferences(['oscar'], ['general'], engines, [],), + external_bang="yt") + search = searx.search.Search(search_query) + results = search.search() + # For checking if the user redirected with the youtube external bang + self.assertTrue(results.redirect_url is not None) + + search_query = searx.query.SearchQuery('youtube never gonna give you up', + [{'category': 'general', 'name': PUBLIC_ENGINE_NAME}], + ['general'], 'en-US', SAFESEARCH, PAGENO, None, None, + preferences=Preferences(['oscar'], ['general'], engines, []),) + + search = searx.search.Search(search_query) + results = search.search() + # This should not redirect + self.assertTrue(results.redirect_url is None) diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index b09b9d414..08b759542 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -1,12 +1,8 @@ # -*- coding: utf-8 -*- import mock -import sys from searx.testing import SearxTestCase from searx import utils -if sys.version_info[0] == 3: - unicode = str - class TestUtils(SearxTestCase): @@ -34,9 +30,9 @@ class TestUtils(SearxTestCase): self.assertEqual(utils.highlight_content(content, None), content) content = 'a' - query = b'test' + query = 'test' self.assertEqual(utils.highlight_content(content, query), content) - query = b'a test' + query = 'a test' self.assertEqual(utils.highlight_content(content, query), content) def test_html_to_text(self): @@ -52,15 +48,19 @@ class TestUtils(SearxTestCase): </span> </a> """ - self.assertIsInstance(utils.html_to_text(html), unicode) + self.assertIsInstance(utils.html_to_text(html), str) self.assertIsNotNone(utils.html_to_text(html)) self.assertEqual(utils.html_to_text(html), "Test text") + def test_html_to_text_invalid(self): + html = '<p><b>Lorem ipsum</i>dolor sit amet</p>' + self.assertEqual(utils.html_to_text(html), "Lorem ipsum") + def test_prettify_url(self): data = (('https://searx.me/', 'https://searx.me/'), - (u'https://searx.me/ű', u'https://searx.me/ű'), + ('https://searx.me/ű', 'https://searx.me/ű'), ('https://searx.me/' + (100 * 'a'), 'https://searx.me/[...]aaaaaaaaaaaaaaaaa'), - (u'https://searx.me/' + (100 * u'ű'), u'https://searx.me/[...]űűűűűűűűűűűűűűűűű')) + ('https://searx.me/' + (100 * 'ű'), 'https://searx.me/[...]űűűűűűűűűűűűűűűűű')) for test_url, expected in data: self.assertEqual(utils.prettify_url(test_url, max_length=32), expected) @@ -108,18 +108,23 @@ class TestHTMLTextExtractor(SearxTestCase): def test_handle_charref(self): self.html_text_extractor.handle_charref('xF') - self.assertIn(u'\x0f', self.html_text_extractor.result) + self.assertIn('\x0f', self.html_text_extractor.result) self.html_text_extractor.handle_charref('XF') - self.assertIn(u'\x0f', self.html_text_extractor.result) + self.assertIn('\x0f', self.html_text_extractor.result) self.html_text_extractor.handle_charref('97') - self.assertIn(u'a', self.html_text_extractor.result) + self.assertIn('a', self.html_text_extractor.result) def test_handle_entityref(self): entity = 'test' self.html_text_extractor.handle_entityref(entity) self.assertIn(entity, self.html_text_extractor.result) + def test_invalid_html(self): + text = '<p><b>Lorem ipsum</i>dolor sit amet</p>' + with self.assertRaises(utils.HTMLTextExtractorException): + self.html_text_extractor.feed(text) + class TestUnicodeWriter(SearxTestCase): diff --git a/tests/unit/test_webapp.py b/tests/unit/test_webapp.py index f31332fa0..7dd465898 100644 --- a/tests/unit/test_webapp.py +++ b/tests/unit/test_webapp.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- import json +from urllib.parse import ParseResult from mock import Mock from searx import webapp from searx.testing import SearxTestCase from searx.search import Search -from searx.url_utils import ParseResult class ViewsTestCase(SearxTestCase): @@ -48,7 +48,7 @@ class ViewsTestCase(SearxTestCase): def search_mock(search_self, *args): search_self.result_container = Mock(get_ordered_results=lambda: test_results, - answers=set(), + answers=dict(), corrections=set(), suggestions=set(), infoboxes=[], @@ -56,7 +56,8 @@ class ViewsTestCase(SearxTestCase): results=test_results, results_number=lambda: 3, results_length=lambda: len(test_results), - get_timings=lambda: timings) + get_timings=lambda: timings, + redirect_url=None) self.setattr4test(Search, 'search', search_mock) @@ -88,7 +89,7 @@ class ViewsTestCase(SearxTestCase): def test_index_json(self): result = self.app.post('/', data={'q': 'test', 'format': 'json'}) - result_dict = json.loads(result.data.decode('utf-8')) + result_dict = json.loads(result.data.decode()) self.assertEqual('test', result_dict['query']) self.assertEqual(len(result_dict['results']), 2) |