[IMP] Convered qunit test suite to template
authorFabien Meghazi <fme@openerp.com>
Mon, 28 Apr 2014 18:24:51 +0000 (20:24 +0200)
committerFabien Meghazi <fme@openerp.com>
Mon, 28 Apr 2014 18:24:51 +0000 (20:24 +0200)
bzr revid: fme@openerp.com-20140428182451-u4mgen9669gnldva

addons/web/__openerp__.py
addons/web/controllers/__init__.py
addons/web/controllers/main.py
addons/web/controllers/testing.py [deleted file]
addons/web/static/src/js/testing.js
addons/web/views/webclient_templates.xml
addons/web_tests_demo/__openerp__.py
addons/web_tests_demo/static/src/js/demo.js
addons/web_tests_demo/views/web_tests_demo.xml

index a8bef3f..a400085 100644 (file)
@@ -17,19 +17,4 @@ This module provides the core of the OpenERP Web Client.
     'qweb' : [
         "static/src/xml/*.xml",
     ],
-    'test': [
-        "static/test/testing.js",
-        "static/test/framework.js",
-        "static/test/registry.js",
-        "static/test/form.js",
-        "static/test/data.js",
-        "static/test/list-utils.js",
-        "static/test/formats.js",
-        "static/test/rpc-misordered.js",
-        "static/test/evals.js",
-        "static/test/search.js",
-        "static/test/list.js",
-        "static/test/list-editable.js",
-        "static/test/mutex.js"
-    ],
 }
index 74c2751..12a7e52 100644 (file)
@@ -1,2 +1 @@
 from . import main
-from . import testing
index d56eece..f85f8be 100644 (file)
@@ -619,7 +619,6 @@ class Home(http.Controller):
         return make_conditional(
             response, bundle.last_modified, bundle.checksum, max_age=60*5)
 
-
 class WebClient(http.Controller):
 
     @http.route('/web/webclient/csslist', type='json', auth="none")
@@ -707,6 +706,10 @@ class WebClient(http.Controller):
     def version_info(self):
         return openerp.service.common.exp_version()
 
+    @http.route('/web/tests', type='http', auth="none")
+    def index(self, mod=None, **kwargs):
+        return request.render('web.qunit_suite')
+
 class Proxy(http.Controller):
 
     @http.route('/web/proxy/load', type='json', auth="none")
