From c03e4c86bc49d6ef4664c038066d9f1c16e7dafc Mon Sep 17 00:00:00 2001 From: rachmadani haryono Date: Wed, 4 Nov 2020 20:38:54 +0800 Subject: Feature/standalone searx update (#1591) * chg: dev: update standalone_searx parent d8a5df721b33dd8a7cc9e21dba4060f21d629f69 author rachmadaniHaryono 1603896594 +0800 committer rachmadaniHaryono 1603896619 +0800 chg: dev: debug engine_shortcuts chg: dev: only initilize if engine is given chg: dev: split main chg: dev: standalone_searx chg: dev: update standalone_searx chg: doc: remove unnecessary log chg: test: differentiate travis chg: test: disable shortcut chg: test: use default engine settings fix: dev: category choices fix: dev: duplicate engine shortcut fix: dev: travis python3 fix: test: use empty string as shortcut fix: test: apkm fix: test: engine shortcut fix: test: mypy fix: test: parameter fix: test: pep8 fix: test: py2 compatibilities fix: test: searx settings fix: test: travis engines new: dev: deduplicate engine new: dev: main receive engines parameter new: dev: parse_argument accept engines parameter new: dev: split search query from get_result func new: test: basic result case Suggestions: use RawTextQuery to make the suggestions URLs. Update all themes accordingly. * new: doc: searx import and init * chg: dev: parse_argument - doc - run on __main__ - simple parse_args * chg: doc: module * chg: dev: import section - remove unused python path modification - new required package * chg: dev: script run - parse_argument func return directly parsed results - main func return dict instead json text - dump directly on sys.stdout.write * chg: dev: get_search_query and get_search_query func * chg: dev: main func - move inner function outside - return dict instead of json text * new: dev: add utils to doc sys path * new: doc: standalone_searx * fix: doc: run script * chg: dev: mypy type hint * chg: dev: SearchQuery don't have attr engines * chg: dev: reset engines __init__ * chg: test: unit test update * chg: dev: pylint and flake8 * new: test: standalone_searx * chg: dev: main func and doc * chg: dev: import and type hint * new: dev: main func - remove get_result func - single func which just translate dict * chg: test: put mypy on dev requirement * chg: doc: update * new: doc: add standalone_searx module member * chg: doc: shell command line * chg: dev: remove mypy * chg: doc: module docstring --- tests/unit/test_standalone_searx.py | 118 ++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 tests/unit/test_standalone_searx.py (limited to 'tests') diff --git a/tests/unit/test_standalone_searx.py b/tests/unit/test_standalone_searx.py new file mode 100644 index 000000000..cd1a14f46 --- /dev/null +++ b/tests/unit/test_standalone_searx.py @@ -0,0 +1,118 @@ +# -*- coding: utf-8 -*- +"""Test utils/standalone_searx.py""" +import datetime +import importlib.util +import sys + +from mock import Mock, patch +from nose2.tools import params + +from searx.testing import SearxTestCase + + +def get_standalone_searx_module(): + """Get standalone_searx module.""" + module_name = 'utils.standalone_searx' + filename = 'utils/standalone_searx.py' + spec = importlib.util.spec_from_file_location(module_name, filename) + sas = importlib.util.module_from_spec(spec) + spec.loader.exec_module(sas) + return sas + + +class StandaloneSearx(SearxTestCase): + """Unit test for standalone_searx.""" + + def test_parse_argument_no_args(self): + """Test parse argument without args.""" + sas = get_standalone_searx_module() + with patch.object(sys, 'argv', ['standalone_searx']), \ + self.assertRaises(SystemExit): + sas.parse_argument() + + def test_parse_argument_basic_args(self): + """Test parse argument with basic args.""" + sas = get_standalone_searx_module() + query = 'red box' + exp_dict = { + 'query': query, 'category': 'general', 'lang': 'all', 'pageno': 1, + 'safesearch': '0', 'timerange': None} + args = ['standalone_searx', query] + with patch.object(sys, 'argv', args): + res = sas.parse_argument() + self.assertEqual(exp_dict, vars(res)) + res2 = sas.parse_argument(args[1:]) + self.assertEqual(exp_dict, vars(res2)) + + def test_to_dict(self): + """test to_dict.""" + sas = get_standalone_searx_module() + self.assertEqual( + sas.to_dict( + sas.get_search_query(sas.parse_argument(['red box']))), + { + 'search': { + 'q': 'red box', 'pageno': 1, 'lang': 'all', + 'safesearch': 0, 'timerange': None + }, + 'results': [], 'infoboxes': [], 'suggestions': [], + 'answers': [], 'paging': False, 'results_number': 0 + } + ) + + def test_to_dict_with_mock(self): + """test to dict.""" + sas = get_standalone_searx_module() + with patch.object(sas.searx.search, 'Search') as mock_s: + m_search = mock_s().search() + m_sq = Mock() + self.assertEqual( + sas.to_dict(m_sq), + { + 'answers': [], + 'infoboxes': m_search.infoboxes, + 'paging': m_search.paging, + 'results': m_search.get_ordered_results(), + 'results_number': m_search.results_number(), + 'search': { + 'lang': m_sq.lang, + 'pageno': m_sq.pageno, + 'q': m_sq.query, + 'safesearch': m_sq.safesearch, + 'timerange': m_sq.time_range, + }, + 'suggestions': [] + } + ) + + def test_get_search_query(self): + """test get_search_query.""" + sas = get_standalone_searx_module() + args = sas.parse_argument(['rain', ]) + search_q = sas.get_search_query(args) + self.assertTrue(search_q) + self.assertEqual(str(search_q), 'rain;[]') + + def test_no_parsed_url(self): + """test no_parsed_url func""" + sas = get_standalone_searx_module() + self.assertEqual( + sas.no_parsed_url([{'parsed_url': 'http://example.com'}]), + [{}] + ) + + @params( + (datetime.datetime(2020, 1, 1), '2020-01-01T00:00:00'), + ('a'.encode('utf8'), 'a'), + (set([1]), [1]) + ) + def test_json_serial(self, arg, exp_res): + """test json_serial func""" + sas = get_standalone_searx_module() + self.assertEqual(sas.json_serial(arg), exp_res) + + def test_json_serial_error(self): + """test error on json_serial.""" + sas = get_standalone_searx_module() + with self.assertRaises(TypeError): + sas.json_serial('a') -- cgit v1.2.3