[IMP] Convered qunit test suite to template
bzr revid: fme@openerp.com-20140428182451-u4mgen9669gnldva
This commit is contained in:
parent
d60af567ad
commit
dde0c9324b
|
@ -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"
|
||||
],
|
||||
}
|
||||
|
|
|
@ -1,2 +1 @@
|
|||
from . import main
|
||||
from . import testing
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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"><< 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, '/')
|
||||
|
|
@ -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;
|
||||
|
|
|
@ -212,5 +212,55 @@
|
|||
</t>
|
||||
</template>
|
||||
|
||||
<template id="web.qunit_suite">
|
||||
<!DOCTYPE html>
|
||||
<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>
|
||||
|
|
|
@ -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'],
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
})
|
||||
});
|
||||
};
|
||||
};
|
||||
|
||||
}());
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue