cubicweb/devtools/qunit.py
author Denis Laxalde <denis.laxalde@logilab.fr>
Fri, 05 Apr 2019 17:58:19 +0200
changeset 12567 26744ad37953
parent 11850 87443f279b0f
child 12820 da416fb21657
permissions -rw-r--r--
Drop python2 support This mostly consists in removing the dependency on "six" and updating the code to use only Python3 idioms. Notice that we previously used TemporaryDirectory from cubicweb.devtools.testlib for compatibility with Python2. We now directly import it from tempfile.
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/>.
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    18
import os, os.path as osp
10886
941e3d15c338 [devtools/qunit] Fail quickly if firefox is not installed
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10885
diff changeset
    19
import errno
11745
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    20
import shutil
12567
26744ad37953 Drop python2 support
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11850
diff changeset
    21
from queue import Queue, Empty
26744ad37953 Drop python2 support
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11850
diff changeset
    22
from tempfile import mkdtemp, TemporaryDirectory
10886
941e3d15c338 [devtools/qunit] Fail quickly if firefox is not installed
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10885
diff changeset
    23
from subprocess import Popen, PIPE, STDOUT
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    24
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    25
# imported by default to simplify further import statements
11744
a6dc650bc230 [test] Replace logilab-common's with_tempdir by tempfile.TemporaryDirectory
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11742
diff changeset
    26
from logilab.common.testlib import Tags
10946
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
    27
import webtest.http
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    28
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    29
import cubicweb
10413
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
    30
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
    31
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
    32
from cubicweb.web.views.staticcontrollers import StaticFileController, STATIC_CONTROLLERS
10946
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
    33
from cubicweb.devtools import webtest as cwwebtest
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    34
5779
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    35
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    36
class FirefoxHelper(object):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    37
11745
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    38
    def __init__(self, url):
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    39
        self._url = url
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    40
        self._process = None
11745
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    41
        self._profile_dir = None
8226
a3d3bdd46463 [devtools] Use Xvfb to run firefox in js tests on posix platforms
Julien Cristau <julien.cristau@logilab.fr>
parents: 7879
diff changeset
    42
        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
    43
        if os.name == 'posix':
8886
bff36e86f74a [devtools] prevent Xvfb resets
Julien Cristau <julien.cristau@logilab.fr>
parents: 8757
diff changeset
    44
            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
    45
                                '-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
    46
11745
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    47
    def __enter__(self):
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    48
        self._profile_dir = mkdtemp(prefix='cwtest-ffxprof-')
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    49
        isavailable, reason = self.test()
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    50
        if not isavailable:
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    51
            raise RuntimeError(
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    52
                'firefox not available or not working properly (%s)' % reason)
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    53
        self.start()
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    54
        return self
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    55
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    56
    def __exit__(self, *exc_info):
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    57
        self.stop()
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    58
        shutil.rmtree(self._profile_dir, ignore_errors=True)
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    59
10886
941e3d15c338 [devtools/qunit] Fail quickly if firefox is not installed
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10885
diff changeset
    60
    def test(self):
941e3d15c338 [devtools/qunit] Fail quickly if firefox is not installed
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10885
diff changeset
    61
        try:
941e3d15c338 [devtools/qunit] Fail quickly if firefox is not installed
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10885
diff changeset
    62
            proc = Popen(['firefox', '--help'], stdout=PIPE, stderr=STDOUT)
941e3d15c338 [devtools/qunit] Fail quickly if firefox is not installed
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10885
diff changeset
    63
            stdout, _ = proc.communicate()
941e3d15c338 [devtools/qunit] Fail quickly if firefox is not installed
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10885
diff changeset
    64
            return proc.returncode == 0, stdout
941e3d15c338 [devtools/qunit] Fail quickly if firefox is not installed
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10885
diff changeset
    65
        except OSError as exc:
941e3d15c338 [devtools/qunit] Fail quickly if firefox is not installed
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10885
diff changeset
    66
            if exc.errno == errno.ENOENT:
941e3d15c338 [devtools/qunit] Fail quickly if firefox is not installed
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10885
diff changeset
    67
                msg = '[%s] %s' % (errno.errorcode[exc.errno], exc.strerror)
941e3d15c338 [devtools/qunit] Fail quickly if firefox is not installed
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10885
diff changeset
    68
                return False, msg
941e3d15c338 [devtools/qunit] Fail quickly if firefox is not installed
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10885
diff changeset
    69
            raise
941e3d15c338 [devtools/qunit] Fail quickly if firefox is not installed
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10885
diff changeset
    70
11746
7cf5a915e2e9 [devtools/qunit] Retain firefox process stdout to eventually print it
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11745
diff changeset
    71
    @property
