summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/unit/network/__init__.py0
-rw-r--r--tests/unit/network/test_network.py236
-rw-r--r--tests/unit/test_engines_init.py2
-rw-r--r--tests/unit/test_poolrequests.py89
-rw-r--r--tests/unit/test_query.py15
-rw-r--r--tests/unit/test_webapp.py7
6 files changed, 253 insertions, 96 deletions
diff --git a/tests/unit/network/__init__.py b/tests/unit/network/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/unit/network/__init__.py
diff --git a/tests/unit/network/test_network.py b/tests/unit/network/test_network.py
new file mode 100644
index 000000000..246dfd85e
--- /dev/null
+++ b/tests/unit/network/test_network.py
@@ -0,0 +1,236 @@
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
+from mock import patch
+
+import httpx
+
+from searx.network.network import Network, NETWORKS
+from searx.testing import SearxTestCase
+
+
+class TestNetwork(SearxTestCase):
+
+ def test_simple(self):
+ network = Network()
+
+ self.assertEqual(next(network._local_addresses_cycle), None)
+ self.assertEqual(next(network._proxies_cycle), ())
+
+ def test_ipaddress_cycle(self):
+ network = NETWORKS['ipv6']
+ self.assertEqual(next(network._local_addresses_cycle), '::')
+ self.assertEqual(next(network._local_addresses_cycle), '::')
+
+ network = NETWORKS['ipv4']
+ self.assertEqual(next(network._local_addresses_cycle), '0.0.0.0')
+ self.assertEqual(next(network._local_addresses_cycle), '0.0.0.0')
+
+ network = Network(local_addresses=['192.168.0.1', '192.168.0.2'])
+ self.assertEqual(next(network._local_addresses_cycle), '192.168.0.1')
+ self.assertEqual(next(network._local_addresses_cycle), '192.168.0.2')
+ self.assertEqual(next(network._local_addresses_cycle), '192.168.0.1')
+
+ network = Network(local_addresses=['192.168.0.0/30'])
+ self.assertEqual(next(network._local_addresses_cycle), '192.168.0.1')
+ self.assertEqual(next(network._local_addresses_cycle), '192.168.0.2')
+ self.assertEqual(next(network._local_addresses_cycle), '192.168.0.1')
+ self.assertEqual(next(network._local_addresses_cycle), '192.168.0.2')
+
+ network = Network(local_addresses=['fe80::/10'])
+ self.assertEqual(next(network._local_addresses_cycle), 'fe80::1')
+ self.assertEqual(next(network._local_addresses_cycle), 'fe80::2')
+ self.assertEqual(next(network._local_addresses_cycle), 'fe80::3')
+
+ with self.assertRaises(ValueError):
+ Network(local_addresses=['not_an_ip_address'])
+
+ def test_proxy_cycles(self):
+ network = Network(proxies='http://localhost:1337')
+ self.assertEqual(next(network._proxies_cycle), (('all://', 'http://localhost:1337'),))
+
+ network = Network(proxies={
+ 'https': 'http://localhost:1337',
+ 'http': 'http://localhost:1338'
+ })
+ self.assertEqual(next(network._proxies_cycle),
+ (('https://', 'http://localhost:1337'), ('http://', 'http://localhost:1338')))
+ self.assertEqual(next(network._proxies_cycle),
+ (('https://', 'http://localhost:1337'), ('http://', 'http://localhost:1338')))
+
+ network = Network(proxies={
+ 'https': ['http://localhost:1337', 'http://localhost:1339'],
+ 'http': 'http://localhost:1338'
+ })
+ self.assertEqual(next(network._proxies_cycle),
+ (('https://', 'http://localhost:1337'), ('http://', 'http://localhost:1338')))
+ self.assertEqual(next(network._proxies_cycle),
+ (('https://', 'http://localhost:1339'), ('http://', 'http://localhost:1338')))
+
+ with self.assertRaises(ValueError):
+ Network(proxies=1)
+
+ def test_get_kwargs_clients(self):
+ kwargs = {
+ 'verify': True,
+ 'max_redirects': 5,
+ 'timeout': 2,
+ }
+ kwargs_client = Network.get_kwargs_clients(kwargs)
+
+ self.assertEqual(len(kwargs_client), 2)
+ self.assertEqual(len(kwargs), 1)
+
+ self.assertEqual(kwargs['timeout'], 2)
+
+ self.assertTrue(kwargs_client['verify'])
+ self.assertEqual(kwargs_client['max_redirects'], 5)
+
+ async def test_get_client(self):
+ network = Network(verify=True)
+ client1 = network.get_client()
+ client2 = network.get_client(verify=True)
+ client3 = network.get_client(max_redirects=10)
+ client4 = network.get_client(verify=True)
+ client5 = network.get_client(verify=False)
+ client6 = network.get_client(max_redirects=10)
+
+ self.assertEqual(client1, client2)
+ self.assertEqual(client1, client4)
+ self.assertNotEqual(client1, client3)
+ self.assertNotEqual(client1, client5)
+ self.assertEqual(client3, client6)
+
+ await network.aclose()
+
+ async def test_aclose(self):
+ network = Network(verify=True)
+ network.get_client()
+ await network.aclose()
+
+ async def test_request(self):
+ a_text = 'Lorem Ipsum'
+ response = httpx.Response(status_code=200, text=a_text)
+ with patch.object(httpx.AsyncClient, 'request', return_value=response):
+ network = Network(enable_http=True)
+ response = await network.request('GET', 'https://example.com/')
+ self.assertEqual(response.text, a_text)
+ await network.aclose()
+
+
+class TestNetworkRequestRetries(SearxTestCase):
+
+ TEXT = 'Lorem Ipsum'
+
+ @classmethod
+ def get_response_404_then_200(cls):
+ first = True
+
+ async def get_response(*args, **kwargs):
+ nonlocal first
+ if first:
+ first = False
+ return httpx.Response(status_code=403, text=TestNetworkRequestRetries.TEXT)
+ return httpx.Response(status_code=200, text=TestNetworkRequestRetries.TEXT)
+ return get_response
+
+ async def test_retries_ok(self):
+ with patch.object(httpx.AsyncClient, 'request', new=TestNetworkRequestRetries.get_response_404_then_200()):
+ network = Network(enable_http=True, retries=1, retry_on_http_error=403)
+ response = await network.request('GET', 'https://example.com/')
+ self.assertEqual(response.text, TestNetworkRequestRetries.TEXT)
+ await network.aclose()
+
+ async def test_retries_fail_int(self):
+ with patch.object(httpx.AsyncClient, 'request', new=TestNetworkRequestRetries.get_response_404_then_200()):
+ network = Network(enable_http=True, retries=0, retry_on_http_error=403)
+ response = await network.request('GET', 'https://example.com/')
+ self.assertEqual(response.status_code, 403)
+ await network.aclose()
+
+ async def test_retries_fail_list(self):
+ with patch.object(httpx.AsyncClient, 'request', new=TestNetworkRequestRetries.get_response_404_then_200()):
+ network = Network(enable_http=True, retries=0, retry_on_http_error=[403, 429])
+ response = await network.request('GET', 'https://example.com/')
+ self.assertEqual(response.status_code, 403)
+ await network.aclose()
+
+ async def test_retries_fail_bool(self):
+ with patch.object(httpx.AsyncClient, 'request', new=TestNetworkRequestRetries.get_response_404_then_200()):
+ network = Network(enable_http=True, retries=0, retry_on_http_error=True)
+ response = await network.request('GET', 'https://example.com/')
+ self.assertEqual(response.status_code, 403)
+ await network.aclose()
+
+ async def test_retries_exception_then_200(self):
+ request_count = 0
+
+ async def get_response(*args, **kwargs):
+ nonlocal request_count
+ request_count += 1
+ if request_count < 3:
+ raise httpx.RequestError('fake exception', request=None)
+ return httpx.Response(status_code=200, text=TestNetworkRequestRetries.TEXT)
+
+ with patch.object(httpx.AsyncClient, 'request', new=get_response):
+ network = Network(enable_http=True, retries=2)
+ response = await network.request('GET', 'https://example.com/')
+ self.assertEqual(response.status_code, 200)
+ self.assertEqual(response.text, TestNetworkRequestRetries.TEXT)
+ await network.aclose()
+
+ async def test_retries_exception(self):
+ async def get_response(*args, **kwargs):
+ raise httpx.RequestError('fake exception', request=None)
+
+ with patch.object(httpx.AsyncClient, 'request', new=get_response):
+ network = Network(enable_http=True, retries=0)
+ with self.assertRaises(httpx.RequestError):
+ await network.request('GET', 'https://example.com/')
+ await network.aclose()
+
+
+class TestNetworkStreamRetries(SearxTestCase):
+
+ TEXT = 'Lorem Ipsum'
+
+ @classmethod
+ def get_response_exception_then_200(cls):
+ first = True
+
+ def stream(*args, **kwargs):
+ nonlocal first
+ if first:
+ first = False
+ raise httpx.RequestError('fake exception', request=None)
+ return httpx.Response(status_code=200, text=TestNetworkStreamRetries.TEXT)
+ return stream
+
+ async def test_retries_ok(self):
+ with patch.object(httpx.AsyncClient, 'stream', new=TestNetworkStreamRetries.get_response_exception_then_200()):
+ network = Network(enable_http=True, retries=1, retry_on_http_error=403)
+ response = network.stream('GET', 'https://example.com/')
+ self.assertEqual(response.text, TestNetworkStreamRetries.TEXT)
+ await network.aclose()
+
+ async def test_retries_fail(self):
+ with patch.object(httpx.AsyncClient, 'stream', new=TestNetworkStreamRetries.get_response_exception_then_200()):
+ network = Network(enable_http=True, retries=0, retry_on_http_error=403)
+ with self.assertRaises(httpx.RequestError):
+ network.stream('GET', 'https://example.com/')
+ await network.aclose()
+
+ async def test_retries_exception(self):
+ first = True
+
+ def stream(*args, **kwargs):
+ nonlocal first
+ if first:
+ first = False
+ return httpx.Response(status_code=403, text=TestNetworkRequestRetries.TEXT)
+ return httpx.Response(status_code=200, text=TestNetworkRequestRetries.TEXT)
+
+ with patch.object(httpx.AsyncClient, 'stream', new=stream):
+ network = Network(enable_http=True, retries=0, retry_on_http_error=403)
+ response = network.stream('GET', 'https://example.com/')
+ self.assertEqual(response.status_code, 403)
+ await network.aclose()
diff --git a/tests/unit/test_engines_init.py b/tests/unit/test_engines_init.py
index cf4d50309..c75637f20 100644
--- a/tests/unit/test_engines_init.py
+++ b/tests/unit/test_engines_init.py
@@ -13,7 +13,7 @@ class TestEnginesInit(SearxTestCase):
engine_list = [{'engine': 'dummy', 'name': 'engine1', 'shortcut': 'e1'},
{'engine': 'dummy', 'name': 'engine2', 'shortcut': 'e2'}]
- engines.initialize_engines(engine_list)
+ engines.load_engines(engine_list)
self.assertEqual(len(engines.engines), 2)
self.assertIn('engine1', engines.engines)
self.assertIn('engine2', engines.engines)
diff --git a/tests/unit/test_poolrequests.py b/tests/unit/test_poolrequests.py
deleted file mode 100644
index b22685fd0..000000000
--- a/tests/unit/test_poolrequests.py
+++ /dev/null
@@ -1,89 +0,0 @@
-from unittest.mock import patch
-from requests.models import Response
-
-from searx.testing import SearxTestCase
-
-import searx.poolrequests
-from searx.poolrequests import get_proxy_cycles, get_proxies
-
-
-CONFIG = {'http': ['http://localhost:9090', 'http://localhost:9092'],
- 'https': ['http://localhost:9091', 'http://localhost:9093']}
-
-
-class TestProxy(SearxTestCase):
-
- def test_noconfig(self):
- cycles = get_proxy_cycles(None)
- self.assertIsNone(cycles)
-
- cycles = get_proxy_cycles(False)
- self.assertIsNone(cycles)
-
- def test_oldconfig(self):
- config = {
- 'http': 'http://localhost:9090',
- 'https': 'http://localhost:9091',
- }
- cycles = get_proxy_cycles(config)
- self.assertEqual(next(cycles['http']), 'http://localhost:9090')
- self.assertEqual(next(cycles['http']), 'http://localhost:9090')
- self.assertEqual(next(cycles['https']), 'http://localhost:9091')
- self.assertEqual(next(cycles['https']), 'http://localhost:9091')
-
- def test_one_proxy(self):
- config = {
- 'http': ['http://localhost:9090'],
- 'https': ['http://localhost:9091'],
- }
- cycles = get_proxy_cycles(config)
- self.assertEqual(next(cycles['http']), 'http://localhost:9090')
- self.assertEqual(next(cycles['http']), 'http://localhost:9090')
- self.assertEqual(next(cycles['https']), 'http://localhost:9091')
- self.assertEqual(next(cycles['https']), 'http://localhost:9091')
-
- def test_multiple_proxies(self):
- cycles = get_proxy_cycles(CONFIG)
- self.assertEqual(next(cycles['http']), 'http://localhost:9090')
- self.assertEqual(next(cycles['http']), 'http://localhost:9092')
- self.assertEqual(next(cycles['http']), 'http://localhost:9090')
- self.assertEqual(next(cycles['https']), 'http://localhost:9091')
- self.assertEqual(next(cycles['https']), 'http://localhost:9093')
- self.assertEqual(next(cycles['https']), 'http://localhost:9091')
-
- def test_getproxies_none(self):
- self.assertIsNone(get_proxies(None))
-
- def test_getproxies_config(self):
- cycles = get_proxy_cycles(CONFIG)
- self.assertEqual(get_proxies(cycles), {
- 'http': 'http://localhost:9090',
- 'https': 'http://localhost:9091'
- })
- self.assertEqual(get_proxies(cycles), {
- 'http': 'http://localhost:9092',
- 'https': 'http://localhost:9093'
- })
-
- @patch('searx.poolrequests.get_global_proxies')
- def test_request(self, mock_get_global_proxies):
- method = 'GET'
- url = 'http://localhost'
- custom_proxies = {
- 'https': 'http://localhost:1080'
- }
- global_proxies = {
- 'http': 'http://localhost:9092',
- 'https': 'http://localhost:9093'
- }
- mock_get_global_proxies.return_value = global_proxies
-
- # check the global proxies usage
- with patch.object(searx.poolrequests.SessionSinglePool, 'request', return_value=Response()) as mock_method:
- searx.poolrequests.request(method, url)
- mock_method.assert_called_once_with(method=method, url=url, proxies=global_proxies)
-
- # check if the proxies parameter overrides the global proxies
- with patch.object(searx.poolrequests.SessionSinglePool, 'request', return_value=Response()) as mock_method:
- searx.poolrequests.request(method, url, proxies=custom_proxies)
- mock_method.assert_called_once_with(method=method, url=url, proxies=custom_proxies)
diff --git a/tests/unit/test_query.py b/tests/unit/test_query.py
index 6bbfdb1e2..7a79ce242 100644
--- a/tests/unit/test_query.py
+++ b/tests/unit/test_query.py
@@ -1,7 +1,11 @@
+from mock import patch
+
from searx.search import initialize
from searx.query import RawTextQuery
from searx.testing import SearxTestCase
+import searx.engines
+
TEST_ENGINES = [
{
@@ -277,9 +281,10 @@ class TestBang(SearxTestCase):
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'])
+ with patch.object(searx.engines, 'initialize_engines', searx.engines.load_engines):
+ 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'])
+ query = RawTextQuery('the query ?', ['osm'])
+ self.assertEqual(query.autocomplete_list, ['?images', '?wikipedia'])
diff --git a/tests/unit/test_webapp.py b/tests/unit/test_webapp.py
index 7d7a04fdc..d3498f51a 100644
--- a/tests/unit/test_webapp.py
+++ b/tests/unit/test_webapp.py
@@ -3,14 +3,19 @@
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
+import searx.engines
class ViewsTestCase(SearxTestCase):
def setUp(self):
+ # skip init function (no external HTTP request)
+ self.setattr4test(searx.engines, 'initialize_engines', searx.engines.load_engines)
+
+ from searx import webapp # pylint disable=import-outside-toplevel
+
webapp.app.config['TESTING'] = True # to get better error messages
self.app = webapp.app.test_client()