devtools/qunit.py
author Rémi Cardona <remi.cardona@logilab.fr>
Tue, 15 Dec 2015 19:05:41 +0100
changeset 10990 3a98422df969
parent 10432 f5ec46a6867a
child 10583 97c88aa7c779
permissions -rw-r--r--
Added tag 3.21.5, debian/3.21.5-1, centos/3.21.5-1 for changeset e0572a786e6b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7879
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
     1
# copyright 2010-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
     2
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
     3
#
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
     4
# This file is part of CubicWeb.
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
     5
#
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
     6
# CubicWeb is free software: you can redistribute it and/or modify it under the
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
     7
# terms of the GNU Lesser General Public License as published by the Free
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
     8
# Software Foundation, either version 2.1 of the License, or (at your option)
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
     9
# any later version.
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
    10
#
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
    11
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
    12
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
    13
# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
    14
# details.
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
    15
#
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
    16
# You should have received a copy of the GNU Lesser General Public License along
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
    17
# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
    18
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    19
import os, os.path as osp
5779
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    20
from tempfile import mkdtemp, NamedTemporaryFile, TemporaryFile
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    21
import tempfile
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    22
from Queue import Queue, Empty
5779
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    23
from subprocess import Popen, check_call, CalledProcessError
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    24
from shutil import rmtree, copy as copyfile
7363
2293c49b290a don't let windmill/qunit test break apycot warning for all web/test
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7051
diff changeset
    25
from uuid import uuid4
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    26
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    27
# imported by default to simplify further import statements
7051
34d8b36480a9 [devtools/qunit] had "qunit" test for tag.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6535
diff changeset
    28
from logilab.common.testlib import unittest_main, with_tempdir, InnerTest, Tags
6535
972bd504daf6 [devtools] Clean up import of f328ec853e18 and use lgc's getlogin.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6514
diff changeset
    29
from logilab.common.shellutils import getlogin
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    30
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    31
import cubicweb
10413
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
    32
from cubicweb.view import View
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    33
from cubicweb.web.controller import Controller
10413
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
    34
from cubicweb.web.views.staticcontrollers import StaticFileController, STATIC_CONTROLLERS
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    35
from cubicweb.devtools.httptest import CubicWebServerTC
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    36
5779
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    37
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    38
class VerboseCalledProcessError(CalledProcessError):
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    39
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    40
    def __init__(self, returncode, command, stdout, stderr):
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    41
        super(VerboseCalledProcessError, self).__init__(returncode, command)
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    42
        self.stdout = stdout
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    43
        self.stderr = stderr
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    44
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    45
    def __str__(self):
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    46
        str = [ super(VerboseCalledProcessError, self).__str__()]
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    47
        if self.stdout.strip():
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    48
            str.append('******************')
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    49
            str.append('* process stdout *')
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    50
            str.append('******************')
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    51
            str.append(self.stdout)
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    52
        if self.stderr.strip():
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    53
            str.append('******************')
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    54
            str.append('* process stderr *')
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    55
            str.append('******************')
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    56
            str.append(self.stderr)
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    57
        return '\n'.join(str)
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    58
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    59
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    60
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    61
class FirefoxHelper(object):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    62
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    63
    profile_name_mask = 'PYTEST_PROFILE_%(uid)s'
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    64
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    65
    def __init__(self, url=None):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    66
        self._process = None
