diff options
Diffstat (limited to 'searx/testing.py')
| -rw-r--r-- | searx/testing.py | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/searx/testing.py b/searx/testing.py new file mode 100644 index 000000000..a3616dc12 --- /dev/null +++ b/searx/testing.py @@ -0,0 +1,112 @@ +# -*- coding: utf-8 -*- +"""Shared testing code.""" + + +import os +import subprocess +import traceback + +from os.path import dirname, join, abspath + +from splinter import Browser +from unittest2 import TestCase + + +class SearxTestLayer: + """Base layer for non-robot tests.""" + + __name__ = u'SearxTestLayer' + + def setUp(cls): + pass + setUp = classmethod(setUp) + + def tearDown(cls): + pass + tearDown = classmethod(tearDown) + + def testSetUp(cls): + pass + testSetUp = classmethod(testSetUp) + + def testTearDown(cls): + pass + testTearDown = classmethod(testTearDown) + + +class SearxRobotLayer(): + """Searx Robot Test Layer""" + + def setUp(self): + os.setpgrp() # create new process group, become its leader + + # get program paths + webapp = os.path.join( + os.path.abspath(os.path.dirname(os.path.realpath(__file__))), + 'webapp.py' + ) + exe = 'python' + + # set robot settings path + os.environ['SEARX_DEBUG'] = '1' + os.environ['SEARX_SETTINGS_PATH'] = abspath( + dirname(__file__) + '/settings_robot.yml') + + # run the server + self.server = subprocess.Popen( + [exe, webapp], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT + ) + if hasattr(self.server.stdout, 'read1'): + print(self.server.stdout.read1(1024).decode('utf-8')) + + def tearDown(self): + os.kill(self.server.pid, 9) + # remove previously set environment variable + del os.environ['SEARX_SETTINGS_PATH'] + + +# SEARXROBOTLAYER = SearxRobotLayer() +def run_robot_tests(tests): + print('Running {0} tests'.format(len(tests))) + for test in tests: + with Browser('firefox', headless=True) as browser: + test(browser) + + +class SearxTestCase(TestCase): + """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) + + +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: + errors = True + print('Error occured: {0}'.format(traceback.format_exc())) + test_layer.tearDown() + sys.exit(1 if errors else 0) |