diff -r 97c55baefa0c -r b9c612274af7 devtools/cwwindmill.py --- a/devtools/cwwindmill.py Mon Jul 19 15:37:02 2010 +0200 +++ b/devtools/cwwindmill.py Mon Jul 19 16:46:42 2010 +0200 @@ -15,19 +15,28 @@ # # You should have received a copy of the GNU Lesser General Public License along # with CubicWeb. If not, see . -"""this module contains base classes for windmill integration""" +"""this module contains base classes for windmill integration + +:todo: + + * import CubicWeb session object into windmill scope to be able to run RQL + * manage command line option from pytest to run specific use tests only +""" + import os, os.path as osp +import sys +import unittest # imported by default to simplify further import statements from logilab.common.testlib import unittest_main -from windmill.authoring import unit from windmill.dep import functest from cubicweb.devtools.httptest import CubicWebServerTC +# Excerpt from :ref:`windmill.authoring.unit` class UnitTestReporter(functest.reports.FunctestReportInterface): def summary(self, test_list, totals_dict, stdout_capture): self.test_list = test_list @@ -35,14 +44,33 @@ unittestreporter = UnitTestReporter() functest.reports.register_reporter(unittestreporter) -class CubicWebWindmillUseCase(CubicWebServerTC, unit.WindmillUnitTestCase): +class WindmillUnitTestCase(unittest.TestCase): + def setUp(self): + import windmill + windmill.stdout, windmill.stdin = sys.stdout, sys.stdin + from windmill.bin.admin_lib import configure_global_settings, setup + configure_global_settings() + windmill.settings['TEST_URL'] = self.test_url + if hasattr(self,"windmill_settings"): + for (setting,value) in self.windmill_settings.iteritems(): + windmill.settings[setting] = value + self.windmill_shell_objects = setup() + + def tearDown(self): + from windmill.bin.admin_lib import teardown + teardown(self.windmill_shell_objects) + + +class CubicWebWindmillUseCase(CubicWebServerTC, WindmillUnitTestCase): """basic class for Windmill use case tests :param browser: browser identification string (firefox|ie|safari|chrome) (firefox by default) :param test_dir: testing file path or directory (./windmill by default) + :param edit_test: load and edit test for debugging (False by default) """ browser = 'firefox' test_dir = osp.join(os.getcwd(), 'windmill') + edit_test = "-i" in sys.argv # detection for pytest invocation def setUp(self): # reduce log output @@ -53,18 +81,33 @@ # Start CubicWeb session before running the server to populate self.vreg CubicWebServerTC.setUp(self) assert os.path.exists(self.test_dir), "provide 'test_dir' as the given test file/dir" - unit.WindmillUnitTestCase.setUp(self) + WindmillUnitTestCase.setUp(self) def tearDown(self): - unit.WindmillUnitTestCase.tearDown(self) + WindmillUnitTestCase.tearDown(self) CubicWebServerTC.tearDown(self) def testWindmill(self): + if self.edit_test: + # see windmill.bin.admin_options.Firebug + import windmill + windmill.settings['INSTALL_FIREBUG'] = 'firebug' + self.windmill_shell_objects['start_' + self.browser]() - self.windmill_shell_objects['do_test'](self.test_dir, threaded=False) + self.windmill_shell_objects['do_test'](self.test_dir, + load=self.edit_test, + threaded=False) + # set a breakpoint to be able to debug windmill test + if self.edit_test: + import pdb; pdb.set_trace() + return + for test in unittestreporter.test_list: + msg = "" self._testMethodDoc = getattr(test, "__doc__", None) self._testMethodName = test.__name__ - self.assertEquals(test.result, True) + # try to display a better message in case of failure + if hasattr(test, "tb"): + msg = '\n'.join(test.tb) + self.assertEquals(test.result, True, msg=msg) -