testing.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. # -*- coding: utf-8 -*-
  2. # SPDX-License-Identifier: AGPL-3.0-or-later
  3. """Shared testing code."""
  4. # pylint: disable=missing-function-docstring
  5. import os
  6. import subprocess
  7. import traceback
  8. from os.path import dirname, join, abspath, realpath
  9. from splinter import Browser
  10. from unittest2 import TestCase
  11. class SearxTestLayer:
  12. """Base layer for non-robot tests."""
  13. __name__ = u'SearxTestLayer'
  14. @classmethod
  15. def setUp(cls):
  16. pass
  17. @classmethod
  18. def tearDown(cls):
  19. pass
  20. @classmethod
  21. def testSetUp(cls):
  22. pass
  23. @classmethod
  24. def testTearDown(cls):
  25. pass
  26. class SearxRobotLayer():
  27. """Searx Robot Test Layer"""
  28. def setUp(self):
  29. os.setpgrp() # create new process group, become its leader
  30. # get program paths
  31. webapp = join(abspath(dirname(realpath(__file__))), 'webapp.py')
  32. exe = 'python'
  33. # set robot settings path
  34. os.environ['SEARX_DEBUG'] = '1'
  35. os.environ['SEARX_SETTINGS_PATH'] = abspath(
  36. dirname(__file__) + '/settings_robot.yml')
  37. # run the server
  38. self.server = subprocess.Popen(
  39. [exe, webapp],
  40. stdout=subprocess.PIPE,
  41. stderr=subprocess.STDOUT
  42. )
  43. if hasattr(self.server.stdout, 'read1'):
  44. print(self.server.stdout.read1(1024).decode('utf-8'))
  45. def tearDown(self):
  46. os.kill(self.server.pid, 9)
  47. # remove previously set environment variable
  48. del os.environ['SEARX_SETTINGS_PATH']
  49. # SEARXROBOTLAYER = SearxRobotLayer()
  50. def run_robot_tests(tests):
  51. print('Running {0} tests'.format(len(tests)))
  52. for test in tests:
  53. with Browser('firefox', headless=True) as browser:
  54. test(browser)
  55. class SearxTestCase(TestCase):
  56. """Base test case for non-robot tests."""
  57. layer = SearxTestLayer
  58. def setattr4test(self, obj, attr, value):
  59. """
  60. setattr(obj, attr, value)
  61. but reset to the previous value in the cleanup.
  62. """
  63. previous_value = getattr(obj, attr)
  64. def cleanup_patch():
  65. setattr(obj, attr, previous_value)
  66. self.addCleanup(cleanup_patch)
  67. setattr(obj, attr, value)
  68. if __name__ == '__main__':
  69. import sys
  70. # test cases
  71. from tests import robot
  72. base_dir = abspath(join(dirname(__file__), '../tests'))
  73. if sys.argv[1] == 'robot':
  74. test_layer = SearxRobotLayer()
  75. errors = False
  76. try:
  77. test_layer.setUp()
  78. run_robot_tests([getattr(robot, x) for x in dir(robot) if x.startswith('test_')])
  79. except Exception: # pylint: disable=broad-except
  80. errors = True
  81. print('Error occured: {0}'.format(traceback.format_exc()))
  82. test_layer.tearDown()
  83. sys.exit(1 if errors else 0)