cubicweb/devtools/qunit.py
author Denis Laxalde <denis.laxalde@logilab.fr>
Mon, 24 Oct 2016 10:08:36 +0200
changeset 11746 7cf5a915e2e9
parent 11745 f79dc500a4e7
child 11850 87443f279b0f
permissions -rw-r--r--
[devtools/qunit] Retain firefox process stdout to eventually print it The bare RuntimeError that gets emitted upon timeout does not help much to diagnose the problem. Let's see if we can get more information from stdout by not dropping it.
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/>.
11746
7cf5a915e2e9 [devtools/qunit] Retain firefox process stdout to eventually print it
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11745
diff changeset
    18
from __future__ import absolute_import, print_function
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
    19
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    20
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
    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
10885
b3a192804b63 [devtools/qunit] Remove unused code
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10608
diff changeset
    23
from tempfile import mkdtemp
10886
941e3d15c338 [devtools/qunit] Fail quickly if firefox is not installed
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10885
diff changeset
    24
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
    25
10608
7fc548d9dd8e [py3k] import queue using six.moves
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10583
diff changeset
    26
from six.moves.queue import Queue, Empty
7fc548d9dd8e [py3k] import queue using six.moves
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10583
diff changeset
    27
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    28
# 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
    29
from logilab.common.testlib import Tags
10946
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
    30
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
    31
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    32
import cubicweb
10413
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
    33
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
    34
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
    35
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
    36
from cubicweb.devtools import webtest as cwwebtest
11744
a6dc650bc230 [test] Replace logilab-common's with_tempdir by tempfile.TemporaryDirectory
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11742
diff changeset
    37
from cubicweb.devtools.testlib import TemporaryDirectory
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    38
5779
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    39
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    40
class FirefoxHelper(object):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    41
11745
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    42
    def __init__(self, url):
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    43
        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
    44
        self._process = None
11745
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    45
        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
    46
        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
    47
        if os.name == 'posix':
8886
bff36e86f74a [devtools] prevent Xvfb resets
Julien Cristau <julien.cristau@logilab.fr>
parents: 8757
diff changeset
    48
            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
    49
                                '-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
    50
