diff --git a/addons/web/static/tests/helpers/test_env.js b/addons/web/static/tests/helpers/test_env.js
index 5b197451517..5a3256e98fd 100644
--- a/addons/web/static/tests/helpers/test_env.js
+++ b/addons/web/static/tests/helpers/test_env.js
@@ -1,10 +1,8 @@
odoo.define('web.test_env', async function (require) {
"use strict";
- const AbstractStorageService = require('web.AbstractStorageService');
- const Bus = require("web.Bus");
- const RamStorage = require('web.RamStorage');
- const { buildQuery } = require("web.rpc");
+ const Bus = require('web.Bus');
+ const { buildQuery } = require('web.rpc');
const session = require('web.session');
/**
@@ -17,9 +15,6 @@ odoo.define('web.test_env', async function (require) {
* @returns {Proxy}
*/
function makeTestEnvironment(env = {}, providedRPC = null) {
- const RamStorageService = AbstractStorageService.extend({
- storage: new RamStorage(),
- });
const database = {
parameters: {
code: "en_US",
@@ -31,33 +26,26 @@ odoo.define('web.test_env', async function (require) {
time_format: '%H:%M:%S',
},
};
- let testEnv = {};
const defaultEnv = {
_t: env._t || Object.assign((s => s), { database }),
- bus: new Bus(),
+ bus: env.bus || new Bus(),
device: Object.assign({ isMobile: false }, env.device),
isDebug: env.isDebug || (() => false),
qweb: new owl.QWeb({ templates: session.owlTemplates }),
services: Object.assign({
- ajax: { // for legacy subwidgets
+ ajax: {
rpc() {
- const prom = testEnv.session.rpc(...arguments);
- prom.abort = function () {
- throw new Error("Can't abort this request");
- };
- return prom;
- },
+ return env.session.rpc(...arguments); // Compatibility Legacy Widgets
+ }
},
- getCookie() { },
- httpRequest() {
+ getCookie() {},
+ httpRequest(/* route, params = {}, readMethod = 'json' */) {
return Promise.resolve('');
},
rpc(params, options) {
const query = buildQuery(params);
- return testEnv.session.rpc(query.route, query.params, options);
+ return env.session.rpc(query.route, query.params, options);
},
- local_storage: new RamStorageService(),
- session_storage: new RamStorageService(),
notification: { notify() { } },
}, env.services),
session: Object.assign({
@@ -67,10 +55,10 @@ odoo.define('web.test_env', async function (require) {
}
throw new Error(`No method to perform RPC`);
},
+ url: session.url,
}, env.session),
};
- testEnv = Object.assign(env, defaultEnv);
- return testEnv;
+ return Object.assign(env, defaultEnv);
}
/**
diff --git a/addons/web/static/tests/helpers/test_utils.js b/addons/web/static/tests/helpers/test_utils.js
index f6114b84fcd..1a1f38f7f09 100644
--- a/addons/web/static/tests/helpers/test_utils.js
+++ b/addons/web/static/tests/helpers/test_utils.js
@@ -121,7 +121,7 @@ odoo.define('web.test_utils', async function (require) {
return {
mock: {
addMockEnvironment: testUtilsMock.addMockEnvironment,
- getMockedOwlEnv: testUtilsMock.getMockedOwlEnv,
+ addMockEnvironmentOwl: testUtilsMock.addMockEnvironmentOwl,
intercept: testUtilsMock.intercept,
patch: testUtilsMock.patch,
patchDate: testUtilsMock.patchDate,
diff --git a/addons/web/static/tests/helpers/test_utils_create.js b/addons/web/static/tests/helpers/test_utils_create.js
index 494a0aa2436..801120bf64b 100644
--- a/addons/web/static/tests/helpers/test_utils_create.js
+++ b/addons/web/static/tests/helpers/test_utils_create.js
@@ -67,7 +67,6 @@ odoo.define('web.test_utils_create', function (require) {
}
params.server = mockServer;
- Component.env = testUtilsMock.getMockedOwlEnv(params);
const userContext = params.context && params.context.user_context || {};
const actionManager = new ActionManager(widget, userContext);
@@ -142,7 +141,7 @@ odoo.define('web.test_utils_create', function (require) {
if (!(constructor.prototype instanceof Component)) {
throw new Error(`Argument "constructor" must be an Owl Component.`);
}
- const env = Object.assign(testUtilsMock.getMockedOwlEnv(params), params.env);
+ const cleanUp = await testUtilsMock.addMockEnvironmentOwl(Component, params);
class Parent extends Component {
constructor() {
super(...arguments);
@@ -154,7 +153,6 @@ odoo.define('web.test_utils_create', function (require) {
}
}
}
- Parent.env = env;
Parent.template = xml``;
const parent = new Parent();
await parent.mount(prepareTarget(params.debug), { position: 'first-child' });
@@ -162,6 +160,7 @@ odoo.define('web.test_utils_create', function (require) {
const originalDestroy = child.destroy;
child.destroy = function () {
child.destroy = originalDestroy;
+ cleanUp();
parent.destroy();
};
return child;
@@ -241,9 +240,9 @@ odoo.define('web.test_utils_create', function (require) {
* mock method, assuming that the user has access rights, and is an admin.
*
* @param {Object} [params={}]
- * @returns {DebugManager}
+ * @returns {Promise}
*/
- function createDebugManager(params = {}) {
+ async function createDebugManager(params = {}) {
const mockRPC = params.mockRPC;
Object.assign(params, {
async mockRPC(route, args) {
@@ -268,7 +267,7 @@ odoo.define('web.test_utils_create', function (require) {
},
});
const debugManager = new DebugManager();
- testUtilsMock.addMockEnvironment(debugManager, params);
+ await testUtilsMock.addMockEnvironment(debugManager, params);
return debugManager;
}
@@ -280,12 +279,12 @@ odoo.define('web.test_utils_create', function (require) {
* @param {Class} params.Model the model class to use
* @returns {Model}
*/
- function createModel(params) {
+ async function createModel(params) {
const widget = new Widget();
const model = new params.Model(widget);
- testUtilsMock.addMockEnvironment(widget, params);
+ await testUtilsMock.addMockEnvironment(widget, params);
// override the model's 'destroy' so that it calls 'destroy' on the widget
// instead, as the widget is the parent of the model and the mockServer.
@@ -304,11 +303,11 @@ odoo.define('web.test_utils_create', function (require) {
*
* @param {Object} params This object will be given to addMockEnvironment, so
* any parameters from that method applies
- * @returns {Widget}
+ * @returns {Promise}
*/
- function createParent(params) {
+ async function createParent(params) {
const widget = new Widget();
- testUtilsMock.addMockEnvironment(widget, params);
+ await testUtilsMock.addMockEnvironment(widget, params);
return widget;
}
@@ -358,8 +357,6 @@ odoo.define('web.test_utils_create', function (require) {
const viewInfo = testUtilsMock.fieldsViewGet(mockServer, params);
params.server = mockServer;
- const env = Object.assign(testUtilsMock.getMockedOwlEnv(params));
- Component.env = env;
// create the view
const View = params.View;
diff --git a/addons/web/static/tests/helpers/test_utils_mock.js b/addons/web/static/tests/helpers/test_utils_mock.js
index 414a9c0df64..6df49cf59f3 100644
--- a/addons/web/static/tests/helpers/test_utils_mock.js
+++ b/addons/web/static/tests/helpers/test_utils_mock.js
@@ -10,12 +10,16 @@ odoo.define('web.test_utils_mock', function (require) {
* testUtils file.
*/
+const AbstractStorageService = require('web.AbstractStorageService');
+const AjaxService = require('web.AjaxService');
const basic_fields = require('web.basic_fields');
+const Bus = require('web.Bus');
const config = require('web.config');
const core = require('web.core');
const dom = require('web.dom');
const makeTestEnvironment = require('web.test_env');
const MockServer = require('web.MockServer');
+const RamStorage = require('web.RamStorage');
const session = require('web.session');
const DebouncedField = basic_fields.DebouncedField;
@@ -25,6 +29,199 @@ const DebouncedField = basic_fields.DebouncedField;
// Private functions
//------------------------------------------------------------------------------
+/**
+ * Returns a mocked environment to be used by OWL components in tests, with
+ * requested services (+ ajax, local_storage and session_storage) deployed.
+ *
+ * @private
+ * @param {Object} params
+ * @param {Bus} [params.bus]
+ * @param {boolean} [params.debug]
+ * @param {Object} [params.env]
+ * @param {Bus} [params.env.bus]
+ * @param {Object} [params.env.dataManager]
+ * @param {Object} [params.env.services]
+ * @param {Object[]} [params.favoriteFilters]
+ * @param {Object} [params.services]
+ * @param {Object} [params.session]
+ * @param {MockServer} [mockServer]
+ * @returns {Promise