forked from Ponysearch/Ponysearch
44a06190bb
- for tests which perform the same arrange/act/assert pattern but with different data, the data portion has been moved to the ``paramaterized.expand`` fields - for monolithic tests which performed multiple arrange/act/asserts, they have been broken up into different unit tests. - when possible, change generic assert statements to more concise asserts (i.e. ``assertIsNone``) This work ultimately is focused on creating smaller and more concise tests. While paramaterized may make adding new configurations for existing tests easier, that is just a beneficial side effect. The main benefit is that smaller tests are easier to reason about, meaning they are easier to debug when they start failing. This improves the developer experience in debugging what went wrong when refactoring the project. Total number of tests went from 192 -> 259; or, broke apart larger tests into 69 more concise ones.
116 lines
6.1 KiB
Python
116 lines
6.1 KiB
Python
# 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'])
|