cubicweb/devtools/qunit.py
author Laurent Peuch <cortex@worlddomination.be>
Tue, 17 Dec 2019 21:21:55 +0100
changeset 12824 bc623a3e44e9
parent 12823 e830ace445bf
permissions -rw-r--r--
autopep8
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/>.
12824
bc623a3e44e9 autopep8
Laurent Peuch <cortex@worlddomination.be>
parents: 12823
diff changeset
    18
import os
bc623a3e44e9 autopep8
Laurent Peuch <cortex@worlddomination.be>
parents: 12823
diff changeset
    19
import os.path as osp
12820
da416fb21657 [test/fix] prevent FirefoxHelper from silently failing to start
Laurent Peuch <cortex@worlddomination.be>
parents: 12567
diff changeset
    20
import time
10886
941e3d15c338 [devtools/qunit] Fail quickly if firefox is not installed
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10885
diff changeset
    21
import errno
11745
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    22
import shutil
12567
26744ad37953 Drop python2 support
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11850
diff changeset
    23
from queue import Queue, Empty
26744ad37953 Drop python2 support
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11850
diff changeset
    24
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
    25
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
    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
11744
a6dc650bc230 [test] Replace logilab-common's with_tempdir by tempfile.TemporaryDirectory
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11742
diff changeset
    28
from logilab.common.testlib import Tags
10946
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
    29
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
    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
10946
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
    35
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
    36
5779
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    37
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    38
class FirefoxHelper(object):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    39
11745
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    40
    def __init__(self, url):
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    41
        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
    42
        self._process = None
11745
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    43
        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
    44
        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
    45
        if os.name == 'posix':
8886
bff36e86f74a [devtools] prevent Xvfb resets
Julien Cristau <julien.cristau@logilab.fr>
parents: 8757
diff changeset
    46
            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
    47
                                '-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
    48