7cf5a915e2e9 [devtools/qunit] Retain firefox process stdout to eventually print it
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11745
diff changeset
    72
    def log_file(self):
7cf5a915e2e9 [devtools/qunit] Retain firefox process stdout to eventually print it
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11745
diff changeset
    73
        return osp.join(self._profile_dir, 'cwtest.log')
7cf5a915e2e9 [devtools/qunit] Retain firefox process stdout to eventually print it
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11745
diff changeset
    74
11745
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    75
    def start(self):
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    76
        self.stop()
9992
3905682ece11 [devtools] Fix Firefox launcher in QUnitTestCase (closes #4294727)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9991
diff changeset
    77
        cmd = self.firefox_cmd + ['-silent', '--profile', self._profile_dir,
11745
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    78
                                  '-url', self._url]
11746
7cf5a915e2e9 [devtools/qunit] Retain firefox process stdout to eventually print it
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11745
diff changeset
    79
        with open(self.log_file, 'wb') as fout:
7cf5a915e2e9 [devtools/qunit] Retain firefox process stdout to eventually print it
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11745
diff changeset
    80
            self._process = Popen(cmd, stdout=fout, stderr=STDOUT)
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    81
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    82
    def stop(self):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    83
        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
    84
            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
    85
            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
    86
            self._process.wait()
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    87
            self._process = None
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    88
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    89
    def __del__(self):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    90
        self.stop()
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    91
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    92
10946
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
    93
class QUnitTestCase(cwwebtest.CubicWebTestTC):
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    94
10946
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
    95
    tags = cwwebtest.CubicWebTestTC.tags | Tags(('qunit',))
7051
34d8b36480a9 [devtools/qunit] had "qunit" test for tag.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6535
diff changeset
    96
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    97
    # 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
    98
    all_js_tests = ()
11850
87443f279b0f [devtools] Make timeout error in qunit tests configurable and use SkipTest in test_jscript.py
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11746
diff changeset
    99
    timeout_error = RuntimeError
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   100
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   101
    def setUp(self):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   102
        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
   103
        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
   104
        class MyQUnitResultController(QUnitResultController):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   105
            tc = self
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   106
            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
   107
        self._qunit_controller = MyQUnitResultController
10946
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
   108
        self.webapp.app.appli.vreg.register(MyQUnitResultController)
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
   109
        self.webapp.app.appli.vreg.register(QUnitView)
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
   110
        self.webapp.app.appli.vreg.register(CWDevtoolsStaticController)
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
   111
        self.server = webtest.http.StopableWSGIServer.create(self.webapp.app)
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
   112
        self.config.global_set_option('base-url', self.server.application_url)
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   113
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   114
    def tearDown(self):
10946
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
   115
        self.server.shutdown()
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
   116
        self.webapp.app.appli.vreg.unregister(self._qunit_controller)
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
   117
        self.webapp.app.appli.vreg.unregister(QUnitView)
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
   118
        self.webapp.app.appli.vreg.unregister(CWDevtoolsStaticController)
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   119
        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
   120
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   121
    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
   122
        for args in self.all_js_tests:
10583
97c88aa7c779 [qunit] remove unused 'data_files' parameter
Julien Cristau <julien.cristau@logilab.fr>
parents: 10432
diff changeset
   123
            self.assertIn(len(args), (1, 2))
10935
049209b9e9d6 [qunit] stop dealing with filesystem paths
Rémi Cardona <remi.cardona@logilab.fr>, Julien Cristau <julien.cristau@logilab.fr>
parents: 10934
diff changeset
   124
            test_file = args[0]
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   125
            if len(args) > 1:
10935
049209b9e9d6 [qunit] stop dealing with filesystem paths
Rémi Cardona <remi.cardona@logilab.fr>, Julien Cristau <julien.cristau@logilab.fr>
parents: 10934
diff changeset
   126
                depends = args[1]
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   127
            else:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   128
                depends = ()
11744
a6dc650bc230 [test] Replace logilab-common's with_tempdir by tempfile.TemporaryDirectory
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11742
diff changeset
   129
            with TemporaryDirectory():
a6dc650bc230 [test] Replace logilab-common's with_tempdir by tempfile.TemporaryDirectory
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11742
diff changeset
   130
                for name, func, args in self._test_qunit(test_file, depends):
a6dc650bc230 [test] Replace logilab-common's with_tempdir by tempfile.TemporaryDirectory
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11742
diff changeset
   131
                    with self.subTest(name=name):
a6dc650bc230 [test] Replace logilab-common's with_tempdir by tempfile.TemporaryDirectory
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11742
diff changeset
   132
                        func(*args)
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   133
10583
97c88aa7c779 [qunit] remove unused 'data_files' parameter
Julien Cristau <julien.cristau@logilab.fr>
parents: 10432
diff changeset
   134
    def _test_qunit(self, test_file, depends=(), timeout=10):
10413
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   135
        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
   136
        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
   137
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   138
        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
   139
            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
   140
11745
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   141
        with FirefoxHelper(self.config['base-url'] + '?vid=qunit') as browser:
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   142
            test_count = 0
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   143
            error = False
11076
403a901b6b1e [devtools] Re-implement generative tests using subtests
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11057
diff changeset
   144
11745
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   145
            def runtime_error(*data):
11746
7cf5a915e2e9 [devtools/qunit] Retain firefox process stdout to eventually print it
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11745
diff changeset
   146
                with open(browser.log_file) as logf:
7cf5a915e2e9 [devtools/qunit] Retain firefox process stdout to eventually print it
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11745
diff changeset
   147
                    print(logf.read())
11745
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   148
                raise RuntimeError(*data)
11076
403a901b6b1e [devtools] Re-implement generative tests using subtests
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11057
diff changeset
   149
11850
87443f279b0f [devtools] Make timeout error in qunit tests configurable and use SkipTest in test_jscript.py
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11746
diff changeset
   150
            def timeout_failure(test_file, timeout, test_count):
87443f279b0f [devtools] Make timeout error in qunit tests configurable and use SkipTest in test_jscript.py
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11746
diff changeset
   151
                with open(browser.log_file) as logf:
87443f279b0f [devtools] Make timeout error in qunit tests configurable and use SkipTest in test_jscript.py
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11746
diff changeset
   152
                    print(logf.read())
87443f279b0f [devtools] Make timeout error in qunit tests configurable and use SkipTest in test_jscript.py
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11746
diff changeset
   153
                msg = '%s inactivity timeout (%is). %i test results received' % (
87443f279b0f [devtools] Make timeout error in qunit tests configurable and use SkipTest in test_jscript.py
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11746
diff changeset
   154
                    test_file, timeout, test_count)
87443f279b0f [devtools] Make timeout error in qunit tests configurable and use SkipTest in test_jscript.py
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11746
diff changeset
   155
                raise self.timeout_error(msg)
87443f279b0f [devtools] Make timeout error in qunit tests configurable and use SkipTest in test_jscript.py
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11746
diff changeset
   156
11745
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   157
            while not error:
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   158
                try:
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   159
                    result, test_name, msg = self.test_queue.get(timeout=timeout)
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   160
                    test_name = '%s (%s)' % (test_name, test_file)
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   161
                    if result is None:
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   162
                        break
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   163
                    test_count += 1
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   164
                    if result:
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   165
                        yield test_name, lambda *args: 1, ()
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   166
                    else:
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   167
                        yield test_name, self.fail, (msg, )
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   168
                except Empty:
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   169
                    error = True
11850
87443f279b0f [devtools] Make timeout error in qunit tests configurable and use SkipTest in test_jscript.py
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11746
diff changeset
   170
                    yield test_file, timeout_failure, (test_file, timeout, test_count)
11745
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   171
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   172
        if test_count <= 0 and not error:
11076
403a901b6b1e [devtools] Re-implement generative tests using subtests
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11057
diff changeset
   173
            yield test_name, runtime_error, ('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
   174
11745
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   175
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   176
class QUnitResultController(Controller):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   177
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   178
    __regid__ = 'qunit_result'
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   179
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
    # 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
   182
    _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
   183
    _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
   184
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   185
    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
   186
        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
   187
        getattr(self, 'handle_%s' % event)()
10934
3f18ec9d96dd [devtools] fix QUnitResultController
Julien Cristau <julien.cristau@logilab.fr>
parents: 10886
diff changeset
   188
        return b''
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   189
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   190
    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
   191
        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
   192
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   193
    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
   194
        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
   195
        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
   196
        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
   197
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   198
        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
   199
        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
   200
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   201
        if failures:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   202
            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
   203
        else:
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((True, name, msg))
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   205
        self._log_stack[:] = []
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   206
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   207
    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
   208
        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
   209
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   210
    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
   211
        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
   212
        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
   213
        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
   214
        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
   215
        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
   216
        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
   217
        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
   218
            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
   219
            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
   220
                log += '\n' + source
f5ec46a6867a [devtools] qunit: show helpful data when an assertion fails
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10427
diff changeset
   221
        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
   222
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   223
10413
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   224
class QUnitView(View):
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   225
    __regid__ = 'qunit'
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   226
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   227
    templatable = False
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   228
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   229
    depends = None
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   230
    test_file = None
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   231
10413
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   232
    def call(self, **kwargs):
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   233
        w = self.w
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   234
        req = self._cw
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   235
        w(u'''<!DOCTYPE html>
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   236
        <html>
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   237
        <head>
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   238
        <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
   239
        <!-- JS lib used as testing framework -->
10946
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
   240
        <link rel="stylesheet" type="text/css" media="all" href="/devtools/qunit.css" />
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
   241
        <script src="/data/jquery.js" type="text/javascript"></script>
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
   242
        <script src="/devtools/cwmock.js" type="text/javascript"></script>
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
   243
        <script src="/devtools/qunit.js" type="text/javascript"></script>''')
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   244
        w(u'<!-- result report tools -->')
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   245
        w(u'<script type="text/javascript">')
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   246
        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
   247
        w(u'''
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   248
            QUnit.moduleStart(function (details) {
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   249
              jQuery.ajax({
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   250
                          url: BASE_URL + 'qunit_result',
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   251
                         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
   252
                                "name": details.name},
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   253
                         async: false});
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   254
            });
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   255
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   256
            QUnit.testDone(function (details) {
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   257
              jQuery.ajax({
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   258
                          url: BASE_URL + 'qunit_result',
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   259
                         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
   260
                                "name": details.name,
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   261
                                "failures": details.failed,
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   262
                                "total": details.total},
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   263
                         async: false});
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   264
            });
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   265
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   266
            QUnit.done(function (details) {
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   267
              jQuery.ajax({
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   268
                           url: BASE_URL + 'qunit_result',
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   269
                           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
   270
                                  "failures": details.failed,
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   271
                                  "total": details.total},
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   272
                           async: false});
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   273
            });
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   274
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   275
            QUnit.log(function (details) {
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   276
              jQuery.ajax({
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   277
                           url: BASE_URL + 'qunit_result',
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   278
                           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
   279
                                  "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
   280
                                  "actual": details.actual,
f5ec46a6867a [devtools] qunit: show helpful data when an assertion fails
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10427
diff changeset
   281
                                  "expected": details.expected,
f5ec46a6867a [devtools] qunit: show helpful data when an assertion fails
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10427
diff changeset
   282
                                  "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
   283
                                  "message": details.message},
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   284
                           async: false});
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   285
            });''')
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   286
        w(u'</script>')
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   287
        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
   288
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   289
        for dep in self.depends:
10935
049209b9e9d6 [qunit] stop dealing with filesystem paths
Rémi Cardona <remi.cardona@logilab.fr>, Julien Cristau <julien.cristau@logilab.fr>
parents: 10934
diff changeset
   290
            w(u'    <script src="%s" type="text/javascript"></script>\n' % dep)
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   291
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   292
        w(u'    <!-- Test script itself -->')
10935
049209b9e9d6 [qunit] stop dealing with filesystem paths
Rémi Cardona <remi.cardona@logilab.fr>, Julien Cristau <julien.cristau@logilab.fr>
parents: 10934
diff changeset
   293
        w(u'    <script src="%s" type="text/javascript"></script>' % self.test_file)
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   294
        w(u'''  </head>
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   295
        <body>
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   296
        <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
   297
        <div id="qunit"></div>
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   298
        </body>
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   299
        </html>''')
10413
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   300
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   301
10935
049209b9e9d6 [qunit] stop dealing with filesystem paths
Rémi Cardona <remi.cardona@logilab.fr>, Julien Cristau <julien.cristau@logilab.fr>
parents: 10934
diff changeset
   302
class CWDevtoolsStaticController(StaticFileController):
049209b9e9d6 [qunit] stop dealing with filesystem paths
Rémi Cardona <remi.cardona@logilab.fr>, Julien Cristau <julien.cristau@logilab.fr>
parents: 10934
diff changeset
   303
    __regid__ = 'devtools'
10413
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   304
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   305
    def publish(self, rset=None):
10935
049209b9e9d6 [qunit] stop dealing with filesystem paths
Rémi Cardona <remi.cardona@logilab.fr>, Julien Cristau <julien.cristau@logilab.fr>
parents: 10934
diff changeset
   306
        staticdir = osp.join(osp.dirname(__file__), 'data')
10413
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   307
        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
   308
        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
   309
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   310
10935
049209b9e9d6 [qunit] stop dealing with filesystem paths
Rémi Cardona <remi.cardona@logilab.fr>, Julien Cristau <julien.cristau@logilab.fr>
parents: 10934
diff changeset
   311
STATIC_CONTROLLERS.append(CWDevtoolsStaticController)
10413
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   312
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   313
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   314
if __name__ == '__main__':
11742
def9b3757945 [test] Use stdlib unittest.main() in qunit
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11165
diff changeset
   315
    import unittest
def9b3757945 [test] Use stdlib unittest.main() in qunit
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11165
diff changeset
   316
    unittest.main()