11745
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    51
    def __enter__(self):
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    52
        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
    53
        isavailable, reason = self.test()
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    54
        if not isavailable:
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    55
            raise RuntimeError(
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    56
                '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
    57
        self.start()
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    58
        return self
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    59
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    60
    def __exit__(self, *exc_info):
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    61
        self.stop()
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    62
        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
    63
10886
941e3d15c338 [devtools/qunit] Fail quickly if firefox is not installed
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10885
diff changeset
    64
    def test(self):
941e3d15c338 [devtools/qunit] Fail quickly if firefox is not installed
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10885
diff changeset
    65
        try:
941e3d15c338 [devtools/qunit] Fail quickly if firefox is not installed
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10885
diff changeset
    66
            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
    67
            stdout, _ = proc.communicate()
941e3d15c338 [devtools/qunit] Fail quickly if firefox is not installed
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10885
diff changeset
    68
            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
    69
        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
    70
            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
    71
                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
    72
                return False, msg
941e3d15c338 [devtools/qunit] Fail quickly if firefox is not installed
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10885
diff changeset
    73
            raise
941e3d15c338 [devtools/qunit] Fail quickly if firefox is not installed
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10885
diff changeset
    74
11746
7cf5a915e2e9 [devtools/qunit] Retain firefox process stdout to eventually print it
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11745
diff changeset
    75
    @property
7cf5a915e2e9 [devtools/qunit] Retain firefox process stdout to eventually print it
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11745
diff changeset
    76
    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
    77
        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
    78
11745
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
    79
    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
    80
        self.stop()
9992
3905682ece11 [devtools] Fix Firefox launcher in QUnitTestCase (closes #4294727)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9991
diff changeset
    81
        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
    82
                                  '-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
    83
        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
    84
            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
    85
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    86
    def stop(self):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    87
        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
    88
            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
    89
            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
    90
            self._process.wait()
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    91
            self._process = None
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    92
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    93
    def __del__(self):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    94
        self.stop()
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    95
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    96
10946
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
    97
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
    98
10946
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
    99
    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
   100
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   101
    # 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
   102
    all_js_tests = ()
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   103
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   104
    def setUp(self):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   105
        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
   106
        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
   107
        class MyQUnitResultController(QUnitResultController):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   108
            tc = self
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   109
            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
   110
        self._qunit_controller = MyQUnitResultController
10946
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
   111
        self.webapp.app.appli.vreg.register(MyQUnitResultController)
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
   112
        self.webapp.app.appli.vreg.register(QUnitView)
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
   113
        self.webapp.app.appli.vreg.register(CWDevtoolsStaticController)
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
   114
        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
   115
        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
   116
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   117
    def tearDown(self):
10946
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
   118
        self.server.shutdown()
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
   119
        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
   120
        self.webapp.app.appli.vreg.unregister(QUnitView)
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
   121
        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
   122
        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
   123
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   124
    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
   125
        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
   126
            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
   127
            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
   128
            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
   129
                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
   130
            else:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   131
                depends = ()
11744
a6dc650bc230 [test] Replace logilab-common's with_tempdir by tempfile.TemporaryDirectory
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11742
diff changeset
   132
            with TemporaryDirectory():
a6dc650bc230 [test] Replace logilab-common's with_tempdir by tempfile.TemporaryDirectory
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11742
diff changeset
   133
                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
   134
                    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
   135
                        func(*args)
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   136
10583
97c88aa7c779 [qunit] remove unused 'data_files' parameter
Julien Cristau <julien.cristau@logilab.fr>
parents: 10432
diff changeset
   137
    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
   138
        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
   139
        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
   140
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   141
        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
   142
            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
   143
11745
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   144
        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
   145
            test_count = 0
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   146
            error = False
11076
403a901b6b1e [devtools] Re-implement generative tests using subtests
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11057
diff changeset
   147
11745
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   148
            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
   149
                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
   150
                    print(logf.read())
11745
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   151
                raise RuntimeError(*data)
11076
403a901b6b1e [devtools] Re-implement generative tests using subtests
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11057
diff changeset
   152
11745
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   153
            while not error:
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   154
                try:
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   155
                    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
   156
                    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
   157
                    if result is None:
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   158
                        break
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   159
                    test_count += 1
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   160
                    if result:
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   161
                        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
   162
                    else:
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   163
                        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
   164
                except Empty:
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   165
                    error = True
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   166
                    msg = '%s inactivity timeout (%is). %i test results received'
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   167
                    yield test_file, runtime_error, (msg % (test_file, timeout, test_count), )
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   168
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   169
        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
   170
            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
   171
11745
f79dc500a4e7 [devtools/qunit] Turn FirefoxHelper into a context manager
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11744
diff changeset
   172
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   173
class QUnitResultController(Controller):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   174
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   175
    __regid__ = 'qunit_result'
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   176
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
    # 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
   179
    _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
   180
    _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
   181
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   182
    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
   183
        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
   184
        getattr(self, 'handle_%s' % event)()
10934
3f18ec9d96dd [devtools] fix QUnitResultController
Julien Cristau <julien.cristau@logilab.fr>
parents: 10886
diff changeset
   185
        return b''
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   186
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   187
    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
   188
        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
   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_test_done(self):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   191
        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
   192
        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
   193
        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
   194
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   195
        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
   196
        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
   197
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   198
        if failures:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   199
            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
   200
        else:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   201
            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
   202
        self._log_stack[:] = []
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   203
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   204
    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
   205
        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
   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_log(self):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   208
        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
   209
        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
   210
        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
   211
        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
   212
        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
   213
        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
   214
        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
   215
            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
   216
            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
   217
                log += '\n' + source
f5ec46a6867a [devtools] qunit: show helpful data when an assertion fails
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10427
diff changeset
   218
        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
   219
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   220
10413
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   221
class QUnitView(View):
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   222
    __regid__ = 'qunit'
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   223
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   224
    templatable = False
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   225
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   226
    depends = None
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   227
    test_file = None
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   228
10413
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   229
    def call(self, **kwargs):
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   230
        w = self.w
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   231
        req = self._cw
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   232
        w(u'''<!DOCTYPE html>
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   233
        <html>
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   234
        <head>
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   235
        <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
   236
        <!-- JS lib used as testing framework -->
10946
f7179ecfbae0 [qunit] move from CubicWebServerTC to CubicWebTestTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 10945
diff changeset
   237
        <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
   238
        <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
   239
        <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
   240
        <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
   241
        w(u'<!-- result report tools -->')
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   242
        w(u'<script type="text/javascript">')
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   243
        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
   244
        w(u'''
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   245
            QUnit.moduleStart(function (details) {
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   246
              jQuery.ajax({
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   247
                          url: BASE_URL + 'qunit_result',
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   248
                         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
   249
                                "name": details.name},
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   250
                         async: false});
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   251
            });
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   252
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   253
            QUnit.testDone(function (details) {
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   254
              jQuery.ajax({
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   255
                          url: BASE_URL + 'qunit_result',
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   256
                         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
   257
                                "name": details.name,
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   258
                                "failures": details.failed,
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   259
                                "total": details.total},
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   260
                         async: false});
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   261
            });
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   262
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   263
            QUnit.done(function (details) {
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   264
              jQuery.ajax({
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   265
                           url: BASE_URL + 'qunit_result',
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   266
                           data: {"event": "done",
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   267
                                  "failures": details.failed,
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   268
                                  "total": details.total},
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   269
                           async: false});
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   270
            });
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   271
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   272
            QUnit.log(function (details) {
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   273
              jQuery.ajax({
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   274
                           url: BASE_URL + 'qunit_result',
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   275
                           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
   276
                                  "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
   277
                                  "actual": details.actual,
f5ec46a6867a [devtools] qunit: show helpful data when an assertion fails
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10427
diff changeset
   278
                                  "expected": details.expected,
f5ec46a6867a [devtools] qunit: show helpful data when an assertion fails
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10427
diff changeset
   279
                                  "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
   280
                                  "message": details.message},
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   281
                           async: false});
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   282
            });''')
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   283
        w(u'</script>')
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   284
        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
   285
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   286
        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
   287
            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
   288
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   289
        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
   290
        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
   291
        w(u'''  </head>
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   292
        <body>
10427
7677c0401864 [devtools] qunit: update to 1.18.0 (closes #5533333)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10425
diff changeset
   293
        <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
   294
        <div id="qunit"></div>
10424
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   295
        </body>
5b0bacc7778c [devtools] qunit: refactor functions into QUnitView
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10423
diff changeset
   296
        </html>''')
10413
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   297
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   298
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
   299
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
   300
    __regid__ = 'devtools'
10413
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   301
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   302
    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
   303
        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
   304
        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
   305
        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
   306
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   307
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
   308
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
   309
22a89d0f4143 [devtools] Serve JS tests over HTTP (closes #5533285)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9994
diff changeset
   310
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   311
if __name__ == '__main__':
11742
def9b3757945 [test] Use stdlib unittest.main() in qunit
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11165
diff changeset
   312
    import unittest
def9b3757945 [test] Use stdlib unittest.main() in qunit
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11165
diff changeset
   313
    unittest.main()