test_settings_loader.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. # SPDX-License-Identifier: AGPL-3.0-or-later
  2. # pylint: disable=missing-module-docstring
  3. from pathlib import Path
  4. import os
  5. from unittest.mock import patch
  6. from searx.exceptions import SearxSettingsException
  7. from searx import settings_loader
  8. from tests import SearxTestCase
  9. def _settings(f_name):
  10. return str(Path(__file__).parent.absolute() / "settings" / f_name)
  11. class TestLoad(SearxTestCase): # pylint: disable=missing-class-docstring
  12. def test_load_zero(self):
  13. with self.assertRaises(SearxSettingsException):
  14. settings_loader.load_yaml('/dev/zero')
  15. with self.assertRaises(SearxSettingsException):
  16. settings_loader.load_yaml(_settings("syntaxerror_settings.yml"))
  17. self.assertEqual(settings_loader.load_yaml(_settings("empty_settings.yml")), {})
  18. class TestDefaultSettings(SearxTestCase): # pylint: disable=missing-class-docstring
  19. def test_load(self):
  20. settings, msg = settings_loader.load_settings(load_user_settings=False)
  21. self.assertTrue(msg.startswith('load the default settings from'))
  22. self.assertFalse(settings['general']['debug'])
  23. self.assertTrue(isinstance(settings['general']['instance_name'], str))
  24. self.assertEqual(settings['server']['secret_key'], "ultrasecretkey")
  25. self.assertTrue(isinstance(settings['server']['port'], int))
  26. self.assertTrue(isinstance(settings['server']['bind_address'], str))
  27. self.assertTrue(isinstance(settings['engines'], list))
  28. self.assertTrue(isinstance(settings['doi_resolvers'], dict))
  29. self.assertTrue(isinstance(settings['default_doi_resolver'], str))
  30. class TestUserSettings(SearxTestCase): # pylint: disable=missing-class-docstring
  31. def test_is_use_default_settings(self):
  32. self.assertFalse(settings_loader.is_use_default_settings({}))
  33. self.assertTrue(settings_loader.is_use_default_settings({'use_default_settings': True}))
  34. self.assertTrue(settings_loader.is_use_default_settings({'use_default_settings': {}}))
  35. with self.assertRaises(ValueError):
  36. self.assertFalse(settings_loader.is_use_default_settings({'use_default_settings': 1}))
  37. with self.assertRaises(ValueError):
  38. self.assertFalse(settings_loader.is_use_default_settings({'use_default_settings': 0}))
  39. def test_user_settings_not_found(self):
  40. with patch.dict(os.environ, {'SEARXNG_SETTINGS_PATH': _settings("not_exists.yml")}):
  41. with self.assertRaises(EnvironmentError):
  42. _s, _m = settings_loader.load_settings()
  43. with patch.dict(os.environ, {'SEARXNG_SETTINGS_PATH': "/folder/not/exists"}):
  44. with self.assertRaises(EnvironmentError):
  45. _s, _m = settings_loader.load_settings()
  46. def test_user_settings(self):
  47. with patch.dict(os.environ, {'SEARXNG_SETTINGS_PATH': _settings("user_settings_simple.yml")}):
  48. settings, msg = settings_loader.load_settings()
  49. self.assertTrue(msg.startswith('merge the default settings'))
  50. self.assertEqual(settings['server']['secret_key'], "user_secret_key")
  51. self.assertEqual(settings['server']['default_http_headers']['Custom-Header'], "Custom-Value")
  52. def test_user_settings_remove(self):
  53. with patch.dict(os.environ, {'SEARXNG_SETTINGS_PATH': _settings("user_settings_remove.yml")}):
  54. settings, msg = settings_loader.load_settings()
  55. self.assertTrue(msg.startswith('merge the default settings'))
  56. self.assertEqual(settings['server']['secret_key'], "user_secret_key")
  57. self.assertEqual(settings['server']['default_http_headers']['Custom-Header'], "Custom-Value")
  58. engine_names = [engine['name'] for engine in settings['engines']]
  59. self.assertNotIn('wikinews', engine_names)
  60. self.assertNotIn('wikibooks', engine_names)
  61. self.assertIn('wikipedia', engine_names)
  62. def test_user_settings_remove2(self):
  63. with patch.dict(os.environ, {'SEARXNG_SETTINGS_PATH': _settings("user_settings_remove2.yml")}):
  64. settings, msg = settings_loader.load_settings()
  65. self.assertTrue(msg.startswith('merge the default settings'))
  66. self.assertEqual(settings['server']['secret_key'], "user_secret_key")
  67. self.assertEqual(settings['server']['default_http_headers']['Custom-Header'], "Custom-Value")
  68. engine_names = [engine['name'] for engine in settings['engines']]
  69. self.assertNotIn('wikinews', engine_names)
  70. self.assertNotIn('wikibooks', engine_names)
  71. self.assertIn('wikipedia', engine_names)
  72. wikipedia = list(filter(lambda engine: (engine.get('name')) == 'wikipedia', settings['engines']))
  73. self.assertEqual(wikipedia[0]['engine'], 'wikipedia')
  74. self.assertEqual(wikipedia[0]['tokens'], ['secret_token'])
  75. newengine = list(filter(lambda engine: (engine.get('name')) == 'newengine', settings['engines']))
  76. self.assertEqual(newengine[0]['engine'], 'dummy')
  77. def test_user_settings_keep_only(self):
  78. with patch.dict(os.environ, {'SEARXNG_SETTINGS_PATH': _settings("user_settings_keep_only.yml")}):
  79. settings, msg = settings_loader.load_settings()
  80. self.assertTrue(msg.startswith('merge the default settings'))
  81. engine_names = [engine['name'] for engine in settings['engines']]
  82. self.assertEqual(engine_names, ['wikibooks', 'wikinews', 'wikipedia', 'newengine'])
  83. # wikipedia has been removed, then added again with the "engine" section of user_settings_keep_only.yml
  84. self.assertEqual(len(settings['engines'][2]), 1)
  85. def test_custom_settings(self):
  86. with patch.dict(os.environ, {'SEARXNG_SETTINGS_PATH': _settings("user_settings.yml")}):
  87. settings, msg = settings_loader.load_settings()
  88. self.assertTrue(msg.startswith('load the user settings from'))
  89. self.assertEqual(settings['server']['port'], 9000)
  90. self.assertEqual(settings['server']['secret_key'], "user_settings_secret")
  91. engine_names = [engine['name'] for engine in settings['engines']]
  92. self.assertEqual(engine_names, ['wikidata', 'wikibooks', 'wikinews', 'wikiquote'])