devtools/qunit.py
author Julien Cristau <julien.cristau@logilab.fr>
Mon, 13 Feb 2012 12:47:59 +0100
branchstable
changeset 8226 a3d3bdd46463
parent 7879 9aae456abab5
child 8257 d54fc706d623
permissions -rw-r--r--
[devtools] Use Xvfb to run firefox in js tests on posix platforms This way we don't require running tests under X.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7879
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
     1
# copyright 2010-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
     2
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
     3
#
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
     4
# This file is part of CubicWeb.
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
     5
#
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
     6
# CubicWeb is free software: you can redistribute it and/or modify it under the
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
     7
# terms of the GNU Lesser General Public License as published by the Free
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
     8
# Software Foundation, either version 2.1 of the License, or (at your option)
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
     9
# any later version.
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
    10
#
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
    11
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
    12
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
    13
# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
    14
# details.
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
    15
#
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
    16
# You should have received a copy of the GNU Lesser General Public License along
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
    17
# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7363
diff changeset
    18
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    19
import os, os.path as osp
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    20
import signal
5779
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    21
from tempfile import mkdtemp, NamedTemporaryFile, TemporaryFile
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    22
import tempfile
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    23
from Queue import Queue, Empty
5779
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    24
from subprocess import Popen, check_call, CalledProcessError
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    25
from shutil import rmtree, copy as copyfile
7363
2293c49b290a don't let windmill/qunit test break apycot warning for all web/test
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7051
diff changeset
    26
from uuid import uuid4
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    27
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
7051
34d8b36480a9 [devtools/qunit] had "qunit" test for tag.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6535
diff changeset
    29
from logilab.common.testlib import unittest_main, with_tempdir, InnerTest, Tags
6535
972bd504daf6 [devtools] Clean up import of f328ec853e18 and use lgc's getlogin.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6514
diff changeset
    30
from logilab.common.shellutils import getlogin
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    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
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    33
from cubicweb.view import StartupView
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
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    35
from cubicweb.devtools.httptest import CubicWebServerTC
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    36
5779
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    37
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    38
class VerboseCalledProcessError(CalledProcessError):
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    39
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    40
    def __init__(self, returncode, command, stdout, stderr):
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    41
        super(VerboseCalledProcessError, self).__init__(returncode, command)
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    42
        self.stdout = stdout
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    43
        self.stderr = stderr
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    44
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    45
    def __str__(self):
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    46
        str = [ super(VerboseCalledProcessError, self).__str__()]
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    47
        if self.stdout.strip():
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    48
            str.append('******************')
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    49
            str.append('* process stdout *')
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    50
            str.append('******************')
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    51
            str.append(self.stdout)
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    52
        if self.stderr.strip():
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    53
            str.append('******************')
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    54
            str.append('* process stderr *')
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    55
            str.append('******************')
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    56
            str.append(self.stderr)
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    57
        return '\n'.join(str)
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    58
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    59
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    60
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    61
class FirefoxHelper(object):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    62
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    63
    profile_name_mask = 'PYTEST_PROFILE_%(uid)s'
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    64
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    65
    def __init__(self, url=None):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    66
        self._process = None
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    67
        self._tmp_dir = mkdtemp()
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    68
        self._profile_data = {'uid': uuid4()}
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    69
        self._profile_name = self.profile_name_mask % self._profile_data
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    70
        fnull = open(os.devnull, 'w')
5779
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    71
        stdout = TemporaryFile()
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    72
        stderr = TemporaryFile()
8226
a3d3bdd46463 [devtools] Use Xvfb to run firefox in js tests on posix platforms
Julien Cristau <julien.cristau@logilab.fr>
parents: 7879
diff changeset
    73
        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
    74
        if os.name == 'posix':
a3d3bdd46463 [devtools] Use Xvfb to run firefox in js tests on posix platforms
Julien Cristau <julien.cristau@logilab.fr>
parents: 7879
diff changeset
    75
            self.firefox_cmd = ['xvfb-run', '-a'] + self.firefox_cmd
