test_settings_loader.py 6.6 KB

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