11745
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    49
    def __enter__(self):
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    50
        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
    51
        isavailable, reason = self.test()
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    52
        if not isavailable:
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    53
            raise RuntimeError(
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    54
                '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
    55
        self.start()
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    56
        return self
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    57
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    58
    def __exit__(self, *exc_info):
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    59
        self.stop()
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    60
        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
    61
10886
941e3d15c338 [devtools/qunit] Fail quickly if firefox is not installed
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10885
diff changeset
    62
    def test(self):
941e3d15c338 [devtools/qunit] Fail quickly if firefox is not installed
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10885
diff changeset
    63
        try:
941e3d15c338 [devtools/qunit] Fail quickly if firefox is not installed
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10885
diff changeset
    64
            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
    65
            stdout, _ = proc.communicate()
941e3d15c338 [devtools/qunit] Fail quickly if firefox is not installed
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10885
diff changeset
    66
            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
    67
        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
    68
            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
    69
                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
    70
                return False, msg
941e3d15c338 [devtools/qunit] Fail quickly if firefox is not installed
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10885
diff changeset
    71
            raise
941e3d15c338 [devtools/qunit] Fail quickly if firefox is not installed
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10885
diff changeset
    72
11746
7cf5a915e2e9 [devtools/qunit] Retain firefox process stdout to eventually print it
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11745
diff changeset
    73
    @property
7cf5a915e2e9 [devtools/qunit] Retain firefox process stdout to eventually print it
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11745
diff changeset
    74
    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
    75
        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
    76
11745
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    77
    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
    78
        self.stop()
9992
3905682ece11 [devtools] Fix Firefox launcher in QUnitTestCase (closes #4294727)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9991
diff changeset
    79
        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
    80
                                  '-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
    81
        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
    82
            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
    83
12820
da416fb21657 [test/fix] prevent FirefoxHelper from silently failing to start
Laurent Peuch <cortex@worlddomination.be>
parents: 12567
diff changeset
    84
        # check that the process has correctly started
da416fb21657 [test/fix] prevent FirefoxHelper from silently failing to start
Laurent Peuch <cortex@worlddomination.be>
parents: 12567
diff changeset
    85
        time.sleep(1)
da416fb21657 [test/fix] prevent FirefoxHelper from silently failing to start
Laurent Peuch <cortex@worlddomination.be>
parents: 12567
diff changeset
    86
        if self._process.poll() is not None:
da416fb21657 [test/fix] prevent FirefoxHelper from silently failing to start
Laurent Peuch <cortex@worlddomination.be>
parents: 12567
diff changeset
    87
            with open(self.log_file, 'r') as f:
da416fb21657 [test/fix] prevent FirefoxHelper from silently failing to start
Laurent Peuch <cortex@worlddomination.be>
parents: 12567
diff changeset
    88
                log = f.read()
da416fb21657 [test/fix] prevent FirefoxHelper from silently failing to start
Laurent Peuch <cortex@worlddomination.be>
parents: 12567
diff changeset
    89
da416fb21657 [test/fix] prevent FirefoxHelper from silently failing to start
Laurent Peuch <cortex@worlddomination.be>
parents: 12567
diff changeset
    90
            raise Exception("Error: failed to start firefox subprocess using the command "
da416fb21657 [test/fix] prevent FirefoxHelper from silently failing to start
Laurent Peuch <cortex@worlddomination.be>
parents: 12567
diff changeset
    91
                            "'%s' with the return code '%s' and the output:\n\n%s" %
da416fb21657 [test/fix] prevent FirefoxHelper from silently failing to start
Laurent Peuch <cortex@worlddomination.be>
parents: 12567
diff changeset
    92
                            (' '.join(cmd), self._process.poll(), log))
da416fb21657 [test/fix] prevent FirefoxHelper from silently failing to start
Laurent Peuch <cortex@worlddomination.be>
parents: 12567
diff changeset
    93
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    94
    def stop(self):
12820
da416fb21657 [test/fix] prevent FirefoxHelper from silently failing to start
Laurent Peuch <cortex@worlddomination.be>
parents: 12567
diff changeset
    95
        if self._process is not None and self._process.poll() is None:
12824
bc623a3e44e9 autopep8
Laurent Peuch <cortex@worlddomination.be>
parents: 12823
diff changeset
    96
            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
    97
            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
    98
            self._process.wait()
12823
e830ace445bf [test] ensure FirefoxHelper successfully exited
Laurent Peuch <cortex@worlddomination.be>
parents: 12822
diff changeset
    99
            assert self._process.returncode == 0, "Error: firefox return code is %s, see %s" %\
e830ace445bf [test] ensure FirefoxHelper successfully exited
Laurent Peuch <cortex@worlddomination.be>
parents: 12822
diff changeset
   100
                                                  (self._process.returncode, self.log_file)
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   101
            self._process = None
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   102
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   103
    def __del__(self):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   104
        self.stop()
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   105
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   106
10946
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
   107
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
   108
10946
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
   109
    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
   110
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   111
    # 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
   112
    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
   113
    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
   114
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   115
    def setUp(self):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   116
        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
   117
        self.test_queue = Queue()
12824
bc623a3e44e9 autopep8
Laurent Peuch <cortex@worlddomination.be>
parents: 12823
diff changeset
   118
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   119
        class MyQUnitResultController(QUnitResultController):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   120
            tc = self
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   121
            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
   122
        self._qunit_controller = MyQUnitResultController
10946
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
   123
        self.webapp.app.appli.vreg.register(MyQUnitResultController)
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
   124
        self.webapp.app.appli.vreg.register(QUnitView)
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
   125
        self.webapp.app.appli.vreg.register(CWDevtoolsStaticController)
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
   126
        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
   127
        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
   128
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   129
    def tearDown(self):
10946
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
   130
        self.server.shutdown()
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
   131
        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
   132
        self.webapp.app.appli.vreg.unregister(QUnitView)
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
   133
        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
   134
        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
   135
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   136
    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
   137
        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
   138
            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
   139
            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
   140
            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
   141
                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
   142
            else:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   143
                depends = ()
11744
a6dc650bc230 [test] Replace logilab-common's with_tempdir by tempfile.TemporaryDirectory
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11742
diff changeset
   144
            with TemporaryDirectory():
a6dc650bc230 [test] Replace logilab-common's with_tempdir by tempfile.TemporaryDirectory
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11742
diff changeset
   145
                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
   146
                    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
   147
                        func(*args)
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   148
10583
97c88aa7c779 [qunit] remove unused 'data_files' parameter
Julien Cristau <julien.cristau@logilab.fr>
parents: 10432
diff changeset
   149
    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
   150
        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
   151
        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
   152
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   153
        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
   154
            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
   155
11745
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   156
        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
   157
            test_count = 0
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   158
            error = False
11076
403a901b6b1e [devtools] Re-implement generative tests using subtests
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11057
diff changeset
   159
11745
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   160
            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
   161
                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
   162
                    print(logf.read())
11745
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   163
                raise RuntimeError(*data)
11076
403a901b6b1e [devtools] Re-implement generative tests using subtests
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11057
diff changeset
   164
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
   165
            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
   166
                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
   167
                    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
   168
                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
   169
                    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
   170
                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
   171
11745
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   172
            while not error:
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   173
                try:
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   174
                    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
   175
                    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
   176
                    if result is None:
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   177
                        break
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   178
                    test_count += 1
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   179
                    if result:
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   180
                        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
   181
                    else:
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   182
                        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
   183
                except Empty:
12822
6a3634515bd5 [test/ux] add a warning when test from FirefoxHelper timeout
Laurent Peuch <cortex@worlddomination.be>
parents: 12820
diff changeset
   184
                    # Empty means nothing was appended to test_queue within timeout
11745
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   185
                    error = True
12822
6a3634515bd5 [test/ux] add a warning when test from FirefoxHelper timeout
Laurent Peuch <cortex@worlddomination.be>
parents: 12820
diff changeset
   186
                    print("WARNING: timeout while trying to get the next test result from "
6a3634515bd5 [test/ux] add a warning when test from FirefoxHelper timeout
Laurent Peuch <cortex@worlddomination.be>
parents: 12820
diff changeset
   187
                          "FirefoxHelper queue, see log file '%s' for more info" % browser.log_file)
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
   188
                    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
   189
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   190
        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
   191
            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
   192
11745
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   193
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   194
class QUnitResultController(Controller):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   195
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   196
    __regid__ = 'qunit_result'
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
    # Class variables to circumvent the instantiation of a new Controller for each request.
12824
bc623a3e44e9 autopep8
Laurent Peuch <cortex@worlddomination.be>
parents: 12823
diff changeset
   199
    _log_stack = []  # store QUnit log messages
bc623a3e44e9 autopep8
Laurent Peuch <cortex@worlddomination.be>
parents: 12823
diff changeset
   200
    _current_module_name = ''  # store the current QUnit module name
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   201
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   202
    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
   203
        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
   204
        getattr(self, 'handle_%s' % event)()
10934
3f18ec9d96dd [devtools] fix QUnitResultController
Julien Cristau <julien.cristau@logilab.fr>
parents: 10886
diff changeset
   205
        return b''
5742
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_module_start(self):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   208
        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
   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_test_done(self):
12824
bc623a3e44e9 autopep8
Laurent Peuch <cortex@worlddomination.be>
parents: 12823
diff changeset
   211
        name = '%s // %s' % (self._current_module_name, self._cw.form.get('name', ''))
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   212
        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
   213
        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
   214
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   215
        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
   216
        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
   217
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   218
        if failures:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   219
            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
   220
        else:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   221
            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
   222
        self._log_stack[:] = []
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   223
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   224
    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
   225
        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
   226
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   227
    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
   228
        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
   229
        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
   230
        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
   231
        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
   232
        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
   233
        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
   234
        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
   235
            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
   236
            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
   237
                log += '\n' + source
f5ec46a6867a [devtools] qunit: show helpful data when an assertion fails
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10427
diff changeset
   238
        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
   239
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   240
10413
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   241
class QUnitView(View):
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   242
    __regid__ = 'qunit'
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   243
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   244
    templatable = False
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   245
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   246
    depends = None
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   247
    test_file = None
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   248
10413
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   249
    def call(self, **kwargs):
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   250
        w = self.w
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   251
        req = self._cw
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   252
        w(u'''<!DOCTYPE html>
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   253
        <html>
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   254
        <head>
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   255
        <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
   256
        <!-- JS lib used as testing framework -->
10946
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
   257
        <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
   258
        <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
   259
        <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
   260
        <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
   261
        w(u'<!-- result report tools -->')
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   262
        w(u'<script type="text/javascript">')
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   263
        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
   264
        w(u'''
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   265
            QUnit.moduleStart(function (details) {
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   266
              jQuery.ajax({
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   267
                          url: BASE_URL + 'qunit_result',
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   268
                         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
   269
                                "name": details.name},
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.testDone(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": "test_done",
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   277
                                "name": details.name,
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   278
                                "failures": details.failed,
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   279
                                "total": details.total},
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   280
                         async: false});
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   281
            });
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   282
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   283
            QUnit.done(function (details) {
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   284
              jQuery.ajax({
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   285
                           url: BASE_URL + 'qunit_result',
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   286
                           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
   287
                                  "failures": details.failed,
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   288
                                  "total": details.total},
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   289
                           async: false});
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   290
            });
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   291
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   292
            QUnit.log(function (details) {
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   293
              jQuery.ajax({
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   294
                           url: BASE_URL + 'qunit_result',
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   295
                           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
   296
                                  "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
   297
                                  "actual": details.actual,
f5ec46a6867a [devtools] qunit: show helpful data when an assertion fails
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10427
diff changeset
   298
                                  "expected": details.expected,
f5ec46a6867a [devtools] qunit: show helpful data when an assertion fails
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10427
diff changeset
   299
                                  "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
   300
                                  "message": details.message},
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   301
                           async: false});
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   302
            });''')
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   303
        w(u'</script>')
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   304
        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
   305
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   306
        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
   307
            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
   308
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   309
        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
   310
        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
   311
        w(u'''  </head>
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   312
        <body>
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   313
        <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
   314
        <div id="qunit"></div>
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   315
        </body>
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   316
        </html>''')
10413
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   317
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   318
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
   319
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
   320
    __regid__ = 'devtools'
10413
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   321
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   322
    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
   323
        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
   324
        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
   325
        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
   326
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   327
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
   328
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
   329
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   330
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   331
if __name__ == '__main__':
11742
def9b3757945 [test] Use stdlib unittest.main() in qunit
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11165
diff changeset
   332
    import unittest
def9b3757945 [test] Use stdlib unittest.main() in qunit
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11165
diff changeset
   333
    unittest.main()