5779
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    76
        try:
6535
972bd504daf6 [devtools] Clean up import of f328ec853e18 and use lgc's getlogin.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6514
diff changeset
    77
            home = osp.expanduser('~')
972bd504daf6 [devtools] Clean up import of f328ec853e18 and use lgc's getlogin.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6514
diff changeset
    78
            user = getlogin()
6514
f328ec853e18 [devtools] Firefox need write access to $HOME
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6424
diff changeset
    79
            assert os.access(home, os.W_OK), \
f328ec853e18 [devtools] Firefox need write access to $HOME
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6424
diff changeset
    80
                   'No write access to your home directory, Firefox will crash.'\
f328ec853e18 [devtools] Firefox need write access to $HOME
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6424
diff changeset
    81
                   ' Are you sure "%s" is a valid home  for user "%s"' % (home, user)
8226
a3d3bdd46463 [devtools] Use Xvfb to run firefox in js tests on posix platforms
Julien Cristau <julien.cristau@logilab.fr>
parents: 7879
diff changeset
    82
            check_call(self.firefox_cmd + ['-CreateProfile',
6514
f328ec853e18 [devtools] Firefox need write access to $HOME
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6424
diff changeset
    83
                        '%s %s' % (self._profile_name, self._tmp_dir)],
f328ec853e18 [devtools] Firefox need write access to $HOME
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6424
diff changeset
    84
                                  stdout=stdout, stderr=stderr)
5779
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    85
        except CalledProcessError, cpe:
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    86
            stdout.seek(0)
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    87
            stderr.seek(0)
916ddfd72ac2 [qunit] improve output of suprocess error
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5742
diff changeset
    88
            raise VerboseCalledProcessError(cpe.returncode, cpe.cmd, stdout.read(), stderr.read())
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    89
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    90
    def start(self, url):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    91
        self.stop()
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    92
        fnull = open(os.devnull, 'w')
8226
a3d3bdd46463 [devtools] Use Xvfb to run firefox in js tests on posix platforms
Julien Cristau <julien.cristau@logilab.fr>
parents: 7879
diff changeset
    93
        self._process = Popen(self.firefox_cmd + ['-P', self._profile_name, url],
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    94
                              stdout=fnull, stderr=fnull)
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
    def stop(self):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    97
        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
    98
            assert self._process.returncode is None,  self._process.returncode
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    99
            os.kill(self._process.pid, signal.SIGTERM)
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   100
            self._process.wait()
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
        rmtree(self._tmp_dir)
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   106
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   107
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   108
class QUnitTestCase(CubicWebServerTC):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   109
7051
34d8b36480a9 [devtools/qunit] had "qunit" test for tag.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6535
diff changeset
   110
    tags = CubicWebServerTC.tags | Tags(('qunit',))
34d8b36480a9 [devtools/qunit] had "qunit" test for tag.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6535
diff changeset
   111
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   112
    # 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
   113
    all_js_tests = ()
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()
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   118
        class MyQUnitResultController(QUnitResultController):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   119
            tc = self
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   120
            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
   121
        self._qunit_controller = MyQUnitResultController
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   122
        self.vreg.register(MyQUnitResultController)
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 tearDown(self):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   125
        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
   126
        self.vreg.unregister(self._qunit_controller)
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   127
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 abspath(self, path):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   130
        """use self.__module__ to build absolute path if necessary"""
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   131
        if not osp.isabs(path):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   132
           dirname = osp.dirname(__import__(self.__module__).__file__)
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   133
           return osp.abspath(osp.join(dirname,path))
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   134
        return path
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:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   138
            test_file = self.abspath(args[0])
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   139
            if len(args) > 1:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   140
                depends   = [self.abspath(dep) for dep in args[1]]
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   141
            else:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   142
                depends = ()
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   143
            if len(args) > 2:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   144
                data   = [self.abspath(data) for data in args[2]]
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   145
            else:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   146
                data = ()
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   147
            for js_test in self._test_qunit(test_file, depends, data):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   148
                yield js_test
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   149
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   150
    @with_tempdir
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   151
    def _test_qunit(self, test_file, depends=(), data_files=(), timeout=30):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   152
        assert osp.exists(test_file), test_file
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   153
        for dep in depends:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   154
            assert osp.exists(dep), dep
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   155
        for data in data_files:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   156
            assert osp.exists(data), data
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   157
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   158
        # generate html test file
