summaryrefslogtreecommitdiff
path: root/addons/web/static/tests/helpers/test_utils_create.js
diff options
context:
space:
mode:
Diffstat (limited to 'addons/web/static/tests/helpers/test_utils_create.js')
-rw-r--r--addons/web/static/tests/helpers/test_utils_create.js288
1 files changed, 144 insertions, 144 deletions
diff --git a/addons/web/static/tests/helpers/test_utils_create.js b/addons/web/static/tests/helpers/test_utils_create.js
index 717b845e80e..21bc6cc7850 100644
--- a/addons/web/static/tests/helpers/test_utils_create.js
+++ b/addons/web/static/tests/helpers/test_utils_create.js
@@ -10,70 +10,68 @@ odoo.define('web.test_utils_create', function (require) {
* testUtils file.
*/
- var ActionManager = require('web.ActionManager');
- var config = require('web.config');
- var ControlPanelView = require('web.ControlPanelView');
- var concurrency = require('web.concurrency');
- var DebugManager = require('web.DebugManager.Backend');
- var dom = require('web.dom');
- var testUtilsMock = require('web.test_utils_mock');
- var Widget = require('web.Widget');
+ const ActionManager = require('web.ActionManager');
+ const concurrency = require('web.concurrency');
+ const config = require('web.config');
+ const ControlPanelView = require('web.ControlPanelView');
+ const DebugManager = require('web.DebugManager.Backend');
+ const dom = require('web.dom');
+ const testUtilsMock = require('web.test_utils_mock');
+ const Widget = require('web.Widget');
/**
- * create and return an instance of ActionManager with all rpcs going through a
+ * Create and return an instance of ActionManager with all rpcs going through a
* mock method using the data, actions and archs objects as sources.
*
- * @param {Object} [params]
+ * @param {Object} [params={}]
* @param {Object} [params.actions] the actions given to the mock server
* @param {Object} [params.archs] this archs given to the mock server
* @param {Object} [params.data] the business data given to the mock server
* @param {function} [params.mockRPC]
- * @returns {ActionManager}
+ * @returns {Promise<ActionManager>}
*/
- async function createActionManager(params) {
- params = params || {};
+ async function createActionManager(params = {}) {
const target = prepareTarget(params.debug);
- var widget = new Widget();
+ const widget = new Widget();
// when 'document' addon is installed, the sidebar does a 'search_read' on
// model 'ir_attachment' each time a record is open, so we monkey-patch
// 'mockRPC' to mute those RPCs, so that the tests can be written uniformly,
// whether or not 'document' is installed
- var mockRPC = params.mockRPC;
- _.extend(params, {
- mockRPC: function (route, args) {
+ const mockRPC = params.mockRPC;
+ Object.assign(params, {
+ async mockRPC(route, args) {
if (args.model === 'ir.attachment') {
- return Promise.resolve([]);
+ return [];
}
if (mockRPC) {
return mockRPC.apply(this, arguments);
}
- return this._super.apply(this, arguments);
+ return this._super(...arguments);
},
});
- testUtilsMock.addMockEnvironment(widget, _.defaults(params, { debounce: false }));
+ testUtilsMock.addMockEnvironment(widget, Object.assign({ debounce: false }, params));
await widget.prependTo(target);
- widget.$el.addClass('o_web_client');
+ widget.el.classList.add('o_web_client');
if (config.device.isMobile) {
- widget.$el.addClass('o_touch_device');
+ widget.el.classList.add('o_touch_device');
}
- var userContext = params.context && params.context.user_context || {};
- var actionManager = new ActionManager(widget, userContext);
+ const userContext = params.context && params.context.user_context || {};
+ const actionManager = new ActionManager(widget, userContext);
- var originalDestroy = ActionManager.prototype.destroy;
+ const originalDestroy = ActionManager.prototype.destroy;
actionManager.destroy = function () {
actionManager.destroy = originalDestroy;
widget.destroy();
};
- var fragment = document.createDocumentFragment();
- return actionManager.appendTo(fragment).then(function () {
- dom.append(widget.$el, fragment, {
- callbacks: [{ widget: actionManager }],
- in_DOM: true,
- });
- return actionManager;
+ const fragment = document.createDocumentFragment();
+ await actionManager.appendTo(fragment);
+ dom.append(widget.el, fragment, {
+ callbacks: [{ widget: actionManager }],
+ in_DOM: true,
});
+ return actionManager;
}
/**
@@ -85,21 +83,22 @@ odoo.define('web.test_utils_create', function (require) {
* makes the calendar scroll to 6:00 in a setTimeout(0), which might have an
* impact according to where we want to trigger positional clicks.
*
- * @param {Object} params see @createView
+ * @param {Object} params @see createView
* @param {Object} [options]
* @param {boolean} [options.positionalClicks=false]
* @returns {Promise<CalendarController>}
*/
async function createCalendarView(params, options) {
- var calendar = await createView(params);
+ const calendar = await createView(params);
if (!options || !options.positionalClicks) {
return calendar;
}
- var $view = $('#qunit-fixture').contents();
- $view.prependTo('body');
- var destroy = calendar.destroy;
- calendar.destroy = function () {
- $view.remove();
+ const viewElements = [...document.getElementById('qunit-fixture').children];
+ viewElements.forEach(el => document.body.prepend(el));
+
+ const destroy = calendar.destroy;
+ calendar.destroy = () => {
+ viewElements.forEach(el => el.remove());
destroy();
};
await concurrency.delay(0);
@@ -107,7 +106,7 @@ odoo.define('web.test_utils_create', function (require) {
}
/**
- * create a controlPanel from various parameters.
+ * Create a controlPanel from various parameters.
*
* It returns an instance of ControlPanelController
*
@@ -138,17 +137,17 @@ odoo.define('web.test_utils_create', function (require) {
*
* @returns {Promise<ControlPanel>} resolves with an instance of the ControlPanelController
*/
- function createControlPanel(params) {
+ async function createControlPanel(params) {
params = params || {};
const target = prepareTarget(params.debug);
// reproduce the DOM environment of a view control panel
- var $webClient = $('<div>').addClass('o_web_client').prependTo(target);
- var $actionManager = $('<div>').addClass('o_action_manager').appendTo($webClient);
- var $action = $('<div>').addClass('o_action').appendTo($actionManager);
+ const $webClient = $('<div>').addClass('o_web_client').prependTo(target);
+ const $actionManager = $('<div>').addClass('o_action_manager').appendTo($webClient);
+ const $action = $('<div>').addClass('o_action').appendTo($actionManager);
- var widget = new Widget();
+ const widget = new Widget();
// add mock environment: mock server, session, fieldviewget, ...
- var mockServer = testUtilsMock.addMockEnvironment(widget, params);
+ const mockServer = testUtilsMock.addMockEnvironment(widget, params);
if (!params.viewInfo) {
try {
params.viewInfo = testUtilsMock.fieldsViewGet(mockServer, params);
@@ -159,37 +158,35 @@ odoo.define('web.test_utils_create', function (require) {
}
}
- var viewOptions = _.defaults({}, params.viewOptions, {
+ const viewOptions = Object.assign({
context: params.context,
modelName: params.model,
searchMenuTypes: params.searchMenuTypes,
viewInfo: params.viewInfo,
- });
- var controlPanelView = new ControlPanelView(viewOptions);
- return controlPanelView.getController(widget).then(function (controlPanel) {
- // override the controlPanel's 'destroy' so that it calls 'destroy' on
- // the widget instead, as the widget is the parent of the controlPanel
- // and the mockServer.
- controlPanel.__destroy = controlPanel.destroy;
- controlPanel.destroy = function () {
- // remove the override to properly destroy the controlPanel and its
- // children when it will be called the second time (by its parent)
- delete controlPanel.destroy;
- widget.destroy();
- $webClient.remove();
- };
+ }, params.viewOptions);
+ const controlPanelView = new ControlPanelView(viewOptions);
+ const controlPanel = await controlPanelView.getController(widget);
+ // override the controlPanel's 'destroy' so that it calls 'destroy' on
+ // the widget instead, as the widget is the parent of the controlPanel
+ // and the mockServer.
+ controlPanel.__destroy = controlPanel.destroy;
+ controlPanel.destroy = function () {
+ // remove the override to properly destroy the controlPanel and its
+ // children when it will be called the second time (by its parent)
+ delete controlPanel.destroy;
+ widget.destroy();
+ $webClient.remove();
+ };
- // render the controlPanel in a fragment as it must be able to render
- // correctly without being in the DOM
- var fragment = document.createDocumentFragment();
- return controlPanel.appendTo(fragment).then(function () {
- dom.prepend($action, fragment, {
- callbacks: [{ widget: controlPanel }],
- in_DOM: true,
- });
- return controlPanel;
- });
+ // render the controlPanel in a fragment as it must be able to render
+ // correctly without being in the DOM
+ const fragment = document.createDocumentFragment();
+ await controlPanel.appendTo(fragment);
+ dom.prepend($action, fragment, {
+ callbacks: [{ widget: controlPanel }],
+ in_DOM: true,
});
+ return controlPanel;
}
/**
@@ -197,39 +194,39 @@ 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}
*/
- var createDebugManager = function (params) {
- params = params || {};
- var mockRPC = params.mockRPC;
- _.extend(params, {
- mockRPC: function (route, args) {
+ function createDebugManager(params = {}) {
+ const mockRPC = params.mockRPC;
+ Object.assign(params, {
+ async mockRPC(route, args) {
if (args.method === 'check_access_rights') {
- return Promise.resolve(true);
+ return true;
}
if (args.method === 'xmlid_to_res_id') {
- return Promise.resolve(true);
+ return true;
}
if (mockRPC) {
return mockRPC.apply(this, arguments);
}
- return this._super.apply(this, arguments);
+ return this._super(...arguments);
},
session: {
- user_has_group: function (group) {
+ async user_has_group(group) {
if (group === 'base.group_no_one') {
- return Promise.resolve(true);
+ return true;
}
- return this._super.apply(this, arguments);
+ return this._super(...arguments);
},
},
});
- var debugManager = new DebugManager();
+ const debugManager = new DebugManager();
testUtilsMock.addMockEnvironment(debugManager, params);
return debugManager;
- };
+ }
/**
- * create a model from given parameters.
+ * Create a model from given parameters.
*
* @param {Object} params This object will be given to addMockEnvironment, so
* any parameters from that method applies
@@ -237,9 +234,9 @@ odoo.define('web.test_utils_create', function (require) {
* @returns {Model}
*/
function createModel(params) {
- var widget = new Widget();
+ const widget = new Widget();
- var model = new params.Model(widget);
+ const model = new params.Model(widget);
testUtilsMock.addMockEnvironment(widget, params);
@@ -256,20 +253,20 @@ odoo.define('web.test_utils_create', function (require) {
}
/**
- * create a widget parent from given parameters.
+ * Create a widget parent from given parameters.
*
* @param {Object} params This object will be given to addMockEnvironment, so
* any parameters from that method applies
* @returns {Widget}
*/
function createParent(params) {
- var widget = new Widget();
+ const widget = new Widget();
testUtilsMock.addMockEnvironment(widget, params);
return widget;
}
/**
- * create a view from various parameters. Here, a view means a javascript
+ * Create a view from various parameters. Here, a view means a javascript
* instance of an AbstractView class, such as a form view, a list view or a
* kanban view.
*
@@ -291,37 +288,42 @@ odoo.define('web.test_utils_create', function (require) {
* Note that this is particularly useful if you want to intercept events going
* up in the init process of the view, because there are no other way to do it
* after this method returns
- * @param {Boolean} [params.doNotDisableAHref=false] will not preventDefault on the A elements of the view if true.
+ * @param {Boolean} [params.doNotDisableAHref=false] will not preventDefault on the A elements of the view if true.
* Default is false.
- * @returns {Promise<AbstractController>} resolves with the instance of the view
+ * @returns {Promise<AbstractController>} the instance of the view
*/
async function createView(params) {
const target = prepareTarget(params.debug);
- var widget = new Widget();
+ const widget = new Widget();
// reproduce the DOM environment of views
- var $webClient = $('<div>').addClass('o_web_client').prependTo(target);
- var $actionManager = $('<div>').addClass('o_action_manager').appendTo($webClient);
-
+ const webClient = Object.assign(document.createElement('div'), {
+ className: 'o_web_client',
+ });
+ const actionManager = Object.assign(document.createElement('div'), {
+ className: 'o_action_manager',
+ });
+ target.prepend(webClient);
+ webClient.append(actionManager);
// add mock environment: mock server, session, fieldviewget, ...
- var mockServer = testUtilsMock.addMockEnvironment(widget, params);
- var viewInfo = testUtilsMock.fieldsViewGet(mockServer, params);
+ const mockServer = testUtilsMock.addMockEnvironment(widget, params);
+ const viewInfo = testUtilsMock.fieldsViewGet(mockServer, params);
// create the view
- var View = params.View;
- var viewOptions = _.defaults({}, params.viewOptions, {
+ const View = params.View;
+ const viewOptions = Object.assign({
modelName: params.model || 'foo',
ids: 'res_id' in params ? [params.res_id] : undefined,
currentId: 'res_id' in params ? params.res_id : undefined,
domain: params.domain || [],
context: params.context || {},
hasSidebar: false,
- });
+ }, params.viewOptions);
// patch the View to handle the groupBy given in params, as we can't give it
// in init (unlike the domain and context which can be set in the action)
testUtilsMock.patch(View, {
- _updateMVCParams: function () {
- this._super.apply(this, arguments);
+ _updateMVCParams() {
+ this._super(...arguments);
this.loadParams.groupedBy = params.groupBy || viewOptions.groupBy || [];
testUtilsMock.unpatch(View);
},
@@ -330,7 +332,7 @@ odoo.define('web.test_utils_create', function (require) {
viewOptions.hasSelectors = params.hasSelectors;
}
- var view;
+ let view;
if (viewInfo.type === 'controlpanel' || viewInfo.type === 'search') {
// TODO: probably needs to create an helper just for that
view = new params.View({
@@ -347,42 +349,40 @@ odoo.define('web.test_utils_create', function (require) {
}
if (params.interceptsPropagate) {
- _.each(params.interceptsPropagate, function (cb, name) {
- testUtilsMock.intercept(widget, name, cb, true);
- });
+ for (const name in params.interceptsPropagate) {
+ testUtilsMock.intercept(widget, name, params.interceptsPropagate[name], true);
+ }
}
- return view.getController(widget).then(function (view) {
- // override the view's 'destroy' so that it calls 'destroy' on the widget
- // instead, as the widget is the parent of the view and the mockServer.
- view.__destroy = view.destroy;
- view.destroy = function () {
- // remove the override to properly destroy the view and its children
- // when it will be called the second time (by its parent)
- delete view.destroy;
- widget.destroy();
- $webClient.remove();
- };
+ const viewController = await view.getController(widget);
+ // override the view's 'destroy' so that it calls 'destroy' on the widget
+ // instead, as the widget is the parent of the view and the mockServer.
+ viewController.__destroy = viewController.destroy;
+ viewController.destroy = function () {
+ // remove the override to properly destroy the viewController and its children
+ // when it will be called the second time (by its parent)
+ delete viewController.destroy;
+ widget.destroy();
+ webClient.remove();
+ };
- // render the view in a fragment as they must be able to render correctly
- // without being in the DOM
- var fragment = document.createDocumentFragment();
- return view.appendTo(fragment).then(() => {
- dom.prepend($actionManager, fragment, {
- callbacks: [{ widget: view }],
- in_DOM: true,
- });
+ // render the viewController in a fragment as they must be able to render correctly
+ // without being in the DOM
+ const fragment = document.createDocumentFragment();
+ await viewController.appendTo(fragment);
+ dom.prepend(actionManager, fragment, {
+ callbacks: [{ widget: viewController }],
+ in_DOM: true,
+ });
- if (!params.doNotDisableAHref) {
- [...view.el.getElementsByTagName('A')].forEach((elem) => {
- elem.addEventListener('click', (ev) => {
- ev.preventDefault();
- });
- });
- }
- return view;
+ if (!params.doNotDisableAHref) {
+ [...viewController.el.getElementsByTagName('A')].forEach(elem => {
+ elem.addEventListener('click', ev => {
+ ev.preventDefault();
+ });
});
- });
+ }
+ return viewController;
}
/**
@@ -395,17 +395,17 @@ odoo.define('web.test_utils_create', function (require) {
*/
function prepareTarget(debug = false) {
document.body.classList.toggle('debug', debug);
- return debug ? document.body : document.querySelector("#qunit-fixture");
+ return debug ? document.body : document.getElementById('qunit-fixture');
}
return {
- createActionManager: createActionManager,
- createCalendarView: createCalendarView,
- createControlPanel: createControlPanel,
- createDebugManager: createDebugManager,
- createModel: createModel,
- createParent: createParent,
- createView: createView,
- prepareTarget: prepareTarget,
+ createActionManager,
+ createCalendarView,
+ createControlPanel,
+ createDebugManager,
+ createModel,
+ createParent,
+ createView,
+ prepareTarget,
};
});