mirror of
				https://github.com/searxng/searxng
				synced 2024-01-01 19:24:07 +01:00 
			
		
		
		
	[mod] move searx/testing.py to the tests directory
move robot tests to tests.robot manage calls "python -m tests.robot"
This commit is contained in:
		
							parent
							
								
									065b4dab56
								
							
						
					
					
						commit
						b9c73fb697
					
				
					 23 changed files with 161 additions and 157 deletions
				
			
		
							
								
								
									
										2
									
								
								manage
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								manage
									
										
									
									
									
								
							|  | @ -636,7 +636,7 @@ test.coverage() { | |||
| test.robot() { | ||||
|     build_msg TEST 'robot' | ||||
|     gecko.driver | ||||
|     PYTHONPATH=. pyenv.cmd python searx/testing.py robot | ||||
|     PYTHONPATH=. pyenv.cmd python -m tests.robot | ||||
|     dump_return $? | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,5 +1,47 @@ | |||
| import os | ||||
| 
 | ||||
| import aiounittest | ||||
| 
 | ||||
| os.environ['SEARX_DEBUG'] = '1' | ||||
| os.environ['SEARX_DISABLE_ETC_SETTINGS'] = '1' | ||||
| os.environ.pop('SEARX_SETTINGS_PATH', None) | ||||
| 
 | ||||
| 
 | ||||
| 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 | ||||
| 
 | ||||
|     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) | ||||
|  |  | |||
|  | @ -1,76 +0,0 @@ | |||
| # -*- coding: utf-8 -*- | ||||
| 
 | ||||
| from time import sleep | ||||
| 
 | ||||
| url = "http://localhost:11111/" | ||||
| 
 | ||||
| 
 | ||||
| def test_index(browser): | ||||
|     # Visit URL | ||||
|     browser.visit(url) | ||||
|     assert browser.is_text_present('about') | ||||
| 
 | ||||
| 
 | ||||
| def test_404(browser): | ||||
|     # Visit URL | ||||
|     browser.visit(url + 'missing_link') | ||||
|     assert browser.is_text_present('Page not found') | ||||
| 
 | ||||
| 
 | ||||
| def test_about(browser): | ||||
|     browser.visit(url) | ||||
|     browser.click_link_by_text('about') | ||||
|     assert browser.is_text_present('Why use it?') | ||||
| 
 | ||||
| 
 | ||||
| def test_preferences(browser): | ||||
|     browser.visit(url) | ||||
|     browser.click_link_by_text('preferences') | ||||
|     assert browser.is_text_present('Preferences') | ||||
|     assert browser.is_text_present('Cookies') | ||||
| 
 | ||||
|     assert browser.is_element_present_by_xpath('//label[@for="checkbox_dummy"]') | ||||
| 
 | ||||
| 
 | ||||
| def test_preferences_engine_select(browser): | ||||
|     browser.visit(url) | ||||
|     browser.click_link_by_text('preferences') | ||||
| 
 | ||||
|     assert browser.is_element_present_by_xpath('//a[@href="#tab_engine"]') | ||||
|     browser.find_by_xpath('//a[@href="#tab_engine"]').first.click() | ||||
| 
 | ||||
|     assert not browser.find_by_xpath('//input[@id="engine_general_dummy__general"]').first.checked | ||||
|     browser.find_by_xpath('//label[@for="engine_general_dummy__general"]').first.check() | ||||
|     browser.find_by_xpath('//input[@value="save"]').first.click() | ||||
| 
 | ||||
|     # waiting for the redirect - without this the test is flaky.. | ||||
|     sleep(1) | ||||
| 
 | ||||
|     browser.visit(url) | ||||
|     browser.click_link_by_text('preferences') | ||||
|     browser.find_by_xpath('//a[@href="#tab_engine"]').first.click() | ||||
| 
 | ||||
|     assert browser.find_by_xpath('//input[@id="engine_general_dummy__general"]').first.checked | ||||
| 
 | ||||
| 
 | ||||
| def test_preferences_locale(browser): | ||||
|     browser.visit(url) | ||||
|     browser.click_link_by_text('preferences') | ||||
| 
 | ||||
|     browser.find_by_xpath('//a[@href="#tab_ui"]').first.click() | ||||
|     browser.select('locale', 'hu') | ||||
|     browser.find_by_xpath('//input[@value="save"]').first.click() | ||||
| 
 | ||||
|     # waiting for the redirect - without this the test is flaky.. | ||||
|     sleep(1) | ||||
| 
 | ||||
|     browser.visit(url) | ||||
|     browser.click_link_by_text('beállítások') | ||||
|     browser.is_text_present('Beállítások') | ||||
| 
 | ||||
| 
 | ||||
| def test_search(browser): | ||||
|     browser.visit(url) | ||||
|     browser.fill('q', 'test search query') | ||||
|     browser.find_by_xpath('//button[@type="submit"]').first.click() | ||||
|     assert browser.is_text_present('didn\'t find any results') | ||||
|  | @ -1,40 +1,19 @@ | |||
| # -*- coding: utf-8 -*- | ||||
| # SPDX-License-Identifier: AGPL-3.0-or-later | ||||
| # lint: pylint | ||||
| """Shared testing code.""" | ||||
| 
 | ||||
| # pylint: disable=missing-function-docstring | ||||
| 
 | ||||
| import sys | ||||
| import os | ||||
| import subprocess | ||||
| import traceback | ||||
| 
 | ||||
| from os.path import dirname, join, abspath, realpath | ||||
| import pathlib | ||||
| 
 | ||||
| from splinter import Browser | ||||
| import aiounittest | ||||
| 
 | ||||
| 
 | ||||
| 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 | ||||
| import tests as searx_tests | ||||
| from tests.robot import test_webapp | ||||
| 
 | ||||
| 
 | ||||
| class SearxRobotLayer(): | ||||
|  | @ -43,8 +22,10 @@ class SearxRobotLayer(): | |||
|     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 = join(abspath(dirname(realpath(__file__))), 'webapp.py') | ||||
|         webapp = str(tests_path.parent / 'searx' / 'webapp.py') | ||||
|         exe = 'python' | ||||
| 
 | ||||
|         # The Flask app is started by Flask.run(...), don't enable Flask's debug | ||||
|  | @ -57,8 +38,7 @@ class SearxRobotLayer(): | |||
|         os.environ['SEARX_DEBUG'] = '0' | ||||
| 
 | ||||
|         # set robot settings path | ||||
|         os.environ['SEARX_SETTINGS_PATH'] = abspath( | ||||
|             dirname(__file__) + '/settings_robot.yml') | ||||
|         os.environ['SEARX_SETTINGS_PATH'] = str(tests_path / 'robot' / 'settings_robot.yml') | ||||
| 
 | ||||
|         # run the server | ||||
|         self.server = subprocess.Popen(  # pylint: disable=consider-using-with | ||||
|  | @ -75,7 +55,6 @@ class SearxRobotLayer(): | |||
|         del os.environ['SEARX_SETTINGS_PATH'] | ||||
| 
 | ||||
| 
 | ||||
| # SEARXROBOTLAYER = SearxRobotLayer() | ||||
| def run_robot_tests(tests): | ||||
|     print('Running {0} tests'.format(len(tests))) | ||||
|     for test in tests: | ||||
|  | @ -83,38 +62,17 @@ def run_robot_tests(tests): | |||
|             test(browser) | ||||
| 
 | ||||
| 
 | ||||
| class SearxTestCase(aiounittest.AsyncTestCase): | ||||
|     """Base test case for non-robot tests.""" | ||||
| 
 | ||||
|     layer = SearxTestLayer | ||||
| 
 | ||||
|     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 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 occured: {0}'.format(traceback.format_exc())) | ||||
|         sys.exit(1) | ||||
|     finally: | ||||
|         test_layer.tearDown() | ||||
| 
 | ||||
| 
 | ||||
| if __name__ == '__main__': | ||||
|     import sys | ||||
|     # test cases | ||||
|     from tests import robot | ||||
| 
 | ||||
|     base_dir = abspath(join(dirname(__file__), '../tests')) | ||||
|     if sys.argv[1] == 'robot': | ||||
|         test_layer = SearxRobotLayer() | ||||
|         errors = False | ||||
|         try: | ||||
|             test_layer.setUp() | ||||
|             run_robot_tests([getattr(robot, x) for x in dir(robot) if x.startswith('test_')]) | ||||
|         except Exception:  # pylint: disable=broad-except | ||||
|             errors = True | ||||
|             print('Error occured: {0}'.format(traceback.format_exc())) | ||||
|         test_layer.tearDown() | ||||
|         sys.exit(1 if errors else 0) | ||||
|     main() | ||||
							
								
								
									
										78
									
								
								tests/robot/test_webapp.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								tests/robot/test_webapp.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,78 @@ | |||
| # SPDX-License-Identifier: AGPL-3.0-or-later | ||||
| # lint: pylint | ||||
| # pylint: disable=missing-module-docstring,missing-function-docstring | ||||
| 
 | ||||
| from time import sleep | ||||
| 
 | ||||
| url = "http://localhost:11111/" | ||||
| 
 | ||||
| 
 | ||||
| def test_index(browser): | ||||
|     # Visit URL | ||||
|     browser.visit(url) | ||||
|     assert browser.is_text_present('about') | ||||
| 
 | ||||
| 
 | ||||
| def test_404(browser): | ||||
|     # Visit URL | ||||
|     browser.visit(url + 'missing_link') | ||||
|     assert browser.is_text_present('Page not found') | ||||
| 
 | ||||
| 
 | ||||
| def test_about(browser): | ||||
|     browser.visit(url) | ||||
|     browser.click_link_by_text('about') | ||||
|     assert browser.is_text_present('Why use it?') | ||||
| 
 | ||||
| 
 | ||||
| def test_preferences(browser): | ||||
|     browser.visit(url) | ||||
|     browser.click_link_by_text('preferences') | ||||
|     assert browser.is_text_present('Preferences') | ||||
|     assert browser.is_text_present('Cookies') | ||||
| 
 | ||||
|     assert browser.is_element_present_by_xpath('//label[@for="checkbox_dummy"]') | ||||
| 
 | ||||
| 
 | ||||
| def test_preferences_engine_select(browser): | ||||
|     browser.visit(url) | ||||
|     browser.click_link_by_text('preferences') | ||||
| 
 | ||||
|     assert browser.is_element_present_by_xpath('//a[@href="#tab_engine"]') | ||||
|     browser.find_by_xpath('//a[@href="#tab_engine"]').first.click() | ||||
| 
 | ||||
|     assert not browser.find_by_xpath('//input[@id="engine_general_dummy__general"]').first.checked | ||||
|     browser.find_by_xpath('//label[@for="engine_general_dummy__general"]').first.check() | ||||
|     browser.find_by_xpath('//input[@value="save"]').first.click() | ||||
| 
 | ||||
|     # waiting for the redirect - without this the test is flaky.. | ||||
|     sleep(1) | ||||
| 
 | ||||
|     browser.visit(url) | ||||
|     browser.click_link_by_text('preferences') | ||||
|     browser.find_by_xpath('//a[@href="#tab_engine"]').first.click() | ||||
| 
 | ||||
|     assert browser.find_by_xpath('//input[@id="engine_general_dummy__general"]').first.checked | ||||
| 
 | ||||
| 
 | ||||
| def test_preferences_locale(browser): | ||||
|     browser.visit(url) | ||||
|     browser.click_link_by_text('preferences') | ||||
| 
 | ||||
|     browser.find_by_xpath('//a[@href="#tab_ui"]').first.click() | ||||
|     browser.select('locale', 'hu') | ||||
|     browser.find_by_xpath('//input[@value="save"]').first.click() | ||||
| 
 | ||||
|     # waiting for the redirect - without this the test is flaky.. | ||||
|     sleep(1) | ||||
| 
 | ||||
|     browser.visit(url) | ||||
|     browser.click_link_by_text('beállítások') | ||||
|     browser.is_text_present('Beállítások') | ||||
| 
 | ||||
| 
 | ||||
| def test_search(browser): | ||||
|     browser.visit(url) | ||||
|     browser.fill('q', 'test search query') | ||||
|     browser.find_by_xpath('//button[@type="submit"]').first.click() | ||||
|     assert browser.is_text_present('didn\'t find any results') | ||||
|  | @ -16,7 +16,7 @@ along with searx. If not, see < http://www.gnu.org/licenses/ >. | |||
| 
 | ||||
| 
 | ||||
| from searx.engines import command as command_engine | ||||
| from searx.testing import SearxTestCase | ||||
| from tests import SearxTestCase | ||||
| 
 | ||||
| 
 | ||||
| class TestCommandEngine(SearxTestCase): | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ | |||
| from collections import defaultdict | ||||
| import mock | ||||
| from searx.engines import xpath | ||||
| from searx.testing import SearxTestCase | ||||
| from tests import SearxTestCase | ||||
| 
 | ||||
| 
 | ||||
| class TestXpathEngine(SearxTestCase): | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ from mock import patch | |||
| import httpx | ||||
| 
 | ||||
| from searx.network.network import Network, NETWORKS, initialize | ||||
| from searx.testing import SearxTestCase | ||||
| from tests import SearxTestCase | ||||
| 
 | ||||
| 
 | ||||
| class TestNetwork(SearxTestCase): | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ | |||
| from mock import Mock | ||||
| 
 | ||||
| from searx.answerers import answerers | ||||
| from searx.testing import SearxTestCase | ||||
| from tests import SearxTestCase | ||||
| 
 | ||||
| 
 | ||||
| class AnswererTest(SearxTestCase): | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| from searx.testing import SearxTestCase | ||||
| from searx import settings, engines | ||||
| from tests import SearxTestCase | ||||
| 
 | ||||
| 
 | ||||
| class TestEnginesInit(SearxTestCase): | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| from searx.external_bang import get_node, resolve_bang_definition, get_bang_url, get_bang_definition_and_autocomplete | ||||
| from searx.search import SearchQuery, EngineRef | ||||
| from searx.testing import SearxTestCase | ||||
| from tests import SearxTestCase | ||||
| 
 | ||||
| 
 | ||||
| TEST_DB = { | ||||
|  |  | |||
|  | @ -1,8 +1,8 @@ | |||
| # -*- coding: utf-8 -*- | ||||
| 
 | ||||
| from searx.testing import SearxTestCase | ||||
| from searx import plugins | ||||
| from mock import Mock | ||||
| from tests import SearxTestCase | ||||
| 
 | ||||
| 
 | ||||
| def get_search_mock(query, **kwargs): | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| from searx.preferences import (EnumStringSetting, MapSetting, MissingArgumentException, SearchLanguageSetting, | ||||
|                                MultipleChoiceSetting, PluginsSetting, ValidationException) | ||||
| from searx.testing import SearxTestCase | ||||
| from tests import SearxTestCase | ||||
| 
 | ||||
| 
 | ||||
| class PluginStub: | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| from searx import settings | ||||
| from searx.engines import load_engines | ||||
| from searx.query import RawTextQuery | ||||
| from searx.testing import SearxTestCase | ||||
| from tests import SearxTestCase | ||||
| 
 | ||||
| 
 | ||||
| TEST_ENGINES = [ | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| # -*- coding: utf-8 -*- | ||||
| 
 | ||||
| from searx.results import ResultContainer | ||||
| from searx.testing import SearxTestCase | ||||
| from tests import SearxTestCase | ||||
| 
 | ||||
| 
 | ||||
| def fake_result(url='https://aa.bb/cc?dd=ee#ff', | ||||
|  |  | |||
|  | @ -1,9 +1,9 @@ | |||
| # -*- coding: utf-8 -*- | ||||
| 
 | ||||
| from searx.testing import SearxTestCase | ||||
| import searx.search | ||||
| from searx.search import SearchQuery, EngineRef | ||||
| from searx import settings | ||||
| import searx.search | ||||
| from tests import SearxTestCase | ||||
| 
 | ||||
| 
 | ||||
| SAFESEARCH = 0 | ||||
|  |  | |||
|  | @ -3,9 +3,9 @@ | |||
| from os.path import dirname, join, abspath | ||||
| from unittest.mock import patch | ||||
| 
 | ||||
| from searx.testing import SearxTestCase | ||||
| from searx.exceptions import SearxSettingsException | ||||
| from searx import settings_loader | ||||
| from tests import SearxTestCase | ||||
| 
 | ||||
| 
 | ||||
| test_dir = abspath(dirname(__file__)) | ||||
|  |  | |||
|  | @ -8,8 +8,8 @@ from mock import Mock, patch | |||
| from nose2.tools import params | ||||
| 
 | ||||
| from searx.search import SearchQuery, EngineRef, initialize | ||||
| from searx.testing import SearxTestCase | ||||
| from searx_extra import standalone_searx as sas | ||||
| from tests import SearxTestCase | ||||
| 
 | ||||
| 
 | ||||
| class StandaloneSearx(SearxTestCase): | ||||
|  |  | |||
|  | @ -2,10 +2,11 @@ | |||
| import lxml.etree | ||||
| from lxml import html | ||||
| 
 | ||||
| from searx.testing import SearxTestCase | ||||
| from searx.exceptions import SearxXPathSyntaxException, SearxEngineXPathException | ||||
| from searx import utils | ||||
| 
 | ||||
| from tests import SearxTestCase | ||||
| 
 | ||||
| 
 | ||||
| class TestUtils(SearxTestCase): | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,12 +1,12 @@ | |||
| # -*- coding: utf-8 -*- | ||||
| 
 | ||||
| from searx.testing import SearxTestCase | ||||
| from searx.preferences import Preferences | ||||
| from searx.engines import engines | ||||
| 
 | ||||
| import searx.search | ||||
| from searx.search import EngineRef | ||||
| from searx.webadapter import validate_engineref_list | ||||
| from tests import SearxTestCase | ||||
| 
 | ||||
| 
 | ||||
| PRIVATE_ENGINE_NAME = 'general private offline' | ||||
|  |  | |||
|  | @ -3,9 +3,10 @@ | |||
| import json | ||||
| from urllib.parse import ParseResult | ||||
| from mock import Mock | ||||
| from searx.testing import SearxTestCase | ||||
| from searx.search import Search | ||||
| 
 | ||||
| import searx.search.processors | ||||
| from searx.search import Search | ||||
| from tests import SearxTestCase | ||||
| 
 | ||||
| 
 | ||||
| class ViewsTestCase(SearxTestCase): | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| # -*- coding: utf-8 -*- | ||||
| import mock | ||||
| from searx.testing import SearxTestCase | ||||
| from searx import webutils | ||||
| from tests import SearxTestCase | ||||
| 
 | ||||
| 
 | ||||
| class TestWebUtils(SearxTestCase): | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Alexandre Flament
						Alexandre Flament