5907
5eba1248e12b [web config] fix old css compat code: we have to modify locate_resource prototype so it return (potentially hacked) file name as well. Should only impact the file cube which has to be released anyway.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5795
diff changeset
   159
        jquery_dir = 'file://' + self.config.locate_resource('jquery.js')[0]
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   160
        html_test_file = NamedTemporaryFile(suffix='.html')
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   161
        html_test_file.write(make_qunit_html(test_file, depends,
6424
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 5950
diff changeset
   162
                             base_url=self.config['base-url'],
5794
a6b81d106775 [devtools/qunit] Locate jquery through cubicwew config to handle installed setup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5790
diff changeset
   163
                             web_data_path=jquery_dir))
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   164
        html_test_file.flush()
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   165
        # copying data file
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   166
        for data in data_files:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   167
            copyfile(data, tempfile.tempdir)
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   168
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   169
        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
   170
            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
   171
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   172
        browser = FirefoxHelper()
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   173
        browser.start(html_test_file.name)
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   174
        test_count = 0
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   175
        error = False
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   176
        def raise_exception(cls, *data):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   177
            raise cls(*data)
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   178
        while not error:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   179
            try:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   180
                result, test_name, msg = self.test_queue.get(timeout=timeout)
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   181
                test_name = '%s (%s)' % (test_name, test_file)
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   182
                self.set_description(test_name)
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   183
                if result is None:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   184
                    break
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   185
                test_count += 1
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   186
                if result:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   187
                    yield InnerTest(test_name, lambda : 1)
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   188
                else:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   189
                    yield InnerTest(test_name, self.fail, msg)
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   190
            except Empty:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   191
                error = True
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   192
                yield InnerTest(test_file, raise_exception, RuntimeError, "%s did not report execution end. %i test processed so far." % (test_file, test_count))
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   193
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   194
        browser.stop()
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   195
        if test_count <= 0 and not error:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   196
            yield InnerTest(test_name, raise_exception, RuntimeError, 'No test yielded by qunit for %s' % test_file)
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 QUnitResultController(Controller):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   199
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   200
    __regid__ = 'qunit_result'
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
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   203
    # 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
   204
    _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
   205
    _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
   206
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   207
    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
   208
        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
   209
        getattr(self, 'handle_%s' % event)()
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   210
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   211
    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
   212
        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
   213
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   214
    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
   215
        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
   216
        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
   217
        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
   218
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   219
        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
   220
        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
   221
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   222
        if failures:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   223
            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
   224
        else:
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((True, name, msg))
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   226
        self._log_stack[:] = []
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   227
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   228
    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
   229
        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
   230
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   231
    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
   232
        result = self._cw.form['result']
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   233
        message = self._cw.form['message']
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   234
        self._log_stack.append('%s: %s' % (result, message))
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   235
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   236
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   237
def cw_path(*paths):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   238
  return file_path(osp.join(cubicweb.CW_SOFTWARE_ROOT, *paths))
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
def file_path(path):
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   241
    return 'file://' + osp.abspath(path)
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   242
6424
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 5950
diff changeset
   243