diff --git a/addons/web/controllers/testing.py b/addons/web/controllers/testing.py
deleted file mode 100644 (file)
index 34a0a15..0000000
+++ /dev/null
@@ -1,172 +0,0 @@
-# coding=utf-8
-# -*- encoding: utf-8 -*-
-
-import glob
-import itertools
-import json
-import operator
-import os
-
-import openerp
-from mako.template import Template
-from openerp.modules import module
-from openerp import http
-from openerp.addons.web.controllers.main import ensure_db
-from openerp.http import request
-
-from .main import module_topological_sort
-
-NOMODULE_TEMPLATE = Template(u"""<!DOCTYPE html>
-<html>
-    <head>
-        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
-        <meta http-equiv="content-type" content="text/html; charset=utf-8" />
-        <title>OpenERP Testing</title>
-    </head>
-    <body>
-        <form action="/web/tests" method="GET">
-            <button name="mod" value="*">Run all tests</button>
-            <ul>
-            % for name, module in modules:
-                <li>${name} <button name="mod" value="${module}">
-                    Run Tests</button></li>
-            % endfor
-            </ul>
-        </form>
-    </body>
-</html>
-""", default_filters=['h'])
-NOTFOUND = Template(u"""
-<p>Unable to find the module [${module}], please check that the module
-   name is correct and the module is on OpenERP's path.</p>
-<a href="/web/tests">&lt;&lt; Back to tests</a>
-""", default_filters=['h'])
-TESTING = Template(u"""<!DOCTYPE html>
-<html style="height: 100%">
-<%def name="to_path(module, p)">/${module}/${p}</%def>
-<head>
-    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
-    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
-    <title>OpenERP Web Tests</title>
-    <link rel="shortcut icon" href="/web/static/src/img/favicon.ico" type="image/x-icon"/>
-
-    <link rel="stylesheet" href="/web/static/lib/qunit/qunit.css">
-    <script src="/web/static/lib/qunit/qunit.js"></script>
-
-    <script type="text/javascript">
-        // List of modules, each module is preceded by its dependencies
-        var oe_all_dependencies = ${dependencies | n};
-        QUnit.config.testTimeout = 5 * 60 * 1000;
-    </script>
-</head>
-<body id="oe" class="openerp">
-    <div id="qunit"></div>
-    <div id="qunit-fixture"></div>
-</body>
-<!-- TODO fme: Remove manifest usage for js and css -->
-${bundle('web.assets_backend') | n}
-% for module, jss, tests, templates in files:
-    % for js in jss:
-        % if not js.endswith('/apps.js'):
-            <script src="${to_path(module, js)}"></script>
-        % endif
-    % endfor
-    % if tests or templates:
-    <script>
-        openerp.testing.current_module = "${module}";
-        % for template in templates:
-        openerp.testing.add_template("${to_path(module, template)}");
-        % endfor
-    </script>
-    % endif
-    % if tests:
-        % for test in tests:
-            <script type="text/javascript" src="${to_path(module, test)}"></script>
-        % endfor
-    % endif
-% endfor
-</html>
-""", default_filters=['h'])
-
-class TestRunnerController(http.Controller):
-
-    @http.route('/web/tests', type='http', auth="none")
-    def index(self, mod=None, **kwargs):
-        ms = module.get_modules()
-        manifests = dict(
-            (name, desc)
-            for name, desc in zip(ms, map(self.load_manifest, ms))
-            if desc # remove not-actually-openerp-modules
-        )
-
-        if not mod:
-            return NOMODULE_TEMPLATE.render(modules=(
-                (manifest['name'], name)
-                for name, manifest in manifests.iteritems()
-                if any(testfile.endswith('.js')
-                       for testfile in manifest['test'])
-            ))
-        sorted_mods = module_topological_sort(dict(
-            (name, manifest.get('depends', []))
-            for name, manifest in manifests.iteritems()
-        ))
-        # to_load and to_test should be zippable lists of the same length.
-        # A falsy value in to_test indicate nothing to test at that index (just
-        # load the corresponding part of to_load)
-        to_test = sorted_mods
-        if mod != '*':
-            if mod not in manifests:
-                return request.not_found(NOTFOUND.render(module=mod))
-            idx = sorted_mods.index(mod)
-            to_test = [None] * len(sorted_mods)
-            to_test[idx] = mod
-
-        tests_candicates = [
-            filter(lambda path: path.endswith('.js'),
-                   manifests[mod]['test'] if mod else [])
-            for mod in to_test]
-        # remove trailing test-less modules
-        tests = reversed(list(
-            itertools.dropwhile(
-                operator.not_,
-                reversed(tests_candicates))))
-
-        files = [
-            (mod, manifests[mod]['js'], tests, manifests[mod]['qweb'])
-            for mod, tests in itertools.izip(sorted_mods, tests)
-        ]
-
-        def bundle(xmlid):
-            dbname = request.params['source']
-            registry = openerp.registry(dbname)
-            view_obj = registry["ir.ui.view"]
-            uid = openerp.SUPERUSER_ID
-            return view_obj.render(registry.cursor(), uid, xmlid, context=request.context)
-
-        return TESTING.render(bundle=bundle, files=files, dependencies=json.dumps(
-            [name for name in sorted_mods
-             if module.get_module_resource(name, 'static')
-             # TODO fme: find a way to detect modules with js bundles
-             # if manifests[name]['js']
-            ]))
-
-
-    def load_manifest(self, name):
-        manifest = module.load_information_from_description_file(name)
-        if manifest:
-            path = module.get_module_path(name)
-            manifest['js'] = list(
-                self.expand_patterns(path, manifest.get('js', [])))
-            manifest['test'] = list(
-                self.expand_patterns(path, manifest.get('test', [])))
-            manifest['qweb'] = list(
-                self.expand_patterns(path, manifest.get('qweb', [])))
-        return manifest
-
-    def expand_patterns(self, root, patterns):
-        for pattern in patterns:
-            normalized_pattern = os.path.normpath(os.path.join(root, pattern))
-            for path in glob.glob(normalized_pattern):
-                # replace OS path separators (from join & normpath) by URI ones
-                yield path[len(root):].replace(os.path.sep, '/')
-
index 1f1c718..5e9483a 100644 (file)
@@ -48,15 +48,6 @@ openerp.testing = {};
 
     testing.dependencies = window['oe_all_dependencies'] || [];
     testing.current_module = null;
-    testing.templates = { };
-    testing.add_template = function (name) {
-        var xhr = QWeb2.Engine.prototype.get_xhr();
-        xhr.open('GET', name, false);
-        xhr.send(null);
-        (testing.templates[testing.current_module] =
-            testing.templates[testing.current_module] || [])
-                .push(xhr.responseXML);
-    };
     /**
      * Function which does not do anything
      */
