Files
odoo_source/addons/mail/static/tests/helpers/webclient_setup.js
T
2022-11-14 16:21:39 +01:00

159 lines
5.7 KiB
JavaScript

/** @odoo-module **/
import { busService } from "@bus/services/bus_service";
import { imStatusService } from "@bus/im_status_service";
import { multiTabService } from "@bus/multi_tab_service";
import { makeMultiTabToLegacyEnv } from "@bus/services/legacy/make_multi_tab_to_legacy_env";
import { makeBusServiceToLegacyEnv } from "@bus/services/legacy/make_bus_service_to_legacy_env";
import { makeFakePresenceService } from "@bus/../tests/helpers/mock_services";
import { ChatWindowManagerContainer } from "@mail/components/chat_window_manager_container/chat_window_manager_container";
import { DialogManagerContainer } from "@mail/components/dialog_manager_container/dialog_manager_container";
import { DiscussContainer } from "@mail/components/discuss_container/discuss_container";
import { PopoverManagerContainer } from "@mail/components/popover_manager_container/popover_manager_container";
import { messagingService } from "@mail/services/messaging_service";
import { systrayService } from "@mail/services/systray_service";
import { makeMessagingToLegacyEnv } from "@mail/utils/make_messaging_to_legacy_env";
import { registry } from "@web/core/registry";
import { patchWithCleanup } from "@web/../tests/helpers/utils";
import { createWebClient } from "@web/../tests/webclient/helpers";
const ROUTES_TO_IGNORE = [
"/web/webclient/load_menus",
"/web/dataset/call_kw/res.users/load_views",
"/web/dataset/call_kw/res.users/systray_get_activities",
];
const WEBCLIENT_PARAMETER_NAMES = new Set([
"legacyParams",
"mockRPC",
"serverData",
"target",
"webClientClass",
]);
const SERVICES_PARAMETER_NAMES = new Set([
"legacyServices",
"loadingBaseDelayDuration",
"messagingBeforeCreationDeferred",
"messagingBus",
"services",
]);
/**
* Add required components to the main component registry.
*/
function setupMainComponentRegistry() {
const mainComponentRegistry = registry.category("main_components");
mainComponentRegistry.add("ChatWindowManagerContainer", {
Component: ChatWindowManagerContainer,
});
mainComponentRegistry.add("DialogManagerContainer", { Component: DialogManagerContainer });
registry.category("actions").add("mail.action_discuss", DiscussContainer);
mainComponentRegistry.add("PopoverManagerContainer", { Component: PopoverManagerContainer });
}
/**
* Setup both legacy and new service registries.
*
* @param {Object} param0
* @param {Object} [param0.services]
* @param {number} [param0.loadingBaseDelayDuration=0]
* @param {Promise} [param0.messagingBeforeCreationDeferred=Promise.resolve()]
* Deferred that let tests block messaging creation and simulate resolution.
* Useful for testing components behavior when messaging is not yet created.
* @param {EventBus} [param0.messagingBus]
* @returns {LegacyRegistry} The registry containing all the legacy services that will be passed
* to the webClient as a legacy parameter.
*/
function setupMessagingServiceRegistries({
loadingBaseDelayDuration = 0,
messagingBeforeCreationDeferred = Promise.resolve(),
messagingBus,
services,
}) {
const serviceRegistry = registry.category("services");
patchWithCleanup(messagingService, {
async _startModelManager(modelManager, messagingValues) {
modelManager.isDebug = true;
const _super = this._super.bind(this);
await messagingBeforeCreationDeferred;
return _super(modelManager, messagingValues);
},
});
const messagingValues = {
start() {
return {
isInQUnitTest: true,
disableAnimation: true,
loadingBaseDelayDuration,
messagingBus,
userNotificationManager: { canPlayAudio: false },
};
},
};
services = {
bus_service: busService,
im_status: imStatusService,
messaging: messagingService,
messagingValues,
presence: makeFakePresenceService({
isOdooFocused: () => true,
}),
systrayService,
multi_tab: multiTabService,
...services,
};
Object.entries(services).forEach(([serviceName, service]) => {
serviceRegistry.add(serviceName, service);
});
registry
.category("wowlToLegacyServiceMappers")
.add("bus_service_to_legacy_env", makeBusServiceToLegacyEnv);
registry
.category("wowlToLegacyServiceMappers")
.add("multi_tab_to_legacy_env", makeMultiTabToLegacyEnv);
registry
.category("wowlToLegacyServiceMappers")
.add("messaging_service_to_legacy_env", makeMessagingToLegacyEnv);
}
/**
* Creates a properly configured instance of WebClient, with the messaging service and all it's
* dependencies initialized.
*
* @param {Object} param0
* @param {Object} [param0.serverData]
* @param {Object} [param0.services]
* @param {Object} [param0.loadingBaseDelayDuration]
* @param {Object} [param0.messagingBeforeCreationDeferred]
* @param {EventBus} [param0.messagingBus] The event bus to be used by messaging.
* @returns {WebClient}
*/
async function getWebClientReady(param0) {
setupMainComponentRegistry();
const servicesParameters = {};
const param0Entries = Object.entries(param0);
for (const [parameterName, value] of param0Entries) {
if (SERVICES_PARAMETER_NAMES.has(parameterName)) {
servicesParameters[parameterName] = value;
}
}
setupMessagingServiceRegistries(servicesParameters);
const webClientParameters = {};
for (const [parameterName, value] of param0Entries) {
if (WEBCLIENT_PARAMETER_NAMES.has(parameterName)) {
webClientParameters[parameterName] = value;
}
}
return createWebClient(webClientParameters);
}
export { getWebClientReady, ROUTES_TO_IGNORE };