def build_js_script(host):
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   244
    return """
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   245
    var host = '%s';
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   246
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   247
    QUnit.moduleStart = function (name) {
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   248
      jQuery.ajax({
6424
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 5950
diff changeset
   249
                  url: host+'/qunit_result',
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   250
                 data: {"event": "module_start",
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   251
                        "name": name},
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   252
                 async: false});
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   253
    }
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   254
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   255
    QUnit.testDone = function (name, failures, total) {
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   256
      jQuery.ajax({
6424
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 5950
diff changeset
   257
                  url: host+'/qunit_result',
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   258
                 data: {"event": "test_done",
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   259
                        "name": name,
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   260
                        "failures": failures,
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   261
                        "total":total},
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   262
                 async: false});
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   263
    }
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   264
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   265
    QUnit.done = function (failures, total) {
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   266
      jQuery.ajax({
6424
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 5950
diff changeset
   267
                   url: host+'/qunit_result',
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   268
                   data: {"event": "done",
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   269
                          "failures": failures,
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   270
                          "total":total},
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   271
                   async: false});
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   272
      window.close();
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   273
    }
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   274
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   275
    QUnit.log = function (result, message) {
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   276
      jQuery.ajax({
6424
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 5950
diff changeset
   277
                   url: host+'/qunit_result',
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   278
                   data: {"event": "log",
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   279
                          "result": result,
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   280
                          "message": message},
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   281
                   async: false});
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   282
    }
6424
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 5950
diff changeset
   283
    """ % host
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   284
6424
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 5950
diff changeset
   285
def make_qunit_html(test_file, depends=(), base_url=None,
5794
a6b81d106775 [devtools/qunit] Locate jquery through cubicwew config to handle installed setup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5790
diff changeset
   286
                    web_data_path=cw_path('web', 'data')):
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   287
    """"""
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   288
    data = {
5794
a6b81d106775 [devtools/qunit] Locate jquery through cubicwew config to handle installed setup
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5790
diff changeset
   289
            'web_data': web_data_path,
5787
20377d2fcc70 [qunit] Move qunit.js and qunit.css in devtools/datadirectory
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5780
diff changeset
   290
            'web_test': cw_path('devtools', 'data'),
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   291
        }
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   292
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   293
    html = ['''<html>
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   294
  <head>
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   295
    <!-- JS lib used as testing framework -->
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   296
    <link rel="stylesheet" type="text/css" media="all" href="%(web_test)s/qunit.css" />
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   297
    <script src="%(web_data)s/jquery.js" type="text/javascript"></script>
5950
f84dba9b8eca [test] fix test_ajax js tests. We have to mock some of our js functions / variables (e.g. _ or pageid) in the test environment
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5907
diff changeset
   298
    <script src="%(web_test)s/cwmock.js" type="text/javascript"></script>
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   299
    <script src="%(web_test)s/qunit.js" type="text/javascript"></script>'''
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   300
    % data]
6424
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 5950
diff changeset
   301
    if base_url is not None:
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   302
        html.append('<!-- result report tools -->')
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   303
        html.append('<script type="text/javascript">')
6424
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 5950
diff changeset
   304
        html.append(build_js_script(base_url))
5742
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   305
        html.append('</script>')
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   306
    html.append('<!-- Test script dependencies (tested code for example) -->')
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   307
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   308
    for dep in depends:
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   309
        html.append('    <script src="%s" type="text/javascript"></script>' % file_path(dep))
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   310
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   311
    html.append('    <!-- Test script itself -->')
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   312
    html.append('    <script src="%s" type="text/javascript"></script>'% (file_path(test_file),))
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   313
    html.append('''  </head>
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   314
  <body>
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   315
    <div id="main">
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   316
    </div>
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   317
    <h1 id="qunit-header">QUnit example</h1>
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   318
    <h2 id="qunit-banner"></h2>
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   319
    <h2 id="qunit-userAgent"></h2>
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   320
    <ol id="qunit-tests">
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   321
  </body>
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   322
</html>''')
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   323
    return u'\n'.join(html)
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   324
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   325
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   326
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   327
if __name__ == '__main__':
74c19dac29cf Add a QUnitTestCase class to run qunit test case.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   328
    unittest_main()