@@ -206,7 +197,7 @@ openerp.testing = {};
             teardown: testing.noop
         });
 
-        QUnit.module(testing.current_module + '.' + name, {_oe: options});
+        QUnit.module(name, {_oe: options});
         body(testing['case']);
     };
     testing['case'] = function (name, options, callback) {
@@ -244,18 +235,6 @@ openerp.testing = {};
                 expect(opts.asserts);
             }
 
-            if (opts.templates) {
-                for(var i=0; i<module_deps.length; ++i) {
-                    var dep = module_deps[i];
-                    var templates = testing.templates[dep];
-                    if (_.isEmpty(templates)) { continue; }
-
-                    for (var j=0; j < templates.length; ++j) {
-                        instance.web.qweb.add_template(templates[j]);
-                    }
-                }
-            }
-
             var $fixture = $('#qunit-fixture');
 
             var mock, async = false;
index c9e0501..734a783 100644 (file)
             </t>
         </template>
 
+        <template id="web.qunit_suite">
+            &lt;!DOCTYPE html&gt;
+            <html style="height: 100%">
+                <head>
+                    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
+                    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+                    <title>OpenERP Web Tests</title>
+
+                    <link rel="shortcut icon" href="/web/static/src/img/favicon.ico" type="image/x-icon"/>
+                    <link rel="stylesheet" href="/web/static/lib/qunit/qunit.css"/>
+                    <script src="/web/static/lib/qunit/qunit.js"></script>
+
+                    <t t-call="web.assets_backend"/>
+
+                    <script type="text/javascript" id="qunit_config">
+                        QUnit.config.testTimeout = 5 * 60 * 1000;
+                        QUnit.moduleDone(function(result) {
+                            console.log("%s (%s/%s passed tests)", result.name, result.passed, result.total);
+                        });
+                        QUnit.done(function(result) {
+                            if (result.failed === 0) {
+                                console.log('ok');
+                            }
+                        });
+                        openerp.web.qweb.add_template("/web/webclient/qweb");
+                    </script>
+
+                    <script type="text/javascript" src="/web/static/test/testing.js"></script>
+                    <script type="text/javascript" src="/web/static/test/framework.js"></script>
+                    <script type="text/javascript" src="/web/static/test/registry.js"></script>
+                    <script type="text/javascript" src="/web/static/test/form.js"></script>
+                    <script type="text/javascript" src="/web/static/test/data.js"></script>
+                    <script type="text/javascript" src="/web/static/test/list-utils.js"></script>
+                    <script type="text/javascript" src="/web/static/test/formats.js"></script>
+                    <script type="text/javascript" src="/web/static/test/rpc-misordered.js"></script>
+                    <script type="text/javascript" src="/web/static/test/evals.js"></script>
+                    <script type="text/javascript" src="/web/static/test/search.js"></script>
+                    <script type="text/javascript" src="/web/static/test/list.js"></script>
+                    <script type="text/javascript" src="/web/static/test/list-editable.js"></script>
+                    <script type="text/javascript" src="/web/static/test/mutex.js"></script>
+                </head>
+
+                <body id="oe" class="openerp">
+                    <div id="qunit"></div>
+                    <div id="qunit-fixture"></div>
+                </body>
+            </html>
+
+        </template>
+
     </data>
 </openerp>
index cccc7e0..e753d2f 100644 (file)
@@ -11,6 +11,5 @@ Test suite example, same code as that used in the testing documentation.
     'data' : [
         'views/web_tests_demo.xml',
     ],
-    'test': ['static/test/demo.js'],
     'qweb': ['static/src/xml/demo.xml'],
 }
index 5068080..9ac8d39 100644 (file)
@@ -1,11 +1,12 @@
 // static/src/js/demo.js
-openerp.web_tests_demo = function (instance) {
-    _.extend(instance.web_tests_demo, {
+(function () {
+    openerp.web_tests_demo = {
         value_true: true,
-        SomeType: instance.web.Class.extend({
+        SomeType: openerp.web.Class.extend({
             init: function (value) {
                 this.value = value;
             }
         })
-    });
-};
+    };
+
+}());
index 9e92085..75d5670 100644 (file)
@@ -8,5 +8,10 @@
                 <script type="text/javascript" src="/web_tests_demo/static/src/js/demo.js"></script>
             </xpath>
         </template>
+        <template id="qunit_suite" name="web_tests_demo qunit" inherit_id="web.qunit_suite">
+            <xpath expr="//head" position="inside">
+                <script type="text/javascript" src="/web_tests_demo/static/test/demo.js"></script>
+            </xpath>
+        </template>
     </data>
 </openerp>