/** @odoo-module */ import { click, editInput, makeDeferred, nextTick, patchWithCleanup, triggerEvent } from "@web/../tests/helpers/utils"; import { EmbeddedViewBehavior } from "@knowledge/components/behaviors/embedded_view_behavior/embedded_view_behavior"; import { EmbeddedViewManager } from "@knowledge/components/behaviors/embedded_view_behavior/embedded_view_manager"; import { makeView, setupViewRegistries } from "@web/../tests/views/helpers"; import { HtmlField } from "@web_editor/js/backend/html_field"; import { onMounted } from "@odoo/owl"; let serverData; let htmlFieldReadyPromise; let embedMountedPromise; /** * Insert an embedded kanban view inside a Knowledge article * @param {HTMLElement} htmlField - Object HtmlField of Knowledge * @param {HTMLElement} action - Server action used for the embed */ const insertKanbanEmbed = async (htmlField, action) => { const wysiwyg = htmlField.wysiwyg; wysiwyg.odooEditor.observerUnactive(); await wysiwyg._insertEmbeddedView(null, action, 'kanban', 'External Kanban'); await htmlFieldReadyPromise; await htmlField.mountBehaviors(); wysiwyg.odooEditor.observerActive(); await nextTick(); }; /** * This module is testing that the hotkey service works as intended when we have an external embed. * This means that when, e.g., when pressing the 'Enter' key inside the embed should have no impact * on the article. Pressing 'Enter' inside the article should also not trigger an event inside * the embedded view. * Testing ensures us that the hotkey service still works as intended inside Knowledge, if not we * would need to change its use for embedded views. */ QUnit.module("Knowledge External Embeds Tests", (hooks) => { hooks.beforeEach(() => { htmlFieldReadyPromise = makeDeferred(); embedMountedPromise = makeDeferred(); patchWithCleanup(HtmlField.prototype, { async startWysiwyg() { await super.startWysiwyg(...arguments); htmlFieldReadyPromise.resolve(this); } }); patchWithCleanup(EmbeddedViewBehavior.prototype, { async setup() { super.setup(...arguments); await this.loadData(); this.state.waiting = false; }, // Override intersection observer for testing. async setupIntersectionObserver() { await this.loadData(); this.state.waiting = false; } }); patchWithCleanup(EmbeddedViewManager.prototype, { setup() { super.setup(...arguments); onMounted(() => { embedMountedPromise.resolve(); }); }, }); serverData = { models: { knowledge_article: { fields: { display_name: {string: "Displayed name", type: "char"}, full_width: {string: "Is Full Width ?", type: "boolean"}, body: {string: "Body", type: 'html'}, }, records: [{ id: 1, display_name: "My Article", body: `