9992
3905682ece11 [devtools] Fix Firefox launcher in QUnitTestCase (closes #4294727)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9991
diff changeset
    67
        self._profile_dir = mkdtemp(prefix='cwtest-ffxprof-')
8226
a3d3bdd46463 [devtools] Use Xvfb to run firefox in js tests on posix platforms
Julien Cristau <julien.cristau@logilab.fr>
parents: 7879
diff changeset
    68
        self.firefox_cmd = ['firefox', '-no-remote']
a3d3bdd46463 [devtools] Use Xvfb to run firefox in js tests on posix platforms
Julien Cristau <julien.cristau@logilab.fr>
parents: 7879
diff changeset
    69
        if os.name == 'posix':
8886
bff36e86f74a [devtools] prevent Xvfb resets
Julien Cristau <julien.cristau@logilab.fr>
parents: 8757
diff changeset
    70
            self.firefox_cmd = [osp.join(osp.dirname(__file__), 'data', 'xvfb-run.sh'),
10421
9bbb35f52d4b [devtools] qunit: increase resolution and depth of Xvfb screen
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10413
diff changeset
    71
                                '-a', '-s', '-noreset -screen 0 800x600x24'] + self.firefox_cmd
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    72
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    73
    def start(self, url):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    74
        self.stop()
9992
3905682ece11 [devtools] Fix Firefox launcher in QUnitTestCase (closes #4294727)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9991
diff changeset
    75
        cmd = self.firefox_cmd + ['-silent', '--profile', self._profile_dir,
3905682ece11 [devtools] Fix Firefox launcher in QUnitTestCase (closes #4294727)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9991
diff changeset
    76
                                  '-url', url]
3905682ece11 [devtools] Fix Firefox launcher in QUnitTestCase (closes #4294727)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9991
diff changeset
    77
        with open(os.devnull, 'w') as fnull:
3905682ece11 [devtools] Fix Firefox launcher in QUnitTestCase (closes #4294727)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9991
diff changeset
    78
            self._process = Popen(cmd, stdout=fnull, stderr=fnull)
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    79
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    80
    def stop(self):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    81
        if self._process is not None:
5780
07c1d64dff34 [qunit] check that the browser has not died by himself before we asked him to stop.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5779
diff changeset
    82
            assert self._process.returncode is None,  self._process.returncode
8757
375acf527559 [devtools/qunit] don't open-code subprocess.Popen.terminate
Julien Cristau <julien.cristau@logilab.fr>
parents: 8756
diff changeset
    83
            self._process.terminate()
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    84
            self._process.wait()
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    85
            self._process = None
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    86
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    87
    def __del__(self):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    88
        self.stop()
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    89
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    90
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    91
class QUnitTestCase(CubicWebServerTC):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    92
7051
34d8b36480a9 [devtools/qunit] had "qunit" test for tag.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6535
diff changeset
    93
    tags = CubicWebServerTC.tags | Tags(('qunit',))
34d8b36480a9 [devtools/qunit] had "qunit" test for tag.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6535
diff changeset
    94
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    95
    # testfile, (dep_a, dep_b)
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    96
    all_js_tests = ()
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    97
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    98
    def setUp(self):
9991
3e7f1e9f3adc [devtools] allow cross-origin requests for qunit
Rémi Cardona <remi.cardona@logilab.fr>
parents: 8930
diff changeset
    99
        self.config.global_set_option('access-control-allow-origin', '*')
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   100
        super(QUnitTestCase, self).setUp()
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   101
        self.test_queue = Queue()
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   102
        class MyQUnitResultController(QUnitResultController):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   103
            tc = self
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   104
            test_queue = self.test_queue
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   105
        self._qunit_controller = MyQUnitResultController
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   106
        self.vreg.register(MyQUnitResultController)
10413
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   107
        self.vreg.register(QUnitView)
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   108
        self.vreg.register(CWSoftwareRootStaticController)
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   109
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   110
    def tearDown(self):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   111
        super(QUnitTestCase, self).tearDown()
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   112
        self.vreg.unregister(self._qunit_controller)
10413
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   113
        self.vreg.unregister(QUnitView)
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   114
        self.vreg.unregister(CWSoftwareRootStaticController)
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   115
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   116
    def abspath(self, path):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   117
        """use self.__module__ to build absolute path if necessary"""
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   118
        if not osp.isabs(path):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   119
           dirname = osp.dirname(__import__(self.__module__).__file__)
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   120
           return osp.abspath(osp.join(dirname,path))
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   121
        return path
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   122
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   123
    def test_javascripts(self):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   124
        for args in self.all_js_tests:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   125
            test_file = self.abspath(args[0])
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   126
            if len(args) > 1:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   127
                depends   = [self.abspath(dep) for dep in args[1]]
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   128
            else:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   129
                depends = ()
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   130
            if len(args) > 2:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   131
                data   = [self.abspath(data) for data in args[2]]
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   132
            else:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   133
                data = ()
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   134
            for js_test in self._test_qunit(test_file, depends, data):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   135
                yield js_test
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   136
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   137
    @with_tempdir
10422
2b54acb271cb [devtools] qunit: decrease test timeout
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10421
diff changeset
   138
    def _test_qunit(self, test_file, depends=(), data_files=(), timeout=10):
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   139
        assert osp.exists(test_file), test_file
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   140
        for dep in depends:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   141
            assert osp.exists(dep), dep
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   142
        for data in data_files:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   143
            assert osp.exists(data), data
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   144
10413
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   145
        QUnitView.test_file = test_file
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   146
        QUnitView.depends = depends
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   147
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   148
        while not self.test_queue.empty():
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   149
            self.test_queue.get(False)
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   150
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   151
        browser = FirefoxHelper()
10413
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   152
        browser.start(self.config['base-url'] + "?vid=qunit")
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   153
        test_count = 0
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   154
        error = False
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   155
        def raise_exception(cls, *data):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   156
            raise cls(*data)
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   157
        while not error:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   158
            try:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   159
                result, test_name, msg = self.test_queue.get(timeout=timeout)
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   160
                test_name = '%s (%s)' % (test_name, test_file)
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   161
                self.set_description(test_name)
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   162
                if result is None:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   163
                    break
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   164
                test_count += 1
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   165
                if result:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   166
                    yield InnerTest(test_name, lambda : 1)
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   167
                else:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   168
                    yield InnerTest(test_name, self.fail, msg)
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   169
            except Empty:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   170
                error = True
8692
40d4ba3589be devtools: improve qunit timeout message
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8261
diff changeset
   171
                msg = '%s inactivity timeout (%is). %i test results received'
40d4ba3589be devtools: improve qunit timeout message
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8261
diff changeset
   172
                yield InnerTest(test_file, raise_exception, RuntimeError,
40d4ba3589be devtools: improve qunit timeout message
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8261
diff changeset
   173
                                 msg % (test_file, timeout, test_count))
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   174
        browser.stop()
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   175
        if test_count <= 0 and not error:
8692
40d4ba3589be devtools: improve qunit timeout message
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8261
diff changeset
   176
            yield InnerTest(test_name, raise_exception, RuntimeError,
40d4ba3589be devtools: improve qunit timeout message
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8261
diff changeset
   177
                            'No test yielded by qunit for %s' % test_file)
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   178
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   179
class QUnitResultController(Controller):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   180
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   181
    __regid__ = 'qunit_result'
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   182
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   183
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   184
    # Class variables to circumvent the instantiation of a new Controller for each request.
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   185
    _log_stack = [] # store QUnit log messages
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   186
    _current_module_name = '' # store the current QUnit module name
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   187
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   188
    def publish(self, rset=None):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   189
        event = self._cw.form['event']
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   190
        getattr(self, 'handle_%s' % event)()
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   191
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   192
    def handle_module_start(self):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   193
        self.__class__._current_module_name = self._cw.form.get('name', '')
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   194
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   195
    def handle_test_done(self):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   196
        name = '%s // %s' %  (self._current_module_name, self._cw.form.get('name', ''))
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   197
        failures = int(self._cw.form.get('failures', 0))
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   198
        total = int(self._cw.form.get('total', 0))
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   199
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   200
        self._log_stack.append('%i/%i assertions failed' % (failures, total))
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   201
        msg = '\n'.join(self._log_stack)
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   202
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   203
        if failures:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   204
            self.tc.test_queue.put((False, name, msg))
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   205
        else:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   206
            self.tc.test_queue.put((True, name, msg))
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   207
        self._log_stack[:] = []
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   208
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   209
    def handle_done(self):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   210
        self.tc.test_queue.put((None, None, None))
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   211
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   212
    def handle_log(self):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   213
        result = self._cw.form['result']
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   214
        message = self._cw.form.get('message', '<no message>')
10432
f5ec46a6867a [devtools] qunit: show helpful data when an assertion fails
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10427
diff changeset
   215
        actual = self._cw.form.get('actual')
f5ec46a6867a [devtools] qunit: show helpful data when an assertion fails
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10427
diff changeset
   216
        expected = self._cw.form.get('expected')
f5ec46a6867a [devtools] qunit: show helpful data when an assertion fails
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10427
diff changeset
   217
        source = self._cw.form.get('source')
f5ec46a6867a [devtools] qunit: show helpful data when an assertion fails
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10427
diff changeset
   218
        log = '%s: %s' % (result, message)
f5ec46a6867a [devtools] qunit: show helpful data when an assertion fails
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10427
diff changeset
   219
        if result == 'false' and actual is not None and expected is not None:
f5ec46a6867a [devtools] qunit: show helpful data when an assertion fails
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10427
diff changeset
   220
            log += ' (got: %s, expected: %s)' % (actual, expected)
f5ec46a6867a [devtools] qunit: show helpful data when an assertion fails
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10427
diff changeset
   221
            if source is not None:
f5ec46a6867a [devtools] qunit: show helpful data when an assertion fails
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10427
diff changeset
   222
                log += '\n' + source
f5ec46a6867a [devtools] qunit: show helpful data when an assertion fails
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10427
diff changeset
   223
        self._log_stack.append(log)
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   224
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   225
10413
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   226
class QUnitView(View):
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   227
    __regid__ = 'qunit'
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   228
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   229
    templatable = False
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   230
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   231
    depends = None
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   232
    test_file = None
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   233
10413
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   234
    def call(self, **kwargs):
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   235
        w = self.w
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   236
        req = self._cw
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   237
        data = {
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   238
            'jquery': req.data_url('jquery.js'),
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   239
            'web_test': req.build_url('cwsoftwareroot/devtools/data'),
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   240
        }
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   241
        w(u'''<!DOCTYPE html>
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   242
        <html>
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   243
        <head>
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   244
        <meta http-equiv="content-type" content="application/html; charset=UTF-8"/>
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   245
        <!-- JS lib used as testing framework -->
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   246
        <link rel="stylesheet" type="text/css" media="all" href="%(web_test)s/qunit.css" />
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   247
        <script src="%(jquery)s" type="text/javascript"></script>
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   248
        <script src="%(web_test)s/cwmock.js" type="text/javascript"></script>
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   249
        <script src="%(web_test)s/qunit.js" type="text/javascript"></script>'''
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   250
        % data)
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   251
        w(u'<!-- result report tools -->')
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   252
        w(u'<script type="text/javascript">')
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   253
        w(u"var BASE_URL = '%s';" % req.base_url())
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   254
        w(u'''
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   255
            QUnit.moduleStart(function (details) {
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   256
              jQuery.ajax({
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   257
                          url: BASE_URL + 'qunit_result',
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   258
                         data: {"event": "module_start",
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   259
                                "name": details.name},
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   260
                         async: false});
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   261
            });
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   262
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   263
            QUnit.testDone(function (details) {
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   264
              jQuery.ajax({
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   265
                          url: BASE_URL + 'qunit_result',
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   266
                         data: {"event": "test_done",
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   267
                                "name": details.name,
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   268
                                "failures": details.failed,
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   269
                                "total": details.total},
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   270
                         async: false});
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   271
            });
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   272
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   273
            QUnit.done(function (details) {
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   274
              jQuery.ajax({
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   275
                           url: BASE_URL + 'qunit_result',
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   276
                           data: {"event": "done",
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   277
                                  "failures": details.failed,
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   278
                                  "total": details.total},
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   279
                           async: false});
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   280
            });
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   281
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   282
            QUnit.log(function (details) {
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   283
              jQuery.ajax({
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   284
                           url: BASE_URL + 'qunit_result',
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   285
                           data: {"event": "log",
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   286
                                  "result": details.result,
10432
f5ec46a6867a [devtools] qunit: show helpful data when an assertion fails
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10427
diff changeset
   287
                                  "actual": details.actual,
f5ec46a6867a [devtools] qunit: show helpful data when an assertion fails
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10427
diff changeset
   288
                                  "expected": details.expected,
f5ec46a6867a [devtools] qunit: show helpful data when an assertion fails
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10427
diff changeset
   289
                                  "source": details.source,
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   290
                                  "message": details.message},
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   291
                           async: false});
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   292
            });''')
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   293
        w(u'</script>')
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   294
        w(u'<!-- Test script dependencies (tested code for example) -->')
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   295
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   296
        prefix = len(cubicweb.CW_SOFTWARE_ROOT) + 1
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   297
        for dep in self.depends:
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   298
            dep = req.build_url('cwsoftwareroot/') + dep[prefix:]
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   299
            w(u'    <script src="%s" type="text/javascript"></script>' % dep)
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   300
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   301
        w(u'    <!-- Test script itself -->')
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   302
        test_url = req.build_url('cwsoftwareroot/') + self.test_file[prefix:]
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   303
        w(u'    <script src="%s" type="text/javascript"></script>' % test_url)
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   304
        w(u'''  </head>
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   305
        <body>
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   306
        <div id="qunit-fixture"></div>
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   307
        <div id="qunit"></div>
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   308
        </body>
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   309
        </html>''')
10413
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   310
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   311
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   312
class CWSoftwareRootStaticController(StaticFileController):
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   313
    __regid__ = 'cwsoftwareroot'
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   314
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   315
    def publish(self, rset=None):
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   316
        staticdir = cubicweb.CW_SOFTWARE_ROOT
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   317
        relpath = self.relpath[len(self.__regid__) + 1:]
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   318
        return self.static_file(osp.join(staticdir, relpath))
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   319
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   320
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   321
STATIC_CONTROLLERS.append(CWSoftwareRootStaticController)
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   322
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   323
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   324
if __name__ == '__main__':
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   325
    unittest_main()