@@ -0,0 +1,122 @@
1+# SPDX-License-Identifier: AGPL-3.0-or-later
2+
3+from os.path import dirname, join, abspath
4+from unittest.mock import patch
5+
6+from searx.testing import SearxTestCase
7+from searx.exceptions import SearxSettingsException
8+from searx import settings_loader
9+
10+
11+test_dir = abspath(dirname(__file__))
12+
13+
14+class TestLoad(SearxTestCase):
15+
16+ def test_load_zero(self):
17+ with self.assertRaises(SearxSettingsException):
18+ settings_loader.load_yaml('/dev/zero')
19+
20+ with self.assertRaises(SearxSettingsException):
21+ settings_loader.load_yaml(join(test_dir, '/settings/syntaxerror_settings.yml'))
22+
23+ with self.assertRaises(SearxSettingsException):
24+ settings_loader.load_yaml(join(test_dir, '/settings/empty_settings.yml'))
25+
26+ def test_check_settings_yml(self):
27+ self.assertIsNone(settings_loader.check_settings_yml('/dev/zero'))
28+
29+ bad_settings_path = join(test_dir, 'settings/syntaxerror_settings.yml')
30+ self.assertEqual(settings_loader.check_settings_yml(bad_settings_path), bad_settings_path)
31+
32+
33+class TestDefaultSettings(SearxTestCase):
34+
35+ def test_load(self):
36+ settings, msg = settings_loader.load_settings(load_user_setttings=False)
37+ self.assertTrue(msg.startswith('load the default settings from'))
38+ self.assertFalse(settings['general']['debug'])
39+ self.assertTrue(isinstance(settings['general']['instance_name'], str))
40+ self.assertEqual(settings['server']['secret_key'], "ultrasecretkey")
41+ self.assertTrue(isinstance(settings['server']['port'], int))
42+ self.assertTrue(isinstance(settings['server']['bind_address'], str))
43+ self.assertTrue(isinstance(settings['engines'], list))
44+ self.assertTrue(isinstance(settings['locales'], dict))
45+ self.assertTrue(isinstance(settings['doi_resolvers'], dict))
46+ self.assertTrue(isinstance(settings['default_doi_resolver'], str))
47+
48+
49+class TestUserSettings(SearxTestCase):
50+
51+ def test_is_use_default_settings(self):
52+ self.assertFalse(settings_loader.is_use_default_settings({}))
53+ self.assertTrue(settings_loader.is_use_default_settings({'use_default_settings': True}))
54+ self.assertTrue(settings_loader.is_use_default_settings({'use_default_settings': {}}))
55+ with self.assertRaises(ValueError):
56+ self.assertFalse(settings_loader.is_use_default_settings({'use_default_settings': 1}))
57+ with self.assertRaises(ValueError):
58+ self.assertFalse(settings_loader.is_use_default_settings({'use_default_settings': 0}))
59+
60+ def test_user_settings_not_found(self):
61+ with patch.dict(settings_loader.environ,
62+ {'SEARX_SETTINGS_PATH': '/dev/null'}):
63+ settings, msg = settings_loader.load_settings()
64+ self.assertTrue(msg.startswith('load the default settings from'))
65+ self.assertEqual(settings['server']['secret_key'], "ultrasecretkey")
66+
67+ def test_user_settings(self):
68+ with patch.dict(settings_loader.environ,
69+ {'SEARX_SETTINGS_PATH': join(test_dir, 'settings/user_settings_simple.yml')}):
70+ settings, msg = settings_loader.load_settings()
71+ self.assertTrue(msg.startswith('merge the default settings'))
72+ self.assertEqual(settings['server']['secret_key'], "user_secret_key")
73+ self.assertEqual(settings['server']['default_http_headers']['Custom-Header'], "Custom-Value")
74+
75+ def test_user_settings_remove(self):
76+ with patch.dict(settings_loader.environ,
77+ {'SEARX_SETTINGS_PATH': join(test_dir, 'settings/user_settings_remove.yml')}):
78+ settings, msg = settings_loader.load_settings()
79+ self.assertTrue(msg.startswith('merge the default settings'))
80+ self.assertEqual(settings['server']['secret_key'], "user_secret_key")
81+ self.assertEqual(settings['server']['default_http_headers']['Custom-Header'], "Custom-Value")
82+ engine_names = [engine['name'] for engine in settings['engines']]
83+ self.assertNotIn('wikinews', engine_names)
84+ self.assertNotIn('wikibooks', engine_names)
85+ self.assertIn('wikipedia', engine_names)
86+
87+ def test_user_settings_remove2(self):
88+ with patch.dict(settings_loader.environ,
89+ {'SEARX_SETTINGS_PATH': join(test_dir, 'settings/user_settings_remove2.yml')}):
90+ settings, msg = settings_loader.load_settings()
91+ self.assertTrue(msg.startswith('merge the default settings'))
92+ self.assertEqual(settings['server']['secret_key'], "user_secret_key")
93+ self.assertEqual(settings['server']['default_http_headers']['Custom-Header'], "Custom-Value")
94+ engine_names = [engine['name'] for engine in settings['engines']]
95+ self.assertNotIn('wikinews', engine_names)
96+ self.assertNotIn('wikibooks', engine_names)
97+ self.assertIn('wikipedia', engine_names)
98+ wikipedia = list(filter(lambda engine: (engine.get('name')) == 'wikipedia', settings['engines']))
99+ self.assertEqual(wikipedia[0]['engine'], 'wikipedia')
100+ self.assertEqual(wikipedia[0]['tokens'], ['secret_token'])
101+ newengine = list(filter(lambda engine: (engine.get('name')) == 'newengine', settings['engines']))
102+ self.assertEqual(newengine[0]['engine'], 'dummy')
103+
104+ def test_user_settings_keep_only(self):
105+ with patch.dict(settings_loader.environ,
106+ {'SEARX_SETTINGS_PATH': join(test_dir, 'settings/user_settings_keep_only.yml')}):
107+ settings, msg = settings_loader.load_settings()
108+ self.assertTrue(msg.startswith('merge the default settings'))
109+ engine_names = [engine['name'] for engine in settings['engines']]
110+ self.assertEqual(engine_names, ['wikibooks', 'wikinews', 'wikipedia', 'newengine'])
111+ # wikipedia has been removed, then added again with the "engine" section of user_settings_keep_only.yml
112+ self.assertEqual(len(settings['engines'][2]), 1)
113+
114+ def test_custom_settings(self):
115+ with patch.dict(settings_loader.environ,
116+ {'SEARX_SETTINGS_PATH': join(test_dir, 'settings/user_settings.yml')}):
117+ settings, msg = settings_loader.load_settings()
118+ self.assertTrue(msg.startswith('load the user settings from'))
119+ self.assertEqual(settings['server']['port'], 9000)
120+ self.assertEqual(settings['server']['secret_key'], "user_settings_secret")
121+ engine_names = [engine['name'] for engine in settings['engines']]
122+ self.assertEqual(engine_names, ['wikidata', 'wikibooks', 'wikinews', 'wikiquote'])