
A local development server can be launched by one of these command lines:: $ flask --app searx.webapp run $ python -m searx.webapp The different ways of starting the server should lead to the same result, which is generally the case. However, if the modules are reloaded after code changes (reload option), it must be avoided that the application is initialized twice at startup. We have already discussed this in 2022 [1][2]. Further information on this topic can be found in [3][4][5]. To test a bash in the ./local environment was started and the follwing commands had been executed:: $ ./manage pyenv.cmd bash --norc --noprofile (py3) SEARXNG_DEBUG=1 flask --app searx.webapp run --reload (py3) SEARXNG_DEBUG=1 python -m searx.webapp Since the generic parts of the docs also initialize the app to generate doc from it, the build of the docs was also tested:: $ make docs.clean docs.live [1] https://github.com/searxng/searxng/pull/1656#issuecomment-1214198941 [2] https://github.com/searxng/searxng/pull/1616#issuecomment-1206137468 [3] https://flask.palletsprojects.com/en/stable/api/#flask.Flask.run [4] https://github.com/pallets/flask/issues/5307#issuecomment-1774646119 [5] https://stackoverflow.com/a/25504196 Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
70 lines
2.0 KiB
Python
70 lines
2.0 KiB
Python
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
# pylint: disable=missing-module-docstring,disable=missing-class-docstring,invalid-name
|
|
"""Shared testing code."""
|
|
|
|
import sys
|
|
import os
|
|
import subprocess
|
|
import traceback
|
|
import pathlib
|
|
import shutil
|
|
|
|
from splinter import Browser
|
|
|
|
import tests as searx_tests
|
|
from tests.robot import test_webapp
|
|
|
|
|
|
class SearxRobotLayer:
|
|
"""Searx Robot Test Layer"""
|
|
|
|
def setUp(self):
|
|
os.setpgrp() # create new process group, become its leader
|
|
|
|
tests_path = pathlib.Path(searx_tests.__file__).resolve().parent
|
|
|
|
# get program paths
|
|
webapp = str(tests_path.parent / 'searx' / 'webapp.py')
|
|
exe = 'python'
|
|
|
|
# set robot settings path
|
|
os.environ['SEARXNG_SETTINGS_PATH'] = str(tests_path / 'robot' / 'settings_robot.yml')
|
|
|
|
# run the server
|
|
self.server = subprocess.Popen( # pylint: disable=consider-using-with
|
|
[exe, webapp], stdout=subprocess.PIPE, stderr=subprocess.STDOUT
|
|
)
|
|
if hasattr(self.server.stdout, 'read1'):
|
|
print(self.server.stdout.read1(1024).decode())
|
|
|
|
def tearDown(self):
|
|
os.kill(self.server.pid, 9)
|
|
# remove previously set environment variable
|
|
del os.environ['SEARXNG_SETTINGS_PATH']
|
|
|
|
|
|
def run_robot_tests(tests):
|
|
print('Running {0} tests'.format(len(tests)))
|
|
print(f'{shutil.which("geckodriver")}')
|
|
print(f'{shutil.which("firefox")}')
|
|
|
|
for test in tests:
|
|
with Browser('firefox', headless=True, profile_preferences={'intl.accept_languages': 'en'}) as browser:
|
|
test(browser)
|
|
|
|
|
|
def main():
|
|
test_layer = SearxRobotLayer()
|
|
try:
|
|
test_layer.setUp()
|
|
run_robot_tests([getattr(test_webapp, x) for x in dir(test_webapp) if x.startswith('test_')])
|
|
except Exception: # pylint: disable=broad-except
|
|
print('Error occurred: {0}'.format(traceback.format_exc()))
|
|
sys.exit(1)
|
|
finally:
|
|
test_layer.tearDown()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|