| 
							
							# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						
						
						
						
							 | 
							
							# pylint: disable=missing-module-docstring
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							from pathlib import Path
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							import os
 | 
						
						
						
						
							 | 
							
							from unittest.mock import patch
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							from parameterized import parameterized
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							from searx.exceptions import SearxSettingsException
 | 
						
						
						
						
							 | 
							
							from searx import settings_loader
 | 
						
						
						
						
							 | 
							
							from tests import SearxTestCase
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							def _settings(f_name):
 | 
						
						
						
						
							 | 
							
							    return str(Path(__file__).parent.absolute() / "settings" / f_name)
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							class TestLoad(SearxTestCase):  # pylint: disable=missing-class-docstring
 | 
						
						
						
						
							 | 
							
							    def test_load_zero(self):
 | 
						
						
						
						
							 | 
							
							        with self.assertRaises(SearxSettingsException):
 | 
						
						
						
						
							 | 
							
							            settings_loader.load_yaml('/dev/zero')
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							        with self.assertRaises(SearxSettingsException):
 | 
						
						
						
						
							 | 
							
							            settings_loader.load_yaml(_settings("syntaxerror_settings.yml"))
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							        self.assertEqual(settings_loader.load_yaml(_settings("empty_settings.yml")), {})
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							class TestDefaultSettings(SearxTestCase):  # pylint: disable=missing-class-docstring
 | 
						
						
						
						
							 | 
							
							    def test_load(self):
 | 
						
						
						
						
							 | 
							
							        settings, msg = settings_loader.load_settings(load_user_settings=False)
 | 
						
						
						
						
							 | 
							
							        self.assertTrue(msg.startswith('load the default settings from'))
 | 
						
						
						
						
							 | 
							
							        self.assertFalse(settings['general']['debug'])
 | 
						
						
						
						
							 | 
							
							        self.assertIsInstance(settings['general']['instance_name'], str)
 | 
						
						
						
						
							 | 
							
							        self.assertEqual(settings['server']['secret_key'], "ultrasecretkey")
 | 
						
						
						
						
							 | 
							
							        self.assertIsInstance(settings['server']['port'], int)
 | 
						
						
						
						
							 | 
							
							        self.assertIsInstance(settings['server']['bind_address'], str)
 | 
						
						
						
						
							 | 
							
							        self.assertIsInstance(settings['engines'], list)
 | 
						
						
						
						
							 | 
							
							        self.assertIsInstance(settings['doi_resolvers'], dict)
 | 
						
						
						
						
							 | 
							
							        self.assertIsInstance(settings['default_doi_resolver'], str)
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							class TestUserSettings(SearxTestCase):  # pylint: disable=missing-class-docstring
 | 
						
						
						
						
							 | 
							
							    def test_is_use_default_settings(self):
 | 
						
						
						
						
							 | 
							
							        self.assertFalse(settings_loader.is_use_default_settings({}))
 | 
						
						
						
						
							 | 
							
							        self.assertTrue(settings_loader.is_use_default_settings({'use_default_settings': True}))
 | 
						
						
						
						
							 | 
							
							        self.assertTrue(settings_loader.is_use_default_settings({'use_default_settings': {}}))
 | 
						
						
						
						
							 | 
							
							        with self.assertRaises(ValueError):
 | 
						
						
						
						
							 | 
							
							            self.assertFalse(settings_loader.is_use_default_settings({'use_default_settings': 1}))
 | 
						
						
						
						
							 | 
							
							        with self.assertRaises(ValueError):
 | 
						
						
						
						
							 | 
							
							            self.assertFalse(settings_loader.is_use_default_settings({'use_default_settings': 0}))
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							    @parameterized.expand(
 | 
						
						
						
						
							 | 
							
							        [
 | 
						
						
						
						
							 | 
							
							            _settings("not_exists.yml"),
 | 
						
						
						
						
							 | 
							
							            "/folder/not/exists",
 | 
						
						
						
						
							 | 
							
							        ]
 | 
						
						
						
						
							 | 
							
							    )
 | 
						
						
						
						
							 | 
							
							    def test_user_settings_not_found(self, path: str):
 | 
						
						
						
						
							 | 
							
							        with patch.dict(os.environ, {'SEARXNG_SETTINGS_PATH': path}):
 | 
						
						
						
						
							 | 
							
							            with self.assertRaises(EnvironmentError):
 | 
						
						
						
						
							 | 
							
							                _s, _m = settings_loader.load_settings()
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							    def test_user_settings(self):
 | 
						
						
						
						
							 | 
							
							        with patch.dict(os.environ, {'SEARXNG_SETTINGS_PATH': _settings("user_settings_simple.yml")}):
 | 
						
						
						
						
							 | 
							
							            settings, msg = settings_loader.load_settings()
 | 
						
						
						
						
							 | 
							
							            self.assertTrue(msg.startswith('merge the default settings'))
 | 
						
						
						
						
							 | 
							
							            self.assertEqual(settings['server']['secret_key'], "user_secret_key")
 | 
						
						
						
						
							 | 
							
							            self.assertEqual(settings['server']['default_http_headers']['Custom-Header'], "Custom-Value")
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							    def test_user_settings_remove(self):
 | 
						
						
						
						
							 | 
							
							        with patch.dict(os.environ, {'SEARXNG_SETTINGS_PATH': _settings("user_settings_remove.yml")}):
 | 
						
						
						
						
							 | 
							
							            settings, msg = settings_loader.load_settings()
 | 
						
						
						
						
							 | 
							
							            self.assertTrue(msg.startswith('merge the default settings'))
 | 
						
						
						
						
							 | 
							
							            self.assertEqual(settings['server']['secret_key'], "user_secret_key")
 | 
						
						
						
						
							 | 
							
							            self.assertEqual(settings['server']['default_http_headers']['Custom-Header'], "Custom-Value")
 | 
						
						
						
						
							 | 
							
							            engine_names = [engine['name'] for engine in settings['engines']]
 | 
						
						
						
						
							 | 
							
							            self.assertNotIn('wikinews', engine_names)
 | 
						
						
						
						
							 | 
							
							            self.assertNotIn('wikibooks', engine_names)
 | 
						
						
						
						
							 | 
							
							            self.assertIn('wikipedia', engine_names)
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							    def test_user_settings_remove2(self):
 | 
						
						
						
						
							 | 
							
							        with patch.dict(os.environ, {'SEARXNG_SETTINGS_PATH': _settings("user_settings_remove2.yml")}):
 | 
						
						
						
						
							 | 
							
							            settings, msg = settings_loader.load_settings()
 | 
						
						
						
						
							 | 
							
							            self.assertTrue(msg.startswith('merge the default settings'))
 | 
						
						
						
						
							 | 
							
							            self.assertEqual(settings['server']['secret_key'], "user_secret_key")
 | 
						
						
						
						
							 | 
							
							            self.assertEqual(settings['server']['default_http_headers']['Custom-Header'], "Custom-Value")
 | 
						
						
						
						
							 | 
							
							            engine_names = [engine['name'] for engine in settings['engines']]
 | 
						
						
						
						
							 | 
							
							            self.assertNotIn('wikinews', engine_names)
 | 
						
						
						
						
							 | 
							
							            self.assertNotIn('wikibooks', engine_names)
 | 
						
						
						
						
							 | 
							
							            self.assertIn('wikipedia', engine_names)
 | 
						
						
						
						
							 | 
							
							            wikipedia = list(filter(lambda engine: (engine.get('name')) == 'wikipedia', settings['engines']))
 | 
						
						
						
						
							 | 
							
							            self.assertEqual(wikipedia[0]['engine'], 'wikipedia')
 | 
						
						
						
						
							 | 
							
							            self.assertEqual(wikipedia[0]['tokens'], ['secret_token'])
 | 
						
						
						
						
							 | 
							
							            newengine = list(filter(lambda engine: (engine.get('name')) == 'newengine', settings['engines']))
 | 
						
						
						
						
							 | 
							
							            self.assertEqual(newengine[0]['engine'], 'dummy')
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							    def test_user_settings_keep_only(self):
 | 
						
						
						
						
							 | 
							
							        with patch.dict(os.environ, {'SEARXNG_SETTINGS_PATH': _settings("user_settings_keep_only.yml")}):
 | 
						
						
						
						
							 | 
							
							            settings, msg = settings_loader.load_settings()
 | 
						
						
						
						
							 | 
							
							            self.assertTrue(msg.startswith('merge the default settings'))
 | 
						
						
						
						
							 | 
							
							            engine_names = [engine['name'] for engine in settings['engines']]
 | 
						
						
						
						
							 | 
							
							            self.assertEqual(engine_names, ['wikibooks', 'wikinews', 'wikipedia', 'newengine'])
 | 
						
						
						
						
							 | 
							
							            # wikipedia has been removed, then added again with the "engine" section of user_settings_keep_only.yml
 | 
						
						
						
						
							 | 
							
							            self.assertEqual(len(settings['engines'][2]), 1)
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							    def test_custom_settings(self):
 | 
						
						
						
						
							 | 
							
							        with patch.dict(os.environ, {'SEARXNG_SETTINGS_PATH': _settings("user_settings.yml")}):
 | 
						
						
						
						
							 | 
							
							            settings, msg = settings_loader.load_settings()
 | 
						
						
						
						
							 | 
							
							            self.assertTrue(msg.startswith('load the user settings from'))
 | 
						
						
						
						
							 | 
							
							            self.assertEqual(settings['server']['port'], 9000)
 | 
						
						
						
						
							 | 
							
							            self.assertEqual(settings['server']['secret_key'], "user_settings_secret")
 | 
						
						
						
						
							 | 
							
							            engine_names = [engine['name'] for engine in settings['engines']]
 | 
						
						
						
						
							 | 
							
							            self.assertEqual(engine_names, ['wikidata', 'wikibooks', 'wikinews', 'wikiquote'])
 |