# SPDX-License-Identifier: AGPL-3.0-or-later # pylint: disable=missing-module-docstring,disable=missing-class-docstring,invalid-name import pathlib import os import aiounittest # Before import from the searx package, we need to set up the (debug) # environment. The import of the searx package initialize the searx.settings # and this in turn takes the defaults from the environment! os.environ.pop('SEARXNG_SETTINGS_PATH', None) os.environ['SEARXNG_DEBUG'] = '1' os.environ['SEARXNG_DEBUG_LOG_LEVEL'] = 'WARNING' os.environ['SEARXNG_DISABLE_ETC_SETTINGS'] = '1' class SearxTestLayer: """Base layer for non-robot tests.""" __name__ = 'SearxTestLayer' @classmethod def setUp(cls): pass @classmethod def tearDown(cls): pass @classmethod def testSetUp(cls): pass @classmethod def testTearDown(cls): pass class SearxTestCase(aiounittest.AsyncTestCase): """Base test case for non-robot tests.""" layer = SearxTestLayer SETTINGS_FOLDER = pathlib.Path(__file__).parent / "unit" / "settings" TEST_SETTINGS = "test_settings.yml" def setUp(self): self.init_test_settings() def setattr4test(self, obj, attr, value): """setattr(obj, attr, value) but reset to the previous value in the cleanup.""" previous_value = getattr(obj, attr) def cleanup_patch(): setattr(obj, attr, previous_value) self.addCleanup(cleanup_patch) setattr(obj, attr, value) def init_test_settings(self): """Sets ``SEARXNG_SETTINGS_PATH`` environment variable an initialize global ``settings`` variable and the ``logger`` from a test config in :origin:`tests/unit/settings/`. """ os.environ['SEARXNG_SETTINGS_PATH'] = str(self.SETTINGS_FOLDER / self.TEST_SETTINGS) # pylint: disable=import-outside-toplevel import searx import searx.locales import searx.plugins import searx.search import searx.webapp # https://flask.palletsprojects.com/en/stable/config/#builtin-configuration-values # searx.webapp.app.config["DEBUG"] = True searx.webapp.app.config["TESTING"] = True # to get better error messages searx.webapp.app.config["EXPLAIN_TEMPLATE_LOADING"] = True searx.init_settings() searx.plugins.initialize(searx.webapp.app) # searx.search.initialize will: # - load the engines and # - initialize searx.network, searx.metrics, searx.processors and searx.search.checker searx.search.initialize( enable_checker=True, check_network=True, enable_metrics=searx.get_setting("general.enable_metrics"), # type: ignore ) # pylint: disable=attribute-defined-outside-init self.app = searx.webapp.app self.client = searx.webapp.app.test_client()