From 4dc2b2e5397aaac9847241941bf1e1da7ac83932 Mon Sep 17 00:00:00 2001 From: "Michael (mcm)" Date: Fri, 25 Feb 2022 09:14:40 +0000 Subject: [PATCH] [REF] web: use LegacyComponent This commit replaces Component by LegacyComponent when the component uses removed features from owl 1 like getting its `el` or `trigger` an event. Some tests are updated to have less LegacyComponent. Part-of: odoo/odoo#85389 --- .../src/core/commands/default_providers.js | 3 +- .../static/src/core/datepicker/datepicker.js | 3 +- addons/web/static/src/core/dialog/dialog.js | 3 +- .../web/static/src/core/dropdown/dropdown.js | 26 +- .../web/static/src/core/dropdown/dropdown.xml | 1 + .../static/src/core/dropdown/dropdown_item.js | 3 +- .../static/src/core/effects/rainbow_man.js | 3 +- .../static/src/core/file_input/file_input.js | 3 +- .../src/core/main_components_container.js | 2 +- addons/web/static/src/core/popover/popover.js | 2 +- .../web/static/src/core/popover/popover.xml | 1 + .../static/src/core/position/position_hook.js | 9 +- addons/web/static/src/core/ui/ui_service.js | 9 +- .../src/legacy/js/components/action_menus.js | 3 +- .../legacy/js/components/custom_checkbox.js | 3 +- .../legacy/js/components/custom_file_input.js | 3 +- .../src/legacy/js/components/datepicker.js | 3 +- .../src/legacy/js/components/dropdown_menu.js | 3 +- .../js/components/dropdown_menu_item.js | 3 +- .../static/src/legacy/js/components/pager.js | 3 +- .../js/control_panel/comparison_menu.js | 3 +- .../legacy/js/control_panel/control_panel.js | 3 +- .../js/control_panel/custom_favorite_item.js | 3 +- .../js/control_panel/custom_filter_item.js | 3 +- .../legacy/js/control_panel/favorite_menu.js | 3 +- .../legacy/js/control_panel/filter_menu.js | 3 +- .../legacy/js/control_panel/groupby_menu.js | 3 +- .../src/legacy/js/control_panel/search_bar.js | 3 +- .../static/src/legacy/js/core/owl_dialog.js | 3 +- .../web/static/src/legacy/js/core/popover.js | 3 +- .../legacy/js/fields/abstract_field_owl.js | 3 +- .../static/src/legacy/js/owl_compatibility.js | 6 +- .../legacy/js/views/abstract_renderer_owl.js | 3 +- .../legacy/js/views/pivot/pivot_renderer.js | 3 +- .../src/legacy/js/views/search_panel.js | 3 +- .../static/src/legacy/js/widgets/week_days.js | 3 +- .../src/legacy/legacy_client_actions.js | 3 +- addons/web/static/src/legacy/legacy_views.js | 3 +- .../static/src/legacy/systray_menu_item.js | 6 +- .../group_by_menu/custom_group_by_item.js | 3 +- .../src/search/search_bar/search_bar.js | 3 +- .../src/search/search_panel/search_panel.js | 4 +- .../src/search/with_search/with_search.js | 3 +- .../static/src/views/graph/graph_renderer.js | 3 +- .../web/static/src/views/graph/graph_view.js | 3 +- addons/web/static/src/views/layout.js | 3 +- .../web/static/src/views/onboarding_banner.js | 3 +- .../static/src/views/pivot/pivot_renderer.js | 3 +- .../web/static/src/views/pivot/pivot_view.js | 3 +- addons/web/static/src/views/view.js | 3 +- .../web/static/src/webclient/navbar/navbar.js | 3 +- .../switch_company_menu.js | 3 +- .../web/static/tests/core/checkbox_tests.js | 7 +- .../core/commands/command_service_tests.js | 29 +- .../web/static/tests/core/datepicker_tests.js | 80 +- .../tests/core/debug/debug_manager_tests.js | 28 +- addons/web/static/tests/core/dialog_tests.js | 21 +- .../web/static/tests/core/dropdown_tests.js | 334 +++---- .../core/effects/effect_service_tests.js | 5 +- .../tests/core/errors/error_service_tests.js | 7 +- .../core/hotkeys/hotkey_service_tests.js | 20 +- .../tests/core/l10n/translation_tests.js | 4 +- .../core/main_components_container_tests.js | 31 +- .../tests/core/network/rpc_service_tests.js | 5 +- addons/web/static/tests/core/pager_tests.js | 76 +- .../core/popover/popover_service_tests.js | 4 +- .../static/tests/core/position_hook_tests.js | 43 +- .../tests/core/scroller_service_tests.js | 6 +- .../core/tooltip/tooltip_service_tests.js | 68 +- .../web/static/tests/core/ui_service_tests.js | 22 +- .../static/tests/core/utils/hooks_tests.js | 17 +- .../tests/legacy/component_extension_tests.js | 17 +- .../legacy/components/dropdown_menu_tests.js | 5 +- .../tests/legacy/components/pager_tests.js | 3 +- .../control_panel/custom_filter_item_tests.js | 242 ++--- .../tests/legacy/core/owl_dialog_tests.js | 15 +- .../static/tests/legacy/core/popover_tests.js | 13 +- .../tests/legacy/helpers/test_utils_create.js | 5 +- .../tests/legacy/owl_compatibility_tests.js | 85 +- .../tests/legacy/views/basic_view_tests.js | 3 +- .../static/tests/legacy/views/form_tests.js | 3 +- .../static/tests/legacy/views/kanban_tests.js | 3 +- .../static/tests/legacy/views/list_tests.js | 3 +- .../tests/legacy/views/state_mapping_tests.js | 3 +- .../tests/search/comparison_menu_tests.js | 70 +- .../web/static/tests/search/control_panel.js | 36 +- .../search/custom_favorite_item_tests.js | 111 ++- .../tests/search/custom_filter_item_tests.js | 284 +++--- .../search/custom_group_by_item_tests.js | 68 +- .../tests/search/favorite_menu_tests.js | 45 +- .../static/tests/search/filter_menu_tests.js | 88 +- .../tests/search/group_by_menu_tests.js | 206 +++-- .../static/tests/search/pager_hook_tests.js | 32 +- .../static/tests/search/search_bar_tests.js | 234 +++-- .../static/tests/search/search_panel_tests.js | 872 +++++++++--------- .../static/tests/search/with_search_tests.js | 27 +- addons/web/static/tests/views/layout_tests.js | 79 +- addons/web/static/tests/views/view_tests.js | 236 +++-- .../webclient/actions/client_action_tests.js | 9 +- .../webclient/actions/concurrency_tests.js | 5 +- .../webclient/actions/error_handling_tests.js | 5 +- .../webclient/actions/load_state_tests.js | 7 +- .../webclient/actions/push_state_tests.js | 7 +- .../tests/webclient/actions/target_tests.js | 7 +- addons/web/static/tests/webclient/helpers.js | 3 +- .../static/tests/webclient/navbar_tests.js | 11 +- .../webclient/switch_company_menu_tests.js | 133 +-- .../static/tests/webclient/user_menu_tests.js | 35 +- .../static/tests/webclient/webclient_tests.js | 5 +- 109 files changed, 2084 insertions(+), 1930 deletions(-) diff --git a/addons/web/static/src/core/commands/default_providers.js b/addons/web/static/src/core/commands/default_providers.js index 7c7398ab4a3..a35be087e8f 100644 --- a/addons/web/static/src/core/commands/default_providers.js +++ b/addons/web/static/src/core/commands/default_providers.js @@ -7,6 +7,7 @@ import { registry } from "@web/core/registry"; import { capitalize } from "@web/core/utils/strings"; import { getVisibleElements } from "@web/core/utils/ui"; import { DefaultCommandItem } from "./command_palette"; +import { LegacyComponent } from "@web/legacy/legacy_component"; const { Component } = owl; @@ -15,7 +16,7 @@ commandSetupRegistry.add("default", { emptyMessage: _lt("No command found"), }); -export class HotkeyCommandItem extends Component { +export class HotkeyCommandItem extends LegacyComponent { setup() { useHotkey(this.props.hotkey, () => { this.trigger("execute-command"); diff --git a/addons/web/static/src/core/datepicker/datepicker.js b/addons/web/static/src/core/datepicker/datepicker.js index 7ca09fd6655..4851e053870 100644 --- a/addons/web/static/src/core/datepicker/datepicker.js +++ b/addons/web/static/src/core/datepicker/datepicker.js @@ -3,6 +3,7 @@ import { localization } from "@web/core/l10n/localization"; import { registry } from "@web/core/registry"; import { useAutofocus } from "@web/core/utils/hooks"; +import { LegacyComponent } from "@web/legacy/legacy_component"; const { Component, @@ -49,7 +50,7 @@ const luxonFormatToMomentFormat = (format) => { * stringified since tempusdominus only works with moment objects. * @extends Component */ -export class DatePicker extends Component { +export class DatePicker extends LegacyComponent { setup() { this.inputRef = useRef("input"); this.state = useState({ warning: false }); diff --git a/addons/web/static/src/core/dialog/dialog.js b/addons/web/static/src/core/dialog/dialog.js index 0b595e8660d..69e2ab772b5 100644 --- a/addons/web/static/src/core/dialog/dialog.js +++ b/addons/web/static/src/core/dialog/dialog.js @@ -2,10 +2,11 @@ import { useHotkey } from "@web/core/hotkeys/hotkey_hook"; import { useActiveElement } from "../ui/ui_service"; +import { LegacyComponent } from "@web/legacy/legacy_component"; const { Component, useRef, useChildSubEnv, xml } = owl; -export class Dialog extends Component { +export class Dialog extends LegacyComponent { setup() { if (this.constructor === Dialog) { throw new Error( diff --git a/addons/web/static/src/core/dropdown/dropdown.js b/addons/web/static/src/core/dropdown/dropdown.js index b9fd9724d67..fe4c6eeb717 100644 --- a/addons/web/static/src/core/dropdown/dropdown.js +++ b/addons/web/static/src/core/dropdown/dropdown.js @@ -4,6 +4,7 @@ import { useBus, useService } from "@web/core/utils/hooks"; import { usePosition } from "../position/position_hook"; import { useDropdownNavigation } from "./dropdown_navigation_hook"; import { localization } from "../l10n/localization"; +import { LegacyComponent } from "@web/legacy/legacy_component"; const { Component, @@ -40,12 +41,13 @@ export const DROPDOWN = Symbol("Dropdown"); /** * @extends Component */ -export class Dropdown extends Component { +export class Dropdown extends LegacyComponent { setup() { this.state = useState({ open: this.props.startOpen, groupIsOpen: this.props.startOpen, }); + this.rootRef = useRef("root"); // Set up beforeOpen --------------------------------------------------- onWillStart(() => { @@ -105,10 +107,7 @@ export class Dropdown extends Component { } position = [direction, variant].join("-"); } - const positioningOptions = { - popper: "menuRef", - position, - }; + const positioningOptions = { position }; this.directionCaretClass = DIRECTION_CARET_CLASS[direction]; this.togglerRef = useRef("togglerRef"); if (this.props.toggler === "parent") { @@ -116,26 +115,26 @@ export class Dropdown extends Component { useEffect( () => { const onClick = (ev) => { - if (this.el.contains(ev.target)) { + if (this.rootRef.el.contains(ev.target)) { // ignore clicks inside the dropdown return; } this.toggle(); }; - this.el.parentElement.addEventListener("click", onClick); + this.rootRef.el.parentElement.addEventListener("click", onClick); return () => { - this.el.parentElement.removeEventListener("click", onClick); + this.rootRef.el.parentElement.removeEventListener("click", onClick); }; }, () => [] ); // Position menu relatively to parent element - usePosition(() => this.el.parentElement, positioningOptions); + usePosition(() => this.rootRef.el.parentElement, "menuRef", positioningOptions); } else { // Position menu relatively to inner toggler const togglerRef = useRef("togglerRef"); - usePosition(() => togglerRef.el, positioningOptions); + usePosition(() => togglerRef.el, "menuRef", positioningOptions); } } @@ -211,13 +210,13 @@ export class Dropdown extends Component { * @param {DropdownStateChangedPayload} args */ onDropdownStateChanged(args) { - if (this.el.contains(args.emitter.el)) { + if (this.rootRef.el.contains(args.emitter.rootRef.el)) { // Do not listen to events emitted by self or children return; } // Emitted by direct siblings ? - if (args.emitter.el.parentElement === this.el.parentElement) { + if (args.emitter.rootRef.el.parentElement === this.rootRef.el.parentElement) { // Sync the group status this.state.groupIsOpen = args.newState.groupIsOpen; @@ -266,7 +265,8 @@ export class Dropdown extends Component { } // Close if we clicked outside the dropdown, or outside the parent // element if it is the toggler - const rootEl = this.props.toggler === "parent" ? this.el.parentElement : this.el; + const rootEl = + this.props.toggler === "parent" ? this.rootRef.el.parentElement : this.rootRef.el; const gotClickedInside = rootEl.contains(ev.target); if (!gotClickedInside) { this.close(); diff --git a/addons/web/static/src/core/dropdown/dropdown.xml b/addons/web/static/src/core/dropdown/dropdown.xml index 611852f3f0a..7d8021175a8 100644 --- a/addons/web/static/src/core/dropdown/dropdown.xml +++ b/addons/web/static/src/core/dropdown/dropdown.xml @@ -10,6 +10,7 @@ {{ state.open ? 'show' : ''}} {{ !parentDropdown ? 'o-dropdown--no-caret' : '' }} " + t-ref="root" > `; - class Parent extends Component { + class Parent extends LegacyComponent { setup() { super.setup(); this.state = useState({ @@ -202,7 +203,7 @@ QUnit.module("Components", (hooks) => { QUnit.test("embed an arbitrary component in a dialog is possible", async function (assert) { assert.expect(6); - class SubComponent extends Component { + class SubComponent extends LegacyComponent { _onClick() { assert.step("subcomponent-clicked"); this.props.onClicked(); @@ -211,7 +212,7 @@ QUnit.module("Components", (hooks) => { SubComponent.template = xml`
`; - class Parent extends Component { + class Parent extends LegacyComponent { _onSubcomponentClicked() { assert.step("message received by parent"); } @@ -233,7 +234,7 @@ QUnit.module("Components", (hooks) => { QUnit.test("dialog without header/footer", async function (assert) { assert.expect(4); - class Parent extends Component {} + class Parent extends LegacyComponent {} Parent.template = xml` `; @@ -248,7 +249,7 @@ QUnit.module("Components", (hooks) => { QUnit.test("dialog size can be chosen", async function (assert) { assert.expect(5); - class Parent extends Component {} + class Parent extends LegacyComponent {} Parent.template = xml`
@@ -280,7 +281,7 @@ QUnit.module("Components", (hooks) => { QUnit.test("dialog can be rendered on fullscreen", async function (assert) { assert.expect(2); - class Parent extends Component {} + class Parent extends LegacyComponent {} Parent.template = xml`
`; @@ -293,7 +294,7 @@ QUnit.module("Components", (hooks) => { QUnit.test("can be the UI active element", async function (assert) { assert.expect(3); - class Parent extends Component { + class Parent extends LegacyComponent { setup() { this.ui = useService("ui"); this.modal = null; diff --git a/addons/web/static/tests/core/dropdown_tests.js b/addons/web/static/tests/core/dropdown_tests.js index 45406ba9ae1..321766b4f5a 100644 --- a/addons/web/static/tests/core/dropdown_tests.js +++ b/addons/web/static/tests/core/dropdown_tests.js @@ -24,7 +24,6 @@ const { App, Component, xml } = owl; const serviceRegistry = registry.category("services"); let env; -let parent; let target; QUnit.module("Components", ({ beforeEach }) => { @@ -45,13 +44,13 @@ QUnit.module("Components", ({ beforeEach }) => { Parent.template = xml``; Parent.components = { Dropdown }; env = await makeTestEnv(); - parent = await mount(Parent, target, { env }); + await mount(Parent, target, { env }); assert.strictEqual( - parent.el.outerHTML, + target.querySelector(".dropdown").outerHTML, '' ); - assert.containsOnce(parent.el, "button.dropdown-toggle"); - assert.containsNone(parent.el, ".dropdown-menu"); + assert.containsOnce(target, "button.dropdown-toggle"); + assert.containsNone(target, ".dropdown-menu"); }); QUnit.test("DropdownItem can be rendered as ", async (assert) => { @@ -59,8 +58,11 @@ QUnit.module("Components", ({ beforeEach }) => { Parent.template = xml`coucou`; Parent.components = { DropdownItem }; env = await makeTestEnv(); - parent = await mount(Parent, target, { env }); - assert.strictEqual(parent.el.outerHTML, 'coucou'); + await mount(Parent, target, { env }); + assert.strictEqual( + target.querySelector(".dropdown-item").outerHTML, + 'coucou' + ); }); QUnit.test("DropdownItem (with href prop) can be rendered as ", async (assert) => { @@ -68,8 +70,11 @@ QUnit.module("Components", ({ beforeEach }) => { Parent.template = xml`coucou`; Parent.components = { DropdownItem }; env = await makeTestEnv(); - parent = await mount(Parent, target, { env }); - assert.strictEqual(parent.el.outerHTML, 'coucou'); + await mount(Parent, target, { env }); + assert.strictEqual( + target.querySelector(".dropdown-item").outerHTML, + 'coucou' + ); }); QUnit.test("DropdownItem: prevents click default with href", async (assert) => { @@ -93,15 +98,15 @@ QUnit.module("Components", ({ beforeEach }) => { `; Parent.components = { Dropdown, DropdownItem }; env = await makeTestEnv(); - parent = await mount(Parent, target, { env }); + await mount(Parent, target, { env }); // The item containing the link class contains an href prop, // which will turn it into So it must be defaultPrevented // The other one not contain any href props, it must not be defaultPrevented, // so as not to prevent the background change flow for example - await click(parent.el, "button.dropdown-toggle"); - await click(parent.el, ".link"); - await click(parent.el, "button.dropdown-toggle"); - await click(parent.el, ".nolink"); + await click(target, "button.dropdown-toggle"); + await click(target, ".link"); + await click(target, "button.dropdown-toggle"); + await click(target, ".nolink"); }); QUnit.test("can be styled", async (assert) => { @@ -112,14 +117,14 @@ QUnit.module("Components", ({ beforeEach }) => { `; Parent.components = { Dropdown, DropdownItem }; env = await makeTestEnv(); - parent = await mount(Parent, target, { env }); - await click(parent.el, "button.dropdown-toggle"); - assert.hasClass(parent.el, "dropdown one"); - const toggler = parent.el.querySelector(".dropdown-toggle"); + await mount(Parent, target, { env }); + await click(target, "button.dropdown-toggle"); + assert.hasClass(target.querySelector(".o-dropdown"), "dropdown one"); + const toggler = target.querySelector(".dropdown-toggle"); assert.hasClass(toggler, "two"); - const menu = parent.el.querySelector(".dropdown-menu"); + const menu = target.querySelector(".dropdown-menu"); assert.hasClass(menu, "three"); - const item = parent.el.querySelector(".dropdown-item"); + const item = target.querySelector(".dropdown-item"); assert.hasClass(item, "four"); }); @@ -138,15 +143,15 @@ QUnit.module("Components", ({ beforeEach }) => { Parent.template = xml``; Parent.components = { Dropdown }; env = await makeTestEnv(); - parent = await mount(Parent, target, { env }); - await click(parent.el, "button.dropdown-toggle"); + await mount(Parent, target, { env }); + await click(target, "button.dropdown-toggle"); assert.verifySteps(["beforeOpen"]); - assert.containsNone(parent.el, ".dropdown-menu"); + assert.containsNone(target, ".dropdown-menu"); beforeOpenProm.resolve(); await nextTick(); - assert.containsOnce(parent.el, ".dropdown-menu"); - await click(parent.el, "button.dropdown-toggle"); - assert.containsNone(parent.el, ".dropdown-menu"); + assert.containsOnce(target, ".dropdown-menu"); + await click(target, "button.dropdown-toggle"); + assert.containsNone(target, ".dropdown-menu"); }); QUnit.test("initial open state can be true", async (assert) => { @@ -162,9 +167,9 @@ QUnit.module("Components", ({ beforeEach }) => { Parent.template = xml``; Parent.components = { Dropdown }; env = await makeTestEnv(); - parent = await mount(Parent, target, { env }); + await mount(Parent, target, { env }); assert.verifySteps(["beforeOpen"]); - assert.containsOnce(parent.el, ".dropdown-menu"); + assert.containsOnce(target, ".dropdown-menu"); }); QUnit.test("close on outside click", async (assert) => { @@ -177,11 +182,11 @@ QUnit.module("Components", ({ beforeEach }) => { `; Parent.components = { Dropdown }; env = await makeTestEnv(); - parent = await mount(Parent, target, { env }); - await click(parent.el, "button.dropdown-toggle"); - assert.containsOnce(parent.el, ".dropdown-menu"); - await click(parent.el, "div.outside"); - assert.containsNone(parent.el, ".dropdown-menu"); + await mount(Parent, target, { env }); + await click(target, "button.dropdown-toggle"); + assert.containsOnce(target, ".dropdown-menu"); + await click(target, "div.outside"); + assert.containsNone(target, ".dropdown-menu"); }); QUnit.test("close on item selection", async (assert) => { @@ -193,10 +198,10 @@ QUnit.module("Components", ({ beforeEach }) => { `; Parent.components = { Dropdown, DropdownItem }; env = await makeTestEnv(); - parent = await mount(Parent, target, { env }); - await click(parent.el, "button.dropdown-toggle"); - await click(parent.el, ".dropdown-menu .dropdown-item"); - assert.containsNone(parent.el, ".dropdown-menu"); + await mount(Parent, target, { env }); + await click(target, "button.dropdown-toggle"); + await click(target, ".dropdown-menu .dropdown-item"); + assert.containsNone(target, ".dropdown-menu"); }); QUnit.test("payload received on item selection", async (assert) => { @@ -212,9 +217,9 @@ QUnit.module("Components", ({ beforeEach }) => { `; Parent.components = { Dropdown, DropdownItem }; env = await makeTestEnv(); - parent = await mount(Parent, target, { env }); - await click(parent.el, "button.dropdown-toggle"); - await click(parent.el, ".dropdown-menu .dropdown-item"); + await mount(Parent, target, { env }); + await click(target, "button.dropdown-toggle"); + await click(target, ".dropdown-menu .dropdown-item"); }); QUnit.test("multi-level dropdown: can be rendered and toggled", async (assert) => { @@ -228,11 +233,11 @@ QUnit.module("Components", ({ beforeEach }) => { `; Parent.components = { Dropdown }; env = await makeTestEnv(); - parent = await mount(Parent, target, { env }); - await click(parent.el, "button.dropdown-toggle:last-child"); - await mouseEnter(parent.el, "button.dropdown-toggle:last-child"); - await mouseEnter(parent.el, "button.dropdown-toggle:last-child"); - assert.containsN(parent.el, ".dropdown-menu", 3); + await mount(Parent, target, { env }); + await click(target, "button.dropdown-toggle:last-child"); + await mouseEnter(target, "button.dropdown-toggle:last-child"); + await mouseEnter(target, "button.dropdown-toggle:last-child"); + assert.containsN(target, ".dropdown-menu", 3); }); QUnit.test("multi-level dropdown: initial open state can be true", async (assert) => { @@ -246,8 +251,8 @@ QUnit.module("Components", ({ beforeEach }) => { `; Parent.components = { Dropdown }; env = await makeTestEnv(); - parent = await mount(Parent, target, { env }); - assert.containsN(parent.el, ".dropdown-menu", 3); + await mount(Parent, target, { env }); + assert.containsN(target, ".dropdown-menu", 3); }); QUnit.test("multi-level dropdown: close on outside click", async (assert) => { @@ -264,13 +269,13 @@ QUnit.module("Components", ({ beforeEach }) => { `; Parent.components = { Dropdown }; env = await makeTestEnv(); - parent = await mount(Parent, target, { env }); - await click(parent.el, "button.dropdown-toggle:last-child"); - await mouseEnter(parent.el, "button.dropdown-toggle:last-child"); - await mouseEnter(parent.el, "button.dropdown-toggle:last-child"); - assert.containsN(parent.el, ".dropdown-menu", 3); - await click(parent.el, "div.outside"); - assert.containsNone(parent.el, ".dropdown-menu"); + await mount(Parent, target, { env }); + await click(target, "button.dropdown-toggle:last-child"); + await mouseEnter(target, "button.dropdown-toggle:last-child"); + await mouseEnter(target, "button.dropdown-toggle:last-child"); + assert.containsN(target, ".dropdown-menu", 3); + await click(target, "div.outside"); + assert.containsNone(target, ".dropdown-menu"); }); QUnit.test("multi-level dropdown: close on item selection", async (assert) => { @@ -284,18 +289,15 @@ QUnit.module("Components", ({ beforeEach }) => { `; Parent.components = { Dropdown, DropdownItem }; env = await makeTestEnv(); - parent = await mount(Parent, target, { env }); - await click(parent.el, "button.dropdown-toggle:last-child"); - await mouseEnter(parent.el, "button.dropdown-toggle:last-child"); - assert.containsN(parent.el, ".dropdown-menu", 2); - assert.containsN(parent.el, ".dropdown-item", 2); - assert.containsOnce( - parent.el, - ".dropdown-menu > .dropdown > .dropdown-toggle.dropdown-item" - ); - assert.containsOnce(parent.el, ".dropdown-menu > .dropdown-item"); - await click(parent.el, ".dropdown-menu > .dropdown-item"); - assert.containsNone(parent.el, ".dropdown-menu"); + await mount(Parent, target, { env }); + await click(target, "button.dropdown-toggle:last-child"); + await mouseEnter(target, "button.dropdown-toggle:last-child"); + assert.containsN(target, ".dropdown-menu", 2); + assert.containsN(target, ".dropdown-item", 2); + assert.containsOnce(target, ".dropdown-menu > .dropdown > .dropdown-toggle.dropdown-item"); + assert.containsOnce(target, ".dropdown-menu > .dropdown-item"); + await click(target, ".dropdown-menu > .dropdown-item"); + assert.containsNone(target, ".dropdown-menu"); }); QUnit.test("multi-level dropdown: parent closing modes on item selection", async (assert) => { @@ -312,30 +314,30 @@ QUnit.module("Components", ({ beforeEach }) => { `; Parent.components = { Dropdown, DropdownItem }; env = await makeTestEnv(); - parent = await mount(Parent, target, { env }); + await mount(Parent, target, { env }); // Open the 2-level dropdowns - await click(parent.el, "button.dropdown-toggle:last-child"); - await mouseEnter(parent.el, "button.dropdown-toggle:last-child"); - assert.containsN(parent.el, ".dropdown-menu", 2); + await click(target, "button.dropdown-toggle:last-child"); + await mouseEnter(target, "button.dropdown-toggle:last-child"); + assert.containsN(target, ".dropdown-menu", 2); // Select item (parentClosingMode=none) - await click(parent.el, ".item1"); - assert.containsN(parent.el, ".dropdown-menu", 2); + await click(target, ".item1"); + assert.containsN(target, ".dropdown-menu", 2); // Select item (parentClosingMode=closest) - await click(parent.el, ".item2"); - assert.containsN(parent.el, ".dropdown-menu", 1); + await click(target, ".item2"); + assert.containsN(target, ".dropdown-menu", 1); // Reopen second level dropdown - await mouseEnter(parent.el, "button.dropdown-toggle:last-child"); - assert.containsN(parent.el, ".dropdown-menu", 2); + await mouseEnter(target, "button.dropdown-toggle:last-child"); + assert.containsN(target, ".dropdown-menu", 2); // Select item (parentClosingMode=all) - await click(parent.el, ".item3"); - assert.containsNone(parent.el, ".dropdown-menu"); + await click(target, ".item3"); + assert.containsNone(target, ".dropdown-menu"); // Reopen the 2-level dropdowns - await click(parent.el, "button.dropdown-toggle:last-child"); - await mouseEnter(parent.el, "button.dropdown-toggle:last-child"); - assert.containsN(parent.el, ".dropdown-menu", 2); + await click(target, "button.dropdown-toggle:last-child"); + await mouseEnter(target, "button.dropdown-toggle:last-child"); + assert.containsN(target, ".dropdown-menu", 2); // Select item (default should be parentClosingMode=all) - await click(parent.el, ".item4"); - assert.containsNone(parent.el, ".dropdown-menu"); + await click(target, ".item4"); + assert.containsNone(target, ".dropdown-menu"); }); QUnit.test("multi-level dropdown: recursive template can be rendered", async (assert) => { @@ -399,9 +401,9 @@ QUnit.module("Components", ({ beforeEach }) => { ` ); - parent = await app.mount(target); + await app.mount(target); assert.deepEqual( - [...parent.el.querySelectorAll("button,.dropdown-menu > .dropdown-item")].map( + [...target.querySelectorAll("button,.dropdown-menu > .dropdown-item")].map( (el) => el.textContent ), [ @@ -446,39 +448,39 @@ QUnit.module("Components", ({ beforeEach }) => { `; Parent.components = { Dropdown }; env = await makeTestEnv(); - parent = await mount(Parent, target, { env }); + await mount(Parent, target, { env }); // Click on ONE - const one = parent.el.querySelector(".one"); + const one = target.querySelector(".one"); await click(one, "button"); assert.verifySteps([]); - assert.containsOnce(parent.el, ".dropdown-menu"); + assert.containsOnce(target, ".dropdown-menu"); assert.containsOnce(one, ".dropdown-menu"); // Hover on TWO - const two = parent.el.querySelector(".two"); + const two = target.querySelector(".two"); two.querySelector("button").dispatchEvent(new MouseEvent("mouseenter")); assert.verifySteps(["beforeOpen"]); await nextTick(); - assert.containsOnce(parent.el, ".dropdown-menu"); + assert.containsOnce(target, ".dropdown-menu"); assert.containsNone(two, ".dropdown-menu"); beforeOpenProm.resolve(); await nextTick(); - assert.containsOnce(parent.el, ".dropdown-menu"); + assert.containsOnce(target, ".dropdown-menu"); assert.containsOnce(two, ".dropdown-menu"); // Hover on THREE - const three = parent.el.querySelector(".three"); + const three = target.querySelector(".three"); three.querySelector("button").dispatchEvent(new MouseEvent("mouseenter")); await nextTick(); - assert.containsOnce(parent.el, ".dropdown-menu"); + assert.containsOnce(target, ".dropdown-menu"); assert.containsOnce(three, ".dropdown-menu"); // Click on OUTSIDE - await click(parent.el, "div.outside"); - assert.containsNone(parent.el, ".dropdown-menu"); + await click(target, "div.outside"); + assert.containsNone(target, ".dropdown-menu"); // Hover on ONE, TWO, THREE one.querySelector("button").dispatchEvent(new MouseEvent("mouseenter")); two.querySelector("button").dispatchEvent(new MouseEvent("mouseenter")); three.querySelector("button").dispatchEvent(new MouseEvent("mouseenter")); await nextTick(); - assert.containsNone(parent.el, ".dropdown-menu"); + assert.containsNone(target, ".dropdown-menu"); } ); @@ -495,15 +497,15 @@ QUnit.module("Components", ({ beforeEach }) => { `; Parent.components = { Dropdown }; env = await makeTestEnv(); - parent = await mount(Parent, target, { env }); + await mount(Parent, target, { env }); // Click on FOO - await click(parent.el, ".foo button"); - assert.containsOnce(parent.el, ".dropdown-menu"); + await click(target, ".foo button"); + assert.containsOnce(target, ".dropdown-menu"); // Hover on BAR1 - const bar1 = parent.el.querySelector(".bar1"); + const bar1 = target.querySelector(".bar1"); bar1.querySelector("button").dispatchEvent(new MouseEvent("mouseenter")); await nextTick(); - assert.containsOnce(parent.el, ".dropdown-menu"); + assert.containsOnce(target, ".dropdown-menu"); assert.containsNone(bar1, ".dropdown-menu"); } ); @@ -521,18 +523,18 @@ QUnit.module("Components", ({ beforeEach }) => { `; Parent.components = { Dropdown }; env = await makeTestEnv(); - parent = await mount(Parent, target, { env }); + await mount(Parent, target, { env }); // Click on BAR1 - await click(parent.el, ".bar1 button"); - assert.containsOnce(parent.el, ".dropdown-menu"); + await click(target, ".bar1 button"); + assert.containsOnce(target, ".dropdown-menu"); // Click on FOO - await click(parent.el, ".foo button"); - assert.containsOnce(parent.el, ".dropdown-menu"); + await click(target, ".foo button"); + assert.containsOnce(target, ".dropdown-menu"); // Hover on BAR1 - const bar1 = parent.el.querySelector(".bar1"); + const bar1 = target.querySelector(".bar1"); bar1.querySelector("button").dispatchEvent(new MouseEvent("mouseenter")); await nextTick(); - assert.containsOnce(parent.el, ".dropdown-menu"); + assert.containsOnce(target, ".dropdown-menu"); assert.containsNone(bar1, ".dropdown-menu"); } ); @@ -549,26 +551,26 @@ QUnit.module("Components", ({ beforeEach }) => { `; Parent.components = { Dropdown }; env = await makeTestEnv(); - parent = await mount(Parent, target, { env }); + await mount(Parent, target, { env }); // Click on one - await click(parent.el, ".one button"); - assert.containsOnce(parent.el, ".dropdown-menu"); + await click(target, ".one button"); + assert.containsOnce(target, ".dropdown-menu"); // Click on two - await click(parent.el, ".two button"); - assert.containsN(parent.el, ".dropdown-menu", 2); + await click(target, ".two button"); + assert.containsN(target, ".dropdown-menu", 2); // Click on one again - await click(parent.el, ".one button"); - assert.containsOnce(parent.el, ".dropdown-menu"); - assert.containsNone(parent.el.querySelector(".one"), ".dropdown-menu"); + await click(target, ".one button"); + assert.containsOnce(target, ".dropdown-menu"); + assert.containsNone(target.querySelector(".one"), ".dropdown-menu"); // Hover on one - const one = parent.el.querySelector(".one"); + const one = target.querySelector(".one"); one.querySelector("button").dispatchEvent(new MouseEvent("mouseenter")); await nextTick(); - assert.containsOnce(parent.el, ".dropdown-menu"); - assert.containsNone(parent.el.querySelector(".one"), ".dropdown-menu"); + assert.containsOnce(target, ".dropdown-menu"); + assert.containsNone(target.querySelector(".one"), ".dropdown-menu"); // Click outside - await click(parent.el, "div.outside"); - assert.containsOnce(parent.el, ".dropdown-menu"); + await click(target, "div.outside"); + assert.containsOnce(target, ".dropdown-menu"); }); QUnit.test("dropdowns keynav", async (assert) => { @@ -587,20 +589,20 @@ QUnit.module("Components", ({ beforeEach }) => { `; Parent.components = { Dropdown, DropdownItem }; env = await makeTestEnv(); - parent = await mount(Parent, target, { env }); - assert.containsNone(parent.el, ".dropdown-menu", "menu is closed at start"); + await mount(Parent, target, { env }); + assert.containsNone(target, ".dropdown-menu", "menu is closed at start"); triggerHotkey("m", true); await nextTick(); assert.containsOnce( - parent.el, + target, ".dropdown-menu", "menu is opened after pressing the toggler hotkey" ); // Navigate with arrows assert.containsNone( - parent.el, + target, ".dropdown-menu > .focus", "menu should not have any active items" ); @@ -626,19 +628,19 @@ QUnit.module("Components", ({ beforeEach }) => { for (const step of scenarioSteps) { triggerHotkey(step.hotkey); await nextTick(); - assert.hasClass(parent.el.querySelector(".dropdown-menu > .focus"), step.expected); + assert.hasClass(target.querySelector(".dropdown-menu > .focus"), step.expected); } // Select last one activated in previous scenario (item1) triggerHotkey("enter"); await nextTick(); - assert.containsNone(parent.el, ".dropdown-menu", "menu is closed after item selection"); + assert.containsNone(target, ".dropdown-menu", "menu is closed after item selection"); // Reopen dropdown triggerHotkey("m", true); await nextTick(); assert.containsOnce( - parent.el, + target, ".dropdown-menu", "menu is opened after pressing the toggler hotkey" ); @@ -646,13 +648,13 @@ QUnit.module("Components", ({ beforeEach }) => { // Select second item through data-hotkey attribute triggerHotkey("2", true); await nextTick(); - assert.containsNone(parent.el, ".dropdown-menu", "menu is closed after item selection"); + assert.containsNone(target, ".dropdown-menu", "menu is closed after item selection"); // Reopen dropdown triggerHotkey("m", true); await nextTick(); assert.containsOnce( - parent.el, + target, ".dropdown-menu", "menu is opened after pressing the toggler hotkey" ); @@ -660,7 +662,7 @@ QUnit.module("Components", ({ beforeEach }) => { // Close dropdown with keynav triggerHotkey("escape"); await nextTick(); - assert.containsNone(parent.el, ".dropdown-menu", "menu is closed after item selection"); + assert.containsNone(target, ".dropdown-menu", "menu is closed after item selection"); assert.verifySteps(["1", "2"], "items should have been selected in this order"); }); @@ -711,13 +713,13 @@ QUnit.module("Components", ({ beforeEach }) => { Parent.components = { Dropdown, DropdownItem }; env = await makeTestEnv(); - parent = await mount(Parent, target, { env }); - assert.containsOnce(parent, ".dropdown"); - assert.containsNone(parent, ".dropdown .dropdown-menu"); - assert.containsNone(parent, ".dropdown button.dropdown-toggle"); - await click(parent.el, ".my_custom_toggler"); - assert.containsOnce(parent, ".dropdown .dropdown-menu"); - assert.containsN(parent, ".dropdown .dropdown-menu .dropdown-item", 2); + await mount(Parent, target, { env }); + assert.containsOnce(target, ".dropdown"); + assert.containsNone(target, ".dropdown .dropdown-menu"); + assert.containsNone(target, ".dropdown button.dropdown-toggle"); + await click(target, ".my_custom_toggler"); + assert.containsOnce(target, ".dropdown .dropdown-menu"); + assert.containsN(target, ".dropdown .dropdown-menu .dropdown-item", 2); }); QUnit.test("multi-level dropdown: keynav", async (assert) => { @@ -743,8 +745,8 @@ QUnit.module("Components", ({ beforeEach }) => { `; Parent.components = { Dropdown, DropdownItem }; env = await makeTestEnv(); - parent = await mount(Parent, target, { env }); - assert.containsNone(parent.el, ".dropdown-menu", "menus are closed at start"); + await mount(Parent, target, { env }); + assert.containsNone(target, ".dropdown-menu", "menus are closed at start"); // Highlighting and selecting items const scenarioSteps = [ @@ -802,7 +804,7 @@ QUnit.module("Components", ({ beforeEach }) => { await nextTick(); if (step.highlighted !== undefined) { let index = 0; - const activeElements = [...parent.el.querySelectorAll(".focus")].map((el) => + const activeElements = [...target.querySelectorAll(".focus")].map((el) => el.classList.contains("dropdown-toggle") ? el.parentElement : el ); assert.ok( @@ -834,8 +836,8 @@ QUnit.module("Components", ({ beforeEach }) => { Parent.components = { Dropdown, DropdownItem }; serviceRegistry.add("localization", makeFakeLocalizationService({ direction: "rtl" })); env = await makeTestEnv(); - parent = await mount(Parent, target, { env }); - assert.containsNone(parent.el, ".dropdown-menu", "menus are closed at start"); + await mount(Parent, target, { env }); + assert.containsNone(target, ".dropdown-menu", "menus are closed at start"); // Highlighting and selecting items const scenarioSteps = [ @@ -851,7 +853,7 @@ QUnit.module("Components", ({ beforeEach }) => { await nextTick(); if (step.highlighted !== undefined) { let index = 0; - const activeElements = [...parent.el.querySelectorAll(".focus")].map((el) => + const activeElements = [...target.querySelectorAll(".focus")].map((el) => el.classList.contains("dropdown-toggle") ? el.parentElement : el ); assert.ok( @@ -878,20 +880,20 @@ QUnit.module("Components", ({ beforeEach }) => { `; Parent.components = { Dropdown, DropdownItem }; env = await makeTestEnv(); - parent = await mount(Parent, target, { env }); - assert.containsNone(parent.el, ".dropdown-menu", "menus are closed at start"); + await mount(Parent, target, { env }); + assert.containsNone(target, ".dropdown-menu", "menus are closed at start"); // Open main dropdown - await click(parent.el, ".main"); - assert.containsOnce(parent.el, ".dropdown-menu", "1st menu is opened"); + await click(target, ".main"); + assert.containsOnce(target, ".dropdown-menu", "1st menu is opened"); // Mouse enter sub dropdown - await mouseEnter(parent.el, ".sub"); - assert.containsN(parent.el, ".dropdown-menu", 2, "all menus are opened"); + await mouseEnter(target, ".sub"); + assert.containsN(target, ".dropdown-menu", 2, "all menus are opened"); // Mouse enter the adjacent dropdown item - await mouseEnter(parent.el, ".item"); - assert.containsOnce(parent.el, ".dropdown-menu", "only 1st menu is opened"); + await mouseEnter(target, ".item"); + assert.containsOnce(target, ".dropdown-menu", "only 1st menu is opened"); } ); @@ -918,32 +920,32 @@ QUnit.module("Components", ({ beforeEach }) => { }; }, }); - parent = await mount(Parent, target, { env }); - assert.containsNone(parent.el, ".dropdown-menu", "menus are closed at start"); + await mount(Parent, target, { env }); + assert.containsNone(target, ".dropdown-menu", "menus are closed at start"); assert.strictEqual(hotkeyRegistrationsCount, 0, "no hotkey registered"); // Open dropdowns one by one - await click(parent.el, ".first"); - assert.containsOnce(parent.el, ".dropdown-menu", "1st menu is opened"); + await click(target, ".first"); + assert.containsOnce(target, ".dropdown-menu", "1st menu is opened"); assert.strictEqual(hotkeyRegistrationsCount, 10, "1st menu hotkeys registered"); - await mouseEnter(parent.el, ".second"); - assert.containsN(parent.el, ".dropdown-menu", 2, "2nd menu is also opened"); + await mouseEnter(target, ".second"); + assert.containsN(target, ".dropdown-menu", 2, "2nd menu is also opened"); assert.strictEqual(hotkeyRegistrationsCount, 20, "2nd menu hotkeys also registered"); - await mouseEnter(parent.el, ".third"); - assert.containsN(parent.el, ".dropdown-menu", 3, "3rd menu is also opened"); + await mouseEnter(target, ".third"); + assert.containsN(target, ".dropdown-menu", 3, "3rd menu is also opened"); assert.strictEqual(hotkeyRegistrationsCount, 30, "3rd menu hotkeys also registered"); // Close third triggerHotkey("escape"); await nextTick(); - assert.containsN(parent.el, ".dropdown-menu", 2, "two menus still opened"); + assert.containsN(target, ".dropdown-menu", 2, "two menus still opened"); assert.strictEqual(hotkeyRegistrationsCount, 20, "two menus hotkeys registered"); // Reopen second - await mouseEnter(parent.el, ".third"); - assert.containsN(parent.el, ".dropdown-menu", 3, "3rd menu is also opened"); + await mouseEnter(target, ".third"); + assert.containsN(target, ".dropdown-menu", 3, "3rd menu is also opened"); assert.strictEqual(hotkeyRegistrationsCount, 30, "3rd menu hotkeys also registered"); // Close third, second and first @@ -953,7 +955,7 @@ QUnit.module("Components", ({ beforeEach }) => { await nextTick(); triggerHotkey("escape"); await nextTick(); - assert.containsNone(parent.el, ".dropdown-menu", "all menus are now closed"); + assert.containsNone(target, ".dropdown-menu", "all menus are now closed"); assert.strictEqual(hotkeyRegistrationsCount, 0, "no hotkey registration left"); }); @@ -965,9 +967,9 @@ QUnit.module("Components", ({ beforeEach }) => { Parent.components = { Dropdown }; env = await makeTestEnv(); - parent = await mount(Parent, target, { env }); + await mount(Parent, target, { env }); assert.strictEqual( - parent.el.querySelector("button.dropdown-toggle").dataset.tooltip, + target.querySelector("button.dropdown-toggle").dataset.tooltip, "My tooltip" ); }); diff --git a/addons/web/static/tests/core/effects/effect_service_tests.js b/addons/web/static/tests/core/effects/effect_service_tests.js index 9846a876e76..c0d6fd78762 100644 --- a/addons/web/static/tests/core/effects/effect_service_tests.js +++ b/addons/web/static/tests/core/effects/effect_service_tests.js @@ -15,12 +15,13 @@ import { nextTick, patchWithCleanup, } from "../../helpers/utils"; +import { LegacyComponent } from "@web/legacy/legacy_component"; const { Component, markup, xml } = owl; const serviceRegistry = registry.category("services"); const mainComponentRegistry = registry.category("main_components"); -class Parent extends Component { +class Parent extends LegacyComponent { setup() { this.EffectContainer = mainComponentRegistry.get("EffectContainer"); this.NotificationContainer = mainComponentRegistry.get("NotificationContainer"); @@ -130,7 +131,7 @@ QUnit.module("Effect Service", (hooks) => { QUnit.test("rendering a rainbowman with a custom component", async function (assert) { assert.expect(2); const props = { foo: "bar" }; - class Custom extends Component { + class Custom extends LegacyComponent { setup() { assert.deepEqual(this.props, props, "should have received these props"); } diff --git a/addons/web/static/tests/core/errors/error_service_tests.js b/addons/web/static/tests/core/errors/error_service_tests.js index 9c2826c948f..0df7447c924 100644 --- a/addons/web/static/tests/core/errors/error_service_tests.js +++ b/addons/web/static/tests/core/errors/error_service_tests.js @@ -20,6 +20,7 @@ import { makeFakeRPCService, } from "../../helpers/mock_services"; import { makeDeferred, nextTick, patchWithCleanup } from "../../helpers/utils"; +import { LegacyComponent } from "@web/legacy/legacy_component"; const { Component, xml } = owl; const errorDialogRegistry = registry.category("error_dialogs"); @@ -83,7 +84,7 @@ QUnit.test( "handle custom RPC_ERROR of type='server' and associated custom dialog class", async (assert) => { assert.expect(2); - class CustomDialog extends Component {} + class CustomDialog extends LegacyComponent {} CustomDialog.template = xml``; CustomDialog.components = { RPCErrorDialog }; const error = new RPCError(); @@ -119,10 +120,10 @@ QUnit.test( "handle normal RPC_ERROR of type='server' and associated custom dialog class", async (assert) => { assert.expect(2); - class CustomDialog extends Component {} + class CustomDialog extends LegacyComponent {} CustomDialog.template = xml``; CustomDialog.components = { RPCErrorDialog }; - class NormalDialog extends Component {} + class NormalDialog extends LegacyComponent {} NormalDialog.template = xml``; NormalDialog.components = { RPCErrorDialog }; const error = new RPCError(); diff --git a/addons/web/static/tests/core/hotkeys/hotkey_service_tests.js b/addons/web/static/tests/core/hotkeys/hotkey_service_tests.js index fd337d91ff3..21f9583b959 100644 --- a/addons/web/static/tests/core/hotkeys/hotkey_service_tests.js +++ b/addons/web/static/tests/core/hotkeys/hotkey_service_tests.js @@ -101,13 +101,13 @@ QUnit.test("invisible data-hotkeys are not enabled. ", async (assert) => { triggerHotkey(key, true); await nextTick(); - const comp = await mount(MyComponent, target, { env }); + await mount(MyComponent, target, { env }); triggerHotkey(key, true); await nextTick(); assert.verifySteps(["click"]); - comp.el.querySelector(".myButton").disabled = true; + target.querySelector(".myButton").disabled = true; triggerHotkey(key, true); await nextTick(); assert.verifySteps([], "shouldn't trigger the hotkey of an invisible button"); @@ -194,9 +194,9 @@ QUnit.test("the overlay of hotkeys is correctly displayed", async (assert) => {
`; - const comp = await mount(MyComponent, target, { env }); + await mount(MyComponent, target, { env }); const getOverlays = () => - [...comp.el.querySelectorAll(".o_web_hotkey_overlay")].map((el) => el.innerText); + [...target.querySelectorAll(".o_web_hotkey_overlay")].map((el) => el.innerText); displayHotkeysOverlay(); assert.deepEqual(getOverlays(), ["B", "C"], "should display the overlay"); @@ -240,9 +240,9 @@ QUnit.test("the overlay of hotkeys is correctly displayed on MacOs", async (asse
`; - const comp = await mount(MyComponent, target, { env }); + await mount(MyComponent, target, { env }); const getOverlays = () => - [...comp.el.querySelectorAll(".o_web_hotkey_overlay")].map((el) => el.innerText); + [...target.querySelectorAll(".o_web_hotkey_overlay")].map((el) => el.innerText); displayHotkeysOverlay(); assert.deepEqual(getOverlays(), ["B", "C"], "should display the overlay"); @@ -317,7 +317,7 @@ QUnit.test("[data-hotkey] alt is required", async (assert) => { } TestComponent.template = xml`
`; - const comp = await mount(TestComponent, target, { env }); + await mount(TestComponent, target, { env }); triggerHotkey(key, true); await nextTick(); @@ -371,7 +371,7 @@ QUnit.test("[data-hotkey] never allow repeat", async (assert) => { } TestComponent.template = xml`
`; - const comp = await mount(TestComponent, target, { env }); + await mount(TestComponent, target, { env }); triggerHotkey(key, true); await nextTick(); @@ -513,13 +513,13 @@ QUnit.test("registrations and elements belong to the correct UI owner", async (a class MyComponent2 extends Component { setup() { useHotkey("a", () => assert.step("MyComponent2 subscription")); - useActiveElement(); + useActiveElement("active"); } onClick() { assert.step("MyComponent2 [data-hotkey]"); } } - MyComponent2.template = xml`
`; + MyComponent2.template = xml`
`; await mount(MyComponent1, target, { env }); triggerHotkey("a"); diff --git a/addons/web/static/tests/core/l10n/translation_tests.js b/addons/web/static/tests/core/l10n/translation_tests.js index 2ecaf0b9bab..d314b115451 100644 --- a/addons/web/static/tests/core/l10n/translation_tests.js +++ b/addons/web/static/tests/core/l10n/translation_tests.js @@ -10,14 +10,14 @@ import { translatedTerms, _lt } from "@web/core/l10n/translation"; import { registry } from "@web/core/registry"; import { patch, unpatch } from "@web/core/utils/patch"; import { session } from "@web/session"; +import { LegacyComponent } from "@web/legacy/legacy_component"; const { Component, xml } = owl; const { DateTime, Settings } = luxon; - const terms = { Hello: "Bonjour" }; const serviceRegistry = registry.category("services"); -class TestComponent extends Component {} +class TestComponent extends LegacyComponent {} /** * Patches the 'lang' of the user session and context. diff --git a/addons/web/static/tests/core/main_components_container_tests.js b/addons/web/static/tests/core/main_components_container_tests.js index da675bf95e9..6d4e60de60f 100644 --- a/addons/web/static/tests/core/main_components_container_tests.js +++ b/addons/web/static/tests/core/main_components_container_tests.js @@ -29,10 +29,11 @@ QUnit.module("Components", (hooks) => { mainComponentsRegistry.add("MainComponentA", { Component: MainComponentA, props: {} }); mainComponentsRegistry.add("MainComponentB", { Component: MainComponentB, props: {} }); - const container = await mount(MainComponentsContainer, target, { env, props: {} }); + await mount(MainComponentsContainer, target, { env, props: {} }); + assert.containsOnce(target, "div.o-main-components-container"); assert.equal( - container.el.outerHTML, - "
MainComponentAMainComponentB
" + target.querySelector(".o-main-components-container").innerHTML, + "MainComponentAMainComponentB" ); }); @@ -56,10 +57,11 @@ QUnit.module("Components", (hooks) => { mainComponentsRegistry.add("MainComponentA", { Component: MainComponentA, props: {} }); mainComponentsRegistry.add("MainComponentB", { Component: MainComponentB, props: {} }); - const container = await mount(MainComponentsContainer, target, { env, props: {} }); + await mount(MainComponentsContainer, target, { env, props: {} }); + assert.containsOnce(target, "div.o-main-components-container"); assert.equal( - container.el.outerHTML, - "
MainComponentAMainComponentB
" + target.querySelector(".o-main-components-container").innerHTML, + "MainComponentAMainComponentB" ); const handler = (ev) => { @@ -78,7 +80,10 @@ QUnit.module("Components", (hooks) => { unpatch(QUnit, "MainComponentsContainer QUnit patch"); assert.verifySteps(["BOOM"]); - assert.equal(container.el.outerHTML, "
MainComponentB
"); + assert.equal( + target.querySelector(".o-main-components-container").innerHTML, + "MainComponentB" + ); }); QUnit.test("unmounts erroring main component: variation", async function (assert) { @@ -101,10 +106,11 @@ QUnit.module("Components", (hooks) => { mainComponentsRegistry.add("MainComponentA", { Component: MainComponentA, props: {} }); mainComponentsRegistry.add("MainComponentB", { Component: MainComponentB, props: {} }); - const container = await mount(MainComponentsContainer, target, { env, props: {} }); + await mount(MainComponentsContainer, target, { env, props: {} }); + assert.containsOnce(target, "div.o-main-components-container"); assert.equal( - container.el.outerHTML, - "
MainComponentAMainComponentB
" + target.querySelector(".o-main-components-container").innerHTML, + "MainComponentAMainComponentB" ); const handler = (ev) => { @@ -123,6 +129,9 @@ QUnit.module("Components", (hooks) => { unpatch(QUnit, "MainComponentsContainer QUnit patch"); assert.verifySteps(["BOOM"]); - assert.equal(container.el.outerHTML, "
MainComponentA
"); + assert.equal( + target.querySelector(".o-main-components-container").innerHTML, + "MainComponentA" + ); }); }); diff --git a/addons/web/static/tests/core/network/rpc_service_tests.js b/addons/web/static/tests/core/network/rpc_service_tests.js index 8016aa0c7da..640910c1ad7 100644 --- a/addons/web/static/tests/core/network/rpc_service_tests.js +++ b/addons/web/static/tests/core/network/rpc_service_tests.js @@ -17,6 +17,7 @@ import { patchWithCleanup, } from "../../helpers/utils"; import { registerCleanup } from "../../helpers/cleanup"; +import { LegacyComponent } from "@web/legacy/legacy_component"; const { Component, xml } = owl; @@ -125,7 +126,7 @@ QUnit.test("rpc with simple routes", async (assert) => { }); QUnit.test("rpc coming from destroyed components are left pending", async (assert) => { - class MyComponent extends Component { + class MyComponent extends LegacyComponent { setup() { this.rpc = useService("rpc"); } @@ -162,7 +163,7 @@ QUnit.test("rpc coming from destroyed components are left pending", async (asser QUnit.test("rpc initiated from destroyed components throw exception", async (assert) => { assert.expect(1); - class MyComponent extends Component { + class MyComponent extends LegacyComponent { setup() { this.rpc = useService("rpc"); } diff --git a/addons/web/static/tests/core/pager_tests.js b/addons/web/static/tests/core/pager_tests.js index ae33c576273..2726b55b636 100644 --- a/addons/web/static/tests/core/pager_tests.js +++ b/addons/web/static/tests/core/pager_tests.js @@ -18,6 +18,8 @@ const { Component, useState, xml } = owl; const serviceRegistry = registry.category("services"); +let target; + class PagerController extends Component { setup() { this.state = useState({ ...this.props }); @@ -33,13 +35,17 @@ PagerController.components = { Pager }; async function makePager(props) { serviceRegistry.add("ui", uiService); const env = await makeTestEnv(); - const pager = await mount(PagerController, getFixture(), { env, props }); + const pager = await mount(PagerController, target, { env, props }); return pager; } -QUnit.module("Components", () => { +QUnit.module("Components", ({ beforeEach }) => { QUnit.module("Pager"); + beforeEach(() => { + target = getFixture(); + }); + QUnit.test("basic interactions", async function (assert) { assert.expect(2); @@ -52,14 +58,14 @@ QUnit.module("Components", () => { }, }); assert.strictEqual( - pager.el.querySelector(`.o_pager_counter .o_pager_value`).textContent.trim(), + target.querySelector(`.o_pager_counter .o_pager_value`).textContent.trim(), "1-4", "currentMinimum should be set to 1" ); - await click(pager.el.querySelector(`.o_pager button.o_pager_next`)); + await click(target.querySelector(`.o_pager button.o_pager_next`)); assert.strictEqual( - pager.el.querySelector(`.o_pager_counter .o_pager_value`).textContent.trim(), + target.querySelector(`.o_pager_counter .o_pager_value`).textContent.trim(), "5-8", "currentMinimum should now be 5" ); @@ -77,23 +83,23 @@ QUnit.module("Components", () => { }, }); - await click(pager.el, ".o_pager_value"); + await click(target, ".o_pager_value"); - assert.containsOnce(pager, "input", "the pager should contain an input"); + assert.containsOnce(target, "input", "the pager should contain an input"); assert.strictEqual( - pager.el.querySelector(`.o_pager_counter .o_pager_value`).value, + target.querySelector(`.o_pager_counter .o_pager_value`).value, "1-4", "the input should have correct value" ); // change the limit - const input = pager.el.querySelector(`.o_pager_counter input.o_pager_value`); + const input = target.querySelector(`.o_pager_counter input.o_pager_value`); input.value = "1-6"; await triggerEvents(input, null, ["change", "blur"]); - assert.containsNone(pager, "input", "the pager should not contain an input anymore"); + assert.containsNone(target, "input", "the pager should not contain an input anymore"); assert.strictEqual( - pager.el.querySelector(`.o_pager_counter .o_pager_value`).textContent.trim(), + target.querySelector(`.o_pager_counter .o_pager_value`).textContent.trim(), "1-6", "the limit should have been updated" ); @@ -102,7 +108,7 @@ QUnit.module("Components", () => { QUnit.test("keydown on pager with same value", async function (assert) { assert.expect(7); - const pager = await makePager({ + await makePager({ offset: 0, limit: 4, total: 10, @@ -112,18 +118,18 @@ QUnit.module("Components", () => { }); // Enter edit mode - await click(pager.el, ".o_pager_value"); + await click(target, ".o_pager_value"); - assert.containsOnce(pager.el, "input"); - assert.strictEqual(pager.el.querySelector(`.o_pager_counter .o_pager_value`).value, "1-4"); + assert.containsOnce(target, "input"); + assert.strictEqual(target.querySelector(`.o_pager_counter .o_pager_value`).value, "1-4"); assert.verifySteps([]); // Exit edit mode - await triggerEvent(pager.el, "input", "keydown", { key: "Enter" }); + await triggerEvent(target, "input", "keydown", { key: "Enter" }); - assert.containsNone(pager.el, "input"); + assert.containsNone(target, "input"); assert.strictEqual( - pager.el.querySelector(`.o_pager_counter .o_pager_value`).textContent.trim(), + target.querySelector(`.o_pager_counter .o_pager_value`).textContent.trim(), "1-4" ); assert.verifySteps(["pager-changed"]); @@ -142,18 +148,18 @@ QUnit.module("Components", () => { }); assert.strictEqual( - pager.el.querySelector(`.o_pager_counter .o_pager_value`).textContent.trim(), + target.querySelector(`.o_pager_counter .o_pager_value`).textContent.trim(), "1-4", "Initial value should be correct" ); async function inputAndAssert(inputValue, expected, reason) { - await click(pager.el.querySelector(`.o_pager_counter .o_pager_value`)); - const inputEl = pager.el.querySelector(`.o_pager_counter input.o_pager_value`); + await click(target.querySelector(`.o_pager_counter .o_pager_value`)); + const inputEl = target.querySelector(`.o_pager_counter input.o_pager_value`); inputEl.value = inputValue; await triggerEvents(inputEl, null, ["change", "blur"]); assert.strictEqual( - pager.el.querySelector(`.o_pager_counter .o_pager_value`).textContent.trim(), + target.querySelector(`.o_pager_counter .o_pager_value`).textContent.trim(), expected, `Pager value should be "${expected}" when given "${inputValue}": ${reason}` ); @@ -195,19 +201,19 @@ QUnit.module("Components", () => { pager.updateProps(data); }, }); - const pagerButtons = pager.el.querySelectorAll("button"); + const pagerButtons = target.querySelectorAll("button"); // Click twice - await click(pager.el.querySelector(`.o_pager button.o_pager_next`)); - await click(pager.el.querySelector(`.o_pager button.o_pager_next`)); + await click(target.querySelector(`.o_pager button.o_pager_next`)); + await click(target.querySelector(`.o_pager button.o_pager_next`)); // Try to edit the pager value - await click(pager.el, ".o_pager_value"); + await click(target, ".o_pager_value"); assert.strictEqual(pagerButtons.length, 2, "the two buttons should be displayed"); assert.ok(pagerButtons[0].disabled, "'previous' is disabled"); assert.ok(pagerButtons[1].disabled, "'next' is disabled"); assert.strictEqual( - pager.el.querySelector(".o_pager_value").tagName, + target.querySelector(".o_pager_value").tagName, "SPAN", "pager edition is prevented" ); @@ -220,15 +226,15 @@ QUnit.module("Components", () => { assert.notOk(pagerButtons[0].disabled, "'previous' is enabled"); assert.notOk(pagerButtons[1].disabled, "'next' is enabled"); assert.strictEqual( - pager.el.querySelector(`.o_pager_counter .o_pager_value`).textContent.trim(), + target.querySelector(`.o_pager_counter .o_pager_value`).textContent.trim(), "5-8", "value has been updated" ); - await click(pager.el, ".o_pager_value"); + await click(target, ".o_pager_value"); assert.strictEqual( - pager.el.querySelector(".o_pager_value").tagName, + target.querySelector(".o_pager_value").tagName, "INPUT", "pager edition is re-enabled" ); @@ -244,15 +250,15 @@ QUnit.module("Components", () => { }, }); - await click(pager.el, ".o_pager_value"); - assert.containsOnce(pager, "input", "the pager should contain an input"); + await click(target, ".o_pager_value"); + assert.containsOnce(target, "input", "the pager should contain an input"); assert.strictEqual( - pager.el.querySelector("input"), + target.querySelector("input"), document.activeElement, "pager input is focused" ); - await triggerEvent(pager.el, null, "mousedown"); - assert.containsNone(pager, "input", "the pager should not contain an input"); + await triggerEvent(target, null, "mousedown"); + assert.containsNone(target, "input", "the pager should not contain an input"); }); }); diff --git a/addons/web/static/tests/core/popover/popover_service_tests.js b/addons/web/static/tests/core/popover/popover_service_tests.js index 07aa2f466b8..7a55255ea45 100644 --- a/addons/web/static/tests/core/popover/popover_service_tests.js +++ b/addons/web/static/tests/core/popover/popover_service_tests.js @@ -2,9 +2,9 @@ import { popoverService } from "@web/core/popover/popover_service"; import { registry } from "@web/core/registry"; -import { registerCleanup } from "../../helpers/cleanup"; import { clearRegistryWithCleanup, makeTestEnv } from "../../helpers/mock_env"; import { click, getFixture, mount, nextTick } from "../../helpers/utils"; +import { LegacyComponent } from "@web/legacy/legacy_component"; const { Component, xml } = owl; @@ -132,7 +132,7 @@ QUnit.test("close callback", async (assert) => { QUnit.test("sub component triggers close", async (assert) => { assert.containsOnce(fixture, ".o_popover_container"); - class Comp extends Component {} + class Comp extends LegacyComponent {} Comp.template = xml`
in popover
`; popovers.add(popoverTarget, Comp, {}); diff --git a/addons/web/static/tests/core/position_hook_tests.js b/addons/web/static/tests/core/position_hook_tests.js index b2a8c9f3ef0..da03475beed 100644 --- a/addons/web/static/tests/core/position_hook_tests.js +++ b/addons/web/static/tests/core/position_hook_tests.js @@ -34,17 +34,17 @@ function isWellPositioned(popper, position = "bottom") { const v = /** @type {import("@web/core/position/position_hook").VariantsDataKey} */ (variant[0]); const posSolution = computePositioning(reference, popper, options).get(d, v); const hasCorrectClass = popper.classList.contains(posSolution.className); - const correctLeft = parseFloat(popper.style.left) === posSolution.left; - const correctTop = parseFloat(popper.style.top) === posSolution.top; + const correctLeft = parseFloat(popper.style.left) === Math.round(posSolution.left * 10) / 10; + const correctTop = parseFloat(popper.style.top) === Math.round(posSolution.top * 10) / 10; return hasCorrectClass && correctLeft && correctTop; } class TestComp extends Component { setup() { - usePosition(reference, this.constructor.popperOptions); + usePosition(reference, "popper", this.constructor.popperOptions); } } -TestComp.template = xml`
`; +TestComp.template = xml`
`; /** @type {import("@web/core/position/position_hook").Options} */ TestComp.popperOptions = {}; @@ -89,8 +89,8 @@ QUnit.module("usePosition Hook", { }); QUnit.test("default position is bottom", async (assert) => { - const popper = await mount(TestComp, container); - assert.ok(isWellPositioned(popper.el, "bottom")); + await mount(TestComp, container); + assert.ok(isWellPositioned(document.getElementById("popper"), "bottom")); }); QUnit.test("can add margin", async (assert) => { @@ -98,30 +98,29 @@ QUnit.test("can add margin", async (assert) => { Object.assign(TestComp.popperOptions, { margin }); let popper = await mount(TestComp, container); - const popBox1 = popper.el.getBoundingClientRect(); + const popBox1 = document.getElementById("popper").getBoundingClientRect(); destroy(popper); margin = 20; Object.assign(TestComp.popperOptions, { margin }); popper = await mount(TestComp, container); - const popBox2 = popper.el.getBoundingClientRect(); + const popBox2 = document.getElementById("popper").getBoundingClientRect(); destroy(popper); assert.strictEqual(popBox1.top + margin, popBox2.top); }); -QUnit.test("can use a t-ref as popper", async (assert) => { +QUnit.test("popper is an inner element", async (assert) => { patchWithCleanup(TestComp, { - popperOptions: { ...TestComp.popperOptions, popper: "popperRef" }, template: xml`
-
+
`, }); - const comp = await mount(TestComp, container); - assert.notOk(isWellPositioned(comp.el)); - assert.ok(isWellPositioned(comp.el.querySelector("#popper"))); + await mount(TestComp, container); + assert.notOk(isWellPositioned(document.getElementById("not-popper"))); + assert.ok(isWellPositioned(document.getElementById("popper"))); }); QUnit.test("has no effect when component is destroyed", async (assert) => { @@ -154,9 +153,9 @@ QUnit.test("has no effect when component is destroyed", async (assert) => { const getPositionTest = (position, positionToCheck) => { return async (assert) => { Object.assign(TestComp.popperOptions, { position }); - const popper = await mount(TestComp, container); + await mount(TestComp, container); positionToCheck = positionToCheck || position; - assert.ok(isWellPositioned(popper.el, positionToCheck)); + assert.ok(isWellPositioned(document.getElementById("popper"), positionToCheck)); }; }; QUnit.test("position top", getPositionTest("top")); @@ -192,8 +191,11 @@ const CONTAINER_STYLE_MAP = { const getRepositionTest = (from, to, containerStyleChanges) => { return async (assert) => { Object.assign(TestComp.popperOptions, { position: from }); - const popper = await mount(TestComp, container); - assert.ok(isWellPositioned(popper.el, from), `points to ${from} direction`); + await mount(TestComp, container); + assert.ok( + isWellPositioned(document.getElementById("popper"), from), + `points to ${from} direction` + ); // Change container style and force update for (const styleToApply of containerStyleChanges.split(" ")) { @@ -201,7 +203,10 @@ const getRepositionTest = (from, to, containerStyleChanges) => { } triggerEvent(document, null, "scroll"); await nextTick(); - assert.ok(isWellPositioned(popper.el, to), `points to ${to} direction`); + assert.ok( + isWellPositioned(document.getElementById("popper"), to), + `points to ${to} direction` + ); }; }; // ----------------------------------------------------------------------------- diff --git a/addons/web/static/tests/core/scroller_service_tests.js b/addons/web/static/tests/core/scroller_service_tests.js index 3abb890d144..3f6f8d1156d 100644 --- a/addons/web/static/tests/core/scroller_service_tests.js +++ b/addons/web/static/tests/core/scroller_service_tests.js @@ -35,7 +35,7 @@ QUnit.test("Ignore empty hrefs", async (assert) => {
`; - const comp = await mount(MyComponent, target, { env }); + await mount(MyComponent, target, { env }); /** * To determine whether the hash changed we need to use a custom hash for @@ -47,10 +47,10 @@ QUnit.test("Ignore empty hrefs", async (assert) => { location.hash = testHash; registerCleanup(() => (location.hash = initialHash)); - comp.el.querySelector(".inactive_link").click(); + target.querySelector(".inactive_link").click(); await nextTick(); - comp.el.querySelector(".fa.fa-trash").click(); + target.querySelector(".fa.fa-trash").click(); await nextTick(); assert.strictEqual(location.hash, testHash); diff --git a/addons/web/static/tests/core/tooltip/tooltip_service_tests.js b/addons/web/static/tests/core/tooltip/tooltip_service_tests.js index ad5fea6e0fa..008811aa71a 100644 --- a/addons/web/static/tests/core/tooltip/tooltip_service_tests.js +++ b/addons/web/static/tests/core/tooltip/tooltip_service_tests.js @@ -92,16 +92,16 @@ QUnit.module("Tooltip service", (hooks) => { const mockSetInterval = (fn) => { simulateInterval = fn; }; - const parent = await makeParent(MyComponent, { mockSetTimeout, mockSetInterval }); + await makeParent(MyComponent, { mockSetTimeout, mockSetInterval }); - assert.containsNone(parent, ".o_popover_container .o_popover"); + assert.containsNone(target, ".o_popover_container .o_popover"); target.querySelector("button").dispatchEvent(new Event("mouseenter")); await nextTick(); - assert.containsNone(parent, ".o_popover_container .o_popover"); + assert.containsNone(target, ".o_popover_container .o_popover"); simulateTimeout(); await nextTick(); - assert.containsOnce(parent, ".o_popover_container .o_popover"); + assert.containsOnce(target, ".o_popover_container .o_popover"); assert.strictEqual( target.querySelector(".o_popover_container .o_popover").innerText, "hello" @@ -118,10 +118,10 @@ QUnit.module("Tooltip service", (hooks) => { layerY: y, screenY: y, }); - assert.containsOnce(parent, ".o_popover_container .o_popover"); + assert.containsOnce(target, ".o_popover_container .o_popover"); simulateInterval(); await nextTick(); - assert.containsNone(parent, ".o_popover_container .o_popover"); + assert.containsNone(target, ".o_popover_container .o_popover"); }); QUnit.test("basic rendering 2", async (assert) => { @@ -135,18 +135,18 @@ QUnit.module("Tooltip service", (hooks) => { const mockSetInterval = (fn) => { simulateInterval = fn; }; - const parent = await makeParent(MyComponent, { mockSetTimeout, mockSetInterval }); + await makeParent(MyComponent, { mockSetTimeout, mockSetInterval }); - assert.containsNone(parent, ".o_popover_container .o_popover"); + assert.containsNone(target, ".o_popover_container .o_popover"); let [outerSpan, innerSpan] = target.querySelectorAll("span.our_span"); outerSpan.dispatchEvent(new Event("mouseenter")); innerSpan.dispatchEvent(new Event("mouseenter")); await nextTick(); - assert.containsNone(parent, ".o_popover_container .o_popover"); + assert.containsNone(target, ".o_popover_container .o_popover"); simulateTimeout(); await nextTick(); - assert.containsOnce(parent, ".o_popover_container .o_popover"); + assert.containsOnce(target, ".o_popover_container .o_popover"); assert.strictEqual( target.querySelector(".o_popover_container .o_popover").innerText, "hello" @@ -163,10 +163,10 @@ QUnit.module("Tooltip service", (hooks) => { layerY: y, screenY: y, }); - assert.containsOnce(parent, ".o_popover_container .o_popover"); + assert.containsOnce(target, ".o_popover_container .o_popover"); simulateInterval(); await nextTick(); - assert.containsNone(parent, ".o_popover_container .o_popover"); + assert.containsNone(target, ".o_popover_container .o_popover"); }); QUnit.test("remove element with opened tooltip", async (assert) => { @@ -185,20 +185,20 @@ QUnit.module("Tooltip service", (hooks) => { const mockSetInterval = (fn) => { simulateInterval = fn; }; - const parent = await makeParent(MyComponent, { mockSetInterval }); + await makeParent(MyComponent, { mockSetInterval }); - assert.containsOnce(parent, "button"); - assert.containsNone(parent, ".o_popover_container .o_popover"); + assert.containsOnce(target, "button"); + assert.containsNone(target, ".o_popover_container .o_popover"); target.querySelector("button").dispatchEvent(new Event("mouseenter")); await nextTick(); - assert.containsOnce(parent, ".o_popover_container .o_popover"); + assert.containsOnce(target, ".o_popover_container .o_popover"); compState.visible = false; await nextTick(); - assert.containsNone(parent, "button"); + assert.containsNone(target, "button"); simulateInterval(); await nextTick(); - assert.containsNone(parent, ".o_popover_container .o_popover"); + assert.containsNone(target, ".o_popover_container .o_popover"); }); QUnit.test("rendering with several tooltips", async (assert) => { @@ -208,17 +208,17 @@ QUnit.module("Tooltip service", (hooks) => {
`; - const parent = await makeParent(MyComponent); + await makeParent(MyComponent); - assert.containsNone(parent, ".o_popover_container .o_popover"); + assert.containsNone(target, ".o_popover_container .o_popover"); target.querySelector("button.button_1").dispatchEvent(new Event("mouseenter")); await nextTick(); - assert.containsOnce(parent, ".o_popover_container .o_popover"); + assert.containsOnce(target, ".o_popover_container .o_popover"); assert.strictEqual(target.querySelector(".o_popover").innerText, "tooltip 1"); target.querySelector("button.button_1").dispatchEvent(new Event("mouseleave")); target.querySelector("button.button_2").dispatchEvent(new Event("mouseenter")); await nextTick(); - assert.containsOnce(parent, ".o_popover_container .o_popover"); + assert.containsOnce(target, ".o_popover_container .o_popover"); assert.strictEqual(target.querySelector(".o_popover").innerText, "tooltip 2"); }); @@ -232,40 +232,40 @@ QUnit.module("Tooltip service", (hooks) => {
`; - const parent = await makeParent(MyComponent); + await makeParent(MyComponent); // default target.querySelector("button.default").dispatchEvent(new Event("mouseenter")); await nextTick(); - assert.containsOnce(parent, ".o_popover_container .o_popover"); + assert.containsOnce(target, ".o_popover_container .o_popover"); assert.strictEqual(target.querySelector(".o_popover").innerText, "default"); assert.hasClass(target.querySelector(".o_popover"), "o-popper-position--bm"); // top target.querySelector("button.top").dispatchEvent(new Event("mouseenter")); await nextTick(); - assert.containsOnce(parent, ".o_popover_container .o_popover"); + assert.containsOnce(target, ".o_popover_container .o_popover"); assert.strictEqual(target.querySelector(".o_popover").innerText, "top"); assert.hasClass(target.querySelector(".o_popover"), "o-popper-position--tm"); // right target.querySelector("button.right").dispatchEvent(new Event("mouseenter")); await nextTick(); - assert.containsOnce(parent, ".o_popover_container .o_popover"); + assert.containsOnce(target, ".o_popover_container .o_popover"); assert.strictEqual(target.querySelector(".o_popover").innerText, "right"); assert.hasClass(target.querySelector(".o_popover"), "o-popper-position--rm"); // bottom target.querySelector("button.bottom").dispatchEvent(new Event("mouseenter")); await nextTick(); - assert.containsOnce(parent, ".o_popover_container .o_popover"); + assert.containsOnce(target, ".o_popover_container .o_popover"); assert.strictEqual(target.querySelector(".o_popover").innerText, "bottom"); assert.hasClass(target.querySelector(".o_popover"), "o-popper-position--bm"); // left target.querySelector("button.left").dispatchEvent(new Event("mouseenter")); await nextTick(); - assert.containsOnce(parent, ".o_popover_container .o_popover"); + assert.containsOnce(target, ".o_popover_container .o_popover"); assert.strictEqual(target.querySelector(".o_popover").innerText, "left"); assert.hasClass(target.querySelector(".o_popover"), "o-popper-position--lm"); }); @@ -279,12 +279,12 @@ QUnit.module("Tooltip service", (hooks) => { const templates = { my_tooltip_template: "tooltip", }; - const parent = await makeParent(MyComponent, { templates }); + await makeParent(MyComponent, { templates }); - assert.containsNone(parent, ".o_popover_container .o-tooltip"); + assert.containsNone(target, ".o_popover_container .o-tooltip"); target.querySelector("button").dispatchEvent(new Event("mouseenter")); await nextTick(); - assert.containsOnce(parent, ".o_popover_container .o-tooltip"); + assert.containsOnce(target, ".o_popover_container .o-tooltip"); assert.strictEqual(target.querySelector(".o-tooltip").innerHTML, "tooltip"); }); @@ -310,12 +310,12 @@ QUnit.module("Tooltip service", (hooks) => { `, }; - const parent = await makeParent(MyComponent, { templates }); + await makeParent(MyComponent, { templates }); - assert.containsNone(parent, ".o_popover_container .o-tooltip"); + assert.containsNone(target, ".o_popover_container .o-tooltip"); target.querySelector("button").dispatchEvent(new Event("mouseenter")); await nextTick(); - assert.containsOnce(parent, ".o_popover_container .o-tooltip"); + assert.containsOnce(target, ".o_popover_container .o-tooltip"); assert.strictEqual( target.querySelector(".o-tooltip").innerHTML, "
  • X: 3
  • Y: abc
" diff --git a/addons/web/static/tests/core/ui_service_tests.js b/addons/web/static/tests/core/ui_service_tests.js index 2d85768fa42..65636a3c459 100644 --- a/addons/web/static/tests/core/ui_service_tests.js +++ b/addons/web/static/tests/core/ui_service_tests.js @@ -5,6 +5,7 @@ import { uiService, useActiveElement } from "@web/core/ui/ui_service"; import { makeTestEnv } from "../helpers/mock_env"; import { makeFakeLocalizationService } from "../helpers/mock_services"; import { destroy, getFixture, mount, nextTick } from "../helpers/utils"; +import { LegacyComponent } from "@web/legacy/legacy_component"; const { Component, xml } = owl; const serviceRegistry = registry.category("services"); @@ -65,25 +66,6 @@ QUnit.test("use block and unblock several times to block ui with ui service", as assert.strictEqual(blockUI, null, "ui should not be blocked"); }); -QUnit.test("a component can be the active element", async (assert) => { - class MyComponent extends Component { - setup() { - useActiveElement(); - } - } - MyComponent.template = xml`
`; - - const env = await makeTestEnv({ ...baseConfig }); - const ui = env.services.ui; - assert.deepEqual(ui.activeElement, document); - - const comp = await mount(MyComponent, target, { env }); - assert.deepEqual(ui.activeElement, comp.el); - - destroy(comp); - assert.deepEqual(ui.activeElement, document); -}); - QUnit.test("a component can be the UI active element: with t-ref delegation", async (assert) => { class MyComponent extends Component { setup() { @@ -103,7 +85,7 @@ QUnit.test("a component can be the UI active element: with t-ref delegation", a assert.deepEqual(ui.activeElement, document); const comp = await mount(MyComponent, target, { env }); - assert.deepEqual(ui.activeElement, comp.el.querySelector("div#owner")); + assert.deepEqual(ui.activeElement, document.getElementById("owner")); comp.hasRef = false; comp.render(); await nextTick(); diff --git a/addons/web/static/tests/core/utils/hooks_tests.js b/addons/web/static/tests/core/utils/hooks_tests.js index 2e66246d1a3..78672b77ad7 100644 --- a/addons/web/static/tests/core/utils/hooks_tests.js +++ b/addons/web/static/tests/core/utils/hooks_tests.js @@ -5,6 +5,7 @@ import { useAutofocus, useBus, useListener, useService } from "@web/core/utils/h import { registry } from "@web/core/registry"; import { makeTestEnv } from "@web/../tests/helpers/mock_env"; import { click, destroy, getFixture, mount, nextTick } from "@web/../tests/helpers/utils"; +import { LegacyComponent } from "@web/legacy/legacy_component"; const { Component, onMounted, xml } = owl; const serviceRegistry = registry.category("services"); @@ -14,7 +15,7 @@ QUnit.module("utils", () => { QUnit.module("useAutofocus"); QUnit.test("useAutofocus: simple usecase", async function (assert) { - class MyComponent extends Component { + class MyComponent extends LegacyComponent { setup() { this.inputRef = useAutofocus(); } @@ -40,7 +41,7 @@ QUnit.module("utils", () => { }); QUnit.test("useAutofocus: conditional autofocus", async function (assert) { - class MyComponent extends Component { + class MyComponent extends LegacyComponent { setup() { this.inputRef = useAutofocus(); this.showInput = true; @@ -112,7 +113,7 @@ QUnit.module("utils", () => { QUnit.module("useBus"); QUnit.test("useBus hook: simple usecase", async function (assert) { - class MyComponent extends Component { + class MyComponent extends LegacyComponent { setup() { useBus(this.env.bus, "test-event", this.myCallback); } @@ -138,7 +139,7 @@ QUnit.module("utils", () => { QUnit.module("useListener"); QUnit.test("useListener: simple usecase", async function (assert) { - class MyComponent extends Component { + class MyComponent extends LegacyComponent { setup() { useListener("click", () => assert.step("click")); } @@ -154,7 +155,7 @@ QUnit.module("utils", () => { }); QUnit.test("useListener: event delegation", async function (assert) { - class MyComponent extends Component { + class MyComponent extends LegacyComponent { setup() { this.flag = true; useListener("click", "button", () => assert.step("click")); @@ -185,7 +186,7 @@ QUnit.module("utils", () => { }); QUnit.test("useListener: event delegation with capture option", async function (assert) { - class MyComponent extends Component { + class MyComponent extends LegacyComponent { setup() { this.flag = false; useListener("click", "button", () => assert.step("click"), { capture: true }); @@ -217,7 +218,7 @@ QUnit.module("utils", () => { QUnit.module("useService"); QUnit.test("useService: unavailable service", async function (assert) { - class MyComponent extends Component { + class MyComponent extends LegacyComponent { setup() { useService("toy_service"); } @@ -234,7 +235,7 @@ QUnit.module("utils", () => { }); QUnit.test("useService: service that returns null", async function (assert) { - class MyComponent extends Component { + class MyComponent extends LegacyComponent { setup() { this.toyService = useService("toy_service"); } diff --git a/addons/web/static/tests/legacy/component_extension_tests.js b/addons/web/static/tests/legacy/component_extension_tests.js index a4ec30349b2..4f99af33966 100644 --- a/addons/web/static/tests/legacy/component_extension_tests.js +++ b/addons/web/static/tests/legacy/component_extension_tests.js @@ -4,6 +4,7 @@ odoo.define('web.component_extension_tests', function (require) { const makeTestEnvironment = require("web.test_env"); const testUtils = require("web.test_utils"); const { destroy, getFixture, mount } = require("@web/../tests/helpers/utils"); + const { LegacyComponent } = require("@web/legacy/legacy_component"); const { Component, xml } = owl; const { useListener } = require("@web/core/utils/hooks"); @@ -15,7 +16,7 @@ odoo.define('web.component_extension_tests', function (require) { QUnit.test("Component destroyed while performing successful RPC", async function (assert) { assert.expect(1); - class Parent extends Component {} + class Parent extends LegacyComponent {} Parent.template = xml`
`; const env = makeTestEnvironment({}, () => Promise.resolve()); @@ -33,7 +34,7 @@ odoo.define('web.component_extension_tests', function (require) { QUnit.test("Component destroyed while performing failed RPC", async function (assert) { assert.expect(1); - class Parent extends Component {} + class Parent extends LegacyComponent {} Parent.template = xml`
`; const env = makeTestEnvironment({}, () => Promise.reject()); @@ -52,7 +53,7 @@ odoo.define('web.component_extension_tests', function (require) { QUnit.test("useListener handler type", async function (assert) { assert.expect(1); - class Parent extends Component { + class Parent extends LegacyComponent { setup() { useListener('custom1', '_onCustom1'); } @@ -71,7 +72,7 @@ odoo.define('web.component_extension_tests', function (require) { assert.expect(12); const env = makeTestEnvironment({}, () => Promise.reject()); - class Parent extends Component { + class Parent extends LegacyComponent { setup() { useListener('custom1', this._onCustom1); useListener('custom2', this._onCustom2); @@ -122,7 +123,7 @@ odoo.define('web.component_extension_tests', function (require) { QUnit.test("useListener with native JS selector", async function (assert) { assert.expect(3); - class Parent extends Component { + class Parent extends LegacyComponent { setup() { useListener('custom1', 'div .custom-class', this._onCustom1); } @@ -149,7 +150,7 @@ odoo.define('web.component_extension_tests', function (require) { QUnit.test("useListener with native JS selector delegation", async function (assert) { assert.expect(3); - class Parent extends Component { + class Parent extends LegacyComponent { setup() { useListener('custom1', '.custom-class', this._onCustom1); } @@ -178,7 +179,7 @@ odoo.define('web.component_extension_tests', function (require) { QUnit.test("useListener with capture option", async function (assert) { assert.expect(7); - class Leaf extends Component { + class Leaf extends LegacyComponent { setup() { useListener('custom1', this._onCustom1); } @@ -188,7 +189,7 @@ odoo.define('web.component_extension_tests', function (require) { } Leaf.template = xml`
`; - class Root extends Component { + class Root extends LegacyComponent { setup() { useListener('custom1', this._onCustom1, { capture: true }); } diff --git a/addons/web/static/tests/legacy/components/dropdown_menu_tests.js b/addons/web/static/tests/legacy/components/dropdown_menu_tests.js index d8d7a9edb4e..b19e13a85b6 100644 --- a/addons/web/static/tests/legacy/components/dropdown_menu_tests.js +++ b/addons/web/static/tests/legacy/components/dropdown_menu_tests.js @@ -5,6 +5,7 @@ odoo.define('web.dropdown_menu_tests', function (require) { const testUtils = require('web.test_utils'); const makeTestEnvironment = require("web.test_env"); const { mount } = require("@web/../tests/helpers/utils"); + const { LegacyComponent } = require("@web/legacy/legacy_component"); const { Component, useState, xml } = owl; const { createComponent } = testUtils; @@ -346,7 +347,7 @@ odoo.define('web.dropdown_menu_tests', function (require) { assert.expect(7); const items = this.items; - class Parent extends Component { + class Parent extends LegacyComponent { setup() { this.state = useState({ items }); } @@ -393,7 +394,7 @@ odoo.define('web.dropdown_menu_tests', function (require) { assert.expect(5); const items = this.items; - class Parent extends Component { + class Parent extends LegacyComponent { setup() { this.items = items; } diff --git a/addons/web/static/tests/legacy/components/pager_tests.js b/addons/web/static/tests/legacy/components/pager_tests.js index 0ec88c8d921..afceb73e4cf 100644 --- a/addons/web/static/tests/legacy/components/pager_tests.js +++ b/addons/web/static/tests/legacy/components/pager_tests.js @@ -3,12 +3,13 @@ odoo.define('web.pager_tests', function (require) { const Pager = require('web.Pager'); const testUtils = require('web.test_utils'); + const { LegacyComponent } = require("@web/legacy/legacy_component"); const { createComponent } = testUtils; const { Component, xml, useState } = owl; - class PagerController extends Component { + class PagerController extends LegacyComponent { setup() { this.state = useState({ ...this.props }); } diff --git a/addons/web/static/tests/legacy/control_panel/custom_filter_item_tests.js b/addons/web/static/tests/legacy/control_panel/custom_filter_item_tests.js index f9d990665e6..a2919905d09 100644 --- a/addons/web/static/tests/legacy/control_panel/custom_filter_item_tests.js +++ b/addons/web/static/tests/legacy/control_panel/custom_filter_item_tests.js @@ -7,6 +7,7 @@ odoo.define('web.filter_menu_generator_tests', function (require) { const pyUtils = require('web.py_utils'); const testUtils = require('web.test_utils'); + const { getFixture } = require('@web/../tests/helpers/utils'); const cpHelpers = require('@web/../tests/search/helpers'); const { createComponent } = testUtils; @@ -14,6 +15,8 @@ odoo.define('web.filter_menu_generator_tests', function (require) { await cpHelpers.toggleMenu(el, "Add Custom Filter"); }; + let target; + QUnit.module('Components', { beforeEach: function () { this.fields = { @@ -25,6 +28,7 @@ odoo.define('web.filter_menu_generator_tests', function (require) { float_field: { name: 'float_field', string: "Floaty McFloatface", type: 'float', searchable: true }, color: { name: 'color', string: "Color", type: 'selection', selection: [['black', "Black"], ['white', "White"]], searchable: true }, }; + target = getFixture(); }, }, function () { @@ -33,7 +37,7 @@ odoo.define('web.filter_menu_generator_tests', function (require) { QUnit.test('basic rendering', async function (assert) { assert.expect(16); - const cfi = await createComponent(CustomFilterItem, { + await createComponent(CustomFilterItem, { props: { fields: this.fields, }, @@ -42,41 +46,41 @@ odoo.define('web.filter_menu_generator_tests', function (require) { }, }); - assert.strictEqual(cfi.el.innerText.trim(), "Add Custom Filter"); - assert.hasClass(cfi.el, 'o_add_custom_filter_menu'); - assert.strictEqual(cfi.el.children.length, 1); + assert.strictEqual(target.querySelector(".dropdown").innerText.trim(), "Add Custom Filter"); + assert.hasClass(target.querySelector(".dropdown"), "o_add_custom_filter_menu"); + assert.strictEqual(target.querySelector(".dropdown").children.length, 1); - await toggleAddCustomFilterStandalone(cfi); + await toggleAddCustomFilterStandalone(target); // Single condition - assert.containsOnce(cfi, '.o_filter_condition'); - assert.containsOnce(cfi, '.o_filter_condition select.o_generator_menu_field'); - assert.containsOnce(cfi, '.o_filter_condition select.o_generator_menu_operator'); - assert.containsOnce(cfi, '.o_filter_condition span.o_generator_menu_value'); - assert.containsNone(cfi, '.o_filter_condition .o_or_filter'); - assert.containsNone(cfi, '.o_filter_condition .o_generator_menu_delete'); + assert.containsOnce(target, '.o_filter_condition'); + assert.containsOnce(target, '.o_filter_condition select.o_generator_menu_field'); + assert.containsOnce(target, '.o_filter_condition select.o_generator_menu_operator'); + assert.containsOnce(target, '.o_filter_condition span.o_generator_menu_value'); + assert.containsNone(target, '.o_filter_condition .o_or_filter'); + assert.containsNone(target, '.o_filter_condition .o_generator_menu_delete'); // no deletion allowed on single condition - assert.containsNone(cfi, '.o_filter_condition > i.o_generator_menu_delete'); + assert.containsNone(target, '.o_filter_condition > i.o_generator_menu_delete'); // Buttons - assert.containsOnce(cfi, 'button.o_apply_filter'); - assert.containsOnce(cfi, 'button.o_add_condition'); + assert.containsOnce(target, 'button.o_apply_filter'); + assert.containsOnce(target, 'button.o_add_condition'); - assert.containsOnce(cfi, '.o_filter_condition'); + assert.containsOnce(target, '.o_filter_condition'); - await cpHelpers.addCondition(cfi); + await cpHelpers.addCondition(target); - assert.containsN(cfi, '.o_filter_condition', 2); - assert.containsOnce(cfi, '.o_filter_condition .o_or_filter'); - assert.containsN(cfi, '.o_filter_condition .o_generator_menu_delete', 2); + assert.containsN(target, '.o_filter_condition', 2); + assert.containsOnce(target, '.o_filter_condition .o_or_filter'); + assert.containsN(target, '.o_filter_condition .o_generator_menu_delete', 2); }); QUnit.test('custom OR filter presets new condition from preceding', async function (assert) { assert.expect(4); const searchModel = new ActionModel(); - const cfi = await createComponent(CustomFilterItem, { + await createComponent(CustomFilterItem, { props: { fields: this.fields, }, @@ -84,30 +88,30 @@ odoo.define('web.filter_menu_generator_tests', function (require) { }); // Open custom filter form - await toggleAddCustomFilterStandalone(cfi); + await toggleAddCustomFilterStandalone(target); // Retrieve second selectable values for field and operator dropdowns - const fieldSecondValue = cfi.el.querySelector('.o_generator_menu_field option:nth-of-type(2)').value; - const operatorSecondValue = cfi.el.querySelector('.o_generator_menu_operator option:nth-of-type(2)').value; + const fieldSecondValue = target.querySelector('.o_generator_menu_field option:nth-of-type(2)').value; + const operatorSecondValue = target.querySelector('.o_generator_menu_operator option:nth-of-type(2)').value; // Check if they really exist… assert.ok(!!fieldSecondValue); assert.ok(!!operatorSecondValue); // Add first filter condition - await testUtils.fields.editSelect(cfi.el.querySelector('.o_generator_menu_field'), fieldSecondValue); - await cpHelpers.editConditionOperator(cfi, 0, operatorSecondValue); + await testUtils.fields.editSelect(target.querySelector('.o_generator_menu_field'), fieldSecondValue); + await cpHelpers.editConditionOperator(target, 0, operatorSecondValue); // Add a second conditon on the filter being created - await cpHelpers.addCondition(cfi); + await cpHelpers.addCondition(target); // Check the defaults for field and operator dropdowns assert.strictEqual( - cfi.el.querySelector('.o_filter_condition:nth-of-type(2) .o_generator_menu_field').value, + target.querySelector('.o_filter_condition:nth-of-type(2) .o_generator_menu_field').value, fieldSecondValue ); assert.strictEqual( - cfi.el.querySelector('.o_filter_condition:nth-of-type(2) .o_generator_menu_operator').value, + target.querySelector('.o_filter_condition:nth-of-type(2) .o_generator_menu_operator').value, operatorSecondValue ); }); @@ -124,7 +128,7 @@ odoo.define('web.filter_menu_generator_tests', function (require) { } } const searchModel = new MockedSearchModel(); - const cfi = await createComponent(CustomFilterItem, { + await createComponent(CustomFilterItem, { props: { fields: this.fields, }, @@ -137,9 +141,9 @@ odoo.define('web.filter_menu_generator_tests', function (require) { domain: '[["binary_field","!=",False]]', type: 'filter', }]; - await toggleAddCustomFilterStandalone(cfi); - await testUtils.fields.editSelect(cfi.el.querySelector('.o_generator_menu_field'), 'binary_field'); - await cpHelpers.applyFilter(cfi); + await toggleAddCustomFilterStandalone(target); + await testUtils.fields.editSelect(target.querySelector('.o_generator_menu_field'), 'binary_field'); + await cpHelpers.applyFilter(target); // Updated value expectedFilters = [{ @@ -147,9 +151,9 @@ odoo.define('web.filter_menu_generator_tests', function (require) { domain: '[["binary_field","=",False]]', type: 'filter', }]; - await testUtils.fields.editSelect(cfi.el.querySelector('.o_generator_menu_field'), 'binary_field'); - await cpHelpers.editConditionOperator(cfi, 0, '='); - await cpHelpers.applyFilter(cfi); + await testUtils.fields.editSelect(target.querySelector('.o_generator_menu_field'), 'binary_field'); + await cpHelpers.editConditionOperator(target, 0, '='); + await cpHelpers.applyFilter(target); }); QUnit.test('selection field: default and updated value', async function (assert) { @@ -164,7 +168,7 @@ odoo.define('web.filter_menu_generator_tests', function (require) { } } const searchModel = new MockedSearchModel(); - const cfi = await createComponent(CustomFilterItem, { + await createComponent(CustomFilterItem, { props: { fields: this.fields, }, @@ -177,9 +181,9 @@ odoo.define('web.filter_menu_generator_tests', function (require) { domain: '[["color","=","black"]]', type: 'filter', }]; - await toggleAddCustomFilterStandalone(cfi); - await testUtils.fields.editSelect(cfi.el.querySelector('.o_generator_menu_field'), 'color'); - await cpHelpers.applyFilter(cfi); + await toggleAddCustomFilterStandalone(target); + await testUtils.fields.editSelect(target.querySelector('.o_generator_menu_field'), 'color'); + await cpHelpers.applyFilter(target); // Updated value expectedFilters = [{ @@ -187,9 +191,9 @@ odoo.define('web.filter_menu_generator_tests', function (require) { domain: '[["color","=","white"]]', type: 'filter', }]; - await testUtils.fields.editSelect(cfi.el.querySelector('.o_generator_menu_field'), 'color'); - await testUtils.fields.editSelect(cfi.el.querySelector('.o_generator_menu_value select'), 'white'); - await cpHelpers.applyFilter(cfi); + await testUtils.fields.editSelect(target.querySelector('.o_generator_menu_field'), 'color'); + await testUtils.fields.editSelect(target.querySelector('.o_generator_menu_value select'), 'white'); + await cpHelpers.applyFilter(target); }); QUnit.test('adding a simple filter works', async function (assert) { @@ -208,21 +212,21 @@ odoo.define('web.filter_menu_generator_tests', function (require) { } } const searchModel = new MockedSearchModel(); - const cfi = await createComponent(CustomFilterItem, { + await createComponent(CustomFilterItem, { props: { fields: this.fields, }, env: { searchModel }, }); - await toggleAddCustomFilterStandalone(cfi); - await testUtils.fields.editSelect(cfi.el.querySelector('.o_generator_menu_field'), 'boolean_field'); - await cpHelpers.applyFilter(cfi); + await toggleAddCustomFilterStandalone(target); + await testUtils.fields.editSelect(target.querySelector('.o_generator_menu_field'), 'boolean_field'); + await cpHelpers.applyFilter(target); // The only things visible should be the button 'Add Custom Filter' and the menu; - assert.strictEqual(cfi.el.children.length, 2); - assert.containsOnce(cfi, 'button.dropdown-toggle'); - assert.containsOnce(cfi, '.dropdown-menu'); + assert.strictEqual(target.querySelector(".dropdown").children.length, 2); + assert.containsOnce(target, 'button.dropdown-toggle'); + assert.containsOnce(target, '.dropdown-menu'); }); QUnit.test('filtering by ID interval works', async function (assert) { @@ -246,7 +250,7 @@ odoo.define('web.filter_menu_generator_tests', function (require) { } } const searchModel = new MockedSearchModel(); - const cfi = await createComponent(CustomFilterItem, { + await createComponent(CustomFilterItem, { props: { fields: this.fields, }, @@ -255,15 +259,15 @@ odoo.define('web.filter_menu_generator_tests', function (require) { async function testValue(operator, value) { // open filter menu generator, select ID field, switch operator, type value, then click apply - await cpHelpers.editConditionField(cfi, 0, 'id_field'); - await cpHelpers.editConditionOperator(cfi, 0, operator); - await cpHelpers.editConditionValue(cfi, 0, + await cpHelpers.editConditionField(target, 0, 'id_field'); + await cpHelpers.editConditionOperator(target, 0, operator); + await cpHelpers.editConditionValue(target, 0, value ); - await cpHelpers.applyFilter(cfi); + await cpHelpers.applyFilter(target); } - await toggleAddCustomFilterStandalone(cfi); + await toggleAddCustomFilterStandalone(target); for (const domain of [...expectedDomains]) { await testValue(domain[0][1], domain[0][2]); } @@ -296,7 +300,7 @@ odoo.define('web.filter_menu_generator_tests', function (require) { } } const searchModel = new MockedSearchModel(); - const cfi = await createComponent(CustomFilterItem, { + await createComponent(CustomFilterItem, { props: { fields: this.fields, }, @@ -305,14 +309,14 @@ odoo.define('web.filter_menu_generator_tests', function (require) { async function testValue(value) { // open filter menu generator, select trululu field and enter string `a`, then click apply - await cpHelpers.editConditionField(cfi, 0, 'many2one_field'); - await cpHelpers.editConditionValue(cfi, 0, + await cpHelpers.editConditionField(target, 0, 'many2one_field'); + await cpHelpers.editConditionValue(target, 0, value ); - await cpHelpers.applyFilter(cfi); + await cpHelpers.applyFilter(target); } - await toggleAddCustomFilterStandalone(cfi); + await toggleAddCustomFilterStandalone(target); for (const value of testedValues) { await testValue(value); } @@ -337,7 +341,7 @@ odoo.define('web.filter_menu_generator_tests', function (require) { } } const searchModel = new MockedSearchModel(); - const cfi = await createComponent(CustomFilterItem, { + await createComponent(CustomFilterItem, { props: { fields: this.fields, }, @@ -349,15 +353,15 @@ odoo.define('web.filter_menu_generator_tests', function (require) { env: { searchModel }, }); - await toggleAddCustomFilterStandalone(cfi); - await testUtils.fields.editSelect(cfi.el.querySelector('.o_generator_menu_field'), 'date_time_field'); + await toggleAddCustomFilterStandalone(target); + await testUtils.fields.editSelect(target.querySelector('.o_generator_menu_field'), 'date_time_field'); - assert.strictEqual(cfi.el.querySelector('.o_generator_menu_field').value, 'date_time_field'); - assert.strictEqual(cfi.el.querySelector('.o_generator_menu_operator').value, 'between'); + assert.strictEqual(target.querySelector('.o_generator_menu_field').value, 'date_time_field'); + assert.strictEqual(target.querySelector('.o_generator_menu_operator').value, 'between'); - await cpHelpers.editConditionOperator(cfi, 0, '='); - await testUtils.fields.editSelect(cfi.el.querySelector('.o_filter_condition span.o_generator_menu_value input'), '02/22/2017 11:00:00'); // in TZ - await cpHelpers.applyFilter(cfi); + await cpHelpers.editConditionOperator(target, 0, '='); + await testUtils.fields.editSelect(target.querySelector('.o_filter_condition span.o_generator_menu_value input'), '02/22/2017 11:00:00'); // in TZ + await cpHelpers.applyFilter(target); }); QUnit.test('custom filter datetime between operator', async function (assert) { @@ -378,7 +382,7 @@ odoo.define('web.filter_menu_generator_tests', function (require) { } } const searchModel = new MockedSearchModel(); - const cfi = await createComponent(CustomFilterItem, { + await createComponent(CustomFilterItem, { props: { fields: this.fields, }, @@ -390,16 +394,16 @@ odoo.define('web.filter_menu_generator_tests', function (require) { env: { searchModel }, }); - await toggleAddCustomFilterStandalone(cfi); - await testUtils.fields.editSelect(cfi.el.querySelector('.o_generator_menu_field'), 'date_time_field'); + await toggleAddCustomFilterStandalone(target); + await testUtils.fields.editSelect(target.querySelector('.o_generator_menu_field'), 'date_time_field'); - assert.strictEqual(cfi.el.querySelector('.o_generator_menu_field').value, 'date_time_field'); - assert.strictEqual(cfi.el.querySelector('.o_generator_menu_operator').value, 'between'); + assert.strictEqual(target.querySelector('.o_generator_menu_field').value, 'date_time_field'); + assert.strictEqual(target.querySelector('.o_generator_menu_operator').value, 'between'); - const valueInputs = cfi.el.querySelectorAll('.o_generator_menu_value .o_input'); + const valueInputs = target.querySelectorAll('.o_generator_menu_value .o_input'); await testUtils.fields.editSelect(valueInputs[0], '02/22/2017 11:00:00'); // in TZ await testUtils.fields.editSelect(valueInputs[1], '02-22-2017 17:00:00'); // in TZ - await cpHelpers.applyFilter(cfi); + await cpHelpers.applyFilter(target); }); QUnit.test('default custom filter datetime', async function (assert) { @@ -418,7 +422,7 @@ odoo.define('web.filter_menu_generator_tests', function (require) { } } const searchModel = new MockedSearchModel(); - const cfi = await createComponent(CustomFilterItem, { + await createComponent(CustomFilterItem, { props: { fields: this.fields, }, @@ -430,19 +434,19 @@ odoo.define('web.filter_menu_generator_tests', function (require) { env: { searchModel }, }); - await toggleAddCustomFilterStandalone(cfi); - await testUtils.fields.editSelect(cfi.el.querySelector('.o_generator_menu_field'), 'date_time_field'); + await toggleAddCustomFilterStandalone(target); + await testUtils.fields.editSelect(target.querySelector('.o_generator_menu_field'), 'date_time_field'); - assert.strictEqual(cfi.el.querySelector('.o_generator_menu_field').value, 'date_time_field'); - assert.strictEqual(cfi.el.querySelector('.o_generator_menu_operator').value, 'between'); + assert.strictEqual(target.querySelector('.o_generator_menu_field').value, 'date_time_field'); + assert.strictEqual(target.querySelector('.o_generator_menu_operator').value, 'between'); - await cpHelpers.applyFilter(cfi); + await cpHelpers.applyFilter(target); }); QUnit.test('input value parsing', async function (assert) { assert.expect(7); - const cfi = await createComponent(CustomFilterItem, { + await createComponent(CustomFilterItem, { props: { fields: this.fields, }, @@ -451,31 +455,31 @@ odoo.define('web.filter_menu_generator_tests', function (require) { }, }); - await toggleAddCustomFilterStandalone(cfi); - await cpHelpers.addCondition(cfi); + await toggleAddCustomFilterStandalone(target); + await cpHelpers.addCondition(target); - await cpHelpers.editConditionField(cfi, 0, "float_field"); - await cpHelpers.editConditionField(cfi, 1, "id"); + await cpHelpers.editConditionField(target, 0, "float_field"); + await cpHelpers.editConditionField(target, 1, "id"); - const [floatInput, idInput] = cfi.el.querySelectorAll('.o_generator_menu_value .o_input'); + const [floatInput, idInput] = target.querySelectorAll('.o_generator_menu_value .o_input'); // Default values assert.strictEqual(floatInput.value, "0.0"); assert.strictEqual(idInput.value, "0"); // Float parsing - await cpHelpers.editConditionValue(cfi, 0, "4.2"); + await cpHelpers.editConditionValue(target, 0, "4.2"); assert.strictEqual(floatInput.value, "4.2"); - await cpHelpers.editConditionValue(cfi, 0, "DefinitelyValidFloat"); + await cpHelpers.editConditionValue(target, 0, "DefinitelyValidFloat"); // String input in a number input gives "", which is parsed as 0 assert.strictEqual(floatInput.value, "0.0"); // Number parsing - await cpHelpers.editConditionValue(cfi, 1, "4"); + await cpHelpers.editConditionValue(target, 1, "4"); assert.strictEqual(idInput.value, "4"); - await cpHelpers.editConditionValue(cfi, 1, "4.2"); + await cpHelpers.editConditionValue(target, 1, "4.2"); assert.strictEqual(idInput.value, "4"); - await cpHelpers.editConditionValue(cfi, 1, "DefinitelyValidID"); + await cpHelpers.editConditionValue(target, 1, "DefinitelyValidID"); // String input in a number input gives "", which is parsed as 0 assert.strictEqual(idInput.value, "0"); }); @@ -483,7 +487,7 @@ odoo.define('web.filter_menu_generator_tests', function (require) { QUnit.test('input value parsing with language', async function (assert) { assert.expect(5); - const cfi = await createComponent(CustomFilterItem, { + await createComponent(CustomFilterItem, { props: { fields: this.fields, }, @@ -498,24 +502,24 @@ odoo.define('web.filter_menu_generator_tests', function (require) { }, }); - await toggleAddCustomFilterStandalone(cfi); - await cpHelpers.addCondition(cfi); + await toggleAddCustomFilterStandalone(target); + await cpHelpers.addCondition(target); - await cpHelpers.editConditionField(cfi, 0, "float_field"); + await cpHelpers.editConditionField(target, 0, "float_field"); - const [floatInput] = cfi.el.querySelectorAll('.o_generator_menu_value .o_input'); + const [floatInput] = target.querySelectorAll('.o_generator_menu_value .o_input'); // Default values assert.strictEqual(floatInput.value, "0,0"); // Float parsing - await cpHelpers.editConditionValue(cfi, 0, '4,'); + await cpHelpers.editConditionValue(target, 0, '4,'); assert.strictEqual(floatInput.value, "4,"); - await cpHelpers.editConditionValue(cfi, 0, '4,2'); + await cpHelpers.editConditionValue(target, 0, '4,2'); assert.strictEqual(floatInput.value, "4,2"); - await cpHelpers.editConditionValue(cfi, 0, '4,2,'); + await cpHelpers.editConditionValue(target, 0, '4,2,'); assert.strictEqual(floatInput.value, "4,2"); - await cpHelpers.editConditionValue(cfi, 0, "DefinitelyValidFloat"); + await cpHelpers.editConditionValue(target, 0, "DefinitelyValidFloat"); // The input here is a string, resulting in a parsing error instead of 0 assert.strictEqual(floatInput.value, "4,2"); }); @@ -554,37 +558,37 @@ odoo.define('web.filter_menu_generator_tests', function (require) { } } const searchModel = new MockedSearchModel(); - const cfi = await createComponent(CustomFilterItem, { + await createComponent(CustomFilterItem, { props: { fields: this.fields, }, env: { searchModel }, }); - await toggleAddCustomFilterStandalone(cfi); - await cpHelpers.addCondition(cfi); - await cpHelpers.addCondition(cfi); - await cpHelpers.addCondition(cfi); - await cpHelpers.addCondition(cfi); + await toggleAddCustomFilterStandalone(target); + await cpHelpers.addCondition(target); + await cpHelpers.addCondition(target); + await cpHelpers.addCondition(target); + await cpHelpers.addCondition(target); - await cpHelpers.editConditionField(cfi, 0, 'date_field'); - await cpHelpers.editConditionValue(cfi, 0, '01/09/1997'); + await cpHelpers.editConditionField(target, 0, 'date_field'); + await cpHelpers.editConditionValue(target, 0, '01/09/1997'); - await cpHelpers.editConditionField(cfi, 1, 'boolean_field'); - await cpHelpers.editConditionOperator(cfi, 1, '!='); + await cpHelpers.editConditionField(target, 1, 'boolean_field'); + await cpHelpers.editConditionOperator(target, 1, '!='); - await cpHelpers.editConditionField(cfi, 2, 'char_field'); - await cpHelpers.editConditionValue(cfi, 2, "I will be deleted anyway"); + await cpHelpers.editConditionField(target, 2, 'char_field'); + await cpHelpers.editConditionValue(target, 2, "I will be deleted anyway"); - await cpHelpers.editConditionField(cfi, 3, 'float_field'); - await cpHelpers.editConditionValue(cfi, 3, 7.2); + await cpHelpers.editConditionField(target, 3, 'float_field'); + await cpHelpers.editConditionValue(target, 3, 7.2); - await cpHelpers.editConditionField(cfi, 4, 'id'); - await cpHelpers.editConditionValue(cfi, 4, 9); + await cpHelpers.editConditionField(target, 4, 'id'); + await cpHelpers.editConditionValue(target, 4, 9); - await cpHelpers.removeCondition(cfi, 2); + await cpHelpers.removeCondition(target, 2); - await cpHelpers.applyFilter(cfi); + await cpHelpers.applyFilter(target); }); }); }); diff --git a/addons/web/static/tests/legacy/core/owl_dialog_tests.js b/addons/web/static/tests/legacy/core/owl_dialog_tests.js index 4427545e73d..28a2c2a424d 100644 --- a/addons/web/static/tests/legacy/core/owl_dialog_tests.js +++ b/addons/web/static/tests/legacy/core/owl_dialog_tests.js @@ -15,6 +15,7 @@ odoo.define('web.owl_dialog_tests', function (require) { destroy, } = require("@web/../tests/helpers/utils"); const { createWebClient, doAction } = require("@web/../tests/webclient/helpers"); + const { LegacyComponent } = require("@web/legacy/legacy_component"); const { Component, useState, xml } = owl; const EscapeKey = { key: 'Escape', keyCode: 27, which: 27 }; @@ -25,7 +26,7 @@ odoo.define('web.owl_dialog_tests', function (require) { QUnit.test("Rendering of all props", async function (assert) { assert.expect(36); - class SubComponent extends Component { + class SubComponent extends LegacyComponent { // Handlers _onClick() { assert.step('subcomponent_clicked'); @@ -33,7 +34,7 @@ odoo.define('web.owl_dialog_tests', function (require) { } SubComponent.template = xml`
`; - class Parent extends Component { + class Parent extends LegacyComponent { setup() { this.state = useState({ textContent: "sup" }); } @@ -174,7 +175,7 @@ odoo.define('web.owl_dialog_tests', function (require) { assert.expect(23); const { legacyEnv } = await makeLegacyDialogMappingTestEnv(); - class Parent extends Component { + class Parent extends LegacyComponent { setup() { this.dialogIds = useState([]); } @@ -277,7 +278,7 @@ odoo.define('web.owl_dialog_tests', function (require) { assert.expect(9); const { legacyEnv, env } = await makeLegacyDialogMappingTestEnv(); - class OwlDialogWrapper extends Component { + class OwlDialogWrapper extends LegacyComponent { setup() { this.env = legacyEnv; this.__owl__.childEnv = legacyEnv; @@ -295,7 +296,7 @@ odoo.define('web.owl_dialog_tests', function (require) { this.contentClass = this.props.contentClass; } } - class Parent extends Component { + class Parent extends LegacyComponent { setup() { this.dialogs = useState([]); } @@ -357,7 +358,7 @@ odoo.define('web.owl_dialog_tests', function (require) { return modal; } - class Parent1 extends Component { + class Parent1 extends LegacyComponent { setup() { } } @@ -371,7 +372,7 @@ odoo.define('web.owl_dialog_tests', function (require) { env: makeTestEnvironment(), }); - class Parent2 extends Component { + class Parent2 extends LegacyComponent { setup() { this.state = useState({ showSecondDialog: true }); } diff --git a/addons/web/static/tests/legacy/core/popover_tests.js b/addons/web/static/tests/legacy/core/popover_tests.js index d42c3d53715..8b2137e2991 100644 --- a/addons/web/static/tests/legacy/core/popover_tests.js +++ b/addons/web/static/tests/legacy/core/popover_tests.js @@ -5,6 +5,7 @@ odoo.define('web.popover_tests', function (require) { const Popover = require('web.Popover'); const testUtils = require('web.test_utils'); const { click, mount } = require("@web/../tests/helpers/utils"); + const { LegacyComponent } = require("@web/legacy/legacy_component"); const { Component, useState, xml } = owl; @@ -14,12 +15,12 @@ odoo.define('web.popover_tests', function (require) { QUnit.test('Basic rendering & props', async function (assert) { assert.expect(11); - class SubComponent extends Component {} + class SubComponent extends LegacyComponent {} SubComponent.template = xml`
`; - class Parent extends Component { + class Parent extends LegacyComponent { constructor() { super(...arguments); this.state = useState({ @@ -143,7 +144,7 @@ odoo.define('web.popover_tests', function (require) { QUnit.test('Multiple popovers', async function (assert) { assert.expect(9); - class Parent extends Component {} + class Parent extends LegacyComponent {} Parent.components = { Popover }; Parent.template = xml`
@@ -191,7 +192,7 @@ odoo.define('web.popover_tests', function (require) { QUnit.test('toggle', async function (assert) { assert.expect(4); - class Parent extends Component {} + class Parent extends LegacyComponent {} Parent.template = xml`
@@ -224,7 +225,7 @@ odoo.define('web.popover_tests', function (require) { assert.expect(7); // Needed to trigger the event from inside the Popover slot. - class Content extends Component { + class Content extends LegacyComponent { onClick() { this.trigger("o-popover-close"); } @@ -235,7 +236,7 @@ odoo.define('web.popover_tests', function (require) { `; - class Parent extends Component {} + class Parent extends LegacyComponent {} Parent.components = { Content, Popover }; Parent.template = xml`
diff --git a/addons/web/static/tests/legacy/helpers/test_utils_create.js b/addons/web/static/tests/legacy/helpers/test_utils_create.js index 2a9a3dc81c0..f1b31c26ccb 100644 --- a/addons/web/static/tests/legacy/helpers/test_utils_create.js +++ b/addons/web/static/tests/legacy/helpers/test_utils_create.js @@ -22,6 +22,7 @@ odoo.define('web.test_utils_create', function (require) { const Widget = require('web.Widget'); const { destroy, getFixture, mount, useChild } = require('@web/../tests/helpers/utils'); const { registerCleanup } = require("@web/../tests/helpers/cleanup"); + const { LegacyComponent } = require("@web/legacy/legacy_component"); const { Component, onMounted, onWillStart, useState, xml } = owl; @@ -82,7 +83,7 @@ odoo.define('web.test_utils_create', function (require) { throw new Error(`Argument "constructor" must be an Owl Component.`); } const cleanUp = await testUtilsMock.addMockEnvironmentOwl(Component, params); - class Parent extends Component { + class Parent extends LegacyComponent { setup() { this.Component = constructor; this.state = useState(params.props || {}); @@ -157,7 +158,7 @@ odoo.define('web.test_utils_create', function (require) { ControlPanel: { archNodes: controlPanelInfo.children, }, }; - class Parent extends Component { + class Parent extends LegacyComponent { setup() { this.searchModel = new ActionModel(extensions, globalConfig); this.state = useState(props); diff --git a/addons/web/static/tests/legacy/owl_compatibility_tests.js b/addons/web/static/tests/legacy/owl_compatibility_tests.js index dd10fa648df..431997dad3f 100644 --- a/addons/web/static/tests/legacy/owl_compatibility_tests.js +++ b/addons/web/static/tests/legacy/owl_compatibility_tests.js @@ -12,6 +12,7 @@ odoo.define('web.OwlCompatibilityTests', function (require) { } = require('web.OwlCompatibility'); const testUtils = require('web.test_utils'); const Widget = require('web.Widget'); + const { LegacyComponent } = require("@web/legacy/legacy_component"); const makeTestPromise = testUtils.makeTestPromise; const nextTick = testUtils.nextTick; @@ -52,7 +53,7 @@ odoo.define('web.OwlCompatibilityTests', function (require) { this.$el.text('Hello World!'); } }); - class Parent extends Component { + class Parent extends LegacyComponent { constructor() { super(...arguments); this.MyWidget = MyWidget; @@ -82,7 +83,7 @@ odoo.define('web.OwlCompatibilityTests', function (require) { this.$el.text(`Hello ${this.name}!`); } }); - class Parent extends Component { + class Parent extends LegacyComponent { constructor() { super(...arguments); this.MyWidget = MyWidget; @@ -113,7 +114,7 @@ odoo.define('web.OwlCompatibilityTests', function (require) { this.$el.text(`${this.a1} ${this.a2}!`); } }); - class Parent extends Component { + class Parent extends LegacyComponent { setup() { this.MyWidget = MyWidget; this.error = false; @@ -157,7 +158,7 @@ odoo.define('web.OwlCompatibilityTests', function (require) { return [this.props.a1, this.props.a2]; } } - class Parent extends Component { + class Parent extends LegacyComponent { constructor() { super(...arguments); this.MyWidget = MyWidget; @@ -188,7 +189,7 @@ odoo.define('web.OwlCompatibilityTests', function (require) { this.$el.text(`${this.a1} ${this.a2}!`); } }); - class Parent extends Component { + class Parent extends LegacyComponent { constructor() { super(...arguments); this.MyWidget = MyWidget; @@ -232,7 +233,7 @@ odoo.define('web.OwlCompatibilityTests', function (require) { this.widget.render(); } } - class Parent extends Component { + class Parent extends LegacyComponent { constructor() { super(...arguments); this.MyWidget = MyWidget; @@ -287,13 +288,13 @@ odoo.define('web.OwlCompatibilityTests', function (require) { this.widget.render(); } } - class AsyncComponent extends Component { + class AsyncComponent extends LegacyComponent { setup() { onWillUpdateProps(() => prom); } } AsyncComponent.template = xml`
Hi !
`; - class Parent extends Component { + class Parent extends LegacyComponent { constructor() { super(...arguments); this.MyWidget = MyWidget; @@ -342,7 +343,7 @@ odoo.define('web.OwlCompatibilityTests', function (require) { this._super.apply(this, arguments); }, }); - class Parent extends Component { + class Parent extends LegacyComponent { constructor() { super(...arguments); this.MyWidget = MyWidget; @@ -372,9 +373,9 @@ odoo.define('web.OwlCompatibilityTests', function (require) { this.$el.text('widget'); }, }); - class MyComponent extends Component {} + class MyComponent extends LegacyComponent {} MyComponent.template = xml`
component
`; - class Parent extends Component { + class Parent extends LegacyComponent { constructor() { super(...arguments); this.Children = [MyWidget, MyComponent]; @@ -402,7 +403,7 @@ odoo.define('web.OwlCompatibilityTests', function (require) { widget = this; }, }); - class Parent extends Component { + class Parent extends LegacyComponent { constructor() { super(...arguments); this.MyWidget = MyWidget; @@ -435,7 +436,7 @@ odoo.define('web.OwlCompatibilityTests', function (require) { return this._rpc({ route: 'some/route', params: { val: 2 } }); }, }); - class Parent extends Component { + class Parent extends LegacyComponent { constructor() { super(...arguments); this.MyWidget = MyWidget; @@ -478,7 +479,7 @@ odoo.define('web.OwlCompatibilityTests', function (require) { assert.strictEqual(result, 3); }, }); - class Parent extends Component { + class Parent extends LegacyComponent { constructor() { super(...arguments); this.MyWidget = MyWidget; @@ -510,7 +511,7 @@ odoo.define('web.OwlCompatibilityTests', function (require) { assert.strictEqual(this.getSession().key, 'value'); }, }); - class Parent extends Component { + class Parent extends LegacyComponent { constructor() { super(...arguments); this.MyWidget = MyWidget; @@ -538,7 +539,7 @@ odoo.define('web.OwlCompatibilityTests', function (require) { return this.loadViews('some_model', { x: 2 }, [[false, 'list']]); }, }); - class Parent extends Component { + class Parent extends LegacyComponent { constructor() { super(...arguments); this.MyWidget = MyWidget; @@ -579,7 +580,7 @@ odoo.define('web.OwlCompatibilityTests', function (require) { this.$el.text('Hello'); }, }); - class Parent extends Component { + class Parent extends LegacyComponent { constructor() { super(...arguments); this.MyWidget1 = MyWidget1; @@ -622,7 +623,7 @@ odoo.define('web.OwlCompatibilityTests', function (require) { this.$el.text('Hi'); }, }); - class Parent extends Component { + class Parent extends LegacyComponent { constructor() { super(...arguments); this.MyWidget = MyWidget; @@ -695,7 +696,7 @@ odoo.define('web.OwlCompatibilityTests', function (require) { this.widget.render(); } } - class Parent extends Component { + class Parent extends LegacyComponent { constructor() { super(...arguments); this.MyWidget = MyWidget; @@ -766,7 +767,7 @@ odoo.define('web.OwlCompatibilityTests', function (require) { this.widget.render(); } } - class Parent extends Component { + class Parent extends LegacyComponent { constructor() { super(...arguments); this.MyWidget = MyWidget; @@ -812,7 +813,7 @@ odoo.define('web.OwlCompatibilityTests', function (require) { let component; let wrapper; - class MyComponent extends Component { + class MyComponent extends LegacyComponent { setup() { component = this; } @@ -838,7 +839,7 @@ odoo.define('web.OwlCompatibilityTests', function (require) { QUnit.test("sub component hooks are correctly called", async function (assert) { assert.expect(13); - class MyComponent extends Component { + class MyComponent extends LegacyComponent { setup() { assert.step("setup"); onWillStart(() => { @@ -889,7 +890,7 @@ odoo.define('web.OwlCompatibilityTests', function (require) { QUnit.test("lifecycle with several sub components", async function (assert) { assert.expect(21); - class MyComponent extends Component { + class MyComponent extends LegacyComponent { setup() { useLogLifeCycle(assert.step.bind(assert), this.props.id); } @@ -945,13 +946,13 @@ odoo.define('web.OwlCompatibilityTests', function (require) { QUnit.test("lifecycle with several levels of sub components", async function (assert) { assert.expect(21); - class MyChildComponent extends Component { + class MyChildComponent extends LegacyComponent { setup() { useLogLifeCycle(assert.step.bind(assert)); } } MyChildComponent.template = xml`
child
`; - class MyComponent extends Component { + class MyComponent extends LegacyComponent { setup() { useLogLifeCycle(assert.step.bind(assert)); } @@ -1007,13 +1008,13 @@ odoo.define('web.OwlCompatibilityTests', function (require) { QUnit.test("lifecycle mount in fragment", async function (assert) { assert.expect(17); - class MyChildComponent extends Component { + class MyChildComponent extends LegacyComponent { setup() { useLogLifeCycle(assert.step.bind(assert)); } } MyChildComponent.template = xml`
child
`; - class MyComponent extends Component { + class MyComponent extends LegacyComponent { setup() { useLogLifeCycle(assert.step.bind(assert)); } @@ -1064,13 +1065,13 @@ odoo.define('web.OwlCompatibilityTests', function (require) { QUnit.test("lifecycle mount/unmount", async function (assert) { assert.expect(37); - class MyChildComponent extends Component { + class MyChildComponent extends LegacyComponent { setup() { useLogLifeCycle(assert.step.bind(assert)); } } MyChildComponent.template = xml`
child
`; - class MyComponent extends Component { + class MyComponent extends LegacyComponent { setup() { useLogLifeCycle(assert.step.bind(assert)); } @@ -1139,13 +1140,13 @@ odoo.define('web.OwlCompatibilityTests', function (require) { QUnit.test("lifecycle mount/unmount/update", async function (assert) { assert.expect(24); - class MyChildComponent extends Component { + class MyChildComponent extends LegacyComponent { setup() { useLogLifeCycle(assert.step.bind(assert)); } } MyChildComponent.template = xml`
child
`; - class MyComponent extends Component { + class MyComponent extends LegacyComponent { setup() { useLogLifeCycle(assert.step.bind(assert)); } @@ -1198,13 +1199,13 @@ odoo.define('web.OwlCompatibilityTests', function (require) { QUnit.test("lifecycle mount/unmount/update/render", async function (assert) { assert.expect(36); - class MyChildComponent extends Component { + class MyChildComponent extends LegacyComponent { setup() { useLogLifeCycle(assert.step.bind(assert)); } } MyChildComponent.template = xml`
child
`; - class MyComponent extends Component { + class MyComponent extends LegacyComponent { setup() { useLogLifeCycle(assert.step.bind(assert)); } @@ -1272,7 +1273,7 @@ odoo.define('web.OwlCompatibilityTests', function (require) { QUnit.test("sub component can be updated (in DOM)", async function (assert) { assert.expect(2); - class MyComponent extends Component {} + class MyComponent extends LegacyComponent {} MyComponent.template = xml`
Component
`; const MyWidget = WidgetAdapter.extend({ start() { @@ -1300,7 +1301,7 @@ odoo.define('web.OwlCompatibilityTests', function (require) { QUnit.test("sub component can be updated (not in DOM)", async function (assert) { assert.expect(18); - class MyComponent extends Component { + class MyComponent extends LegacyComponent { setup() { useLogLifeCycle((log) => assert.step(log)); } @@ -1361,7 +1362,7 @@ odoo.define('web.OwlCompatibilityTests', function (require) { QUnit.test("update a destroyed sub component", async function (assert) { assert.expect(1); - class MyComponent extends Component {} + class MyComponent extends LegacyComponent {} MyComponent.template = xml`
Component
`; const MyWidget = WidgetAdapter.extend({ start() { @@ -1387,7 +1388,7 @@ odoo.define('web.OwlCompatibilityTests', function (require) { QUnit.test("sub component that triggers events", async function (assert) { assert.expect(3); - class WidgetComponent extends Component {} + class WidgetComponent extends LegacyComponent {} WidgetComponent.template = xml`
Component
`; const MyWidget = WidgetAdapter.extend({ @@ -1420,7 +1421,7 @@ odoo.define('web.OwlCompatibilityTests', function (require) { let myComponent; let widget1; let widget2; - class WidgetComponent extends Component {} + class WidgetComponent extends LegacyComponent {} WidgetComponent.template = xml`
Component
`; const MyWidget = WidgetAdapter.extend({ custom_events: _.extend({}, Widget.custom_events, { @@ -1479,7 +1480,7 @@ odoo.define('web.OwlCompatibilityTests', function (require) { assert.expect(7); let leafComponent; - class MyComponent extends Component {} + class MyComponent extends LegacyComponent {} MyComponent.template = xml`Component`; const MyWidget = WidgetAdapter.extend({ custom_events: { @@ -1498,7 +1499,7 @@ odoo.define('web.OwlCompatibilityTests', function (require) { return leafComponent.mount(this.el); }, }); - class Parent extends Component { + class Parent extends LegacyComponent { constructor() { super(...arguments); this.MyWidget = MyWidget; @@ -1546,7 +1547,7 @@ odoo.define('web.OwlCompatibilityTests', function (require) { this.$el.text('Widget'); } }); - class MyComponent extends Component { + class MyComponent extends LegacyComponent { constructor() { super(...arguments); this.MyWidget = MyWidget; @@ -1620,7 +1621,7 @@ odoo.define('web.OwlCompatibilityTests', function (require) { }); fieldRegistry.add('pad_like', PadLikeWidget); - class WidgetComponent extends Component {} + class WidgetComponent extends LegacyComponent {} WidgetComponent.template = xml`
Widget
`; widgetRegistry.add("widget_comp", WidgetComponent); diff --git a/addons/web/static/tests/legacy/views/basic_view_tests.js b/addons/web/static/tests/legacy/views/basic_view_tests.js index ce4f8bb5c8f..f6a60c7ba2b 100644 --- a/addons/web/static/tests/legacy/views/basic_view_tests.js +++ b/addons/web/static/tests/legacy/views/basic_view_tests.js @@ -5,6 +5,7 @@ odoo.define('web.basic_view_tests', function (require) { const BasicRenderer = require("web.BasicRenderer"); const testUtils = require('web.test_utils'); const widgetRegistryOwl = require('web.widgetRegistry'); + const { LegacyComponent } = require("@web/legacy/legacy_component"); const { Component, xml } = owl; @@ -43,7 +44,7 @@ odoo.define('web.basic_view_tests', function (require) { }) }); - class MyWidget extends Component {} + class MyWidget extends LegacyComponent {} MyWidget.fieldDependencies = { foo: { type: 'char' }, bar: { type: 'boolean' }, diff --git a/addons/web/static/tests/legacy/views/form_tests.js b/addons/web/static/tests/legacy/views/form_tests.js index 813ae361f93..8e09ff4632c 100644 --- a/addons/web/static/tests/legacy/views/form_tests.js +++ b/addons/web/static/tests/legacy/views/form_tests.js @@ -30,6 +30,7 @@ const makeTestEnvironment = require("web.test_env"); const { mapLegacyEnvToWowlEnv } = require("@web/legacy/utils"); const { registry } = require("@web/core/registry"); const { scrollerService } = require("@web/core/scroller_service"); +const { LegacyComponent } = require("@web/legacy/legacy_component"); const { Component, onMounted, onWillUnmount, xml } = owl; @@ -8351,7 +8352,7 @@ QUnit.module('Views', { QUnit.test('basic support for widgets (being Owl Components)', async function (assert) { assert.expect(1); - class MyComponent extends Component { + class MyComponent extends LegacyComponent { get value() { return JSON.stringify(this.props.record.data); } diff --git a/addons/web/static/tests/legacy/views/kanban_tests.js b/addons/web/static/tests/legacy/views/kanban_tests.js index c2a868f6b42..91d669a405b 100644 --- a/addons/web/static/tests/legacy/views/kanban_tests.js +++ b/addons/web/static/tests/legacy/views/kanban_tests.js @@ -13,6 +13,7 @@ var testUtils = require('web.test_utils'); var Widget = require('web.Widget'); var widgetRegistry = require('web.widget_registry'); const widgetRegistryOwl = require('web.widgetRegistry'); +const { LegacyComponent } = require("@web/legacy/legacy_component"); var makeTestPromise = testUtils.makeTestPromise; var nextTick = testUtils.nextTick; @@ -6174,7 +6175,7 @@ QUnit.module('Views', { QUnit.test('basic support for widgets (being Owl Components)', async function (assert) { assert.expect(1); - class MyComponent extends Component { + class MyComponent extends LegacyComponent { get value() { return JSON.stringify(this.props.record.data); } diff --git a/addons/web/static/tests/legacy/views/list_tests.js b/addons/web/static/tests/legacy/views/list_tests.js index b7ccff6f298..2c924bfef6f 100644 --- a/addons/web/static/tests/legacy/views/list_tests.js +++ b/addons/web/static/tests/legacy/views/list_tests.js @@ -22,6 +22,7 @@ const Widget = require('web.Widget'); const ControlPanel = require('web.ControlPanel'); const ListController = require('web.ListController'); const cpHelpers = require('@web/../tests/search/helpers'); +const { LegacyComponent } = require("@web/legacy/legacy_component"); var createView = testUtils.createView; const { getFixture, click, legacyExtraNextTick } = require("@web/../tests/helpers/utils"); @@ -9309,7 +9310,7 @@ QUnit.module('Views', { QUnit.test('basic support for widgets (being Owl Components)', async function (assert) { assert.expect(1); - class MyComponent extends Component { + class MyComponent extends LegacyComponent { get value() { return JSON.stringify(this.props.record.data); } diff --git a/addons/web/static/tests/legacy/views/state_mapping_tests.js b/addons/web/static/tests/legacy/views/state_mapping_tests.js index 6bf6a567f9e..a942dc91902 100644 --- a/addons/web/static/tests/legacy/views/state_mapping_tests.js +++ b/addons/web/static/tests/legacy/views/state_mapping_tests.js @@ -24,6 +24,7 @@ import ActionModel from "web.ActionModel"; import { mock } from "web.test_utils"; import legacyViewRegistry from "web.view_registry"; import { browser } from "@web/core/browser/browser"; +import { LegacyComponent } from "@web/legacy/legacy_component"; const { Component, xml } = owl; const serviceRegistry = registry.category("services"); @@ -78,7 +79,7 @@ QUnit.module("Views", (hooks) => { setupControlPanelServiceRegistry(); serviceRegistry.add("dialog", dialogService); - class ToyView extends Component {} + class ToyView extends LegacyComponent {} ToyView.components = { ControlPanel }; ToyView.display_name = _lt("Toy view"); ToyView.icon = "fab fa-android"; diff --git a/addons/web/static/tests/search/comparison_menu_tests.js b/addons/web/static/tests/search/comparison_menu_tests.js index 4fdbbbbd95b..4917d8d356a 100644 --- a/addons/web/static/tests/search/comparison_menu_tests.js +++ b/addons/web/static/tests/search/comparison_menu_tests.js @@ -1,6 +1,6 @@ /** @odoo-module **/ -import { patchDate, patchWithCleanup } from "@web/../tests/helpers/utils"; +import { getFixture, patchDate, patchWithCleanup } from "@web/../tests/helpers/utils"; import { browser } from "@web/core/browser/browser"; import { ControlPanel } from "@web/search/control_panel/control_panel"; import { @@ -14,6 +14,7 @@ import { toggleMenuItemOption, } from "./helpers"; +let target; let serverData; QUnit.module("Search", (hooks) => { hooks.beforeEach(async () => { @@ -40,6 +41,7 @@ QUnit.module("Search", (hooks) => { setTimeout: (fn) => fn(), clearTimeout: () => {}, }); + target = getFixture(); }); QUnit.module("Comparison"); @@ -47,30 +49,28 @@ QUnit.module("Search", (hooks) => { QUnit.test("simple rendering", async function (assert) { assert.expect(6); patchDate(1997, 0, 9, 12, 0, 0); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "foo", Component: ControlPanel, searchMenuTypes: ["filter", "comparison"], searchViewId: false, }); - assert.containsOnce(controlPanel, ".dropdown.o_filter_menu"); - assert.containsNone(controlPanel, ".dropdown.o_comparison_menu"); - await toggleFilterMenu(controlPanel); - await toggleMenuItem(controlPanel, "Birthday"); - await toggleMenuItemOption(controlPanel, "Birthday", "January"); - assert.containsOnce(controlPanel, "div.o_comparison_menu > button i.oi.oi-contrast"); + assert.containsOnce(target, ".dropdown.o_filter_menu"); + assert.containsNone(target, ".dropdown.o_comparison_menu"); + await toggleFilterMenu(target); + await toggleMenuItem(target, "Birthday"); + await toggleMenuItemOption(target, "Birthday", "January"); + assert.containsOnce(target, "div.o_comparison_menu > button i.oi.oi-contrast"); assert.strictEqual( - controlPanel.el + target .querySelector("div.o_comparison_menu > button span") .innerText.trim() .toUpperCase() /** @todo why do I need to upperCase */, "COMPARISON" ); - await toggleComparisonMenu(controlPanel); - const comparisonOptions = [ - ...controlPanel.el.querySelectorAll(".o_comparison_menu .dropdown-item"), - ]; + await toggleComparisonMenu(target); + const comparisonOptions = [...target.querySelectorAll(".o_comparison_menu .dropdown-item")]; assert.strictEqual(comparisonOptions.length, 2); assert.deepEqual( comparisonOptions.map((e) => e.innerText.trim()), @@ -81,42 +81,42 @@ QUnit.module("Search", (hooks) => { QUnit.test("activate a comparison works", async function (assert) { assert.expect(5); patchDate(1997, 0, 9, 12, 0, 0); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "foo", Component: ControlPanel, searchMenuTypes: ["filter", "comparison"], searchViewId: false, }); - await toggleFilterMenu(controlPanel); - await toggleMenuItem(controlPanel, "Birthday"); - await toggleMenuItemOption(controlPanel, "Birthday", "January"); - await toggleComparisonMenu(controlPanel); - await toggleMenuItem(controlPanel, "Birthday: Previous Period"); - assert.deepEqual(getFacetTexts(controlPanel), [ + await toggleFilterMenu(target); + await toggleMenuItem(target, "Birthday"); + await toggleMenuItemOption(target, "Birthday", "January"); + await toggleComparisonMenu(target); + await toggleMenuItem(target, "Birthday: Previous Period"); + assert.deepEqual(getFacetTexts(target), [ "Birthday: January 1997", "Birthday: Previous Period", ]); - await toggleFilterMenu(controlPanel); - await toggleMenuItem(controlPanel, "Date"); - await toggleMenuItemOption(controlPanel, "Date", "December"); - await toggleComparisonMenu(controlPanel); - await toggleMenuItem(controlPanel, "Date: Previous Year"); - assert.deepEqual(getFacetTexts(controlPanel), [ + await toggleFilterMenu(target); + await toggleMenuItem(target, "Date"); + await toggleMenuItemOption(target, "Date", "December"); + await toggleComparisonMenu(target); + await toggleMenuItem(target, "Date: Previous Year"); + assert.deepEqual(getFacetTexts(target), [ ["Birthday: January 1997", "Date: December 1996"].join("or"), "Date: Previous Year", ]); - await toggleFilterMenu(controlPanel); - await toggleMenuItem(controlPanel, "Date"); - await toggleMenuItemOption(controlPanel, "Date", "1996"); - assert.deepEqual(getFacetTexts(controlPanel), ["Birthday: January 1997"]); - await toggleComparisonMenu(controlPanel); - await toggleMenuItem(controlPanel, "Birthday: Previous Year"); - assert.deepEqual(getFacetTexts(controlPanel), [ + await toggleFilterMenu(target); + await toggleMenuItem(target, "Date"); + await toggleMenuItemOption(target, "Date", "1996"); + assert.deepEqual(getFacetTexts(target), ["Birthday: January 1997"]); + await toggleComparisonMenu(target); + await toggleMenuItem(target, "Birthday: Previous Year"); + assert.deepEqual(getFacetTexts(target), [ "Birthday: January 1997", "Birthday: Previous Year", ]); - await removeFacet(controlPanel); - assert.deepEqual(getFacetTexts(controlPanel), []); + await removeFacet(target); + assert.deepEqual(getFacetTexts(target), []); }); }); diff --git a/addons/web/static/tests/search/control_panel.js b/addons/web/static/tests/search/control_panel.js index 2861d2bfeb8..e6dbc3f8ee2 100644 --- a/addons/web/static/tests/search/control_panel.js +++ b/addons/web/static/tests/search/control_panel.js @@ -1,9 +1,10 @@ /** @odoo-module **/ -import { click, nextTick } from "@web/../tests/helpers/utils"; +import { click, getFixture, nextTick } from "@web/../tests/helpers/utils"; import { ControlPanel } from "@web/search/control_panel/control_panel"; import { makeWithSearch, setupControlPanelServiceRegistry } from "./helpers"; +let target; let serverData; QUnit.module("Search", (hooks) => { hooks.beforeEach(async () => { @@ -18,12 +19,13 @@ QUnit.module("Search", (hooks) => { }, }; setupControlPanelServiceRegistry(); + target = getFixture(); }); QUnit.module("ControlPanel"); QUnit.test("simple rendering", async (assert) => { - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "foo", Component: ControlPanel, @@ -35,16 +37,16 @@ QUnit.module("Search", (hooks) => { searchMenuTypes: [], }); - assert.containsOnce(controlPanel, ".o_cp_top"); - assert.containsOnce(controlPanel, ".o_cp_top_left"); - assert.containsNone(controlPanel, ".o_cp_top_right"); - assert.containsOnce(controlPanel, ".o_cp_bottom"); - assert.containsOnce(controlPanel, ".o_cp_bottom_left"); - assert.containsOnce(controlPanel, ".o_cp_bottom_right"); + assert.containsOnce(target, ".o_cp_top"); + assert.containsOnce(target, ".o_cp_top_left"); + assert.containsNone(target, ".o_cp_top_right"); + assert.containsOnce(target, ".o_cp_bottom"); + assert.containsOnce(target, ".o_cp_bottom_left"); + assert.containsOnce(target, ".o_cp_bottom_right"); - assert.containsNone(controlPanel, ".o_cp_switch_buttons"); + assert.containsNone(target, ".o_cp_switch_buttons"); - assert.containsOnce(controlPanel, ".breadcrumb"); + assert.containsOnce(target, ".breadcrumb"); }); QUnit.test("breadcrumbs", async (assert) => { @@ -61,8 +63,8 @@ QUnit.module("Search", (hooks) => { searchMenuTypes: [], }); - assert.containsN(controlPanel, ".breadcrumb li.breadcrumb-item", 2); - const breadcrumbItems = controlPanel.el.querySelectorAll("li.breadcrumb-item"); + assert.containsN(target, ".breadcrumb li.breadcrumb-item", 2); + const breadcrumbItems = target.querySelectorAll("li.breadcrumb-item"); assert.strictEqual(breadcrumbItems[0].innerText, "Previous"); assert.hasClass(breadcrumbItems[1], "active"); assert.strictEqual(breadcrumbItems[1].innerText, "Current"); @@ -89,9 +91,9 @@ QUnit.module("Search", (hooks) => { searchMenuTypes: [], }); - assert.containsOnce(controlPanel, ".o_cp_switch_buttons"); - assert.containsN(controlPanel, ".o_switch_view", 2); - const views = controlPanel.el.querySelectorAll(".o_switch_view"); + assert.containsOnce(target, ".o_cp_switch_buttons"); + assert.containsN(target, ".o_switch_view", 2); + const views = target.querySelectorAll(".o_switch_view"); assert.strictEqual(views[0].getAttribute("data-tooltip"), "List"); assert.hasClass(views[0], "active"); @@ -123,11 +125,11 @@ QUnit.module("Search", (hooks) => { }, searchMenuTypes: [], }); - assert.containsOnce(controlPanel.el, ".o_pager"); + assert.containsOnce(target, ".o_pager"); pagerProps.total = 0; controlPanel.render(); await nextTick(); - assert.containsNone(controlPanel.el, ".o_pager"); + assert.containsNone(target, ".o_pager"); }); }); diff --git a/addons/web/static/tests/search/custom_favorite_item_tests.js b/addons/web/static/tests/search/custom_favorite_item_tests.js index e974da2b784..a32c7ec6a7e 100644 --- a/addons/web/static/tests/search/custom_favorite_item_tests.js +++ b/addons/web/static/tests/search/custom_favorite_item_tests.js @@ -1,6 +1,6 @@ /** @odoo-module **/ -import { patchWithCleanup, triggerEvent } from "@web/../tests/helpers/utils"; +import { getFixture, patchWithCleanup, triggerEvent } from "@web/../tests/helpers/utils"; import { browser } from "@web/core/browser/browser"; import { dialogService } from "@web/core/dialog/dialog_service"; import { registry } from "@web/core/registry"; @@ -24,23 +24,24 @@ const { Component, xml } = owl; const serviceRegistry = registry.category("services"); /** - * @param {Component} comp + * @param {HTMLElement} target */ -async function toggleDefaultCheckBox(comp) { - const checkbox = comp.el.querySelector("input[type='checkbox']"); +async function toggleDefaultCheckBox(target) { + const checkbox = target.querySelector("input[type='checkbox']"); checkbox.checked = !checkbox.checked; await triggerEvent(checkbox, null, "change"); } /** - * @param {Component} comp + * @param {HTMLElement} target */ -async function toggleShareCheckBox(comp) { - const checkbox = comp.el.querySelectorAll("input[type='checkbox']")[1]; +async function toggleShareCheckBox(target) { + const checkbox = target.querySelectorAll("input[type='checkbox']")[1]; checkbox.checked = !checkbox.checked; await triggerEvent(checkbox, null, "change"); } +let target; let serverData; QUnit.module("Search", (hooks) => { hooks.beforeEach(async () => { @@ -68,6 +69,8 @@ QUnit.module("Search", (hooks) => { setTimeout: (fn) => fn(), clearTimeout: () => {}, }); + + target = getFixture(); }); QUnit.module("CustomFavoriteItem"); @@ -75,7 +78,7 @@ QUnit.module("Search", (hooks) => { QUnit.test("simple rendering", async function (assert) { assert.expect(3); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "foo", Component: ControlPanel, @@ -86,18 +89,14 @@ QUnit.module("Search", (hooks) => { }, }); - await toggleFavoriteMenu(controlPanel); - await toggleSaveFavorite(controlPanel); + await toggleFavoriteMenu(target); + await toggleSaveFavorite(target); assert.strictEqual( - controlPanel.el.querySelector('.o_add_favorite input[type="text"]').value, + target.querySelector('.o_add_favorite input[type="text"]').value, "Action Name" ); - assert.containsN( - controlPanel, - '.o_add_favorite .custom-checkbox input[type="checkbox"]', - 2 - ); - const labelEls = controlPanel.el.querySelectorAll(".o_add_favorite .custom-checkbox label"); + assert.containsN(target, '.o_add_favorite .custom-checkbox input[type="checkbox"]', 2); + const labelEls = target.querySelectorAll(".o_add_favorite .custom-checkbox label"); assert.deepEqual( [...labelEls].map((e) => e.innerText.trim()), ["Use by default", "Share with all users"] @@ -107,7 +106,7 @@ QUnit.module("Search", (hooks) => { QUnit.test("favorites use by default and share are exclusive", async function (assert) { assert.expect(11); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "foo", Component: ControlPanel, @@ -115,21 +114,21 @@ QUnit.module("Search", (hooks) => { searchViewId: false, }); - await toggleFavoriteMenu(controlPanel); - await toggleSaveFavorite(controlPanel); - const checkboxes = controlPanel.el.querySelectorAll('input[type="checkbox"]'); + await toggleFavoriteMenu(target); + await toggleSaveFavorite(target); + const checkboxes = target.querySelectorAll('input[type="checkbox"]'); assert.strictEqual(checkboxes.length, 2, "2 checkboxes are present"); assert.notOk(checkboxes[0].checked, "Start: None of the checkboxes are checked (1)"); assert.notOk(checkboxes[1].checked, "Start: None of the checkboxes are checked (2)"); - await toggleDefaultCheckBox(controlPanel); + await toggleDefaultCheckBox(target); assert.ok(checkboxes[0].checked, "The first checkbox is checked"); assert.notOk(checkboxes[1].checked, "The second checkbox is not checked"); - await toggleShareCheckBox(controlPanel); + await toggleShareCheckBox(target); assert.notOk( checkboxes[0].checked, @@ -140,7 +139,7 @@ QUnit.module("Search", (hooks) => { "Clicking on the second checkbox checks it, and unchecks the first (2)" ); - await toggleDefaultCheckBox(controlPanel); + await toggleDefaultCheckBox(target); assert.ok( checkboxes[0].checked, @@ -151,7 +150,7 @@ QUnit.module("Search", (hooks) => { "Clicking on the first checkbox checks it, and unchecks the second (2)" ); - await toggleDefaultCheckBox(controlPanel); + await toggleDefaultCheckBox(target); assert.notOk(checkboxes[0].checked, "End: None of the checkboxes are checked (1)"); assert.notOk(checkboxes[1].checked, "End: None of the checkboxes are checked (2)"); @@ -172,7 +171,7 @@ QUnit.module("Search", (hooks) => { TestComponent.components = { FavoriteMenu }; TestComponent.template = xml`
`; - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, mockRPC: (_, args) => { if (args.model === "ir.filters" && args.method === "create_or_replace") { @@ -187,16 +186,16 @@ QUnit.module("Search", (hooks) => { searchViewId: false, }); - await toggleFavoriteMenu(comp); - await toggleSaveFavorite(comp); - await editFavoriteName(comp, "aaa"); - await saveFavorite(comp); + await toggleFavoriteMenu(target); + await toggleSaveFavorite(target); + await editFavoriteName(target, "aaa"); + await saveFavorite(target); }); QUnit.test("dynamic filters are saved dynamic", async function (assert) { assert.expect(3); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, mockRPC: (_, args) => { if (args.model === "ir.filters" && args.method === "create_or_replace") { @@ -220,20 +219,20 @@ QUnit.module("Search", (hooks) => { context: { search_default_filter: 1 }, }); - assert.deepEqual(getFacetTexts(controlPanel), ["Filter"]); + assert.deepEqual(getFacetTexts(target), ["Filter"]); - await toggleFavoriteMenu(controlPanel); - await toggleSaveFavorite(controlPanel); - await editFavoriteName(controlPanel, "My favorite"); - await saveFavorite(controlPanel); + await toggleFavoriteMenu(target); + await toggleSaveFavorite(target); + await editFavoriteName(target, "My favorite"); + await saveFavorite(target); - assert.deepEqual(getFacetTexts(controlPanel), ["My favorite"]); + assert.deepEqual(getFacetTexts(target), ["My favorite"]); }); QUnit.test("save filters created via autocompletion works", async function (assert) { assert.expect(4); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, mockRPC: (_, args) => { if (args.model === "ir.filters" && args.method === "create_or_replace") { @@ -253,19 +252,19 @@ QUnit.module("Search", (hooks) => { `, }); - assert.deepEqual(getFacetTexts(controlPanel), []); + assert.deepEqual(getFacetTexts(target), []); - await editSearch(controlPanel, "a"); - await validateSearch(controlPanel); + await editSearch(target, "a"); + await validateSearch(target); - assert.deepEqual(getFacetTexts(controlPanel), ["Foo\na"]); + assert.deepEqual(getFacetTexts(target), ["Foo\na"]); - await toggleFavoriteMenu(controlPanel); - await toggleSaveFavorite(controlPanel); - await editFavoriteName(controlPanel, "My favorite"); - await saveFavorite(controlPanel); + await toggleFavoriteMenu(target); + await toggleSaveFavorite(target); + await editFavoriteName(target, "My favorite"); + await saveFavorite(target); - assert.deepEqual(getFacetTexts(controlPanel), ["My favorite"]); + assert.deepEqual(getFacetTexts(target), ["My favorite"]); }); QUnit.test( @@ -291,7 +290,7 @@ QUnit.module("Search", (hooks) => { { force: true } ); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, mockRPC: (route, args) => { if (args.model === "ir.filters" && args.method === "create_or_replace") { @@ -326,20 +325,20 @@ QUnit.module("Search", (hooks) => { ], }); - await toggleFavoriteMenu(controlPanel); - await toggleSaveFavorite(controlPanel); + await toggleFavoriteMenu(target); + await toggleSaveFavorite(target); // first try: should fail - await editFavoriteName(controlPanel, "My favorite"); - await saveFavorite(controlPanel); + await editFavoriteName(target, "My favorite"); + await saveFavorite(target); // second try: should succeed - await editFavoriteName(controlPanel, "My favorite 2"); - await saveFavorite(controlPanel); + await editFavoriteName(target, "My favorite 2"); + await saveFavorite(target); // third try: should fail - await editFavoriteName(controlPanel, "My favorite 2"); - await saveFavorite(controlPanel); + await editFavoriteName(target, "My favorite 2"); + await saveFavorite(target); } ); diff --git a/addons/web/static/tests/search/custom_filter_item_tests.js b/addons/web/static/tests/search/custom_filter_item_tests.js index 9177368a341..4a791b5ea34 100644 --- a/addons/web/static/tests/search/custom_filter_item_tests.js +++ b/addons/web/static/tests/search/custom_filter_item_tests.js @@ -1,7 +1,7 @@ /** @odoo-module **/ import { registerCleanup } from "@web/../tests/helpers/cleanup"; -import { click, patchDate, patchWithCleanup } from "@web/../tests/helpers/utils"; +import { click, getFixture, patchDate, patchWithCleanup } from "@web/../tests/helpers/utils"; import { localization } from "@web/core/l10n/localization"; import { ControlPanel } from "@web/search/control_panel/control_panel"; import { browser } from "@web/core/browser/browser"; @@ -25,6 +25,7 @@ function getDomain(controlPanel) { return controlPanel.env.searchModel.domain; } +let target; let serverData; QUnit.module("Search", (hooks) => { hooks.beforeEach(async () => { @@ -89,6 +90,7 @@ QUnit.module("Search", (hooks) => { setTimeout: (fn) => fn(), clearTimeout: () => {}, }); + target = getFixture(); }); QUnit.module("CustomFilterItem"); @@ -96,7 +98,7 @@ QUnit.module("Search", (hooks) => { QUnit.test("basic rendering", async function (assert) { assert.expect(14); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "foo", Component: ControlPanel, @@ -104,13 +106,13 @@ QUnit.module("Search", (hooks) => { searchMenuTypes: ["filter"], }); - await toggleFilterMenu(controlPanel); + await toggleFilterMenu(target); - const customFilterItem = controlPanel.el.querySelector(".o_add_custom_filter_menu"); + const customFilterItem = target.querySelector(".o_add_custom_filter_menu"); assert.strictEqual(customFilterItem.innerText.trim(), "Add Custom Filter"); - await toggleAddCustomFilter(controlPanel); + await toggleAddCustomFilter(target); // Single condition assert.containsOnce(customFilterItem, ".o_filter_condition"); @@ -147,7 +149,7 @@ QUnit.module("Search", (hooks) => { async function (assert) { assert.expect(2); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "foo", Component: ControlPanel, @@ -166,9 +168,9 @@ QUnit.module("Search", (hooks) => { }, }); - await toggleFilterMenu(controlPanel); - await toggleAddCustomFilter(controlPanel); - const optionEls = controlPanel.el.querySelectorAll( + await toggleFilterMenu(target); + await toggleAddCustomFilter(target); + const optionEls = target.querySelectorAll( ".o_filter_condition > select.o_generator_menu_field option" ); assert.strictEqual(optionEls[0].innerText.trim(), "Date"); @@ -181,7 +183,7 @@ QUnit.module("Search", (hooks) => { patchDate(2020, 1, 5, 12, 20, 0); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "foo", Component: ControlPanel, @@ -199,23 +201,23 @@ QUnit.module("Search", (hooks) => { }, }); - await toggleFilterMenu(controlPanel); - await toggleAddCustomFilter(controlPanel); - await applyFilter(controlPanel); + await toggleFilterMenu(target); + await toggleAddCustomFilter(target); + await applyFilter(target); - assert.ok(isItemSelected(controlPanel, 'Date is equal to "02/05/2020"')); - assert.deepEqual(getFacetTexts(controlPanel), ['Date is equal to "02/05/2020"']); + assert.ok(isItemSelected(target, 'Date is equal to "02/05/2020"')); + assert.deepEqual(getFacetTexts(target), ['Date is equal to "02/05/2020"']); - await toggleMenuItem(controlPanel, 'Date is equal to "02/05/2020"'); + await toggleMenuItem(target, 'Date is equal to "02/05/2020"'); - assert.notOk(isItemSelected(controlPanel, 'Date is equal to "02/05/2020"')); - assert.deepEqual(getFacetTexts(controlPanel), []); + assert.notOk(isItemSelected(target, 'Date is equal to "02/05/2020"')); + assert.deepEqual(getFacetTexts(target), []); }); QUnit.test("custom OR filter presets new condition from preceding", async function (assert) { assert.expect(4); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "foo", Component: ControlPanel, @@ -223,14 +225,14 @@ QUnit.module("Search", (hooks) => { searchMenuTypes: ["filter"], }); - await toggleFilterMenu(controlPanel); - await toggleAddCustomFilter(controlPanel); + await toggleFilterMenu(target); + await toggleAddCustomFilter(target); // Retrieve second selectable values for field and operator dropdowns - const secondFieldName = controlPanel.el.querySelector( + const secondFieldName = target.querySelector( ".o_generator_menu_field option:nth-of-type(2)" ).value; - const secondOperator = controlPanel.el.querySelector( + const secondOperator = target.querySelector( ".o_generator_menu_operator option:nth-of-type(2)" ).value; @@ -239,23 +241,21 @@ QUnit.module("Search", (hooks) => { assert.ok(!!secondOperator); // Add first filter condition - await editConditionField(controlPanel, 0, secondFieldName); - await editConditionOperator(controlPanel, 0, secondOperator); + await editConditionField(target, 0, secondFieldName); + await editConditionOperator(target, 0, secondOperator); // Add a second conditon on the filter being created - await addCondition(controlPanel); + await addCondition(target); // Check the defaults for field and operator dropdowns assert.strictEqual( - controlPanel.el.querySelector( - ".o_filter_condition:nth-of-type(2) .o_generator_menu_field" - ).value, + target.querySelector(".o_filter_condition:nth-of-type(2) .o_generator_menu_field") + .value, secondFieldName ); assert.strictEqual( - controlPanel.el.querySelector( - ".o_filter_condition:nth-of-type(2) .o_generator_menu_operator" - ).value, + target.querySelector(".o_filter_condition:nth-of-type(2) .o_generator_menu_operator") + .value, secondOperator ); }); @@ -272,15 +272,15 @@ QUnit.module("Search", (hooks) => { searchViewFields: {}, }); - await toggleFilterMenu(controlPanel); - await toggleAddCustomFilter(controlPanel); + await toggleFilterMenu(target); + await toggleAddCustomFilter(target); // choose ID field in 'Add Custom filter' menu and value 1 - await editConditionField(controlPanel, 0, "id"); - await editConditionValue(controlPanel, 0, 1); + await editConditionField(target, 0, "id"); + await editConditionValue(target, 0, 1); - await applyFilter(controlPanel); + await applyFilter(target); - assert.deepEqual(getFacetTexts(controlPanel), ['ID is "1"']); + assert.deepEqual(getFacetTexts(target), ['ID is "1"']); assert.deepEqual(getDomain(controlPanel), [["id", "=", 1]]); }); @@ -304,29 +304,29 @@ QUnit.module("Search", (hooks) => { }, }); - await toggleFilterMenu(controlPanel); + await toggleFilterMenu(target); - assert.deepEqual(getFacetTexts(controlPanel), []); + assert.deepEqual(getFacetTexts(target), []); assert.deepEqual(getDomain(controlPanel), []); - assert.containsNone(controlPanel, ".o_menu_item"); - assert.containsOnce(controlPanel, ".o_add_custom_filter_menu button.dropdown-toggle"); + assert.containsNone(target, ".o_menu_item"); + assert.containsOnce(target, ".o_add_custom_filter_menu button.dropdown-toggle"); // the 'Add Custom Filter' menu should be closed; - assert.containsNone(controlPanel, ".o_add_custom_filter_menu .dropdown-menu"); + assert.containsNone(target, ".o_add_custom_filter_menu .dropdown-menu"); - await toggleAddCustomFilter(controlPanel); + await toggleAddCustomFilter(target); // the 'Add Custom Filter' menu should be open; - assert.containsOnce(controlPanel, ".o_add_custom_filter_menu .dropdown-menu"); + assert.containsOnce(target, ".o_add_custom_filter_menu .dropdown-menu"); - await applyFilter(controlPanel); + await applyFilter(target); - assert.deepEqual(getFacetTexts(controlPanel), ["Boolean Field is Yes"]); + assert.deepEqual(getFacetTexts(target), ["Boolean Field is Yes"]); assert.deepEqual(getDomain(controlPanel), [["boolean_field", "=", true]]); - assert.containsOnce(controlPanel, ".o_menu_item"); - assert.containsOnce(controlPanel, ".o_add_custom_filter_menu button.dropdown-toggle"); + assert.containsOnce(target, ".o_menu_item"); + assert.containsOnce(target, ".o_add_custom_filter_menu button.dropdown-toggle"); // the 'Add Custom Filter' menu should still be opened; - assert.containsOnce(controlPanel, ".o_add_custom_filter_menu .dropdown-menu"); + assert.containsOnce(target, ".o_add_custom_filter_menu .dropdown-menu"); }); QUnit.test("selection field: default and updated value", async function (assert) { @@ -341,36 +341,36 @@ QUnit.module("Search", (hooks) => { }); // Default value - await toggleFilterMenu(controlPanel); + await toggleFilterMenu(target); - assert.containsN(controlPanel, ".o_menu_item", 0); - assert.containsN(controlPanel, ".dropdown-divider", 0); + assert.containsN(target, ".o_menu_item", 0); + assert.containsN(target, ".dropdown-divider", 0); - await toggleAddCustomFilter(controlPanel); - await editConditionField(controlPanel, 0, "color"); - await applyFilter(controlPanel); + await toggleAddCustomFilter(target); + await editConditionField(target, 0, "color"); + await applyFilter(target); - assert.deepEqual(getFacetTexts(controlPanel), ['Color is "black"']); + assert.deepEqual(getFacetTexts(target), ['Color is "black"']); assert.deepEqual(getDomain(controlPanel), [["color", "=", "black"]]); - assert.containsN(controlPanel, ".o_menu_item", 1); - assert.containsN(controlPanel, ".dropdown-divider", 1); + assert.containsN(target, ".o_menu_item", 1); + assert.containsN(target, ".dropdown-divider", 1); // deactivate custom filter - await removeFacet(controlPanel); + await removeFacet(target); // Updated value - await toggleFilterMenu(controlPanel); - await toggleAddCustomFilter(controlPanel); - await editConditionField(controlPanel, 0, "color"); - await editConditionValue(controlPanel, 0, "white"); - await applyFilter(controlPanel); + await toggleFilterMenu(target); + await toggleAddCustomFilter(target); + await editConditionField(target, 0, "color"); + await editConditionValue(target, 0, "white"); + await applyFilter(target); - assert.deepEqual(getFacetTexts(controlPanel), ['Color is "white"']); + assert.deepEqual(getFacetTexts(target), ['Color is "white"']); assert.deepEqual(getDomain(controlPanel), [["color", "=", "white"]]); - assert.containsN(controlPanel, ".o_menu_item", 2); - assert.containsN(controlPanel, ".dropdown-divider", 2); + assert.containsN(target, ".o_menu_item", 2); + assert.containsN(target, ".dropdown-divider", 2); }); QUnit.test( @@ -428,15 +428,15 @@ QUnit.module("Search", (hooks) => { ]; for (const step of steps) { - await toggleFilterMenu(controlPanel); - await toggleAddCustomFilter(controlPanel); - await editConditionValue(controlPanel, 0, step.value); - await applyFilter(controlPanel); + await toggleFilterMenu(target); + await toggleAddCustomFilter(target); + await editConditionValue(target, 0, step.value); + await applyFilter(target); - assert.deepEqual(getFacetTexts(controlPanel), [step.facetContent]); + assert.deepEqual(getFacetTexts(target), [step.facetContent]); assert.deepEqual(getDomain(controlPanel), step.domain); - await removeFacet(controlPanel); + await removeFacet(target); } } ); @@ -458,26 +458,23 @@ QUnit.module("Search", (hooks) => { searchMenuTypes: ["filter"], }); - await toggleFilterMenu(controlPanel); - await toggleAddCustomFilter(controlPanel); + await toggleFilterMenu(target); + await toggleAddCustomFilter(target); - await editConditionField(controlPanel, 0, "date_time_field"); + await editConditionField(target, 0, "date_time_field"); assert.strictEqual( - controlPanel.el.querySelector(".o_generator_menu_field").value, + target.querySelector(".o_generator_menu_field").value, "date_time_field" ); - assert.strictEqual( - controlPanel.el.querySelector(".o_generator_menu_operator").value, - "between" - ); + assert.strictEqual(target.querySelector(".o_generator_menu_operator").value, "between"); - await editConditionOperator(controlPanel, 0, "="); - await editConditionValue(controlPanel, 0, "02/22/2017 11:00:00"); // in TZ - await applyFilter(controlPanel); + await editConditionOperator(target, 0, "="); + await editConditionValue(target, 0, "02/22/2017 11:00:00"); // in TZ + await applyFilter(target); assert.deepEqual( - getFacetTexts(controlPanel), + getFacetTexts(target), ['DateTime is equal to "02/22/2017 11:00:00"'], "description should be in localized format" ); @@ -505,25 +502,22 @@ QUnit.module("Search", (hooks) => { searchMenuTypes: ["filter"], }); - await toggleFilterMenu(controlPanel); - await toggleAddCustomFilter(controlPanel); - await editConditionField(controlPanel, 0, "date_time_field"); + await toggleFilterMenu(target); + await toggleAddCustomFilter(target); + await editConditionField(target, 0, "date_time_field"); assert.strictEqual( - controlPanel.el.querySelector(".o_generator_menu_field").value, + target.querySelector(".o_generator_menu_field").value, "date_time_field" ); - assert.strictEqual( - controlPanel.el.querySelector(".o_generator_menu_operator").value, - "between" - ); + assert.strictEqual(target.querySelector(".o_generator_menu_operator").value, "between"); - await editConditionValue(controlPanel, 0, "02/22/2017 11:00:00", 0); // in TZ - await editConditionValue(controlPanel, 0, "02-22-2017 17:00:00", 1); // in TZ - await applyFilter(controlPanel); + await editConditionValue(target, 0, "02/22/2017 11:00:00", 0); // in TZ + await editConditionValue(target, 0, "02-22-2017 17:00:00", 1); // in TZ + await applyFilter(target); assert.deepEqual( - getFacetTexts(controlPanel), + getFacetTexts(target), ['DateTime is between "02/22/2017 11:00:00 and 02/22/2017 17:00:00"'], "description should be in localized format" ); @@ -541,7 +535,7 @@ QUnit.module("Search", (hooks) => { QUnit.test("input value parsing", async function (assert) { assert.expect(7); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "foo", Component: ControlPanel, @@ -549,40 +543,38 @@ QUnit.module("Search", (hooks) => { searchMenuTypes: ["filter"], }); - await toggleFilterMenu(controlPanel); - await toggleAddCustomFilter(controlPanel); - await addCondition(controlPanel); + await toggleFilterMenu(target); + await toggleAddCustomFilter(target); + await addCondition(target); - await editConditionField(controlPanel, 0, "float_field"); - await editConditionField(controlPanel, 1, "id"); + await editConditionField(target, 0, "float_field"); + await editConditionField(target, 1, "id"); - const [floatInput, idInput] = controlPanel.el.querySelectorAll( - ".o_generator_menu_value .o_input" - ); + const [floatInput, idInput] = target.querySelectorAll(".o_generator_menu_value .o_input"); // Default values - await editConditionValue(controlPanel, 0, "0.0"); + await editConditionValue(target, 0, "0.0"); assert.strictEqual(floatInput.value, "0.0"); - await editConditionValue(controlPanel, 1, "0"); + await editConditionValue(target, 1, "0"); assert.strictEqual(idInput.value, "0"); // Float parsing - await editConditionValue(controlPanel, 0, "4.2"); + await editConditionValue(target, 0, "4.2"); assert.strictEqual(floatInput.value, "4.2"); - await editConditionValue(controlPanel, 0, "DefinitelyValidFloat"); + await editConditionValue(target, 0, "DefinitelyValidFloat"); // "DefinitelyValidFloat" cannot be entered in a input type number so that the input value is reset to 0 assert.strictEqual(floatInput.value, "4.2"); // Number parsing - await editConditionValue(controlPanel, 1, "4"); + await editConditionValue(target, 1, "4"); assert.strictEqual(idInput.value, "4"); - await editConditionValue(controlPanel, 1, "4.2"); + await editConditionValue(target, 1, "4.2"); assert.strictEqual(idInput.value, "4"); - await editConditionValue(controlPanel, 1, "DefinitelyValidID"); + await editConditionValue(target, 1, "DefinitelyValidID"); // "DefinitelyValidID" cannot be entered in a input type number so that the input value is reset to 0 assert.strictEqual(idInput.value, "0"); }); @@ -590,7 +582,7 @@ QUnit.module("Search", (hooks) => { QUnit.test("input value parsing with language", async function (assert) { assert.expect(5); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "foo", Component: ControlPanel, @@ -605,27 +597,27 @@ QUnit.module("Search", (hooks) => { grouping: [3, 0], }); - await toggleFilterMenu(controlPanel); - await toggleAddCustomFilter(controlPanel); + await toggleFilterMenu(target); + await toggleAddCustomFilter(target); - await editConditionField(controlPanel, 0, "float_field"); + await editConditionField(target, 0, "float_field"); - const [floatInput] = controlPanel.el.querySelectorAll(".o_generator_menu_value .o_input"); + const [floatInput] = target.querySelectorAll(".o_generator_menu_value .o_input"); // Default values assert.strictEqual(floatInput.value, "0,0"); // Float parsing - await editConditionValue(controlPanel, 0, "4,"); + await editConditionValue(target, 0, "4,"); assert.strictEqual(floatInput.value, "4,0"); - await editConditionValue(controlPanel, 0, "4,2"); + await editConditionValue(target, 0, "4,2"); assert.strictEqual(floatInput.value, "4,2"); - await editConditionValue(controlPanel, 0, "4,2,"); + await editConditionValue(target, 0, "4,2,"); assert.strictEqual(floatInput.value, "4,2"); - await editConditionValue(controlPanel, 0, "DefinitelyValidFloat"); + await editConditionValue(target, 0, "DefinitelyValidFloat"); // The input here is a string, resulting in a parsing error instead of 0 assert.strictEqual(floatInput.value, "4,2"); @@ -642,34 +634,34 @@ QUnit.module("Search", (hooks) => { searchMenuTypes: ["filter"], }); - await toggleFilterMenu(controlPanel); - await toggleAddCustomFilter(controlPanel); + await toggleFilterMenu(target); + await toggleAddCustomFilter(target); for (let i = 0; i < 4; i++) { - await addCondition(controlPanel); + await addCondition(target); } - await editConditionField(controlPanel, 0, "date_field"); - await editConditionValue(controlPanel, 0, "01/09/1997"); + await editConditionField(target, 0, "date_field"); + await editConditionValue(target, 0, "01/09/1997"); - await editConditionField(controlPanel, 1, "boolean_field"); - await editConditionOperator(controlPanel, 1, "!="); + await editConditionField(target, 1, "boolean_field"); + await editConditionOperator(target, 1, "!="); - await editConditionField(controlPanel, 2, "char_field"); - await editConditionValue(controlPanel, 2, "I will be deleted anyway"); + await editConditionField(target, 2, "char_field"); + await editConditionValue(target, 2, "I will be deleted anyway"); - await editConditionField(controlPanel, 3, "float_field"); - await editConditionValue(controlPanel, 3, 7.2); + await editConditionField(target, 3, "float_field"); + await editConditionValue(target, 3, 7.2); - await editConditionField(controlPanel, 4, "id"); - await editConditionValue(controlPanel, 4, 9); + await editConditionField(target, 4, "id"); + await editConditionValue(target, 4, 9); - const thirdcondition = controlPanel.el.querySelectorAll(".o_filter_condition")[2]; + const thirdcondition = target.querySelectorAll(".o_filter_condition")[2]; await click(thirdcondition, ".o_generator_menu_delete"); - await applyFilter(controlPanel); + await applyFilter(target); - assert.deepEqual(getFacetTexts(controlPanel), [ + assert.deepEqual(getFacetTexts(target), [ [ 'A date is equal to "01/09/1997"', "Boolean Field is No", @@ -689,7 +681,7 @@ QUnit.module("Search", (hooks) => { }); QUnit.test("delete button is visible", async function (assert) { - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "foo", Component: ControlPanel, @@ -697,24 +689,24 @@ QUnit.module("Search", (hooks) => { searchMenuTypes: ["filter"], }); - await toggleFilterMenu(controlPanel); - await toggleAddCustomFilter(controlPanel); + await toggleFilterMenu(target); + await toggleAddCustomFilter(target); assert.containsNone( - controlPanel, + target, ".o_generator_menu_delete", "There is no delete button by default" ); - await addCondition(controlPanel); + await addCondition(target); assert.containsN( - controlPanel, + target, ".o_generator_menu_delete", 2, "A delete button has been added to each condition" ); assert.containsN( - controlPanel, + target, "i.o_generator_menu_delete.fa-trash-o", 2, "The delete button is shown as a trash icon" diff --git a/addons/web/static/tests/search/custom_group_by_item_tests.js b/addons/web/static/tests/search/custom_group_by_item_tests.js index e6da6ff60a9..4e8d94119e5 100644 --- a/addons/web/static/tests/search/custom_group_by_item_tests.js +++ b/addons/web/static/tests/search/custom_group_by_item_tests.js @@ -2,7 +2,7 @@ import { browser } from "@web/core/browser/browser"; import { ControlPanel } from "@web/search/control_panel/control_panel"; -import { patchWithCleanup } from "../helpers/utils"; +import { getFixture, patchWithCleanup } from "../helpers/utils"; import { applyGroup, getFacetTexts, @@ -15,6 +15,7 @@ import { toggleMenuItem, } from "./helpers"; +let target; let serverData; QUnit.module("Search", (hooks) => { hooks.beforeEach(async () => { @@ -40,6 +41,7 @@ QUnit.module("Search", (hooks) => { setTimeout: (fn) => fn(), clearTimeout: () => {}, }); + target = getFixture(); }); QUnit.module("CustomGroupByItem"); @@ -47,7 +49,7 @@ QUnit.module("Search", (hooks) => { QUnit.test("simple rendering", async function (assert) { assert.expect(5); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "foo", Component: ControlPanel, @@ -55,20 +57,20 @@ QUnit.module("Search", (hooks) => { searchViewId: false, }); - await toggleGroupByMenu(controlPanel); + await toggleGroupByMenu(target); - const customGroupByItem = controlPanel.el.querySelector(".o_add_custom_group_menu"); + const customGroupByItem = target.querySelector(".o_add_custom_group_menu"); assert.strictEqual(customGroupByItem.innerText.trim(), "Add Custom Group"); assert.containsOnce(customGroupByItem, "button.dropdown-toggle"); assert.containsNone(customGroupByItem, ".dropdown-menu"); - await toggleAddCustomGroup(controlPanel); + await toggleAddCustomGroup(target); assert.containsOnce(customGroupByItem, ".dropdown-menu"); assert.deepEqual( - [...controlPanel.el.querySelectorAll(".o_add_custom_group_menu select option")].map( + [...target.querySelectorAll(".o_add_custom_group_menu select option")].map( (el) => el.innerText ), ["Birthday", "Date", "Foo"] @@ -80,7 +82,7 @@ QUnit.module("Search", (hooks) => { async function (assert) { assert.expect(1); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "foo", Component: ControlPanel, @@ -92,12 +94,12 @@ QUnit.module("Search", (hooks) => { }, }); - await toggleGroupByMenu(controlPanel); - await toggleAddCustomGroup(controlPanel); + await toggleGroupByMenu(target); + await toggleAddCustomGroup(target); assert.deepEqual( [ - ...controlPanel.el.querySelectorAll( + ...target.querySelectorAll( ".o_add_custom_group_menu .dropdown-menu select option" ), ].map((el) => el.innerText), @@ -122,28 +124,28 @@ QUnit.module("Search", (hooks) => { id: { sortable: true, string: "ID", type: "integer" }, }, }); - await toggleGroupByMenu(controlPanel); + await toggleGroupByMenu(target); assert.deepEqual(controlPanel.env.searchModel.groupBy, []); - assert.containsNone(controlPanel, ".o_menu_item"); + assert.containsNone(target, ".o_menu_item"); - await toggleAddCustomGroup(controlPanel); - await applyGroup(controlPanel); + await toggleAddCustomGroup(target); + await applyGroup(target); assert.deepEqual(controlPanel.env.searchModel.groupBy, ["date_field:month"]); - assert.deepEqual(getFacetTexts(controlPanel), ["Date: Month"]); - assert.ok(isItemSelected(controlPanel, "Date")); + assert.deepEqual(getFacetTexts(target), ["Date: Month"]); + assert.ok(isItemSelected(target, "Date")); - await toggleMenuItem(controlPanel, "Date"); + await toggleMenuItem(target, "Date"); - assert.ok(isOptionSelected(controlPanel, "Date", "Month")); + assert.ok(isOptionSelected(target, "Date", "Month")); } ); QUnit.test("click on add custom group toggle group selector", async function (assert) { assert.expect(4); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "foo", Component: ControlPanel, @@ -153,25 +155,25 @@ QUnit.module("Search", (hooks) => { }, }); - await toggleGroupByMenu(controlPanel); + await toggleGroupByMenu(target); - const addCustomGroupMenu = controlPanel.el.querySelector(".o_add_custom_group_menu"); + const addCustomGroupMenu = target.querySelector(".o_add_custom_group_menu"); assert.strictEqual(addCustomGroupMenu.innerText.trim(), "Add Custom Group"); - await toggleAddCustomGroup(controlPanel); + await toggleAddCustomGroup(target); // Single select node with a single option - assert.containsOnce(controlPanel, ".o_add_custom_group_menu .dropdown-menu select"); + assert.containsOnce(target, ".o_add_custom_group_menu .dropdown-menu select"); assert.strictEqual( - controlPanel.el + target .querySelector(".o_add_custom_group_menu .dropdown-menu select option") .innerText.trim(), "Super Date" ); // Button apply - assert.containsOnce(controlPanel, ".o_add_custom_group_menu .dropdown-menu .btn"); + assert.containsOnce(target, ".o_add_custom_group_menu .dropdown-menu .btn"); }); QUnit.test( @@ -179,7 +181,7 @@ QUnit.module("Search", (hooks) => { async function (assert) { assert.expect(4); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "foo", Component: ControlPanel, @@ -193,14 +195,14 @@ QUnit.module("Search", (hooks) => { }, }); - await toggleGroupByMenu(controlPanel); - await toggleAddCustomGroup(controlPanel); - await applyGroup(controlPanel); + await toggleGroupByMenu(target); + await toggleAddCustomGroup(target); + await applyGroup(target); - assert.containsOnce(controlPanel, ".o_group_by_menu .o_menu_item"); - assert.containsOnce(controlPanel, ".o_add_custom_group_menu .dropdown-toggle"); - assert.containsOnce(controlPanel, ".o_add_custom_group_menu .dropdown-menu"); - assert.deepEqual(getFacetTexts(controlPanel), ["Candlelight"]); + assert.containsOnce(target, ".o_group_by_menu .o_menu_item"); + assert.containsOnce(target, ".o_add_custom_group_menu .dropdown-toggle"); + assert.containsOnce(target, ".o_add_custom_group_menu .dropdown-menu"); + assert.deepEqual(getFacetTexts(target), ["Candlelight"]); } ); }); diff --git a/addons/web/static/tests/search/favorite_menu_tests.js b/addons/web/static/tests/search/favorite_menu_tests.js index c437ca3c36d..b5d482dd0b7 100644 --- a/addons/web/static/tests/search/favorite_menu_tests.js +++ b/addons/web/static/tests/search/favorite_menu_tests.js @@ -18,6 +18,7 @@ import { toggleFavoriteMenu, toggleMenuItem, } from "./helpers"; +import { LegacyComponent } from "@web/legacy/legacy_component"; const { Component, onWillUpdateProps, xml } = owl; const serviceRegistry = registry.category("services"); @@ -64,7 +65,7 @@ QUnit.module("Search", (hooks) => { favoriteMenuRegistry.remove("custom-favorite-item"); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "foo", Component: ControlPanel, @@ -75,29 +76,29 @@ QUnit.module("Search", (hooks) => { }, }); - assert.containsOnce(controlPanel, "div.o_favorite_menu > button i.oi.oi-star"); + assert.containsOnce(target, "div.o_favorite_menu > button i.oi.oi-star"); assert.strictEqual( - controlPanel.el + target .querySelector("div.o_favorite_menu > button span") .innerText.trim() .toUpperCase(), "FAVORITES" ); - await toggleFavoriteMenu(controlPanel); + await toggleFavoriteMenu(target); assert.containsOnce( - controlPanel, + target, "div.o_favorite_menu > .dropdown-menu", "the menu should be opened" ); - assert.containsNone(controlPanel, ".dropdown-menu *", "the menu should be empty"); + assert.containsNone(target, ".dropdown-menu *", "the menu should be empty"); } ); QUnit.test("simple rendering with no favorite", async function (assert) { assert.expect(5); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "foo", Component: ControlPanel, @@ -108,23 +109,23 @@ QUnit.module("Search", (hooks) => { }, }); - assert.containsOnce(controlPanel, "div.o_favorite_menu > button i.oi.oi-star"); + assert.containsOnce(target, "div.o_favorite_menu > button i.oi.oi-star"); assert.strictEqual( - controlPanel.el + target .querySelector("div.o_favorite_menu > button span") .innerText.trim() .toUpperCase(), "FAVORITES" ); - await toggleFavoriteMenu(controlPanel); + await toggleFavoriteMenu(target); assert.containsOnce( - controlPanel, + target, "div.o_favorite_menu > .dropdown-menu", "the menu should be opened" ); - assert.containsNone(controlPanel, ".dropdown-menu .dropdown-divider"); - assert.containsOnce(controlPanel, ".dropdown-menu .o_add_favorite"); + assert.containsNone(target, ".dropdown-menu .dropdown-divider"); + assert.containsOnce(target, ".dropdown-menu .o_add_favorite"); }); QUnit.test( @@ -221,11 +222,11 @@ QUnit.module("Search", (hooks) => { activateFavorite: false, }); - await toggleFavoriteMenu(controlPanel); + await toggleFavoriteMenu(target); - assert.notOk(isItemSelected(controlPanel, "My favorite")); + assert.notOk(isItemSelected(target, "My favorite")); assert.deepEqual(getDomain(controlPanel), []); - assert.deepEqual(getFacetTexts(controlPanel), []); + assert.deepEqual(getFacetTexts(target), []); } ); @@ -288,15 +289,15 @@ QUnit.module("Search", (hooks) => { assert.deepEqual(groupBy, ["date_field:month"]); assert.deepEqual(comparison, null); - assert.deepEqual(getFacetTexts(controlPanel), [ + assert.deepEqual(getFacetTexts(target), [ "Foo\na", "Date Field Filter: 2019", "Date Field Groupby: Month", ]); // activate a comparison - await toggleComparisonMenu(controlPanel); - await toggleMenuItem(controlPanel, "Date Field Filter: Previous Period"); + await toggleComparisonMenu(target); + await toggleMenuItem(target, "Date Field Filter: Previous Period"); domain = controlPanel.env.searchModel.domain; groupBy = controlPanel.env.searchModel.groupBy; @@ -323,8 +324,8 @@ QUnit.module("Search", (hooks) => { }); // activate the unique existing favorite - await toggleFavoriteMenu(controlPanel); - await toggleMenuItem(controlPanel, 0); + await toggleFavoriteMenu(target); + await toggleMenuItem(target, 0); domain = controlPanel.env.searchModel.domain; groupBy = controlPanel.env.searchModel.groupBy; @@ -336,7 +337,7 @@ QUnit.module("Search", (hooks) => { "favorite comparison content": "bla bla...", }); - assert.deepEqual(getFacetTexts(controlPanel), ["My favorite"]); + assert.deepEqual(getFacetTexts(target), ["My favorite"]); } ); diff --git a/addons/web/static/tests/search/filter_menu_tests.js b/addons/web/static/tests/search/filter_menu_tests.js index 0ab34536079..d97019968be 100644 --- a/addons/web/static/tests/search/filter_menu_tests.js +++ b/addons/web/static/tests/search/filter_menu_tests.js @@ -1,6 +1,6 @@ /** @odoo-module **/ -import { patchDate, patchWithCleanup } from "@web/../tests/helpers/utils"; +import { getFixture, patchDate, patchWithCleanup } from "@web/../tests/helpers/utils"; import { browser } from "@web/core/browser/browser"; import { ControlPanel } from "@web/search/control_panel/control_panel"; import { @@ -22,6 +22,7 @@ function getContext(controlPanel) { return controlPanel.env.searchModel.context; } +let target; let serverData; QUnit.module("Search", (hooks) => { hooks.beforeEach(async () => { @@ -50,6 +51,7 @@ QUnit.module("Search", (hooks) => { setTimeout: (fn) => fn(), clearTimeout: () => {}, }); + target = getFixture(); }); QUnit.module("FilterMenu"); @@ -57,23 +59,23 @@ QUnit.module("Search", (hooks) => { QUnit.test("simple rendering with no filter", async function (assert) { assert.expect(3); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "foo", Component: ControlPanel, searchMenuTypes: ["filter"], }); - await toggleFilterMenu(controlPanel); - assert.containsNone(controlPanel, ".o_menu_item"); - assert.containsNone(controlPanel, ".dropdown-divider"); - assert.containsOnce(controlPanel, ".o_add_custom_filter_menu"); + await toggleFilterMenu(target); + assert.containsNone(target, ".o_menu_item"); + assert.containsNone(target, ".dropdown-divider"); + assert.containsOnce(target, ".o_add_custom_filter_menu"); }); QUnit.test("simple rendering with a single filter", async function (assert) { assert.expect(3); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "foo", Component: ControlPanel, @@ -86,10 +88,10 @@ QUnit.module("Search", (hooks) => { `, }); - await toggleFilterMenu(controlPanel); - assert.containsOnce(controlPanel, ".o_menu_item"); - assert.containsOnce(controlPanel, ".dropdown-divider"); - assert.containsOnce(controlPanel, ".o_add_custom_filter_menu"); + await toggleFilterMenu(target); + assert.containsOnce(target, ".o_menu_item"); + assert.containsOnce(target, ".dropdown-divider"); + assert.containsOnce(target, ".o_add_custom_filter_menu"); }); QUnit.test('toggle a "simple" filter in filter menu works', async function (assert) { @@ -108,25 +110,25 @@ QUnit.module("Search", (hooks) => { `, }); - await toggleFilterMenu(controlPanel); - assert.deepEqual(getFacetTexts(controlPanel), []); - assert.notOk(isItemSelected(controlPanel, "Foo")); + await toggleFilterMenu(target); + assert.deepEqual(getFacetTexts(target), []); + assert.notOk(isItemSelected(target, "Foo")); assert.deepEqual(getDomain(controlPanel), []); - await toggleMenuItem(controlPanel, "Foo"); + await toggleMenuItem(target, "Foo"); - assert.deepEqual(getFacetTexts(controlPanel), ["Foo"]); + assert.deepEqual(getFacetTexts(target), ["Foo"]); assert.containsOnce( - controlPanel.el.querySelector(".o_searchview .o_searchview_facet"), + target.querySelector(".o_searchview .o_searchview_facet"), "span.oi.oi-filter.o_searchview_facet_label" ); - assert.ok(isItemSelected(controlPanel, "Foo")); + assert.ok(isItemSelected(target, "Foo")); assert.deepEqual(getDomain(controlPanel), [["foo", "=", "qsdf"]]); - await toggleMenuItem(controlPanel, "Foo"); + await toggleMenuItem(target, "Foo"); - assert.deepEqual(getFacetTexts(controlPanel), []); - assert.notOk(isItemSelected(controlPanel, "Foo")); + assert.deepEqual(getFacetTexts(target), []); + assert.notOk(isItemSelected(target, "Foo")); assert.deepEqual(getDomain(controlPanel), []); }); @@ -149,10 +151,10 @@ QUnit.module("Search", (hooks) => { context: { search_default_date_field: 1 }, }); - await toggleFilterMenu(controlPanel); - await toggleMenuItem(controlPanel, "Date"); + await toggleFilterMenu(target); + await toggleMenuItem(target, "Date"); - const optionEls = controlPanel.el.querySelectorAll(".dropdown .o_item_option"); + const optionEls = target.querySelectorAll(".dropdown .o_item_option"); // default filter should be activated with the global default period 'this_month' assert.deepEqual(getDomain(controlPanel), [ @@ -160,8 +162,8 @@ QUnit.module("Search", (hooks) => { ["date_field", ">=", "2017-03-01"], ["date_field", "<=", "2017-03-31"], ]); - assert.ok(isItemSelected(controlPanel, "Date")); - assert.ok(isOptionSelected(controlPanel, "Date", "March")); + assert.ok(isItemSelected(target, "Date")); + assert.ok(isOptionSelected(target, "Date", "March")); // check option descriptions const optionDescriptions = [...optionEls].map((e) => e.innerText.trim()); @@ -342,16 +344,16 @@ QUnit.module("Search", (hooks) => { }, ]; for (const s of steps) { - await toggleMenuItemOption(controlPanel, "Date", s.toggledOption); + await toggleMenuItemOption(target, "Date", s.toggledOption); assert.deepEqual(getDomain(controlPanel), s.domain); if (s.resultingFacet) { - assert.deepEqual(getFacetTexts(controlPanel), [s.resultingFacet]); + assert.deepEqual(getFacetTexts(target), [s.resultingFacet]); } else { - assert.deepEqual(getFacetTexts(controlPanel), []); + assert.deepEqual(getFacetTexts(target), []); } s.selectedoptions.forEach((option) => { assert.ok( - isOptionSelected(controlPanel, "Date", option), + isOptionSelected(target, "Date", option), `at step ${steps.indexOf(s) + 1}, ${option} should be selected` ); }); @@ -385,14 +387,14 @@ QUnit.module("Search", (hooks) => { ["date_field", "<=", "2016-12-31"], ]); - assert.deepEqual(getFacetTexts(controlPanel), ["Date: December 2016"]); + assert.deepEqual(getFacetTexts(target), ["Date: December 2016"]); - await toggleFilterMenu(controlPanel); - await toggleMenuItem(controlPanel, "Date"); + await toggleFilterMenu(target); + await toggleMenuItem(target, "Date"); - assert.ok(isItemSelected(controlPanel, "Date")); - assert.ok(isOptionSelected(controlPanel, "Date", "December")); - assert.ok(isOptionSelected(controlPanel, "Date", "2016")); + assert.ok(isItemSelected(target, "Date")); + assert.ok(isOptionSelected(target, "Date", "December")); + assert.ok(isOptionSelected(target, "Date", "2016")); } ); @@ -452,7 +454,7 @@ QUnit.module("Search", (hooks) => { patchDate(2019, 6, 31, 13, 43, 0); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "foo", Component: ControlPanel, @@ -466,7 +468,7 @@ QUnit.module("Search", (hooks) => { context: { search_default_date_field: true }, }); - assert.deepEqual(getFacetTexts(controlPanel), ["Date: June 2019"]); + assert.deepEqual(getFacetTexts(target), ["Date: June 2019"]); }); QUnit.test("filter domains are correcly combined by OR and AND", async function (assert) { @@ -501,7 +503,7 @@ QUnit.module("Search", (hooks) => { ["foo", "=", "f2_g2"], ]); - assert.deepEqual(getFacetTexts(controlPanel), [ + assert.deepEqual(getFacetTexts(target), [ "Filter Group 1", "Filter 1 Group 2orFilter 2 GROUP 2", ]); @@ -510,7 +512,7 @@ QUnit.module("Search", (hooks) => { QUnit.test("arch order of groups of filters preserved", async function (assert) { assert.expect(12); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "foo", Component: ControlPanel, @@ -543,10 +545,10 @@ QUnit.module("Search", (hooks) => { `, }); - await toggleFilterMenu(controlPanel); - assert.containsN(controlPanel, ".o_filter_menu .o_menu_item", 11); + await toggleFilterMenu(target); + assert.containsN(target, ".o_filter_menu .o_menu_item", 11); - const menuItemEls = controlPanel.el.querySelectorAll(".o_filter_menu .o_menu_item"); + const menuItemEls = target.querySelectorAll(".o_filter_menu .o_menu_item"); [...menuItemEls].forEach((e, index) => { assert.strictEqual(e.innerText.trim(), String(index + 1)); }); diff --git a/addons/web/static/tests/search/group_by_menu_tests.js b/addons/web/static/tests/search/group_by_menu_tests.js index 3da3dd75bdf..35035bbeb79 100644 --- a/addons/web/static/tests/search/group_by_menu_tests.js +++ b/addons/web/static/tests/search/group_by_menu_tests.js @@ -2,7 +2,7 @@ import { browser } from "@web/core/browser/browser"; import { ControlPanel } from "@web/search/control_panel/control_panel"; -import { patchWithCleanup } from "../helpers/utils"; +import { getFixture, patchWithCleanup } from "../helpers/utils"; import { getFacetTexts, isItemSelected, @@ -15,6 +15,7 @@ import { toggleMenuItemOption, } from "./helpers"; +let target; let serverData; QUnit.module("Search", (hooks) => { hooks.beforeEach(async () => { @@ -40,6 +41,7 @@ QUnit.module("Search", (hooks) => { setTimeout: (fn) => fn(), clearTimeout: () => {}, }); + target = getFixture(); }); QUnit.module("GroupByMenu"); @@ -49,7 +51,7 @@ QUnit.module("Search", (hooks) => { async function (assert) { assert.expect(3); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "foo", Component: ControlPanel, @@ -58,18 +60,18 @@ QUnit.module("Search", (hooks) => { searchViewFields: {}, }); - await toggleGroupByMenu(controlPanel); + await toggleGroupByMenu(target); - assert.containsNone(controlPanel, ".o_menu_item"); - assert.containsNone(controlPanel, ".dropdown-divider"); - assert.containsNone(controlPanel, ".o_add_custom_group_menu"); + assert.containsNone(target, ".o_menu_item"); + assert.containsNone(target, ".dropdown-divider"); + assert.containsNone(target, ".o_add_custom_group_menu"); } ); QUnit.test("simple rendering with no groupby", async function (assert) { assert.expect(3); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "foo", Component: ControlPanel, @@ -77,17 +79,17 @@ QUnit.module("Search", (hooks) => { searchViewId: false, }); - await toggleGroupByMenu(controlPanel); + await toggleGroupByMenu(target); - assert.containsNone(controlPanel, ".o_menu_item"); - assert.containsNone(controlPanel, ".dropdown-divider"); - assert.containsOnce(controlPanel, ".o_add_custom_group_menu"); + assert.containsNone(target, ".o_menu_item"); + assert.containsNone(target, ".dropdown-divider"); + assert.containsOnce(target, ".o_add_custom_group_menu"); }); QUnit.test("simple rendering with a single groupby", async function (assert) { assert.expect(4); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "foo", Component: ControlPanel, @@ -100,12 +102,12 @@ QUnit.module("Search", (hooks) => { `, }); - await toggleGroupByMenu(controlPanel); + await toggleGroupByMenu(target); - assert.containsOnce(controlPanel, ".o_menu_item"); - assert.strictEqual(controlPanel.el.querySelector(".o_menu_item").innerText.trim(), "Foo"); - assert.containsOnce(controlPanel, ".dropdown-divider"); - assert.containsOnce(controlPanel, ".o_add_custom_group_menu"); + assert.containsOnce(target, ".o_menu_item"); + assert.strictEqual(target.querySelector(".o_menu_item").innerText.trim(), "Foo"); + assert.containsOnce(target, ".dropdown-divider"); + assert.containsOnce(target, ".o_add_custom_group_menu"); }); QUnit.test('toggle a "simple" groupby in groupby menu works', async function (assert) { @@ -124,33 +126,33 @@ QUnit.module("Search", (hooks) => { `, }); - await toggleGroupByMenu(controlPanel); + await toggleGroupByMenu(target); assert.deepEqual(controlPanel.env.searchModel.groupBy, []); - assert.deepEqual(getFacetTexts(controlPanel), []); - assert.notOk(isItemSelected(controlPanel, "Foo")); + assert.deepEqual(getFacetTexts(target), []); + assert.notOk(isItemSelected(target, "Foo")); - await toggleMenuItem(controlPanel, "Foo"); + await toggleMenuItem(target, "Foo"); assert.deepEqual(controlPanel.env.searchModel.groupBy, ["foo"]); - assert.deepEqual(getFacetTexts(controlPanel), ["Foo"]); + assert.deepEqual(getFacetTexts(target), ["Foo"]); assert.containsOnce( - controlPanel.el.querySelector(".o_searchview .o_searchview_facet"), + target.querySelector(".o_searchview .o_searchview_facet"), "span.oi.oi-layers.o_searchview_facet_label" ); - assert.ok(isItemSelected(controlPanel, "Foo")); + assert.ok(isItemSelected(target, "Foo")); - await toggleMenuItem(controlPanel, "Foo"); + await toggleMenuItem(target, "Foo"); assert.deepEqual(controlPanel.env.searchModel.groupBy, []); - assert.deepEqual(getFacetTexts(controlPanel), []); - assert.notOk(isItemSelected(controlPanel, "Foo")); + assert.deepEqual(getFacetTexts(target), []); + assert.notOk(isItemSelected(target, "Foo")); }); QUnit.test('toggle a "simple" groupby quickly does not crash', async function (assert) { assert.expect(1); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "foo", Component: ControlPanel, @@ -163,10 +165,10 @@ QUnit.module("Search", (hooks) => { `, }); - await toggleGroupByMenu(controlPanel); + await toggleGroupByMenu(target); - toggleMenuItem(controlPanel, "Foo"); - toggleMenuItem(controlPanel, "Foo"); + toggleMenuItem(target, "Foo"); + toggleMenuItem(target, "Foo"); assert.ok(true); }); @@ -190,20 +192,20 @@ QUnit.module("Search", (hooks) => { context: { search_default_group_by_foo: 1 }, }); - await toggleGroupByMenu(controlPanel); + await toggleGroupByMenu(target); - assert.deepEqual(getFacetTexts(controlPanel), ["Foo"]); + assert.deepEqual(getFacetTexts(target), ["Foo"]); assert.deepEqual(controlPanel.env.searchModel.groupBy, ["foo"]); - assert.ok(isItemSelected(controlPanel, "Foo")); + assert.ok(isItemSelected(target, "Foo")); - await removeFacet(controlPanel, "Foo"); + await removeFacet(target, "Foo"); - assert.deepEqual(getFacetTexts(controlPanel), []); + assert.deepEqual(getFacetTexts(target), []); assert.deepEqual(controlPanel.env.searchModel.groupBy, []); - await toggleGroupByMenu(controlPanel); + await toggleGroupByMenu(target); - assert.notOk(isItemSelected(controlPanel, "Foo")); + assert.notOk(isItemSelected(target, "Foo")); } ); @@ -224,16 +226,16 @@ QUnit.module("Search", (hooks) => { context: { search_default_date: 1 }, }); - await toggleGroupByMenu(controlPanel); + await toggleGroupByMenu(target); assert.deepEqual(controlPanel.env.searchModel.groupBy, ["date_field:week"]); - await toggleMenuItem(controlPanel, "Date"); + await toggleMenuItem(target, "Date"); - assert.ok(isOptionSelected(controlPanel, "Date", "Week")); + assert.ok(isOptionSelected(target, "Date", "Week")); assert.deepEqual( - [...controlPanel.el.querySelectorAll(".o_item_option")].map((el) => el.innerText), + [...target.querySelectorAll(".o_item_option")].map((el) => el.innerText), ["Year", "Quarter", "Month", "Week", "Day"] ); @@ -265,12 +267,12 @@ QUnit.module("Search", (hooks) => { { description: "Year", facetTexts: [], selectedoptions: [], groupBy: [] }, ]; for (const s of steps) { - await toggleMenuItemOption(controlPanel, "Date", s.description); + await toggleMenuItemOption(target, "Date", s.description); assert.deepEqual(controlPanel.env.searchModel.groupBy, s.groupBy); - assert.deepEqual(getFacetTexts(controlPanel), s.facetTexts); + assert.deepEqual(getFacetTexts(target), s.facetTexts); s.selectedoptions.forEach((description) => { - assert.ok(isOptionSelected(controlPanel, "Date", description)); + assert.ok(isOptionSelected(target, "Date", description)); }); } }); @@ -278,7 +280,7 @@ QUnit.module("Search", (hooks) => { QUnit.test("interval options are correctly grouped and ordered", async function (assert) { assert.expect(8); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "foo", Component: ControlPanel, @@ -294,53 +296,53 @@ QUnit.module("Search", (hooks) => { context: { search_default_bar: 1 }, }); - assert.deepEqual(getFacetTexts(controlPanel), ["Bar"]); + assert.deepEqual(getFacetTexts(target), ["Bar"]); // open menu 'Group By' - await toggleGroupByMenu(controlPanel); + await toggleGroupByMenu(target); // Open the groupby 'Date' - await toggleMenuItem(controlPanel, "Date"); + await toggleMenuItem(target, "Date"); // select option 'week' - await toggleMenuItemOption(controlPanel, "Date", "Week"); + await toggleMenuItemOption(target, "Date", "Week"); - assert.deepEqual(getFacetTexts(controlPanel), ["Bar>Date: Week"]); + assert.deepEqual(getFacetTexts(target), ["Bar>Date: Week"]); // select option 'day' - await toggleMenuItemOption(controlPanel, "Date", "Day"); + await toggleMenuItemOption(target, "Date", "Day"); - assert.deepEqual(getFacetTexts(controlPanel), ["Bar>Date: Week>Date: Day"]); + assert.deepEqual(getFacetTexts(target), ["Bar>Date: Week>Date: Day"]); // select option 'year' - await toggleMenuItemOption(controlPanel, "Date", "Year"); + await toggleMenuItemOption(target, "Date", "Year"); - assert.deepEqual(getFacetTexts(controlPanel), ["Bar>Date: Year>Date: Week>Date: Day"]); + assert.deepEqual(getFacetTexts(target), ["Bar>Date: Year>Date: Week>Date: Day"]); // select 'Foo' - await toggleMenuItem(controlPanel, "Foo"); + await toggleMenuItem(target, "Foo"); - assert.deepEqual(getFacetTexts(controlPanel), ["Bar>Date: Year>Date: Week>Date: Day>Foo"]); + assert.deepEqual(getFacetTexts(target), ["Bar>Date: Year>Date: Week>Date: Day>Foo"]); // select option 'quarter' - await toggleMenuItem(controlPanel, "Date"); - await toggleMenuItemOption(controlPanel, "Date", "Quarter"); + await toggleMenuItem(target, "Date"); + await toggleMenuItemOption(target, "Date", "Quarter"); - assert.deepEqual(getFacetTexts(controlPanel), [ + assert.deepEqual(getFacetTexts(target), [ "Bar>Date: Year>Date: Quarter>Date: Week>Date: Day>Foo", ]); // unselect 'Bar' - await toggleMenuItem(controlPanel, "Bar"); + await toggleMenuItem(target, "Bar"); - assert.deepEqual(getFacetTexts(controlPanel), [ + assert.deepEqual(getFacetTexts(target), [ "Date: Year>Date: Quarter>Date: Week>Date: Day>Foo", ]); // unselect option 'week' - await toggleMenuItem(controlPanel, "Date"); - await toggleMenuItemOption(controlPanel, "Date", "Week"); + await toggleMenuItem(target, "Date"); + await toggleMenuItemOption(target, "Date", "Week"); - assert.deepEqual(getFacetTexts(controlPanel), ["Date: Year>Date: Quarter>Date: Day>Foo"]); + assert.deepEqual(getFacetTexts(target), ["Date: Year>Date: Quarter>Date: Day>Foo"]); }); QUnit.test("default groupbys can be ordered", async function (assert) { @@ -366,13 +368,13 @@ QUnit.module("Search", (hooks) => { "date_field:week", "birthday:month", ]); - assert.deepEqual(getFacetTexts(controlPanel), ["Date: Week>Birthday: Month"]); + assert.deepEqual(getFacetTexts(target), ["Date: Week>Birthday: Month"]); }); QUnit.test("a separator in groupbys does not cause problems", async function (assert) { assert.expect(23); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "foo", Component: ControlPanel, @@ -387,51 +389,51 @@ QUnit.module("Search", (hooks) => { `, }); - await toggleGroupByMenu(controlPanel); - await toggleMenuItem(controlPanel, "Date"); - await toggleMenuItemOption(controlPanel, "Date", "Day"); + await toggleGroupByMenu(target); + await toggleMenuItem(target, "Date"); + await toggleMenuItemOption(target, "Date", "Day"); - assert.ok(isItemSelected(controlPanel, "Date")); - assert.notOk(isItemSelected(controlPanel, "Bar")); - assert.ok(isOptionSelected(controlPanel, "Date", "Day"), "selected"); - assert.deepEqual(getFacetTexts(controlPanel), ["Date: Day"]); + assert.ok(isItemSelected(target, "Date")); + assert.notOk(isItemSelected(target, "Bar")); + assert.ok(isOptionSelected(target, "Date", "Day"), "selected"); + assert.deepEqual(getFacetTexts(target), ["Date: Day"]); - await toggleMenuItem(controlPanel, "Bar"); - await toggleMenuItem(controlPanel, "Date"); + await toggleMenuItem(target, "Bar"); + await toggleMenuItem(target, "Date"); - assert.ok(isItemSelected(controlPanel, "Date")); - assert.ok(isItemSelected(controlPanel, "Bar")); - assert.ok(isOptionSelected(controlPanel, "Date", "Day"), "selected"); - assert.deepEqual(getFacetTexts(controlPanel), ["Date: Day>Bar"]); + assert.ok(isItemSelected(target, "Date")); + assert.ok(isItemSelected(target, "Bar")); + assert.ok(isOptionSelected(target, "Date", "Day"), "selected"); + assert.deepEqual(getFacetTexts(target), ["Date: Day>Bar"]); - await toggleMenuItemOption(controlPanel, "Date", "Quarter"); + await toggleMenuItemOption(target, "Date", "Quarter"); - assert.ok(isItemSelected(controlPanel, "Date")); - assert.ok(isItemSelected(controlPanel, "Bar")); - assert.ok(isOptionSelected(controlPanel, "Date", "Quarter"), "selected"); - assert.ok(isOptionSelected(controlPanel, "Date", "Day"), "selected"); - assert.deepEqual(getFacetTexts(controlPanel), ["Date: Quarter>Date: Day>Bar"]); + assert.ok(isItemSelected(target, "Date")); + assert.ok(isItemSelected(target, "Bar")); + assert.ok(isOptionSelected(target, "Date", "Quarter"), "selected"); + assert.ok(isOptionSelected(target, "Date", "Day"), "selected"); + assert.deepEqual(getFacetTexts(target), ["Date: Quarter>Date: Day>Bar"]); - await toggleMenuItem(controlPanel, "Bar"); - await toggleMenuItem(controlPanel, "Date"); + await toggleMenuItem(target, "Bar"); + await toggleMenuItem(target, "Date"); - assert.ok(isItemSelected(controlPanel, "Date")); - assert.notOk(isItemSelected(controlPanel, "Bar")); - assert.ok(isOptionSelected(controlPanel, "Date", "Quarter"), "selected"); - assert.ok(isOptionSelected(controlPanel, "Date", "Day"), "selected"); - assert.deepEqual(getFacetTexts(controlPanel), ["Date: Quarter>Date: Day"]); + assert.ok(isItemSelected(target, "Date")); + assert.notOk(isItemSelected(target, "Bar")); + assert.ok(isOptionSelected(target, "Date", "Quarter"), "selected"); + assert.ok(isOptionSelected(target, "Date", "Day"), "selected"); + assert.deepEqual(getFacetTexts(target), ["Date: Quarter>Date: Day"]); - await removeFacet(controlPanel); + await removeFacet(target); - assert.deepEqual(getFacetTexts(controlPanel), []); + assert.deepEqual(getFacetTexts(target), []); - await toggleGroupByMenu(controlPanel); - await toggleMenuItem(controlPanel, "Date"); + await toggleGroupByMenu(target); + await toggleMenuItem(target, "Date"); - assert.notOk(isItemSelected(controlPanel, "Date")); - assert.notOk(isItemSelected(controlPanel, "Bar")); - assert.notOk(isOptionSelected(controlPanel, "Date", "Quarter"), "selected"); - assert.notOk(isOptionSelected(controlPanel, "Date", "Day"), "selected"); + assert.notOk(isItemSelected(target, "Date")); + assert.notOk(isItemSelected(target, "Bar")); + assert.notOk(isOptionSelected(target, "Date", "Quarter"), "selected"); + assert.notOk(isOptionSelected(target, "Date", "Day"), "selected"); }); QUnit.test("falsy search default groupbys are not activated", async function (assert) { @@ -453,6 +455,6 @@ QUnit.module("Search", (hooks) => { }); assert.deepEqual(controlPanel.env.searchModel.groupBy, []); - assert.deepEqual(getFacetTexts(controlPanel), []); + assert.deepEqual(getFacetTexts(target), []); }); }); diff --git a/addons/web/static/tests/search/pager_hook_tests.js b/addons/web/static/tests/search/pager_hook_tests.js index 478fad93573..6a3b9f0e350 100644 --- a/addons/web/static/tests/search/pager_hook_tests.js +++ b/addons/web/static/tests/search/pager_hook_tests.js @@ -2,11 +2,12 @@ import { ControlPanel } from "@web/search/control_panel/control_panel"; import { usePager } from "@web/search/pager_hook"; -import { click, nextTick } from "../helpers/utils"; +import { click, getFixture, nextTick } from "../helpers/utils"; import { makeWithSearch, setupControlPanelServiceRegistry } from "./helpers"; const { Component, useState, xml } = owl; +let target; let serverData; QUnit.module("Search", (hooks) => { hooks.beforeEach(async () => { @@ -21,6 +22,7 @@ QUnit.module("Search", (hooks) => { }, }; setupControlPanelServiceRegistry(); + target = getFixture(); }); QUnit.module("usePager"); @@ -39,20 +41,20 @@ QUnit.module("Search", (hooks) => { TestComponent.components = { ControlPanel }; TestComponent.template = xml``; - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "foo", Component: TestComponent, searchMenuTypes: [], }); - assert.containsOnce(comp, ".o_pager"); + assert.containsOnce(target, ".o_pager"); assert.strictEqual( - comp.el.querySelector(`.o_pager_counter .o_pager_value`).textContent.trim(), + target.querySelector(`.o_pager_counter .o_pager_value`).textContent.trim(), "1-10" ); assert.strictEqual( - comp.el.querySelector(`.o_pager_counter span.o_pager_limit`).textContent.trim(), + target.querySelector(`.o_pager_counter span.o_pager_limit`).textContent.trim(), "50" ); }); @@ -81,13 +83,13 @@ QUnit.module("Search", (hooks) => { searchMenuTypes: [], }); - assert.containsOnce(comp, ".o_pager"); + assert.containsOnce(target, ".o_pager"); assert.strictEqual( - comp.el.querySelector(`.o_pager_counter .o_pager_value`).textContent.trim(), + target.querySelector(`.o_pager_counter .o_pager_value`).textContent.trim(), "1-10" ); assert.strictEqual( - comp.el.querySelector(`.o_pager_counter span.o_pager_limit`).textContent.trim(), + target.querySelector(`.o_pager_counter span.o_pager_limit`).textContent.trim(), "50" ); assert.deepEqual(comp.state, { @@ -95,15 +97,15 @@ QUnit.module("Search", (hooks) => { limit: 10, }); - await click(comp.el.querySelector(`.o_pager button.o_pager_next`)); + await click(target.querySelector(`.o_pager button.o_pager_next`)); - assert.containsOnce(comp, ".o_pager"); + assert.containsOnce(target, ".o_pager"); assert.strictEqual( - comp.el.querySelector(`.o_pager_counter .o_pager_value`).textContent.trim(), + target.querySelector(`.o_pager_counter .o_pager_value`).textContent.trim(), "11-20" ); assert.strictEqual( - comp.el.querySelector(`.o_pager_counter span.o_pager_limit`).textContent.trim(), + target.querySelector(`.o_pager_counter span.o_pager_limit`).textContent.trim(), "50" ); assert.deepEqual(comp.state, { @@ -114,13 +116,13 @@ QUnit.module("Search", (hooks) => { comp.state.offset = 20; await nextTick(); - assert.containsOnce(comp, ".o_pager"); + assert.containsOnce(target, ".o_pager"); assert.strictEqual( - comp.el.querySelector(`.o_pager_counter .o_pager_value`).textContent.trim(), + target.querySelector(`.o_pager_counter .o_pager_value`).textContent.trim(), "21-30" ); assert.strictEqual( - comp.el.querySelector(`.o_pager_counter span.o_pager_limit`).textContent.trim(), + target.querySelector(`.o_pager_counter span.o_pager_limit`).textContent.trim(), "50" ); assert.deepEqual(comp.state, { diff --git a/addons/web/static/tests/search/search_bar_tests.js b/addons/web/static/tests/search/search_bar_tests.js index fb6c0123ecb..e5bbd4e9e7d 100644 --- a/addons/web/static/tests/search/search_bar_tests.js +++ b/addons/web/static/tests/search/search_bar_tests.js @@ -2,7 +2,14 @@ import { registerCleanup } from "@web/../tests/helpers/cleanup"; import { ControlPanel } from "@web/search/control_panel/control_panel"; -import { click, makeDeferred, nextTick, patchWithCleanup, triggerEvent } from "../helpers/utils"; +import { + click, + getFixture, + makeDeferred, + nextTick, + patchWithCleanup, + triggerEvent, +} from "../helpers/utils"; import { editSearch, getFacetTexts, @@ -18,6 +25,7 @@ function getDomain(controlPanel) { const { onWillUpdateProps } = owl; +let target; let serverData; QUnit.module("Search", (hooks) => { hooks.beforeEach(async () => { @@ -105,6 +113,7 @@ QUnit.module("Search", (hooks) => { }, }; setupControlPanelServiceRegistry(); + target = getFixture(); }); QUnit.module("SearchBar"); @@ -112,7 +121,7 @@ QUnit.module("Search", (hooks) => { QUnit.test("basic rendering", async function (assert) { assert.expect(1); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "partner", Component: ControlPanel, @@ -122,7 +131,7 @@ QUnit.module("Search", (hooks) => { assert.strictEqual( document.activeElement, - controlPanel.el.querySelector(".o_searchview input"), + target.querySelector(".o_searchview input"), "searchview input should be focused" ); }); @@ -130,7 +139,7 @@ QUnit.module("Search", (hooks) => { QUnit.test("navigation with facets", async function (assert) { assert.expect(4); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "partner", Component: ControlPanel, @@ -140,28 +149,22 @@ QUnit.module("Search", (hooks) => { }); assert.containsOnce( - controlPanel, + target, ".o_searchview .o_searchview_facet", "there should be one facet" ); - assert.strictEqual( - document.activeElement, - controlPanel.el.querySelector(".o_searchview input") - ); + assert.strictEqual(document.activeElement, target.querySelector(".o_searchview input")); // press left to focus the facet await triggerEvent(document.activeElement, null, "keydown", { key: "ArrowLeft" }); assert.strictEqual( document.activeElement, - controlPanel.el.querySelector(".o_searchview .o_searchview_facet") + target.querySelector(".o_searchview .o_searchview_facet") ); // press right to focus the input await triggerEvent(document.activeElement, null, "keydown", { key: "ArrowRight" }); - assert.strictEqual( - document.activeElement, - controlPanel.el.querySelector(".o_searchview input") - ); + assert.strictEqual(document.activeElement, target.querySelector(".o_searchview input")); }); QUnit.test("search date and datetime fields. Support of timezones", async function (assert) { @@ -182,13 +185,13 @@ QUnit.module("Search", (hooks) => { }); // Date case - await editSearch(controlPanel, "07/15/1983"); - let searchInput = controlPanel.el.querySelector(".o_searchview input"); + await editSearch(target, "07/15/1983"); + let searchInput = target.querySelector(".o_searchview input"); await triggerEvent(searchInput, null, "keydown", { key: "ArrowDown" }); await triggerEvent(searchInput, null, "keydown", { key: "Enter" }); // select assert.deepEqual( - getFacetTexts(controlPanel).map((str) => str.replace(/\s+/, " ")), + getFacetTexts(target).map((str) => str.replace(/\s+/, " ")), ["Birthday 07/15/1983"], "The format of the date in the facet should be in locale" ); @@ -196,17 +199,17 @@ QUnit.module("Search", (hooks) => { assert.deepEqual(getDomain(controlPanel), [["birthday", "=", "1983-07-15"]]); // Close Facet - await click(controlPanel.el.querySelector(".o_searchview_facet .o_facet_remove")); + await click(target.querySelector(".o_searchview_facet .o_facet_remove")); // DateTime case - await editSearch(controlPanel, "07/15/1983 00:00:00"); - searchInput = controlPanel.el.querySelector(".o_searchview input"); + await editSearch(target, "07/15/1983 00:00:00"); + searchInput = target.querySelector(".o_searchview input"); await triggerEvent(searchInput, null, "keydown", { key: "ArrowDown" }); await triggerEvent(searchInput, null, "keydown", { key: "ArrowDown" }); await triggerEvent(searchInput, null, "keydown", { key: "Enter" }); // select assert.deepEqual( - getFacetTexts(controlPanel).map((str) => str.replace(/\s+/, " ")), + getFacetTexts(target).map((str) => str.replace(/\s+/, " ")), ["Birth DateTime\n07/15/1983 00:00:00"], "The format of the datetime in the facet should be in locale" ); @@ -217,7 +220,7 @@ QUnit.module("Search", (hooks) => { QUnit.test("autocomplete menu clickout interactions", async function (assert) { assert.expect(9); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "partner", Component: ControlPanel, @@ -234,29 +237,29 @@ QUnit.module("Search", (hooks) => { `, }); - const input = controlPanel.el.querySelector(".o_searchview input"); + const input = target.querySelector(".o_searchview input"); - assert.containsNone(controlPanel, ".o_searchview_autocomplete"); + assert.containsNone(target, ".o_searchview_autocomplete"); - await editSearch(controlPanel, "Hello there"); + await editSearch(target, "Hello there"); assert.strictEqual(input.value, "Hello there", "input value should be updated"); - assert.containsOnce(controlPanel, ".o_searchview_autocomplete"); + assert.containsOnce(target, ".o_searchview_autocomplete"); await triggerEvent(input, null, "keydown", { key: "Escape" }); assert.strictEqual(input.value, "", "input value should be empty"); - assert.containsNone(controlPanel, ".o_searchview_autocomplete"); + assert.containsNone(target, ".o_searchview_autocomplete"); - await editSearch(controlPanel, "General Kenobi"); + await editSearch(target, "General Kenobi"); assert.strictEqual(input.value, "General Kenobi", "input value should be updated"); - assert.containsOnce(controlPanel, ".o_searchview_autocomplete"); + assert.containsOnce(target, ".o_searchview_autocomplete"); await click(document.body); assert.strictEqual(input.value, "", "input value should be empty"); - assert.containsNone(controlPanel, ".o_searchview_autocomplete"); + assert.containsNone(target, ".o_searchview_autocomplete"); }); QUnit.test("select an autocomplete field", async function (assert) { @@ -270,20 +273,18 @@ QUnit.module("Search", (hooks) => { searchViewId: false, }); - await editSearch(controlPanel, "a"); + await editSearch(target, "a"); assert.containsN( - controlPanel, + target, ".o_searchview_autocomplete li", 2, "there should be 2 result for 'a' in search bar autocomplete" ); - const searchInput = controlPanel.el.querySelector(".o_searchview input"); + const searchInput = target.querySelector(".o_searchview input"); await triggerEvent(searchInput, null, "keydown", { key: "Enter" }); assert.strictEqual( - controlPanel.el - .querySelector(".o_searchview_input_container .o_facet_values") - .innerText.trim(), + target.querySelector(".o_searchview_input_container .o_facet_values").innerText.trim(), "a", "There should be a field facet with label 'a'" ); @@ -313,15 +314,15 @@ QUnit.module("Search", (hooks) => { }); // 'r' key to filter on bar "First Record" - await editSearch(controlPanel, "record"); - const searchInput = controlPanel.el.querySelector(".o_searchview input"); + await editSearch(target, "record"); + const searchInput = target.querySelector(".o_searchview input"); await triggerEvent(searchInput, null, "keydown", { key: "ArrowDown" }); await triggerEvent(searchInput, null, "keydown", { key: "ArrowRight" }); await triggerEvent(searchInput, null, "keydown", { key: "ArrowDown" }); await triggerEvent(searchInput, null, "keydown", { key: "Enter" }); assert.deepEqual( - getFacetTexts(controlPanel).map((str) => str.replace(/\s+/, "")), + getFacetTexts(target).map((str) => str.replace(/\s+/, "")), ["BarFirst record"] ); @@ -331,7 +332,7 @@ QUnit.module("Search", (hooks) => { assert.deepEqual(controlPanel.env.searchModel.context.bar, [1]); // 'r' key to filter on bar "Second Record" - await editSearch(controlPanel, "record"); + await editSearch(target, "record"); await triggerEvent(searchInput, null, "keydown", { key: "ArrowDown" }); await triggerEvent(searchInput, null, "keydown", { key: "ArrowRight" }); await triggerEvent(searchInput, null, "keydown", { key: "ArrowDown" }); @@ -339,7 +340,7 @@ QUnit.module("Search", (hooks) => { await triggerEvent(searchInput, null, "keydown", { key: "Enter" }); assert.deepEqual( - getFacetTexts(controlPanel).map((str) => str.replace(/\s+/, "")), + getFacetTexts(target).map((str) => str.replace(/\s+/, "")), ["BarFirst recordorSecond record"] ); @@ -362,7 +363,7 @@ QUnit.module("Search", (hooks) => { }, }); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "partner", Component: ControlPanel, @@ -370,17 +371,17 @@ QUnit.module("Search", (hooks) => { searchViewId: false, }); - const searchInput = controlPanel.el.querySelector(".o_searchview input"); + const searchInput = target.querySelector(".o_searchview input"); await triggerEvent(searchInput, null, "keydown", { key: "Enter" }); - assert.containsNone(controlPanel, ".o_searchview_facet_label"); + assert.containsNone(target, ".o_searchview_facet_label"); assert.strictEqual(updateCount, 1, "should have been updated once"); }); QUnit.test("selecting (no result) triggers a search bar rendering", async function (assert) { assert.expect(3); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "partner", Component: ControlPanel, @@ -393,27 +394,25 @@ QUnit.module("Search", (hooks) => { `, }); - await editSearch(controlPanel, "hello there"); + await editSearch(target, "hello there"); // 'a' key to filter nothing on bar - const searchInput = controlPanel.el.querySelector(".o_searchview input"); + const searchInput = target.querySelector(".o_searchview input"); await triggerEvent(searchInput, null, "keydown", { key: "ArrowDown" }); await triggerEvent(searchInput, null, "keydown", { key: "ArrowRight" }); await triggerEvent(searchInput, null, "keydown", { key: "ArrowDown" }); assert.strictEqual( - controlPanel.el - .querySelector(".o_searchview_autocomplete .o_selection_focus") - .innerText.trim(), + target.querySelector(".o_searchview_autocomplete .o_selection_focus").innerText.trim(), "(no result)", "there should be no result for 'a' in bar" ); await triggerEvent(searchInput, null, "keydown", { key: "Enter" }); - assert.containsNone(controlPanel, ".o_searchview_facet_label"); + assert.containsNone(target, ".o_searchview_facet_label"); assert.strictEqual( - controlPanel.el.querySelector(".o_searchview input").value, + target.querySelector(".o_searchview input").value, "", "the search input should be re-rendered" ); @@ -429,7 +428,7 @@ QUnit.module("Search", (hooks) => { // not handled but are triggered to ensure they do not interfere. const TEST = "TEST"; const テスト = "テスト"; - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "partner", Component: ControlPanel, @@ -437,7 +436,7 @@ QUnit.module("Search", (hooks) => { searchViewId: false, }); - const searchInput = controlPanel.el.querySelector(".o_searchview input"); + const searchInput = target.querySelector(".o_searchview input"); // Simulate typing "TEST" on search view. for (let i = 0; i < TEST.length; i++) { @@ -462,12 +461,12 @@ QUnit.module("Search", (hooks) => { }); } assert.containsOnce( - controlPanel.el, + target, ".o_searchview_autocomplete", "should display autocomplete dropdown menu on typing something in search view" ); assert.strictEqual( - controlPanel.el.querySelector(".o_searchview_autocomplete li").innerText.trim(), + target.querySelector(".o_searchview_autocomplete li").innerText.trim(), "Search Foo for: TEST", `1st filter suggestion should be based on typed word "TEST"` ); @@ -492,7 +491,7 @@ QUnit.module("Search", (hooks) => { }); assert.strictEqual( - controlPanel.el.querySelector(".o_searchview_autocomplete li").innerText.trim(), + target.querySelector(".o_searchview_autocomplete li").innerText.trim(), "Search Foo for: テスト", `1st filter suggestion should be updated with soft-selection typed word "テスト"` ); @@ -520,7 +519,7 @@ QUnit.module("Search", (hooks) => { await triggerEvent(searchInput, null, "compositionend"); assert.strictEqual( - controlPanel.el.querySelector(".o_searchview_autocomplete li").innerText.trim(), + target.querySelector(".o_searchview_autocomplete li").innerText.trim(), "Search Foo for: TEST", `1st filter suggestion should finally be updated with click selection on word "TEST" from IME` ); @@ -530,7 +529,7 @@ QUnit.module("Search", (hooks) => { QUnit.test("open search view autocomplete on paste value using mouse", async function (assert) { assert.expect(1); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "partner", Component: ControlPanel, @@ -539,11 +538,11 @@ QUnit.module("Search", (hooks) => { }); // Simulate paste text through the mouse. - const searchInput = controlPanel.el.querySelector(".o_searchview input"); + const searchInput = target.querySelector(".o_searchview input"); searchInput.value = "ABC"; await triggerEvent(searchInput, null, "input", { inputType: "insertFromPaste" }); assert.containsOnce( - controlPanel, + target, ".o_searchview_autocomplete", "should display autocomplete dropdown menu on paste in search view" ); @@ -570,20 +569,18 @@ QUnit.module("Search", (hooks) => { assert.deepEqual(getDomain(controlPanel), []); - await editSearch(controlPanel, "rec"); - await click(controlPanel.el.querySelector(".o_searchview_autocomplete li:last-child")); + await editSearch(target, "rec"); + await click(target.querySelector(".o_searchview_autocomplete li:last-child")); assert.deepEqual(getDomain(controlPanel), [["bar", "child_of", "rec"]]); - await removeFacet(controlPanel); + await removeFacet(target); assert.deepEqual(getDomain(controlPanel), []); - await editSearch(controlPanel, "rec"); - await click(controlPanel.el.querySelector(".o_expand")); - await click( - controlPanel.el.querySelector(".o_searchview_autocomplete li.o_menu_item.o_indent") - ); + await editSearch(target, "rec"); + await click(target.querySelector(".o_expand")); + await click(target.querySelector(".o_searchview_autocomplete li.o_menu_item.o_indent")); assert.deepEqual(getDomain(controlPanel), [["bar", "child_of", 1]]); }); @@ -601,17 +598,14 @@ QUnit.module("Search", (hooks) => { assert.deepEqual(getDomain(controlPanel), []); - await editSearch(controlPanel, "null"); + await editSearch(target, "null"); assert.strictEqual( - controlPanel.el.querySelector(".o_searchview_autocomplete .o_selection_focus") - .innerText, + target.querySelector(".o_searchview_autocomplete .o_selection_focus").innerText, "Search Foo for: null" ); - await click( - controlPanel.el.querySelector(".o_searchview_autocomplete li.o_selection_focus a") - ); + await click(target.querySelector(".o_searchview_autocomplete li.o_selection_focus a")); assert.deepEqual(getDomain(controlPanel), [["foo", "ilike", "null"]]); }); @@ -634,33 +628,33 @@ QUnit.module("Search", (hooks) => { assert.deepEqual(getDomain(controlPanel), []); - await editSearch(controlPanel, "y"); + await editSearch(target, "y"); - assert.containsN(controlPanel, ".o_searchview_autocomplete li", 1); + assert.containsN(target, ".o_searchview_autocomplete li", 1); assert.strictEqual( - controlPanel.el.querySelector(".o_searchview_autocomplete li:last-child").innerText, + target.querySelector(".o_searchview_autocomplete li:last-child").innerText, "Search Bool for: Yes" ); // select "Yes" - await click(controlPanel.el.querySelector(".o_searchview_autocomplete li:last-child")); + await click(target.querySelector(".o_searchview_autocomplete li:last-child")); assert.deepEqual(getDomain(controlPanel), [["bool", "=", true]]); - await removeFacet(controlPanel); + await removeFacet(target); assert.deepEqual(getDomain(controlPanel), []); - await editSearch(controlPanel, "No"); + await editSearch(target, "No"); - assert.containsN(controlPanel, ".o_searchview_autocomplete li", 1); + assert.containsN(target, ".o_searchview_autocomplete li", 1); assert.strictEqual( - controlPanel.el.querySelector(".o_searchview_autocomplete li:last-child").innerText, + target.querySelector(".o_searchview_autocomplete li:last-child").innerText, "Search Bool for: No" ); // select "No" - await click(controlPanel.el.querySelector(".o_searchview_autocomplete li:last-child")); + await click(target.querySelector(".o_searchview_autocomplete li:last-child")); assert.deepEqual(getDomain(controlPanel), [["bool", "=", false]]); }); @@ -678,17 +672,17 @@ QUnit.module("Search", (hooks) => { `, }); - await editSearch(controlPanel, "bar"); - await validateSearch(controlPanel); + await editSearch(target, "bar"); + await validateSearch(target); assert.deepEqual(getDomain(controlPanel), [["foo", "ilike", "bar"]]); - await removeFacet(controlPanel); + await removeFacet(target); assert.deepEqual(getDomain(controlPanel), []); - await editSearch(controlPanel, " bar "); - await validateSearch(controlPanel); + await editSearch(target, " bar "); + await validateSearch(target); assert.deepEqual( getDomain(controlPanel), @@ -721,17 +715,17 @@ QUnit.module("Search", (hooks) => { assert.deepEqual(getDomain(controlPanel), []); - await editSearch(controlPanel, "ref"); - await validateSearch(controlPanel); + await editSearch(target, "ref"); + await validateSearch(target); assert.deepEqual(getDomain(controlPanel), [["ref", "ilike", "ref"]]); - await removeFacet(controlPanel); + await removeFacet(target); assert.deepEqual(getDomain(controlPanel), []); - await editSearch(controlPanel, "ref002"); - await validateSearch(controlPanel); + await editSearch(target, "ref002"); + await validateSearch(target); assert.deepEqual(getDomain(controlPanel), [["ref", "ilike", "ref002"]]); }); @@ -747,7 +741,7 @@ QUnit.module("Search", (hooks) => { await def; } }; - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, mockRPC, resModel: "partner", @@ -760,18 +754,18 @@ QUnit.module("Search", (hooks) => { `, }); - await editSearch(controlPanel, "rec"); - await click(controlPanel.el.querySelector(".o_expand")); + await editSearch(target, "rec"); + await click(target.querySelector(".o_expand")); await triggerEvent( - controlPanel.el, + target, ".o_searchview_autocomplete li.o_menu_item:first-child", "mousemove" ); - assert.containsNone(controlPanel, ".o_searchview_autocomplete li.o_menu_item.o_indent"); + assert.containsNone(target, ".o_searchview_autocomplete li.o_menu_item.o_indent"); def.resolve(); await nextTick(); - assert.containsN(controlPanel, ".o_searchview_autocomplete li.o_menu_item.o_indent", 5); + assert.containsN(target, ".o_searchview_autocomplete li.o_menu_item.o_indent", 5); } ); @@ -786,7 +780,7 @@ QUnit.module("Search", (hooks) => { await def; } }; - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, mockRPC, resModel: "partner", @@ -799,22 +793,22 @@ QUnit.module("Search", (hooks) => { `, }); - await editSearch(controlPanel, "rec"); - await click(controlPanel.el.querySelector(".o_expand")); - const searchInput = controlPanel.el.querySelector(".o_searchview input"); + await editSearch(target, "rec"); + await click(target.querySelector(".o_expand")); + const searchInput = target.querySelector(".o_searchview input"); await triggerEvent(searchInput, null, "keydown", { key: "ArrowDown" }); - assert.containsNone(controlPanel, ".o_searchview_autocomplete li.o_menu_item.o_indent"); + assert.containsNone(target, ".o_searchview_autocomplete li.o_menu_item.o_indent"); def.resolve(); await nextTick(); - assert.containsN(controlPanel, ".o_searchview_autocomplete li.o_menu_item.o_indent", 5); + assert.containsN(target, ".o_searchview_autocomplete li.o_menu_item.o_indent", 5); } ); QUnit.test("checks that an arrowDown always selects an item", async function (assert) { assert.expect(1); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "partner", Component: ControlPanel, @@ -826,23 +820,23 @@ QUnit.module("Search", (hooks) => { `, }); - await editSearch(controlPanel, "rec"); - await click(controlPanel.el.querySelector(".o_expand")); - click(controlPanel.el.querySelector(".o_expand")); + await editSearch(target, "rec"); + await click(target.querySelector(".o_expand")); + click(target.querySelector(".o_expand")); triggerEvent( - controlPanel.el, + target, ".o_searchview_autocomplete li.o_menu_item.o_indent:last-child", "mousemove" ); - const searchInput = controlPanel.el.querySelector(".o_searchview input"); + const searchInput = target.querySelector(".o_searchview input"); await triggerEvent(searchInput, null, "keydown", { key: "ArrowDown" }); - assert.containsOnce(controlPanel, ".o_selection_focus"); + assert.containsOnce(target, ".o_selection_focus"); }); QUnit.test("checks that an arrowUp always selects an item", async function (assert) { assert.expect(1); - const controlPanel = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "partner", Component: ControlPanel, @@ -854,16 +848,16 @@ QUnit.module("Search", (hooks) => { `, }); - await editSearch(controlPanel, "rec"); - await click(controlPanel.el.querySelector(".o_expand")); - click(controlPanel.el.querySelector(".o_expand")); + await editSearch(target, "rec"); + await click(target.querySelector(".o_expand")); + click(target.querySelector(".o_expand")); triggerEvent( - controlPanel.el, + target, ".o_searchview_autocomplete li.o_menu_item.o_indent:last-child", "mousemove" ); - const searchInput = controlPanel.el.querySelector(".o_searchview input"); + const searchInput = target.querySelector(".o_searchview input"); await triggerEvent(searchInput, null, "keydown", { key: "ArrowUp" }); - assert.containsOnce(controlPanel, ".o_selection_focus"); + assert.containsOnce(target, ".o_selection_focus"); }); }); diff --git a/addons/web/static/tests/search/search_panel_tests.js b/addons/web/static/tests/search/search_panel_tests.js index 5625f3c6e1d..a946e7b0b8f 100644 --- a/addons/web/static/tests/search/search_panel_tests.js +++ b/addons/web/static/tests/search/search_panel_tests.js @@ -29,8 +29,7 @@ const serviceRegistry = registry.category("services"); // Helpers //----------------------------------------------------------------------------- -const getValues = (comp, type) => { - const el = comp instanceof Component ? comp.el : comp; +const getValues = (el, type) => { switch (type) { case "category": { return [...el.querySelectorAll(".o_search_panel_category_value header")]; @@ -47,8 +46,8 @@ const getValues = (comp, type) => { } }; -const getValue = (comp, type, content = 0, additionalSelector = null) => { - const values = getValues(comp, type); +const getValue = (el, type, content = 0, additionalSelector = null) => { + const values = getValues(el, type); let match = null; if (Number.isInteger(content) && content < values.length) { match = values[content]; @@ -63,24 +62,24 @@ const getValue = (comp, type, content = 0, additionalSelector = null) => { }; const parseContent = ([value, counter]) => (counter ? `${value}: ${counter}` : value); -const getContent = (comp, type, parse = parseContent) => { - return getValues(comp, type) +const getContent = (el, type, parse = parseContent) => { + return getValues(el, type) .map((v) => parse(v.innerText.trim().split(/\s+/))) .filter((v) => v !== null); }; // Categories -const getCategory = (comp, ...args) => getValue(comp, "category", ...args); -const getCategoriesContent = (comp, ...args) => getContent(comp, "category", ...args); +const getCategory = (el, ...args) => getValue(el, "category", ...args); +const getCategoriesContent = (el, ...args) => getContent(el, "category", ...args); // Filters -const getFilter = (comp, ...args) => getValue(comp, "filter", ...args); -const getFiltersContent = (comp, ...args) => getContent(comp, "filter", ...args); +const getFilter = (el, ...args) => getValue(el, "filter", ...args); +const getFiltersContent = (el, ...args) => getContent(el, "filter", ...args); // Filter groups -const getFilterGroup = (comp, ...args) => getValue(comp, "filterGroup", ...args); -const getFilterGroupContent = (comp, ...args) => { - const group = getFilterGroup(comp, ...args); +const getFilterGroup = (el, ...args) => getValue(el, "filterGroup", ...args); +const getFilterGroupContent = (el, ...args) => { + const group = getFilterGroup(el, ...args); return [getContent(group, "groupHeader")[0], getFiltersContent(group)]; }; @@ -279,7 +278,7 @@ QUnit.module("Search", (hooks) => { assert.expect(2); const { TestComponent, getDomain } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, async mockRPC(route, { method }) { if (/search_panel_/.test(method || route)) { @@ -291,7 +290,7 @@ QUnit.module("Search", (hooks) => { searchViewId: false, display: { searchPanel: false }, }); - assert.containsNone(comp, ".o_search_panel"); + assert.containsNone(target, ".o_search_panel"); assert.deepEqual(getDomain(), []); // initial domain }); @@ -301,7 +300,7 @@ QUnit.module("Search", (hooks) => { serverData.views["partner,false,search"] = ``; const { TestComponent, getDomain } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, async mockRPC(route, { method, model }) { if (/search_panel_/.test(method || route)) { @@ -313,14 +312,14 @@ QUnit.module("Search", (hooks) => { searchViewId: false, }); - assert.containsNone(comp, ".o_search_panel"); + assert.containsNone(target, ".o_search_panel"); assert.deepEqual(getDomain(), []); // initial domain }); QUnit.test("basic rendering of a component with search panel", async (assert) => { assert.expect(15); const { TestComponent, getDomain } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, async mockRPC(route, { method, model }) { if (/search_panel_/.test(method || route)) { @@ -332,10 +331,10 @@ QUnit.module("Search", (hooks) => { searchViewId: false, }); - assert.containsOnce(comp, ".o_search_panel"); - assert.containsN(comp, ".o_search_panel_section", 2); + assert.containsOnce(target, ".o_search_panel"); + assert.containsN(target, ".o_search_panel_section", 2); - const sections = comp.el.querySelectorAll(".o_search_panel_section"); + const sections = target.querySelectorAll(".o_search_panel_section"); const firstSection = sections[0]; assert.hasClass( @@ -386,7 +385,7 @@ QUnit.module("Search", (hooks) => { `; - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", @@ -394,7 +393,7 @@ QUnit.module("Search", (hooks) => { config: { viewType: "toy" }, }); - const sectionHeaderIcons = comp.el.querySelectorAll(".o_search_panel_section_header i"); + const sectionHeaderIcons = target.querySelectorAll(".o_search_panel_section_header i"); assert.hasClass(sectionHeaderIcons[0], "fa-car"); assert.hasAttrValue(sectionHeaderIcons[0], 'style="{color: blue}"'); assert.hasClass(sectionHeaderIcons[1], "fa-star"); @@ -417,7 +416,7 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, async mockRPC(route, { method }) { if (/search_panel_/.test(method || route)) { @@ -430,7 +429,7 @@ QUnit.module("Search", (hooks) => { config: { viewType: "kanban" }, }); - assert.containsOnce(comp, ".o_search_panel_section"); + assert.containsOnce(target, ".o_search_panel_section"); assert.verifySteps(["search_panel_select_range"]); }); @@ -447,7 +446,7 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", @@ -455,8 +454,8 @@ QUnit.module("Search", (hooks) => { config: { viewType: "kanban" }, }); - const headers = comp.el.getElementsByClassName("o_search_panel_section_header"); - assert.containsN(comp, ".o_search_panel_section", 3); + const headers = target.getElementsByClassName("o_search_panel_section_header"); + assert.containsN(target, ".o_search_panel_section", 3); assert.strictEqual(headers[0].innerText.trim(), "COMPANY"); assert.strictEqual(headers[1].innerText.trim(), "CATEGORY"); assert.strictEqual(headers[2].innerText.trim(), "STATE"); @@ -476,7 +475,7 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent, getDomain } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", @@ -489,7 +488,7 @@ QUnit.module("Search", (hooks) => { assert.deepEqual( [ - ...comp.el.querySelectorAll( + ...target.querySelectorAll( ".o_search_panel_category_value header.active label" ), ].map((el) => el.innerText), @@ -498,11 +497,11 @@ QUnit.module("Search", (hooks) => { assert.deepEqual(getDomain(), [["state", "=", "ghi"]]); // select 'ABC' in the category 'state' - await click(comp.el.querySelectorAll(".o_search_panel_category_value header")[4]); + await click(target.querySelectorAll(".o_search_panel_category_value header")[4]); assert.deepEqual( [ - ...comp.el.querySelectorAll( + ...target.querySelectorAll( ".o_search_panel_category_value header.active label" ), ].map((el) => el.innerText), @@ -525,7 +524,7 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent, getDomain } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", @@ -540,26 +539,26 @@ QUnit.module("Search", (hooks) => { assert.deepEqual(getDomain(), [["bar", "=", true]]); // select "asustek" - await click(comp.el.querySelectorAll(".o_search_panel_category_value header")[1]); + await click(target.querySelectorAll(".o_search_panel_category_value header")[1]); - assert.containsOnce(comp, ".o_search_panel_category_value .active"); - assert.containsOnce(comp, ".o_search_panel_category_value:nth(1) .active"); + assert.containsOnce(target, ".o_search_panel_category_value .active"); + assert.containsOnce(target, ".o_search_panel_category_value:nth(1) .active"); assert.deepEqual(getDomain(), ["&", ["bar", "=", true], ["company_id", "child_of", 3]]); // select "agrolait" - await click(comp.el.querySelectorAll(".o_search_panel_category_value header")[2]); + await click(target.querySelectorAll(".o_search_panel_category_value header")[2]); - assert.containsOnce(comp, ".o_search_panel_category_value .active"); - assert.containsOnce(comp, ".o_search_panel_category_value:nth(2) .active"); + assert.containsOnce(target, ".o_search_panel_category_value .active"); + assert.containsOnce(target, ".o_search_panel_category_value:nth(2) .active"); assert.deepEqual(getDomain(), ["&", ["bar", "=", true], ["company_id", "child_of", 5]]); // select "All" - await click(comp.el.querySelector(".o_search_panel_category_value header")); + await click(target.querySelector(".o_search_panel_category_value header")); - assert.containsOnce(comp, ".o_search_panel_category_value .active"); - assert.containsOnce(comp, ".o_search_panel_category_value:first .active"); + assert.containsOnce(target, ".o_search_panel_category_value .active"); + assert.containsOnce(target, ".o_search_panel_category_value:first .active"); assert.deepEqual(getDomain(), [["bar", "=", true]]); }); @@ -575,7 +574,7 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent, getDomain } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", @@ -585,26 +584,26 @@ QUnit.module("Search", (hooks) => { assert.deepEqual(getDomain(), []); // select 'abc' - await click(comp.el, ".o_search_panel_category_value:nth-of-type(2) header"); + await click(target, ".o_search_panel_category_value:nth-of-type(2) header"); - assert.containsOnce(comp, ".o_search_panel_category_value .active"); - assert.containsOnce(comp, ".o_search_panel_category_value:nth-of-type(2) .active"); + assert.containsOnce(target, ".o_search_panel_category_value .active"); + assert.containsOnce(target, ".o_search_panel_category_value:nth-of-type(2) .active"); assert.deepEqual(getDomain(), [["state", "=", "abc"]]); // select 'ghi' - await click(comp.el, ".o_search_panel_category_value:nth-of-type(4) header"); + await click(target, ".o_search_panel_category_value:nth-of-type(4) header"); - assert.containsOnce(comp, ".o_search_panel_category_value .active"); - assert.containsOnce(comp, ".o_search_panel_category_value:nth-of-type(4) .active"); + assert.containsOnce(target, ".o_search_panel_category_value .active"); + assert.containsOnce(target, ".o_search_panel_category_value:nth-of-type(4) .active"); assert.deepEqual(getDomain(), [["state", "=", "ghi"]]); // select 'All' again - await click(comp.el, ".o_search_panel_category_value:nth-of-type(1) header"); + await click(target, ".o_search_panel_category_value:nth-of-type(1) header"); - assert.containsOnce(comp, ".o_search_panel_category_value:nth-of-type(1) .active"); - assert.containsOnce(comp, ".o_search_panel_category_value:first .active"); + assert.containsOnce(target, ".o_search_panel_category_value:nth-of-type(1) .active"); + assert.containsOnce(target, ".o_search_panel_category_value:first .active"); assert.deepEqual(getDomain(), []); }); @@ -640,7 +639,7 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", @@ -648,14 +647,14 @@ QUnit.module("Search", (hooks) => { }); assert.containsN( - comp, + target, ".o_search_panel_category_value", 2, "The number of categories should be 2: All and Company 5" ); assert.containsNone( - comp, + target, ".o_toggle_fold > i", "None of the categories should have children" ); @@ -674,7 +673,7 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent, getDomain } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", @@ -684,12 +683,12 @@ QUnit.module("Search", (hooks) => { assert.deepEqual(getDomain(), [["bar", "=", true]]); - assert.containsN(comp, ".o_search_panel_section", 2); + assert.containsN(target, ".o_search_panel_section", 2); // select 'asustek' await click( [ - ...comp.el.querySelectorAll( + ...target.querySelectorAll( ".o_search_panel_category_value header .o_search_panel_label_title" ), ].find((el) => el.innerText === "asustek") @@ -699,7 +698,7 @@ QUnit.module("Search", (hooks) => { // select 'abc' await click( [ - ...comp.el.querySelectorAll( + ...target.querySelectorAll( ".o_search_panel_category_value header .o_search_panel_label_title" ), ].find((el) => el.innerText === "ABC") @@ -715,7 +714,7 @@ QUnit.module("Search", (hooks) => { // select 'ghi' await click( [ - ...comp.el.querySelectorAll( + ...target.querySelectorAll( ".o_search_panel_category_value header .o_search_panel_label_title" ), ].find((el) => el.innerText === "GHI") @@ -729,11 +728,11 @@ QUnit.module("Search", (hooks) => { ]); // select 'All' in first category (company_id) - let firstSection = comp.el.querySelector(".o_search_panel_section"); + let firstSection = target.querySelector(".o_search_panel_section"); await click(firstSection.querySelector(".o_search_panel_category_value header")); assert.deepEqual(getDomain(), ["&", ["bar", "=", true], ["state", "=", "ghi"]]); - firstSection = comp.el.querySelectorAll(".o_search_panel_section")[1]; + firstSection = target.querySelectorAll(".o_search_panel_section")[1]; // select 'All' in second category (state) await click(firstSection.querySelector(".o_search_panel_category_value header")); assert.deepEqual(getDomain(), [["bar", "=", true]]); @@ -755,7 +754,7 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent, getDomain } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", @@ -763,61 +762,65 @@ QUnit.module("Search", (hooks) => { }); // 'All' is selected by default - assert.containsOnce(comp, ".o_search_panel_category_value .active"); - assert.containsOnce(comp, ".o_search_panel_category_value:first .active"); - assert.containsN(comp, ".o_search_panel_category_value", 3); - assert.containsOnce(comp, ".o_search_panel_category_value .o_toggle_fold > i"); + assert.containsOnce(target, ".o_search_panel_category_value .active"); + assert.containsOnce(target, ".o_search_panel_category_value:first .active"); + assert.containsN(target, ".o_search_panel_category_value", 3); + assert.containsOnce(target, ".o_search_panel_category_value .o_toggle_fold > i"); // unfold parent category and select 'All' again - await click(getCategory(comp, 2)); - await click(getCategory(comp, 0)); + await click(getCategory(target, 2)); + await click(getCategory(target, 0)); - assert.containsOnce(comp, ".o_search_panel_category_value .active"); - assert.containsOnce(comp, ".o_search_panel_category_value:first .active"); - assert.containsN(comp, ".o_search_panel_category_value", 5); - assert.containsN(comp, ".o_search_panel_category_value .o_search_panel_category_value", 2); + assert.containsOnce(target, ".o_search_panel_category_value .active"); + assert.containsOnce(target, ".o_search_panel_category_value:first .active"); + assert.containsN(target, ".o_search_panel_category_value", 5); + assert.containsN( + target, + ".o_search_panel_category_value .o_search_panel_category_value", + 2 + ); assert.deepEqual(getDomain(), []); // click on first child company - await click(getCategory(comp, 3)); + await click(getCategory(target, 3)); - assert.containsOnce(comp, ".o_search_panel_category_value .active"); + assert.containsOnce(target, ".o_search_panel_category_value .active"); assert.containsOnce( - comp, + target, ".o_search_panel_category_value .o_search_panel_category_value:first .active" ); assert.deepEqual(getDomain(), [["company_id", "child_of", 40]]); // click on parent company - await click(getCategory(comp, 2)); + await click(getCategory(target, 2)); - assert.containsOnce(comp, ".o_search_panel_category_value .active"); - assert.containsOnce(comp, ".o_search_panel_category_value:nth(2) .active"); + assert.containsOnce(target, ".o_search_panel_category_value .active"); + assert.containsOnce(target, ".o_search_panel_category_value:nth(2) .active"); assert.deepEqual(getDomain(), [["company_id", "child_of", 5]]); // fold parent company by clicking on it - await click(getCategory(comp, 2)); + await click(getCategory(target, 2)); - assert.containsOnce(comp, ".o_search_panel_category_value .active"); - assert.containsOnce(comp, ".o_search_panel_category_value:nth(2) .active"); + assert.containsOnce(target, ".o_search_panel_category_value .active"); + assert.containsOnce(target, ".o_search_panel_category_value:nth(2) .active"); // parent company should be folded - assert.containsOnce(comp, ".o_search_panel_category_value .active"); - assert.containsOnce(comp, ".o_search_panel_category_value:nth(2) .active"); - assert.containsN(comp, ".o_search_panel_category_value", 3); + assert.containsOnce(target, ".o_search_panel_category_value .active"); + assert.containsOnce(target, ".o_search_panel_category_value:nth(2) .active"); + assert.containsN(target, ".o_search_panel_category_value", 3); assert.deepEqual(getDomain(), [["company_id", "child_of", 5]]); // fold category with children - await click(getCategory(comp, 2)); - await click(getCategory(comp, 2)); + await click(getCategory(target, 2)); + await click(getCategory(target, 2)); - assert.containsOnce(comp, ".o_search_panel_category_value .active"); - assert.containsOnce(comp, ".o_search_panel_category_value:nth(2) .active"); - assert.containsN(comp, ".o_search_panel_category_value", 3); + assert.containsOnce(target, ".o_search_panel_category_value .active"); + assert.containsOnce(target, ".o_search_panel_category_value:nth(2) .active"); + assert.containsN(target, ".o_search_panel_category_value", 3); assert.deepEqual(getDomain(), [["company_id", "child_of", 5]]); }); @@ -834,7 +837,7 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent, getDomain } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", @@ -844,15 +847,15 @@ QUnit.module("Search", (hooks) => { assert.deepEqual(getDomain(), []); // 'All' is selected by default - assert.containsOnce(comp, ".o_search_panel_category_value .active"); - assert.containsOnce(comp, ".o_search_panel_category_value:first .active"); - assert.containsN(comp, ".o_search_panel_category_value", 3); + assert.containsOnce(target, ".o_search_panel_category_value .active"); + assert.containsOnce(target, ".o_search_panel_category_value:first .active"); + assert.containsN(target, ".o_search_panel_category_value", 3); // click on 'gold' category - await click(comp.el.querySelectorAll(".o_search_panel_category_value header")[1]); + await click(target.querySelectorAll(".o_search_panel_category_value header")[1]); - assert.containsOnce(comp, ".o_search_panel_category_value .active"); - assert.containsOnce(comp, ".o_search_panel_category_value:nth(1) .active"); + assert.containsOnce(target, ".o_search_panel_category_value .active"); + assert.containsOnce(target, ".o_search_panel_category_value:nth(1) .active"); assert.deepEqual(getDomain(), [["category_id", "=", 6]]); // must use '=' operator (instead of 'child_of') }); @@ -873,7 +876,7 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", @@ -881,21 +884,21 @@ QUnit.module("Search", (hooks) => { }); assert.containsOnce( - comp, + target, ".o_search_panel_category_value:contains(agrolait) .o_toggle_fold > i" ); - assert.hasClass(getCategory(comp, "agrolait", ".o_toggle_fold > i"), "fa-caret-right"); - assert.containsN(comp, ".o_search_panel_category_value", 3); + assert.hasClass(getCategory(target, "agrolait", ".o_toggle_fold > i"), "fa-caret-right"); + assert.containsN(target, ".o_search_panel_category_value", 3); // unfold agrolait - await click(getCategory(comp, "agrolait", ".o_toggle_fold > i")); - assert.hasClass(getCategory(comp, "agrolait", ".o_toggle_fold > i"), "fa-caret-down"); - assert.containsN(comp, ".o_search_panel_category_value", 5); + await click(getCategory(target, "agrolait", ".o_toggle_fold > i")); + assert.hasClass(getCategory(target, "agrolait", ".o_toggle_fold > i"), "fa-caret-down"); + assert.containsN(target, ".o_search_panel_category_value", 5); // fold agrolait - await click(getCategory(comp, "agrolait", ".o_toggle_fold > i")); - assert.hasClass(getCategory(comp, "agrolait", ".o_toggle_fold > i"), "fa-caret-right"); - assert.containsN(comp, ".o_search_panel_category_value", 3); + await click(getCategory(target, "agrolait", ".o_toggle_fold > i")); + assert.hasClass(getCategory(target, "agrolait", ".o_toggle_fold > i"), "fa-caret-right"); + assert.containsN(target, ".o_search_panel_category_value", 3); }); QUnit.test("fold status is kept at reload", async (assert) => { @@ -917,7 +920,7 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", @@ -927,7 +930,7 @@ QUnit.module("Search", (hooks) => { // unfold agrolait function getAgrolaitElement() { return [ - ...comp.el.querySelectorAll(".o_search_panel_category_value > header"), + ...target.querySelectorAll(".o_search_panel_category_value > header"), ].find((el) => el.innerText.includes("agrolait")); } @@ -937,17 +940,17 @@ QUnit.module("Search", (hooks) => { "fa-caret-down", "'agrolait' should be open" ); - assert.containsN(comp, ".o_search_panel_category_value", 5); + assert.containsN(target, ".o_search_panel_category_value", 5); - await toggleFilterMenu(comp); - await toggleMenuItem(comp, "True Domain"); + await toggleFilterMenu(target); + await toggleMenuItem(target, "True Domain"); assert.hasClass( getAgrolaitElement().querySelector(".o_toggle_fold > i"), "fa-caret-down", "'agrolait' should be open" ); - assert.containsN(comp, ".o_search_panel_category_value", 5); + assert.containsN(target, ".o_search_panel_category_value", 5); }); QUnit.test("concurrency: delayed component update", async (assert) => { @@ -964,7 +967,7 @@ QUnit.module("Search", (hooks) => { const { TestComponent, getDomain } = makeTestComponent({ onWillUpdateProps: () => promise, }); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, async mockRPC(route) { if (route === "/web/dataset/search_read") { @@ -978,29 +981,29 @@ QUnit.module("Search", (hooks) => { }); // 'All' should be selected by default - assert.containsOnce(comp, ".o_search_panel_category_value .active"); - assert.containsOnce(comp, ".o_search_panel_category_value:first .active"); + assert.containsOnce(target, ".o_search_panel_category_value .active"); + assert.containsOnce(target, ".o_search_panel_category_value:first .active"); assert.deepEqual(getDomain(), [["bar", "=", true]]); // select 'asustek' (delay the reload) const asustekPromise = promise; - await click(getCategory(comp, 1)); + await click(getCategory(target, 1)); // 'asustek' should be selected, but there should still be 3 records - assert.containsOnce(comp, ".o_search_panel_category_value .active"); - assert.containsOnce(comp, ".o_search_panel_category_value:nth(1) .active"); + assert.containsOnce(target, ".o_search_panel_category_value .active"); + assert.containsOnce(target, ".o_search_panel_category_value:nth(1) .active"); assert.deepEqual(getDomain(), [["bar", "=", true]]); // select 'agrolait' (delay the reload) promise = makeDeferred(); const agrolaitPromise = promise; - await click(getCategory(comp, 2)); + await click(getCategory(target, 2)); // 'agrolait' should be selected, but there should still be 3 records - assert.containsOnce(comp, ".o_search_panel_category_value .active"); - assert.containsOnce(comp, ".o_search_panel_category_value:nth(2) .active"); + assert.containsOnce(target, ".o_search_panel_category_value .active"); + assert.containsOnce(target, ".o_search_panel_category_value:nth(2) .active"); assert.deepEqual(getDomain(), [["bar", "=", true]]); @@ -1008,8 +1011,8 @@ QUnit.module("Search", (hooks) => { asustekPromise.resolve(); await nextTick(); - assert.containsOnce(comp, ".o_search_panel_category_value .active"); - assert.containsOnce(comp, ".o_search_panel_category_value:nth(2) .active"); + assert.containsOnce(target, ".o_search_panel_category_value .active"); + assert.containsOnce(target, ".o_search_panel_category_value:nth(2) .active"); assert.deepEqual(getDomain(), ["&", ["bar", "=", true], ["company_id", "child_of", 3]]); @@ -1017,8 +1020,8 @@ QUnit.module("Search", (hooks) => { agrolaitPromise.resolve(); await nextTick(); - assert.containsOnce(comp, ".o_search_panel_category_value .active"); - assert.containsOnce(comp, ".o_search_panel_category_value:nth(2) .active"); + assert.containsOnce(target, ".o_search_panel_category_value .active"); + assert.containsOnce(target, ".o_search_panel_category_value:nth(2) .active"); assert.deepEqual(getDomain(), ["&", ["bar", "=", true], ["company_id", "child_of", 5]]); }); @@ -1055,15 +1058,15 @@ QUnit.module("Search", (hooks) => { assert.verifySteps([]); promise.resolve(); - const comp = await compPromise; + await compPromise; assert.verifySteps(["load_views", "search_panel_select_range"]); // Case 2: search domain changed so we wait for the search panel once again promise = makeDeferred(); - await toggleFilterMenu(comp); - await toggleMenuItem(comp, 0); + await toggleFilterMenu(target); + await toggleMenuItem(target, 0); assert.verifySteps([]); @@ -1075,7 +1078,7 @@ QUnit.module("Search", (hooks) => { // Case 3: search domain is the same and default values do not matter anymore promise = makeDeferred(); - await click(getCategory(comp, 1)); + await click(getCategory(target, 1)); // The search read is executed right away in this case assert.verifySteps([]); @@ -1176,7 +1179,7 @@ QUnit.module("Search", (hooks) => { let promise; const { TestComponent, getDomain } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, async mockRPC(route, { method }) { if (method === "search_panel_select_multi_range") { @@ -1188,30 +1191,30 @@ QUnit.module("Search", (hooks) => { searchViewId: false, }); - assert.containsOnce(comp, ".o_search_panel_category_value .active"); - assert.containsOnce(comp, ".o_search_panel_category_value:first .active"); + assert.containsOnce(target, ".o_search_panel_category_value .active"); + assert.containsOnce(target, ".o_search_panel_category_value:first .active"); assert.deepEqual(getDomain(), []); // select 'abc' (delay the reload) promise = makeDeferred(); const abcDef = promise; - await click(getCategory(comp, 1)); + await click(getCategory(target, 1)); // 'All' should still be selected - assert.containsOnce(comp, ".o_search_panel_category_value .active"); - assert.containsOnce(comp, ".o_search_panel_category_value:first .active"); + assert.containsOnce(target, ".o_search_panel_category_value .active"); + assert.containsOnce(target, ".o_search_panel_category_value:first .active"); assert.deepEqual(getDomain(), [["state", "=", "abc"]]); // select 'ghi' (delay the reload) promise = makeDeferred(); const ghiDef = promise; - await click(getCategory(comp, 3)); + await click(getCategory(target, 3)); // 'All' should still be selected - assert.containsOnce(comp, ".o_search_panel_category_value .active"); - assert.containsOnce(comp, ".o_search_panel_category_value:first .active"); + assert.containsOnce(target, ".o_search_panel_category_value .active"); + assert.containsOnce(target, ".o_search_panel_category_value:first .active"); assert.deepEqual(getDomain(), [["state", "=", "ghi"]]); @@ -1219,8 +1222,8 @@ QUnit.module("Search", (hooks) => { ghiDef.resolve(); await nextTick(); - assert.containsOnce(comp, ".o_search_panel_category_value .active"); - assert.containsOnce(comp, ".o_search_panel_category_value:nth(3) .active"); + assert.containsOnce(target, ".o_search_panel_category_value .active"); + assert.containsOnce(target, ".o_search_panel_category_value:nth(3) .active"); assert.deepEqual(getDomain(), [["state", "=", "ghi"]]); @@ -1228,8 +1231,8 @@ QUnit.module("Search", (hooks) => { abcDef.resolve(); await nextTick(); - assert.containsOnce(comp, ".o_search_panel_category_value .active"); - assert.containsOnce(comp, ".o_search_panel_category_value:nth(3) .active"); + assert.containsOnce(target, ".o_search_panel_category_value .active"); + assert.containsOnce(target, ".o_search_panel_category_value:nth(3) .active"); assert.deepEqual(getDomain(), [["state", "=", "ghi"]]); }); @@ -1247,7 +1250,7 @@ QUnit.module("Search", (hooks) => { let promise; const { TestComponent, getDomain } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, async mockRPC(route, { method }) { if (method === "search_panel_select_multi_range") { @@ -1264,8 +1267,8 @@ QUnit.module("Search", (hooks) => { // trigger a reload and delay the get_filter promise = makeDeferred(); - await toggleFilterMenu(comp); - await toggleMenuItem(comp, 0); + await toggleFilterMenu(target); + await toggleMenuItem(target, 0); assert.deepEqual(getDomain(), []); @@ -1287,7 +1290,7 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent, getDomain } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", @@ -1295,37 +1298,37 @@ QUnit.module("Search", (hooks) => { domain: [["bar", "=", true]], }); - assert.containsN(comp, ".o_search_panel_filter_value", 2); - assert.containsNone(comp, ".o_search_panel_filter_value input:checked"); - assert.deepEqual(getFiltersContent(comp), ["asustek: 2", "agrolait: 1"]); + assert.containsN(target, ".o_search_panel_filter_value", 2); + assert.containsNone(target, ".o_search_panel_filter_value input:checked"); + assert.deepEqual(getFiltersContent(target), ["asustek: 2", "agrolait: 1"]); assert.deepEqual(getDomain(), [["bar", "=", true]]); // check 'asustek' - await click(getFilter(comp, 0, "input")); + await click(getFilter(target, 0, "input")); - assert.containsOnce(comp, ".o_search_panel_filter_value input:checked"); - assert.deepEqual(getFiltersContent(comp), ["asustek: 2", "agrolait: 1"]); + assert.containsOnce(target, ".o_search_panel_filter_value input:checked"); + assert.deepEqual(getFiltersContent(target), ["asustek: 2", "agrolait: 1"]); assert.deepEqual(getDomain(), ["&", ["bar", "=", true], ["company_id", "in", [3]]]); // check 'agrolait' - await click(getFilter(comp, 1, "input")); + await click(getFilter(target, 1, "input")); - assert.containsN(comp, ".o_search_panel_filter_value input:checked", 2); - assert.deepEqual(getFiltersContent(comp), ["asustek: 2", "agrolait: 1"]); + assert.containsN(target, ".o_search_panel_filter_value input:checked", 2); + assert.deepEqual(getFiltersContent(target), ["asustek: 2", "agrolait: 1"]); assert.deepEqual(getDomain(), ["&", ["bar", "=", true], ["company_id", "in", [3, 5]]]); // uncheck 'asustek' - await click(getFilter(comp, 0, "input")); + await click(getFilter(target, 0, "input")); - assert.containsOnce(comp, ".o_search_panel_filter_value input:checked"); - assert.deepEqual(getFiltersContent(comp), ["asustek: 2", "agrolait: 1"]); + assert.containsOnce(target, ".o_search_panel_filter_value input:checked"); + assert.deepEqual(getFiltersContent(target), ["asustek: 2", "agrolait: 1"]); assert.deepEqual(getDomain(), ["&", ["bar", "=", true], ["company_id", "in", [5]]]); // uncheck 'agrolait' - await click(getFilter(comp, 1, "input")); + await click(getFilter(target, 1, "input")); - assert.containsNone(comp, ".o_search_panel_filter_value input:checked"); - assert.deepEqual(getFiltersContent(comp), ["asustek: 2", "agrolait: 1"]); + assert.containsNone(target, ".o_search_panel_filter_value input:checked"); + assert.deepEqual(getFiltersContent(target), ["asustek: 2", "agrolait: 1"]); assert.deepEqual(getDomain(), [["bar", "=", true]]); }); @@ -1341,7 +1344,7 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent, getDomain } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", @@ -1349,37 +1352,37 @@ QUnit.module("Search", (hooks) => { domain: [["bar", "=", true]], }); - assert.containsN(comp, ".o_search_panel_filter_value", 3); - assert.containsNone(comp, ".o_search_panel_filter_value input:checked"); - assert.deepEqual(getFiltersContent(comp), ["ABC: 1", "DEF: 1", "GHI: 1"]); + assert.containsN(target, ".o_search_panel_filter_value", 3); + assert.containsNone(target, ".o_search_panel_filter_value input:checked"); + assert.deepEqual(getFiltersContent(target), ["ABC: 1", "DEF: 1", "GHI: 1"]); assert.deepEqual(getDomain(), [["bar", "=", true]]); // check 'abc' - await click(getFilter(comp, 0, "input")); + await click(getFilter(target, 0, "input")); - assert.containsOnce(comp, ".o_search_panel_filter_value input:checked"); - assert.deepEqual(getFiltersContent(comp), ["ABC: 1", "DEF: 1", "GHI: 1"]); + assert.containsOnce(target, ".o_search_panel_filter_value input:checked"); + assert.deepEqual(getFiltersContent(target), ["ABC: 1", "DEF: 1", "GHI: 1"]); assert.deepEqual(getDomain(), ["&", ["bar", "=", true], ["state", "in", ["abc"]]]); // check 'def' - await click(getFilter(comp, 1, "input")); + await click(getFilter(target, 1, "input")); - assert.containsN(comp, ".o_search_panel_filter_value input:checked", 2); - assert.deepEqual(getFiltersContent(comp), ["ABC: 1", "DEF: 1", "GHI: 1"]); + assert.containsN(target, ".o_search_panel_filter_value input:checked", 2); + assert.deepEqual(getFiltersContent(target), ["ABC: 1", "DEF: 1", "GHI: 1"]); assert.deepEqual(getDomain(), ["&", ["bar", "=", true], ["state", "in", ["abc", "def"]]]); // uncheck 'abc' - await click(getFilter(comp, 0, "input")); + await click(getFilter(target, 0, "input")); - assert.containsOnce(comp, ".o_search_panel_filter_value input:checked"); - assert.deepEqual(getFiltersContent(comp), ["ABC: 1", "DEF: 1", "GHI: 1"]); + assert.containsOnce(target, ".o_search_panel_filter_value input:checked"); + assert.deepEqual(getFiltersContent(target), ["ABC: 1", "DEF: 1", "GHI: 1"]); assert.deepEqual(getDomain(), ["&", ["bar", "=", true], ["state", "in", ["def"]]]); // uncheck 'def' - await click(getFilter(comp, 1, "input")); + await click(getFilter(target, 1, "input")); - assert.containsNone(comp, ".o_search_panel_filter_value input:checked"); - assert.deepEqual(getFiltersContent(comp), ["ABC: 1", "DEF: 1", "GHI: 1"]); + assert.containsNone(target, ".o_search_panel_filter_value input:checked"); + assert.deepEqual(getFiltersContent(target), ["ABC: 1", "DEF: 1", "GHI: 1"]); assert.deepEqual(getDomain(), [["bar", "=", true]]); }); @@ -1398,7 +1401,7 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, async mockRPC(route, { method }) { if (/search_panel_/.test(method || route)) { @@ -1413,13 +1416,13 @@ QUnit.module("Search", (hooks) => { assert.verifySteps(["search_panel_select_range", "search_panel_select_multi_range"]); // reload with another domain, so the filters should be reloaded - await toggleFilterMenu(comp); - await toggleMenuItem(comp, 0); + await toggleFilterMenu(target); + await toggleMenuItem(target, 0); assert.verifySteps(["search_panel_select_multi_range"]); // change category value, so the filters should be reloaded - await click(getCategory(comp, 1)); + await click(getCategory(target, 1)); assert.verifySteps(["search_panel_select_multi_range"]); } @@ -1440,7 +1443,7 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, async mockRPC(route, { method }) { if (/search_panel_/.test(method || route)) { @@ -1455,13 +1458,13 @@ QUnit.module("Search", (hooks) => { assert.verifySteps(["search_panel_select_range", "search_panel_select_multi_range"]); // reload with another domain, so the filters should be reloaded - await toggleFilterMenu(comp); - await toggleMenuItem(comp, 0); + await toggleFilterMenu(target); + await toggleMenuItem(target, 0); assert.verifySteps(["search_panel_select_multi_range"]); // change category value, so the filters should be reloaded - await click(getCategory(comp, 1)); + await click(getCategory(target, 1)); assert.verifySteps(["search_panel_select_multi_range"]); } @@ -1480,7 +1483,7 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, async mockRPC(route, { args, method }) { if (/search_panel_/.test(method || route)) { @@ -1501,7 +1504,7 @@ QUnit.module("Search", (hooks) => { "search_panel_select_range", "company_id", ]); - assert.deepEqual(getCategoriesContent(comp), [ + assert.deepEqual(getCategoriesContent(target), [ "All", "ABC: 1", "DEF: 1", @@ -1512,11 +1515,11 @@ QUnit.module("Search", (hooks) => { ]); // reload with another domain, so the categories 'state' and 'company_id' should be reloaded - await toggleFilterMenu(comp); - await toggleMenuItem(comp, 0); + await toggleFilterMenu(target); + await toggleMenuItem(target, 0); assert.verifySteps(["search_panel_select_range", "state"]); - assert.deepEqual(getCategoriesContent(comp), [ + assert.deepEqual(getCategoriesContent(target), [ "All", "ABC: 1", "DEF: 1", @@ -1527,10 +1530,10 @@ QUnit.module("Search", (hooks) => { ]); // change category value, so the category 'state' should be reloaded - await click(getCategory(comp, 1)); + await click(getCategory(target, 1)); assert.verifySteps(["search_panel_select_range", "state"]); - assert.deepEqual(getCategoriesContent(comp), [ + assert.deepEqual(getCategoriesContent(target), [ "All", "ABC: 1", "DEF: 1", @@ -1553,7 +1556,7 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, async mockRPC(route, { args, method }) { if (/search_panel_/.test(method || route)) { @@ -1569,20 +1572,20 @@ QUnit.module("Search", (hooks) => { }); assert.verifySteps(["search_panel_select_range", "state"]); - assert.deepEqual(getCategoriesContent(comp), ["All", "ABC", "DEF", "GHI"]); + assert.deepEqual(getCategoriesContent(target), ["All", "ABC", "DEF", "GHI"]); // reload with another domain, so the category 'state' should be reloaded - await toggleFilterMenu(comp); - await toggleMenuItem(comp, 0); + await toggleFilterMenu(target); + await toggleMenuItem(target, 0); assert.verifySteps([]); - assert.deepEqual(getCategoriesContent(comp), ["All", "ABC", "DEF", "GHI"]); + assert.deepEqual(getCategoriesContent(target), ["All", "ABC", "DEF", "GHI"]); // change category value, so the category 'state' should be reloaded - await click(getCategory(comp, 1)); + await click(getCategory(target, 1)); assert.verifySteps([]); - assert.deepEqual(getCategoriesContent(comp), ["All", "ABC", "DEF", "GHI"]); + assert.deepEqual(getCategoriesContent(target), ["All", "ABC", "DEF", "GHI"]); }); QUnit.test("filter with groupby", async (assert) => { @@ -1597,7 +1600,7 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent, getDomain } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", @@ -1605,41 +1608,44 @@ QUnit.module("Search", (hooks) => { domain: [["bar", "=", true]], }); - assert.containsN(comp, ".o_search_panel_filter_group", 2); + assert.containsN(target, ".o_search_panel_filter_group", 2); assert.containsOnce( - comp, + target, ".o_search_panel_filter_group:first .o_search_panel_filter_value" ); assert.containsN( - comp, + target, ".o_search_panel_filter_group:nth(1) .o_search_panel_filter_value", 2 ); - assert.containsNone(comp, ".o_search_panel_filter_value input:checked"); - assert.deepEqual(getFilterGroupContent(comp, 0), ["gold", ["asustek: 2"]]); - assert.deepEqual(getFilterGroupContent(comp, 1), ["silver", ["agrolait: 1", "camptocamp"]]); + assert.containsNone(target, ".o_search_panel_filter_value input:checked"); + assert.deepEqual(getFilterGroupContent(target, 0), ["gold", ["asustek: 2"]]); + assert.deepEqual(getFilterGroupContent(target, 1), [ + "silver", + ["agrolait: 1", "camptocamp"], + ]); assert.deepEqual(getDomain(), [["bar", "=", true]]); // check 'asustek' - await click(getFilter(comp, 0, "input")); + await click(getFilter(target, 0, "input")); - const firstGroupCheckbox = getFilterGroup(comp, 0, "header > div > input"); + const firstGroupCheckbox = getFilterGroup(target, 0, "header > div > input"); - assert.containsOnce(comp, ".o_search_panel_filter_value input:checked"); + assert.containsOnce(target, ".o_search_panel_filter_value input:checked"); assert.strictEqual( firstGroupCheckbox.checked, true, "first group checkbox should be checked" ); - assert.deepEqual(getFiltersContent(comp), ["asustek: 2", "agrolait", "camptocamp"]); + assert.deepEqual(getFiltersContent(target), ["asustek: 2", "agrolait", "camptocamp"]); assert.deepEqual(getDomain(), ["&", ["bar", "=", true], ["company_id", "in", [3]]]); // check 'agrolait' - await click(getFilter(comp, 1, "input")); + await click(getFilter(target, 1, "input")); - assert.containsN(comp, ".o_search_panel_filter_value input:checked", 2); + assert.containsN(target, ".o_search_panel_filter_value input:checked", 2); - const secondGroupCheckbox = getFilterGroup(comp, 1, "header > div > input"); + const secondGroupCheckbox = getFilterGroup(target, 1, "header > div > input"); assert.strictEqual( secondGroupCheckbox.checked, @@ -1651,7 +1657,7 @@ QUnit.module("Search", (hooks) => { true, "second group checkbox should be indeterminate" ); - assert.deepEqual(getFiltersContent(comp), ["asustek", "agrolait", "camptocamp"]); + assert.deepEqual(getFiltersContent(target), ["asustek", "agrolait", "camptocamp"]); assert.deepEqual(getDomain(), [ "&", ["bar", "=", true], @@ -1661,9 +1667,9 @@ QUnit.module("Search", (hooks) => { ]); // check 'camptocamp' - await click(getFilter(comp, 2, "input")); + await click(getFilter(target, 2, "input")); - assert.containsN(comp, ".o_search_panel_filter_value input:checked", 3); + assert.containsN(target, ".o_search_panel_filter_value input:checked", 3); assert.strictEqual( secondGroupCheckbox.checked, true, @@ -1674,7 +1680,7 @@ QUnit.module("Search", (hooks) => { false, "second group checkbox should not be indeterminate" ); - assert.deepEqual(getFiltersContent(comp), ["asustek", "agrolait", "camptocamp"]); + assert.deepEqual(getFiltersContent(target), ["asustek", "agrolait", "camptocamp"]); assert.deepEqual(getDomain(), [ "&", ["bar", "=", true], @@ -1684,9 +1690,9 @@ QUnit.module("Search", (hooks) => { ]); // uncheck second group - await click(getFilterGroup(comp, 1, "header > div > input")); + await click(getFilterGroup(target, 1, "header > div > input")); - assert.containsOnce(comp, ".o_search_panel_filter_value input:checked"); + assert.containsOnce(target, ".o_search_panel_filter_value input:checked"); assert.strictEqual( secondGroupCheckbox.checked, false, @@ -1697,7 +1703,7 @@ QUnit.module("Search", (hooks) => { false, "second group checkbox should not be indeterminate" ); - assert.deepEqual(getFiltersContent(comp), ["asustek: 2", "agrolait", "camptocamp"]); + assert.deepEqual(getFiltersContent(target), ["asustek: 2", "agrolait", "camptocamp"]); assert.deepEqual(getDomain(), ["&", ["bar", "=", true], ["company_id", "in", [3]]]); }); @@ -1713,7 +1719,7 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, async mockRPC(route, { kwargs, method }) { if (method === "search_panel_select_multi_range") { @@ -1737,8 +1743,8 @@ QUnit.module("Search", (hooks) => { searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_filter_value", 2); - assert.deepEqual(getFiltersContent(comp), ["asustek: 2", "agrolait: 2"]); + assert.containsN(target, ".o_search_panel_filter_value", 2); + assert.deepEqual(getFiltersContent(target), ["asustek: 2", "agrolait: 2"]); }); QUnit.test("filter with domain depending on category", async (assert) => { @@ -1753,7 +1759,7 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, async mockRPC(route, { kwargs, method }) { if (method === "search_panel_select_multi_range") { @@ -1779,25 +1785,25 @@ QUnit.module("Search", (hooks) => { }); // select 'gold' category - await click(getCategory(comp, 1)); + await click(getCategory(target, 1)); - assert.containsOnce(comp, ".o_search_panel_category_value .active"); - assert.containsOnce(comp, ".o_search_panel_category_value:nth(1) .active"); - assert.containsOnce(comp, ".o_search_panel_filter_value"); - assert.deepEqual(getFiltersContent(comp), ["asustek: 1"]); + assert.containsOnce(target, ".o_search_panel_category_value .active"); + assert.containsOnce(target, ".o_search_panel_category_value:nth(1) .active"); + assert.containsOnce(target, ".o_search_panel_filter_value"); + assert.deepEqual(getFiltersContent(target), ["asustek: 1"]); // select 'silver' category - await click(getCategory(comp, 2)); + await click(getCategory(target, 2)); - assert.containsOnce(comp, ".o_search_panel_category_value:nth(2) .active"); - assert.containsOnce(comp, ".o_search_panel_filter_value"); - assert.deepEqual(getFiltersContent(comp), ["agrolait: 2"]); + assert.containsOnce(target, ".o_search_panel_category_value:nth(2) .active"); + assert.containsOnce(target, ".o_search_panel_filter_value"); + assert.deepEqual(getFiltersContent(target), ["agrolait: 2"]); // select All - await click(getCategory(comp, 0)); + await click(getCategory(target, 0)); - assert.containsOnce(comp, ".o_search_panel_category_value:first .active"); - assert.containsNone(comp, ".o_search_panel_filter_value"); + assert.containsOnce(target, ".o_search_panel_category_value:first .active"); + assert.containsNone(target, ".o_search_panel_filter_value"); assert.verifySteps([ "[]", // category_domain (All) @@ -1823,7 +1829,7 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent, getDomain } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", @@ -1834,7 +1840,7 @@ QUnit.module("Search", (hooks) => { }, }); - assert.containsN(comp, ".o_search_panel_filter_value input:checked", 3); + assert.containsN(target, ".o_search_panel_filter_value input:checked", 3); assert.deepEqual(getDomain(), [ "&", ["company_id", "in", [5]], @@ -1842,9 +1848,9 @@ QUnit.module("Search", (hooks) => { ]); // manually untick a default value - await click(getFilter(comp, 1, "input")); + await click(getFilter(target, 1, "input")); - assert.containsN(comp, ".o_search_panel_filter_value input:checked", 2); + assert.containsN(target, ".o_search_panel_filter_value input:checked", 2); assert.deepEqual(getDomain(), [["state", "in", ["abc", "ghi"]]]); }); @@ -1884,7 +1890,7 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent, getDomain } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", @@ -1894,7 +1900,7 @@ QUnit.module("Search", (hooks) => { }, }); - const secondGroupCheckbox = getFilterGroup(comp, 1, "header > div > input"); + const secondGroupCheckbox = getFilterGroup(target, 1, "header > div > input"); assert.strictEqual(secondGroupCheckbox.indeterminate, true); assert.deepEqual(getDomain(), [["company_id", "in", [5]]]); @@ -1916,7 +1922,7 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", @@ -1926,17 +1932,17 @@ QUnit.module("Search", (hooks) => { }, }); - assert.containsOnce(comp, ".o_search_panel_section"); + assert.containsOnce(target, ".o_search_panel_section"); // There should be a group 'false' displayed with only value B inside it. - assert.containsOnce(comp, ".o_search_panel_filter_group"); - assert.deepEqual(getFilterGroupContent(comp), ["false", ["B"]]); - assert.containsOnce(getFilterGroup(comp), ".o_search_panel_filter_value"); + assert.containsOnce(target, ".o_search_panel_filter_group"); + assert.deepEqual(getFilterGroupContent(target), ["false", ["B"]]); + assert.containsOnce(getFilterGroup(target), ".o_search_panel_filter_value"); // Globally, there should be two values, one displayed in the group 'false', and one at the end of the section // (the group false is not displayed and its values are displayed at the first level) - assert.containsN(comp, ".o_search_panel_filter_value", 2); - assert.deepEqual(getFiltersContent(comp), ["B", "A"]); + assert.containsN(target, ".o_search_panel_filter_value", 2); + assert.deepEqual(getFiltersContent(target), ["B", "A"]); }); QUnit.test("tests conservation of category record order", async (assert) => { @@ -1955,14 +1961,14 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.deepEqual(getCategoriesContent(comp), [ + assert.deepEqual(getCategoriesContent(target), [ "All", "lowID", "asustek: 2", @@ -2311,7 +2317,7 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, async mockRPC(route, { method }) { if (/search_panel_/.test(method || route)) { @@ -2325,13 +2331,13 @@ QUnit.module("Search", (hooks) => { assert.verifySteps(["search_panel_select_range", "search_panel_select_multi_range"]); - assert.deepEqual(getCategoriesContent(comp, getCounters), [1, 3]); - assert.deepEqual(getFiltersContent(comp, getCounters), [1, 1, 2]); + assert.deepEqual(getCategoriesContent(target, getCounters), [1, 3]); + assert.deepEqual(getFiltersContent(target, getCounters), [1, 1, 2]); - await click(getFilter(comp, 0, "input")); + await click(getFilter(target, 0, "input")); - assert.deepEqual(getCategoriesContent(comp, getCounters), [1]); - assert.deepEqual(getFiltersContent(comp, getCounters), [1, 1, 2]); + assert.deepEqual(getCategoriesContent(target, getCounters), [1]); + assert.deepEqual(getFiltersContent(target, getCounters), [1, 1, 2]); assert.verifySteps(["search_panel_select_range", "search_panel_select_multi_range"]); } @@ -2353,21 +2359,21 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_field .o_search_panel_category_value", 3); - assert.containsOnce(comp, ".o_toggle_fold > i"); - assert.deepEqual(getCategoriesContent(comp, getCounters), [2, 1]); + assert.containsN(target, ".o_search_panel_field .o_search_panel_category_value", 3); + assert.containsOnce(target, ".o_toggle_fold > i"); + assert.deepEqual(getCategoriesContent(target, getCounters), [2, 1]); - await click(getCategory(comp, "agrolait")); + await click(getCategory(target, "agrolait")); - assert.containsN(comp, ".o_search_panel_field .o_search_panel_category_value", 5); - assert.deepEqual(getCategoriesContent(comp, getCounters), [2, 1, 1]); + assert.containsN(target, ".o_search_panel_field .o_search_panel_category_value", 5); + assert.deepEqual(getCategoriesContent(target, getCounters), [2, 1, 1]); }); QUnit.test("many2one: select one, no expand, hierarchize, counters", async (assert) => { @@ -2386,21 +2392,21 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_field .o_search_panel_category_value", 3); - assert.containsOnce(comp, ".o_toggle_fold > i"); - assert.deepEqual(getCategoriesContent(comp, getCounters), [2, 1]); + assert.containsN(target, ".o_search_panel_field .o_search_panel_category_value", 3); + assert.containsOnce(target, ".o_toggle_fold > i"); + assert.deepEqual(getCategoriesContent(target, getCounters), [2, 1]); - await click(getCategory(comp, "agrolait")); + await click(getCategory(target, "agrolait")); - assert.containsN(comp, ".o_search_panel_field .o_search_panel_category_value", 4); - assert.deepEqual(getCategoriesContent(comp, getCounters), [2, 1, 1]); + assert.containsN(target, ".o_search_panel_field .o_search_panel_category_value", 4); + assert.deepEqual(getCategoriesContent(target, getCounters), [2, 1, 1]); }); QUnit.test("many2one: select one, expand, no hierarchize, counters", async (assert) => { @@ -2419,16 +2425,16 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_field .o_search_panel_category_value", 5); - assert.containsNone(comp, ".o_toggle_fold > i"); - assert.deepEqual(getCategoriesContent(comp, getCounters), [2, 1, 1]); + assert.containsN(target, ".o_search_panel_field .o_search_panel_category_value", 5); + assert.containsNone(target, ".o_toggle_fold > i"); + assert.deepEqual(getCategoriesContent(target, getCounters), [2, 1, 1]); }); QUnit.test("many2one: select one, no expand, no hierarchize, counters", async (assert) => { @@ -2447,16 +2453,16 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_field .o_search_panel_category_value", 4); - assert.containsNone(comp, ".o_toggle_fold > i"); - assert.deepEqual(getCategoriesContent(comp, getCounters), [2, 1, 1]); + assert.containsN(target, ".o_search_panel_field .o_search_panel_category_value", 4); + assert.containsNone(target, ".o_toggle_fold > i"); + assert.deepEqual(getCategoriesContent(target, getCounters), [2, 1, 1]); }); QUnit.test("many2one: select one, expand, hierarchize, no counters", async (assert) => { @@ -2475,21 +2481,21 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_field .o_search_panel_category_value", 3); - assert.containsOnce(comp, ".o_toggle_fold > i"); - assert.deepEqual(getCategoriesContent(comp, getCounters), []); + assert.containsN(target, ".o_search_panel_field .o_search_panel_category_value", 3); + assert.containsOnce(target, ".o_toggle_fold > i"); + assert.deepEqual(getCategoriesContent(target, getCounters), []); - await click(getCategory(comp, "agrolait")); + await click(getCategory(target, "agrolait")); - assert.containsN(comp, ".o_search_panel_field .o_search_panel_category_value", 5); - assert.deepEqual(getCategoriesContent(comp, getCounters), []); + assert.containsN(target, ".o_search_panel_field .o_search_panel_category_value", 5); + assert.deepEqual(getCategoriesContent(target, getCounters), []); }); QUnit.test("many2one: select one, no expand, hierarchize, no counters", async (assert) => { @@ -2508,21 +2514,21 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_field .o_search_panel_category_value", 3); - assert.containsOnce(comp, ".o_toggle_fold > i"); - assert.deepEqual(getCategoriesContent(comp, getCounters), []); + assert.containsN(target, ".o_search_panel_field .o_search_panel_category_value", 3); + assert.containsOnce(target, ".o_toggle_fold > i"); + assert.deepEqual(getCategoriesContent(target, getCounters), []); - await click(getCategory(comp, "agrolait")); + await click(getCategory(target, "agrolait")); - assert.containsN(comp, ".o_search_panel_field .o_search_panel_category_value", 4); - assert.deepEqual(getCategoriesContent(comp, getCounters), []); + assert.containsN(target, ".o_search_panel_field .o_search_panel_category_value", 4); + assert.deepEqual(getCategoriesContent(target, getCounters), []); }); QUnit.test("many2one: select one, expand, no hierarchize, no counters", async (assert) => { @@ -2541,16 +2547,16 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_field .o_search_panel_category_value", 5); - assert.containsNone(comp, ".o_toggle_fold > i"); - assert.deepEqual(getCategoriesContent(comp, getCounters), []); + assert.containsN(target, ".o_search_panel_field .o_search_panel_category_value", 5); + assert.containsNone(target, ".o_toggle_fold > i"); + assert.deepEqual(getCategoriesContent(target, getCounters), []); }); QUnit.test("many2one: select one, no expand, no hierarchize, no counters", async (assert) => { @@ -2569,16 +2575,16 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_field .o_search_panel_category_value", 4); - assert.containsNone(comp, ".o_toggle_fold > i"); - assert.deepEqual(getCategoriesContent(comp, getCounters), []); + assert.containsN(target, ".o_search_panel_field .o_search_panel_category_value", 4); + assert.containsNone(target, ".o_toggle_fold > i"); + assert.deepEqual(getCategoriesContent(target, getCounters), []); }); QUnit.test("many2one: select multi, expand, groupby, counters", async (assert) => { @@ -2593,16 +2599,16 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_label", 5); - assert.containsNone(comp, ".o_toggle_fold > i"); - assert.deepEqual(getFiltersContent(comp, getCounters), [2, 2]); + assert.containsN(target, ".o_search_panel_label", 5); + assert.containsNone(target, ".o_toggle_fold > i"); + assert.deepEqual(getFiltersContent(target, getCounters), [2, 2]); }); QUnit.test("many2one: select multi, no expand, groupby, counters", async (assert) => { @@ -2617,16 +2623,16 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_label", 4); - assert.containsNone(comp, ".o_toggle_fold > i"); - assert.deepEqual(getFiltersContent(comp, getCounters), [2, 2]); + assert.containsN(target, ".o_search_panel_label", 4); + assert.containsNone(target, ".o_toggle_fold > i"); + assert.deepEqual(getFiltersContent(target, getCounters), [2, 2]); }); QUnit.test("many2one: select multi, expand, no groupby, counters", async (assert) => { @@ -2641,16 +2647,16 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_label", 3); - assert.containsNone(comp, ".o_toggle_fold > i"); - assert.deepEqual(getFiltersContent(comp, getCounters), [2, 2]); + assert.containsN(target, ".o_search_panel_label", 3); + assert.containsNone(target, ".o_toggle_fold > i"); + assert.deepEqual(getFiltersContent(target, getCounters), [2, 2]); }); QUnit.test("many2one: select multi, no expand, no groupby, counters", async (assert) => { @@ -2665,16 +2671,16 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_label", 2); - assert.containsNone(comp, ".o_toggle_fold > i"); - assert.deepEqual(getFiltersContent(comp, getCounters), [2, 2]); + assert.containsN(target, ".o_search_panel_label", 2); + assert.containsNone(target, ".o_toggle_fold > i"); + assert.deepEqual(getFiltersContent(target, getCounters), [2, 2]); }); QUnit.test("many2one: select multi, expand, groupby, no counters", async (assert) => { @@ -2689,16 +2695,16 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_label", 5); - assert.containsNone(comp, ".o_toggle_fold > i"); - assert.deepEqual(getFiltersContent(comp, getCounters), []); + assert.containsN(target, ".o_search_panel_label", 5); + assert.containsNone(target, ".o_toggle_fold > i"); + assert.deepEqual(getFiltersContent(target, getCounters), []); }); QUnit.test("many2one: select multi, no expand, groupby, no counters", async (assert) => { @@ -2713,16 +2719,16 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_label", 4); - assert.containsNone(comp, ".o_toggle_fold > i"); - assert.deepEqual(getFiltersContent(comp, getCounters), []); + assert.containsN(target, ".o_search_panel_label", 4); + assert.containsNone(target, ".o_toggle_fold > i"); + assert.deepEqual(getFiltersContent(target, getCounters), []); }); QUnit.test("many2one: select multi, expand, no groupby, no counters", async (assert) => { @@ -2737,16 +2743,16 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_label", 3); - assert.containsNone(comp, ".o_toggle_fold > i"); - assert.deepEqual(getFiltersContent(comp, getCounters), []); + assert.containsN(target, ".o_search_panel_label", 3); + assert.containsNone(target, ".o_toggle_fold > i"); + assert.deepEqual(getFiltersContent(target, getCounters), []); }); QUnit.test("many2one: select multi, no expand, no groupby, no counters", async (assert) => { @@ -2761,16 +2767,16 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_label", 2); - assert.containsNone(comp, ".o_toggle_fold > i"); - assert.deepEqual(getFiltersContent(comp, getCounters), []); + assert.containsN(target, ".o_search_panel_label", 2); + assert.containsNone(target, ".o_toggle_fold > i"); + assert.deepEqual(getFiltersContent(target, getCounters), []); }); QUnit.test("many2many: select multi, expand, groupby, counters", async (assert) => { @@ -2785,16 +2791,16 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_label", 5); - assert.containsNone(comp, ".o_toggle_fold > i"); - assert.deepEqual(getFiltersContent(comp, getCounters), [2, 1]); + assert.containsN(target, ".o_search_panel_label", 5); + assert.containsNone(target, ".o_toggle_fold > i"); + assert.deepEqual(getFiltersContent(target, getCounters), [2, 1]); }); QUnit.test("many2many: select multi, no expand, groupby, counters", async (assert) => { @@ -2809,16 +2815,16 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_label", 4); - assert.containsNone(comp, ".o_toggle_fold > i"); - assert.deepEqual(getFiltersContent(comp, getCounters), [2, 1]); + assert.containsN(target, ".o_search_panel_label", 4); + assert.containsNone(target, ".o_toggle_fold > i"); + assert.deepEqual(getFiltersContent(target, getCounters), [2, 1]); }); QUnit.test("many2many: select multi, expand, no groupby, counters", async (assert) => { @@ -2833,16 +2839,16 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_label", 3); - assert.containsNone(comp, ".o_toggle_fold > i"); - assert.deepEqual(getFiltersContent(comp, getCounters), [2, 1]); + assert.containsN(target, ".o_search_panel_label", 3); + assert.containsNone(target, ".o_toggle_fold > i"); + assert.deepEqual(getFiltersContent(target, getCounters), [2, 1]); }); QUnit.test("many2many: select multi, no expand, no groupby, counters", async (assert) => { @@ -2857,16 +2863,16 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_label", 2); - assert.containsNone(comp, ".o_toggle_fold > i"); - assert.deepEqual(getFiltersContent(comp, getCounters), [2, 1]); + assert.containsN(target, ".o_search_panel_label", 2); + assert.containsNone(target, ".o_toggle_fold > i"); + assert.deepEqual(getFiltersContent(target, getCounters), [2, 1]); }); QUnit.test("many2many: select multi, expand, groupby, no counters", async (assert) => { @@ -2881,16 +2887,16 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_label", 5); - assert.containsNone(comp, ".o_toggle_fold > i"); - assert.deepEqual(getFiltersContent(comp, getCounters), []); + assert.containsN(target, ".o_search_panel_label", 5); + assert.containsNone(target, ".o_toggle_fold > i"); + assert.deepEqual(getFiltersContent(target, getCounters), []); }); QUnit.test("many2many: select multi, no expand, groupby, no counters", async (assert) => { @@ -2905,16 +2911,16 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_label", 4); - assert.containsNone(comp, ".o_toggle_fold > i"); - assert.deepEqual(getFiltersContent(comp, getCounters), []); + assert.containsN(target, ".o_search_panel_label", 4); + assert.containsNone(target, ".o_toggle_fold > i"); + assert.deepEqual(getFiltersContent(target, getCounters), []); }); QUnit.test("many2many: select multi, expand, no groupby, no counters", async (assert) => { @@ -2929,16 +2935,16 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_label", 3); - assert.containsNone(comp, ".o_toggle_fold > i"); - assert.deepEqual(getFiltersContent(comp, getCounters), []); + assert.containsN(target, ".o_search_panel_label", 3); + assert.containsNone(target, ".o_toggle_fold > i"); + assert.deepEqual(getFiltersContent(target, getCounters), []); }); QUnit.test("many2many: select multi, no expand, no groupby, no counters", async (assert) => { @@ -2953,16 +2959,16 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_label", 2); - assert.containsNone(comp, ".o_toggle_fold > i"); - assert.deepEqual(getFiltersContent(comp, getCounters), []); + assert.containsN(target, ".o_search_panel_label", 2); + assert.containsNone(target, ".o_toggle_fold > i"); + assert.deepEqual(getFiltersContent(target, getCounters), []); }); QUnit.test("selection: select one, expand, counters", async (assert) => { @@ -2977,16 +2983,16 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_field .o_search_panel_category_value", 4); - assert.containsNone(comp, ".o_toggle_fold > i"); - assert.deepEqual(getCategoriesContent(comp, getCounters), [1, 2]); + assert.containsN(target, ".o_search_panel_field .o_search_panel_category_value", 4); + assert.containsNone(target, ".o_toggle_fold > i"); + assert.deepEqual(getCategoriesContent(target, getCounters), [1, 2]); }); QUnit.test("selection: select one, no expand, counters", async (assert) => { @@ -3001,16 +3007,16 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_field .o_search_panel_category_value", 3); - assert.containsNone(comp, ".o_toggle_fold > i"); - assert.deepEqual(getCategoriesContent(comp, getCounters), [1, 2]); + assert.containsN(target, ".o_search_panel_field .o_search_panel_category_value", 3); + assert.containsNone(target, ".o_toggle_fold > i"); + assert.deepEqual(getCategoriesContent(target, getCounters), [1, 2]); }); QUnit.test("selection: select one, expand, no counters", async (assert) => { @@ -3025,16 +3031,16 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_field .o_search_panel_category_value", 4); - assert.containsNone(comp, ".o_toggle_fold > i"); - assert.deepEqual(getCategoriesContent(comp, getCounters), []); + assert.containsN(target, ".o_search_panel_field .o_search_panel_category_value", 4); + assert.containsNone(target, ".o_toggle_fold > i"); + assert.deepEqual(getCategoriesContent(target, getCounters), []); }); QUnit.test("selection: select one, no expand, no counters", async (assert) => { @@ -3049,16 +3055,16 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_field .o_search_panel_category_value", 3); - assert.containsNone(comp, ".o_toggle_fold > i"); - assert.deepEqual(getCategoriesContent(comp, getCounters), []); + assert.containsN(target, ".o_search_panel_field .o_search_panel_category_value", 3); + assert.containsNone(target, ".o_toggle_fold > i"); + assert.deepEqual(getCategoriesContent(target, getCounters), []); }); QUnit.test("selection: select multi, expand, counters", async (assert) => { @@ -3073,16 +3079,16 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_label", 3); - assert.containsNone(comp, ".o_toggle_fold > i"); - assert.deepEqual(getFiltersContent(comp, getCounters), [1, 2]); + assert.containsN(target, ".o_search_panel_label", 3); + assert.containsNone(target, ".o_toggle_fold > i"); + assert.deepEqual(getFiltersContent(target, getCounters), [1, 2]); }); QUnit.test("selection: select multi, no expand, counters", async (assert) => { @@ -3097,16 +3103,16 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_label", 2); - assert.containsNone(comp, ".o_toggle_fold > i"); - assert.deepEqual(getFiltersContent(comp, getCounters), [1, 2]); + assert.containsN(target, ".o_search_panel_label", 2); + assert.containsNone(target, ".o_toggle_fold > i"); + assert.deepEqual(getFiltersContent(target, getCounters), [1, 2]); }); QUnit.test("selection: select multi, expand, no counters", async (assert) => { @@ -3121,16 +3127,16 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_label", 3); - assert.containsNone(comp, ".o_toggle_fold > i"); - assert.deepEqual(getFiltersContent(comp, getCounters), []); + assert.containsN(target, ".o_search_panel_label", 3); + assert.containsNone(target, ".o_toggle_fold > i"); + assert.deepEqual(getFiltersContent(target, getCounters), []); }); QUnit.test("selection: select multi, no expand, no counters", async (assert) => { @@ -3145,16 +3151,16 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_label", 2); - assert.containsNone(comp, ".o_toggle_fold > i"); - assert.deepEqual(getFiltersContent(comp, getCounters), []); + assert.containsN(target, ".o_search_panel_label", 2); + assert.containsNone(target, ".o_toggle_fold > i"); + assert.deepEqual(getFiltersContent(target, getCounters), []); }); //------------------------------------------------------------------------- @@ -3174,21 +3180,21 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsN(comp, ".o_search_panel_label", 5); - assert.containsNone(comp, ".o_toggle_fold > i"); - assert.deepEqual(getFiltersContent(comp, getCounters), [1, 2]); + assert.containsN(target, ".o_search_panel_label", 5); + assert.containsNone(target, ".o_toggle_fold > i"); + assert.deepEqual(getFiltersContent(target, getCounters), [1, 2]); - await click(getCategory(comp, "asustek")); + await click(getCategory(target, "asustek")); - assert.containsN(comp, ".o_search_panel_label", 5); - assert.deepEqual(getFiltersContent(comp, getCounters), [1]); + assert.containsN(target, ".o_search_panel_label", 5); + assert.deepEqual(getFiltersContent(target, getCounters), [1]); }); //------------------------------------------------------------------------- @@ -3205,25 +3211,25 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsOnce(comp, ".o_search_panel_section"); - assert.containsOnce(comp, ".o_search_panel_section_header"); + assert.containsOnce(target, ".o_search_panel_section"); + assert.containsOnce(target, ".o_search_panel_section_header"); assert.strictEqual( - comp.el.querySelector(".o_search_panel_section_header").innerText, + target.querySelector(".o_search_panel_section_header").innerText, "COMPANY" ); - assert.containsOnce(comp, "section div.alert.alert-warning"); + assert.containsOnce(target, "section div.alert.alert-warning"); assert.strictEqual( - comp.el.querySelector("section div.alert.alert-warning").innerText, + target.querySelector("section div.alert.alert-warning").innerText, "Too many items to display." ); - assert.containsNone(comp, ".o_search_panel_category_value"); + assert.containsNone(target, ".o_search_panel_category_value"); }); QUnit.test("reached limit for a filter", async (assert) => { @@ -3236,25 +3242,25 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.containsOnce(comp, ".o_search_panel_section"); - assert.containsOnce(comp, ".o_search_panel_section_header"); + assert.containsOnce(target, ".o_search_panel_section"); + assert.containsOnce(target, ".o_search_panel_section_header"); assert.strictEqual( - comp.el.querySelector(".o_search_panel_section_header").innerText, + target.querySelector(".o_search_panel_section_header").innerText, "COMPANY" ); - assert.containsOnce(comp, "section div.alert.alert-warning"); + assert.containsOnce(target, "section div.alert.alert-warning"); assert.strictEqual( - comp.el.querySelector("section div.alert.alert-warning").innerText, + target.querySelector("section div.alert.alert-warning").innerText, "Too many items to display." ); - assert.containsNone(comp, ".o_search_panel_filter_value"); + assert.containsNone(target, ".o_search_panel_filter_value"); }); QUnit.test( @@ -3270,7 +3276,7 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, async mockRPC(route, { method }) { if (/search_panel_/.test(method || route)) { @@ -3285,17 +3291,17 @@ QUnit.module("Search", (hooks) => { assert.verifySteps(["search_panel_select_range"]); // select 'ABC' in search panel - await click(getCategory(comp, 1)); + await click(getCategory(target, 1)); assert.verifySteps(["search_panel_select_range"]); // select DEF in filter menu - await toggleFilterMenu(comp); - await toggleMenuItem(comp, "DEF"); + await toggleFilterMenu(target); + await toggleMenuItem(target, "DEF"); assert.verifySteps(["search_panel_select_range"]); - const firstCategoryValue = getCategory(comp, 0); + const firstCategoryValue = getCategory(target, 0); assert.strictEqual(firstCategoryValue.innerText, "All"); assert.hasClass( firstCategoryValue, @@ -3319,7 +3325,7 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, async mockRPC(route, { method }) { if (/search_panel_/.test(method || route)) { @@ -3332,20 +3338,20 @@ QUnit.module("Search", (hooks) => { }); assert.verifySteps(["search_panel_select_range"]); - assert.deepEqual(getCategoriesContent(comp), ["All", "ABC", "DEF", "GHI"]); + assert.deepEqual(getCategoriesContent(target), ["All", "ABC", "DEF", "GHI"]); // select 'ABC' in search panel --> no need to update the category value - await click(getCategory(comp, 1)); + await click(getCategory(target, 1)); assert.verifySteps([]); - assert.deepEqual(getCategoriesContent(comp), ["All", "ABC", "DEF", "GHI"]); + assert.deepEqual(getCategoriesContent(target), ["All", "ABC", "DEF", "GHI"]); // select DEF in filter menu --> the external domain changes --> the values should be updated - await toggleFilterMenu(comp); - await toggleMenuItem(comp, "DEF"); + await toggleFilterMenu(target); + await toggleMenuItem(target, "DEF"); assert.verifySteps(["search_panel_select_range"]); - assert.deepEqual(getCategoriesContent(comp), ["All", "DEF"]); + assert.deepEqual(getCategoriesContent(target), ["All", "DEF"]); } ); @@ -3361,13 +3367,13 @@ QUnit.module("Search", (hooks) => { `; const { TestComponent } = makeTestComponent(); - const comp = await makeWithSearch({ + await makeWithSearch({ serverData, Component: TestComponent, resModel: "partner", searchViewId: false, }); - assert.deepEqual(getCategoriesContent(comp), ["All", "gold", "silver"]); + assert.deepEqual(getCategoriesContent(target), ["All", "gold", "silver"]); }); }); diff --git a/addons/web/static/tests/search/with_search_tests.js b/addons/web/static/tests/search/with_search_tests.js index 94467e154ec..2224c9314ce 100644 --- a/addons/web/static/tests/search/with_search_tests.js +++ b/addons/web/static/tests/search/with_search_tests.js @@ -22,6 +22,7 @@ const { Component, onWillUpdateProps, onWillStart, useState, xml } = owl; const serviceRegistry = registry.category("services"); +let target; let serverData; QUnit.module("Search", (hooks) => { @@ -57,6 +58,7 @@ QUnit.module("Search", (hooks) => { serviceRegistry.add("hotkey", hotkeyService); serviceRegistry.add("orm", ormService); serviceRegistry.add("view", viewService); + target = getFixture(); }); QUnit.module("WithSearch"); @@ -67,13 +69,16 @@ QUnit.module("Search", (hooks) => { class TestComponent extends Component {} TestComponent.template = xml`
Test component content
`; - const component = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "animal", Component: TestComponent, }); - assert.hasClass(component.el, "o_test_component"); - assert.strictEqual(component.el.innerText, "Test component content"); + assert.containsOnce(target, ".o_test_component"); + assert.strictEqual( + target.querySelector(".o_test_component").innerText, + "Test component content" + ); }); QUnit.test("search model in sub env", async function (assert) { @@ -245,7 +250,7 @@ QUnit.module("Search", (hooks) => {
`; - const component = await makeWithSearch({ + await makeWithSearch({ serverData, mockRPC: function (_, args) { if (args.method === "load_views") { @@ -256,11 +261,11 @@ QUnit.module("Search", (hooks) => { Component: TestComponent, searchViewId: 1, }); - await toggleFilterMenu(component); - await assert.ok(getMenuItemTexts(component), ["True Domain"]); + await toggleFilterMenu(target); + await assert.ok(getMenuItemTexts(target), ["True Domain"]); - await toggleGroupByMenu(component); - await assert.ok(getMenuItemTexts(component), ["Name"]); + await toggleGroupByMenu(target); + await assert.ok(getMenuItemTexts(target), ["Name"]); } ); @@ -286,14 +291,14 @@ QUnit.module("Search", (hooks) => {
`; - const component = await makeWithSearch({ + await makeWithSearch({ serverData, resModel: "animal", Component: TestComponent, searchViewId: 1, }); - await toggleFilterMenu(component); - await toggleMenuItem(component, "True domain"); + await toggleFilterMenu(target); + await toggleMenuItem(target, "True domain"); } ); diff --git a/addons/web/static/tests/views/layout_tests.js b/addons/web/static/tests/views/layout_tests.js index b08b848ceda..144cabc548e 100644 --- a/addons/web/static/tests/views/layout_tests.js +++ b/addons/web/static/tests/views/layout_tests.js @@ -12,6 +12,7 @@ const { Component, xml, useChildSubEnv } = owl; const serviceRegistry = registry.category("services"); +let target; let serverData; QUnit.module("Views", (hooks) => { @@ -43,6 +44,8 @@ QUnit.module("Views", (hooks) => { setupControlPanelServiceRegistry(); serviceRegistry.add("dialog", dialogService); + + target = getFixture(); }); QUnit.module("Layout"); @@ -58,13 +61,13 @@ QUnit.module("Views", (hooks) => { ToyComponent.components = { Layout }; const env = await makeTestEnv({ config: {} }); - const comp = await mount(ToyComponent, getFixture(), { env }); + await mount(ToyComponent, getFixture(), { env }); - assert.hasClass(comp.el, "o_toy_view o_view_sample_data"); - assert.containsNone(comp, ".o_control_panel"); - assert.containsNone(comp, ".o_component_with_search_panel"); - assert.containsNone(comp, ".o_search_panel"); - assert.containsOnce(comp, ".o_content > .toy_content"); + assert.containsOnce(target, ".o_toy_view.o_view_sample_data"); + assert.containsNone(target, ".o_control_panel"); + assert.containsNone(target, ".o_component_with_search_panel"); + assert.containsNone(target, ".o_search_panel"); + assert.containsOnce(target, ".o_content > .toy_content"); }); QUnit.test("Simple rendering: with search", async (assert) => { @@ -80,19 +83,19 @@ QUnit.module("Views", (hooks) => { `; ToyComponent.components = { Layout }; - const root = await makeWithSearch({ + await makeWithSearch({ serverData, Component: ToyComponent, resModel: "foo", searchViewId: false, }); - assert.hasClass(root.el, "o_toy_view"); - assert.doesNotHaveClass(root.el, "o_view_sample_data"); - assert.containsOnce(root, ".o_control_panel .o_cp_top_right .toy_search_bar"); - assert.containsOnce(root, ".o_component_with_search_panel .o_search_panel"); - assert.containsNone(root, ".o_cp_searchview"); - assert.containsOnce(root, ".o_content > .toy_content"); + assert.containsOnce(target, ".o_toy_view"); + assert.containsNone(target, ".o_view_sample_data"); + assert.containsOnce(target, ".o_control_panel .o_cp_top_right .toy_search_bar"); + assert.containsOnce(target, ".o_component_with_search_panel .o_search_panel"); + assert.containsNone(target, ".o_cp_searchview"); + assert.containsOnce(target, ".o_content > .toy_content"); }); QUnit.test("Nested layouts", async (assert) => { @@ -154,23 +157,23 @@ QUnit.module("Views", (hooks) => { `; ToyA.components = { Layout, ToyB }; - const root = await makeWithSearch({ + await makeWithSearch({ serverData, Component: ToyA, resModel: "foo", searchViewId: false, }); - assert.hasClass(root.el, "o_toy_a_view"); - assert.doesNotHaveClass(root.el, "o_view_sample_data"); - assert.containsOnce(root, ".o_content .o_toy_b_view .o_content .o_toy_c_view .o_content"); // Full chain of contents - assert.containsN(root, ".o_control_panel", 2); // Component C has hidden its control panel - assert.containsN(root, ".o_content.o_component_with_search_panel", 3); - assert.containsOnce(root, ".o_search_panel"); // Standard search panel - assert.containsN(root, ".o_toy_search_panel", 2); // Custom search panels - assert.containsOnce(root, ".toy_a_search"); - assert.containsOnce(root, ".toy_b_breadcrumbs"); - assert.containsOnce(root, ".toy_c_content"); + assert.containsOnce(target, ".o_toy_a_view"); + assert.containsNone(target, ".o_view_sample_data"); + assert.containsOnce(target, ".o_content .o_toy_b_view .o_content .o_toy_c_view .o_content"); // Full chain of contents + assert.containsN(target, ".o_control_panel", 2); // Component C has hidden its control panel + assert.containsN(target, ".o_content.o_component_with_search_panel", 3); + assert.containsOnce(target, ".o_search_panel"); // Standard search panel + assert.containsN(target, ".o_toy_search_panel", 2); // Custom search panels + assert.containsOnce(target, ".toy_a_search"); + assert.containsOnce(target, ".toy_b_breadcrumbs"); + assert.containsOnce(target, ".toy_c_content"); }); QUnit.test("Custom control panel", async (assert) => { @@ -186,7 +189,7 @@ QUnit.module("Views", (hooks) => { class ControlPanel extends Component {} ControlPanel.template = xml`
`; - const root = await makeWithSearch({ + await makeWithSearch({ serverData, Component: ToyComponent, resModel: "foo", @@ -194,9 +197,9 @@ QUnit.module("Views", (hooks) => { config: { ControlPanel }, }); - assert.containsOnce(root, ".o_toy_content"); - assert.containsOnce(root, ".o_toy_search_panel"); - assert.containsNone(root, ".o_control_panel"); + assert.containsOnce(target, ".o_toy_content"); + assert.containsOnce(target, ".o_toy_search_panel"); + assert.containsNone(target, ".o_control_panel"); }); QUnit.test("Custom search panel", async (assert) => { @@ -212,7 +215,7 @@ QUnit.module("Views", (hooks) => { class SearchPanel extends Component {} SearchPanel.template = xml`
`; - const root = await makeWithSearch({ + await makeWithSearch({ serverData, Component: ToyComponent, resModel: "foo", @@ -220,9 +223,9 @@ QUnit.module("Views", (hooks) => { config: { SearchPanel }, }); - assert.containsOnce(root, ".o_toy_content"); - assert.containsOnce(root, ".o_toy_search_panel"); - assert.containsNone(root, ".o_search_panel"); + assert.containsOnce(target, ".o_toy_content"); + assert.containsOnce(target, ".o_toy_search_panel"); + assert.containsNone(target, ".o_search_panel"); }); QUnit.test("Custom banner: no bannerRoute in env", async (assert) => { @@ -238,7 +241,7 @@ QUnit.module("Views", (hooks) => { class Banner extends Component {} Banner.template = xml`
`; - const root = await makeWithSearch({ + await makeWithSearch({ serverData, Component: ToyComponent, resModel: "foo", @@ -246,8 +249,8 @@ QUnit.module("Views", (hooks) => { config: { Banner }, }); - assert.containsOnce(root, ".o_toy_content"); - assert.containsNone(root, ".o_toy_banner"); + assert.containsOnce(target, ".o_toy_content"); + assert.containsNone(target, ".o_toy_banner"); }); QUnit.test("Custom banner: with bannerRoute in env", async (assert) => { @@ -263,7 +266,7 @@ QUnit.module("Views", (hooks) => { class Banner extends Component {} Banner.template = xml`
`; - const root = await makeWithSearch({ + await makeWithSearch({ serverData, Component: ToyComponent, resModel: "foo", @@ -271,7 +274,7 @@ QUnit.module("Views", (hooks) => { config: { Banner, bannerRoute: "toy/banner/route" }, }); - assert.containsOnce(root, ".o_toy_content"); - assert.containsOnce(root, ".o_toy_banner"); + assert.containsOnce(target, ".o_toy_content"); + assert.containsOnce(target, ".o_toy_banner"); }); }); diff --git a/addons/web/static/tests/views/view_tests.js b/addons/web/static/tests/views/view_tests.js index bb919b3a0d3..54730df0fb8 100644 --- a/addons/web/static/tests/views/view_tests.js +++ b/addons/web/static/tests/views/view_tests.js @@ -22,6 +22,7 @@ const serviceRegistry = registry.category("services"); const viewRegistry = registry.category("views"); let serverData; +let target; QUnit.module("Views", (hooks) => { hooks.beforeEach(async () => { @@ -102,6 +103,8 @@ QUnit.module("Views", (hooks) => { }, }; serviceRegistry.add("action", fakeActionService, { force: true }); + + target = getFixture(); }); QUnit.module("View component"); @@ -126,7 +129,7 @@ QUnit.module("Views", (hooks) => { }, }); - const view = await makeView({ + await makeView({ serverData, mockRPC: (_, args) => { assert.strictEqual(args.model, "animal"); @@ -141,8 +144,11 @@ QUnit.module("Views", (hooks) => { resModel: "animal", type: "toy", }); - assert.hasClass(view.el, "o_toy_view"); - assert.strictEqual(view.el.innerHTML, serverData.views["animal,false,toy"]); + assert.containsOnce(target, ".o_toy_view"); + assert.strictEqual( + target.querySelector(".o_toy_view").innerHTML, + serverData.views["animal,false,toy"] + ); }); QUnit.test("rendering with given viewId", async function (assert) { @@ -160,7 +166,7 @@ QUnit.module("Views", (hooks) => { }, }); - const view = await makeView({ + await makeView({ serverData, mockRPC: (_, args) => { assert.deepEqual(args.kwargs.views, [[1, "toy"]]); @@ -174,8 +180,11 @@ QUnit.module("Views", (hooks) => { type: "toy", viewId: 1, }); - assert.hasClass(view.el, "o_toy_view"); - assert.strictEqual(view.el.innerHTML, serverData.views["animal,1,toy"]); + assert.containsOnce(target, ".o_toy_view"); + assert.strictEqual( + target.querySelector(".o_toy_view").innerHTML, + serverData.views["animal,1,toy"] + ); }); QUnit.test("rendering with given 'views' param", async function (assert) { @@ -193,7 +202,7 @@ QUnit.module("Views", (hooks) => { }, }); - const view = await makeView({ + await makeView({ serverData, mockRPC: (_, args) => { console.log(_); @@ -210,8 +219,11 @@ QUnit.module("Views", (hooks) => { views: [[1, "toy"]], }, }); - assert.hasClass(view.el, "o_toy_view"); - assert.strictEqual(view.el.innerHTML, serverData.views["animal,1,toy"]); + assert.containsOnce(target, ".o_toy_view"); + assert.strictEqual( + target.querySelector(".o_toy_view").innerHTML, + serverData.views["animal,1,toy"] + ); }); QUnit.test( @@ -231,7 +243,7 @@ QUnit.module("Views", (hooks) => { }, }); - const view = await makeView({ + await makeView({ serverData, mockRPC: (_, args) => { assert.deepEqual(args.kwargs.views, [ @@ -250,8 +262,11 @@ QUnit.module("Views", (hooks) => { views: [[false, "other"]], }, }); - assert.hasClass(view.el, "o_toy_view"); - assert.strictEqual(view.el.innerHTML, serverData.views["animal,false,toy"]); + assert.containsOnce(target, ".o_toy_view"); + assert.strictEqual( + target.querySelector(".o_toy_view").innerHTML, + serverData.views["animal,false,toy"] + ); } ); @@ -270,7 +285,7 @@ QUnit.module("Views", (hooks) => { }, }); - const view = await makeView({ + await makeView({ serverData, mockRPC: (_, args) => { assert.deepEqual(args.kwargs.views, [ @@ -293,8 +308,11 @@ QUnit.module("Views", (hooks) => { ], }, }); - assert.hasClass(view.el, "o_toy_view"); - assert.strictEqual(view.el.innerHTML, serverData.views["animal,1,toy"]); + assert.containsOnce(target, ".o_toy_view"); + assert.strictEqual( + target.querySelector(".o_toy_view").innerHTML, + serverData.views["animal,1,toy"] + ); }); QUnit.test("rendering with given arch and fields", async function (assert) { @@ -312,7 +330,7 @@ QUnit.module("Views", (hooks) => { }, }); - const view = await makeView({ + await makeView({ serverData, mockRPC: () => { throw new Error("no RPC expected"); @@ -322,8 +340,11 @@ QUnit.module("Views", (hooks) => { arch: `Specific arch content`, fields: {}, }); - assert.hasClass(view.el, "o_toy_view"); - assert.strictEqual(view.el.innerHTML, `Specific arch content`); + assert.containsOnce(target, ".o_toy_view"); + assert.strictEqual( + target.querySelector(".o_toy_view").innerHTML, + `Specific arch content` + ); }); QUnit.test("rendering with loadActionMenus='true'", async function (assert) { @@ -341,7 +362,7 @@ QUnit.module("Views", (hooks) => { }, }); - const view = await makeView({ + await makeView({ serverData, mockRPC: (_, args) => { // the rpc is done for fields @@ -356,8 +377,11 @@ QUnit.module("Views", (hooks) => { type: "toy", loadActionMenus: true, }); - assert.hasClass(view.el, "o_toy_view"); - assert.strictEqual(view.el.innerHTML, serverData.views["animal,false,toy"]); + assert.containsOnce(target, ".o_toy_view"); + assert.strictEqual( + target.querySelector(".o_toy_view").innerHTML, + serverData.views["animal,false,toy"] + ); }); QUnit.test( @@ -377,7 +401,7 @@ QUnit.module("Views", (hooks) => { }, }); - const view = await makeView({ + await makeView({ serverData, mockRPC: (_, args) => { // the rpc is done for fields @@ -394,8 +418,11 @@ QUnit.module("Views", (hooks) => { fields: {}, loadActionMenus: true, }); - assert.hasClass(view.el, "o_toy_view"); - assert.strictEqual(view.el.innerHTML, `Specific arch content`); + assert.containsOnce(target, ".o_toy_view"); + assert.strictEqual( + target.querySelector(".o_toy_view").innerHTML, + `Specific arch content` + ); } ); @@ -416,7 +443,7 @@ QUnit.module("Views", (hooks) => { }, }); - const view = await makeView({ + await makeView({ serverData, mockRPC: () => { throw new Error("no RPC expected"); @@ -430,8 +457,11 @@ QUnit.module("Views", (hooks) => { }, loadActionMenus: true, }); - assert.hasClass(view.el, "o_toy_view"); - assert.strictEqual(view.el.innerHTML, `Specific arch content`); + assert.containsOnce(target, ".o_toy_view"); + assert.strictEqual( + target.querySelector(".o_toy_view").innerHTML, + `Specific arch content` + ); } ); @@ -455,7 +485,7 @@ QUnit.module("Views", (hooks) => { }, }); - const view = await makeView({ + await makeView({ serverData, mockRPC: (_, args) => { // the rpc is done for fields @@ -473,8 +503,11 @@ QUnit.module("Views", (hooks) => { type: "toy", searchViewId: false, }); - assert.hasClass(view.el, "o_toy_view"); - assert.strictEqual(view.el.innerText, "Arch content (id=false)"); + assert.containsOnce(target, ".o_toy_view"); + assert.strictEqual( + target.querySelector(".o_toy_view").innerText, + "Arch content (id=false)" + ); }); QUnit.test( @@ -512,8 +545,11 @@ QUnit.module("Views", (hooks) => { searchViewArch: ``, searchViewFields: {}, }); - assert.hasClass(view.el, "o_toy_view"); - assert.strictEqual(view.el.innerText, "Specific arch content"); + assert.containsOnce(target, ".o_toy_view"); + assert.strictEqual( + target.querySelector(".o_toy_view").innerText, + "Specific arch content" + ); } ); @@ -539,7 +575,7 @@ QUnit.module("Views", (hooks) => { }, }); - const view = await makeView({ + await makeView({ serverData, mockRPC: () => { throw new Error("no RPC expected"); @@ -551,8 +587,11 @@ QUnit.module("Views", (hooks) => { searchViewArch: ``, searchViewFields: {}, }); - assert.hasClass(view.el, "o_toy_view"); - assert.strictEqual(view.el.innerText, "Specific arch content"); + assert.containsOnce(target, ".o_toy_view"); + assert.strictEqual( + target.querySelector(".o_toy_view").innerText, + "Specific arch content" + ); } ); @@ -578,7 +617,7 @@ QUnit.module("Views", (hooks) => { }, }); - const view = await makeView({ + await makeView({ serverData, mockRPC: (_, args) => { // the rpc is done for fields @@ -601,8 +640,11 @@ QUnit.module("Views", (hooks) => { searchViewFields: {}, loadIrFilters: true, }); - assert.hasClass(view.el, "o_toy_view"); - assert.strictEqual(view.el.innerText, "Specific arch content"); + assert.containsOnce(target, ".o_toy_view"); + assert.strictEqual( + target.querySelector(".o_toy_view").innerText, + "Specific arch content" + ); } ); @@ -639,7 +681,7 @@ QUnit.module("Views", (hooks) => { }, }); - const view = await makeView({ + await makeView({ serverData, mockRPC: () => { throw new Error("no RPC expected"); @@ -653,8 +695,11 @@ QUnit.module("Views", (hooks) => { loadIrFilters: true, irFilters, }); - assert.hasClass(view.el, "o_toy_view"); - assert.strictEqual(view.el.innerText, "Specific arch content"); + assert.containsOnce(target, ".o_toy_view"); + assert.strictEqual( + target.querySelector(".o_toy_view").innerText, + "Specific arch content" + ); } ); @@ -698,7 +743,7 @@ QUnit.module("Views", (hooks) => { } }; - const toy = await makeView({ + await makeView({ serverData, mockRPC, resModel: "animal", @@ -708,8 +753,8 @@ QUnit.module("Views", (hooks) => { }, }); - assert.containsOnce(toy, "a"); - await click(toy.el.querySelector("a")); + assert.containsOnce(target, "a"); + await click(target.querySelector("a")); assert.verifySteps(["/web/dataset/call_kw/animal/setTheControl"]); }); @@ -744,7 +789,7 @@ QUnit.module("Views", (hooks) => { `; - const toy = await makeView({ + await makeView({ serverData, resModel: "animal", type: "toy", @@ -753,8 +798,8 @@ QUnit.module("Views", (hooks) => { }, }); - assert.containsOnce(toy, "a"); - await click(toy.el.querySelector("a")); + assert.containsOnce(target, "a"); + await click(target.querySelector("a")); }); QUnit.test("can click on action-bound links -- 3", async (assert) => { @@ -796,7 +841,7 @@ QUnit.module("Views", (hooks) => { `; - const toy = await makeView({ + await makeView({ serverData, resModel: "animal", type: "toy", @@ -805,8 +850,8 @@ QUnit.module("Views", (hooks) => { }, }); - assert.containsOnce(toy, "a"); - await click(toy.el.querySelector("a")); + assert.containsOnce(target, "a"); + await click(target.querySelector("a")); }); QUnit.test("renders banner_route", async (assert) => { @@ -823,7 +868,7 @@ QUnit.module("Views", (hooks) => { } }; - const toy = await makeView({ + await makeView({ serverData, mockRPC, resModel: "animal", @@ -834,7 +879,7 @@ QUnit.module("Views", (hooks) => { }); assert.verifySteps(["/mybody/isacage"]); - assert.containsOnce(toy, ".setmybodyfree"); + assert.containsOnce(target, ".setmybodyfree"); }); QUnit.test("renders banner_route with js and css assets", async (assert) => { @@ -885,7 +930,7 @@ QUnit.module("Views", (hooks) => { patchWithCleanup(document, { createElement }); - const toy = await makeView({ + await makeView({ serverData, mockRPC, resModel: "animal", @@ -896,9 +941,9 @@ QUnit.module("Views", (hooks) => { }); assert.verifySteps(["/mybody/isacage", "js loaded", "css loaded"]); - assert.containsOnce(toy, ".setmybodyfree"); - assert.containsNone(toy, "script"); - assert.containsNone(toy, "link"); + assert.containsOnce(target, ".setmybodyfree"); + assert.containsNone(target, "script"); + assert.containsNone(target, "link"); }); QUnit.test("banner can re-render with new HTML", async (assert) => { @@ -932,7 +977,7 @@ QUnit.module("Views", (hooks) => { } }; - const toy = await makeView({ + await makeView({ serverData, mockRPC, resModel: "animal", @@ -943,12 +988,12 @@ QUnit.module("Views", (hooks) => { }); assert.verifySteps(["/mybody/isacage"]); - assert.containsOnce(toy, ".banner1"); - assert.containsNone(toy, ".banner2"); - await click(toy.el.querySelector("a")); + assert.containsOnce(target, ".banner1"); + assert.containsNone(target, ".banner2"); + await click(target.querySelector("a")); assert.verifySteps(["/mybody/isacage"]); - assert.containsNone(toy, ".banner1"); - assert.containsOnce(toy, ".banner2"); + assert.containsNone(target, ".banner1"); + assert.containsOnce(target, ".banner2"); }); QUnit.test("banner does not reload on render", async (assert) => { @@ -981,11 +1026,11 @@ QUnit.module("Views", (hooks) => { }); assert.verifySteps(["/mybody/isacage"]); - assert.containsOnce(toy, ".setmybodyfree"); + assert.containsOnce(target, ".setmybodyfree"); await toy.render(); await nextTick(); assert.verifySteps([]); - assert.containsOnce(toy, ".setmybodyfree"); + assert.containsOnce(target, ".setmybodyfree"); }); QUnit.test("click on action-bound links in banner (concurrency)", async (assert) => { @@ -1038,7 +1083,7 @@ QUnit.module("Views", (hooks) => { } }; - const toy = await makeView({ + await makeView({ mockRPC, serverData, resModel: "animal", @@ -1048,8 +1093,8 @@ QUnit.module("Views", (hooks) => { }, }); - await click(toy.el.querySelector("a[data-method='setTheControl']")); - click(toy.el.querySelector("a[data-method='heartOfTheSun']")); + await click(target.querySelector("a[data-method='setTheControl']")); + click(target.querySelector("a[data-method='heartOfTheSun']")); prom.resolve(); await nextTick(); }); @@ -1104,7 +1149,7 @@ QUnit.module("Views", (hooks) => { } }; - const toy = await makeView({ + await makeView({ serverData, mockRPC, resModel: "animal", @@ -1122,23 +1167,23 @@ QUnit.module("Views", (hooks) => { }; // We need to handle both events, because the transition is not // always executed - toy.el.addEventListener("transitionend", complete); - toy.el.addEventListener("transitioncancel", complete); + target.addEventListener("transitionend", complete); + target.addEventListener("transitioncancel", complete); }); assert.verifySteps(["/mybody/isacage"]); - assert.isNotVisible(toy.el.querySelector(".modal")); - assert.hasClass(toy.el.querySelector(".o_onboarding_container"), "collapse show"); + assert.isNotVisible(target.querySelector(".modal")); + assert.hasClass(target.querySelector(".o_onboarding_container"), "collapse show"); - await click(toy.el.querySelector("#closeOnboarding")); - assert.isVisible(toy.el.querySelector(".modal")); + await click(target.querySelector("#closeOnboarding")); + assert.isVisible(target.querySelector(".modal")); - await click(toy.el.querySelector(".modal a[type='action']")); + await click(target.querySelector(".modal a[type='action']")); assert.verifySteps(["mah_method"]); await prom; - assert.doesNotHaveClass(toy.el.querySelector(".o_onboarding_container"), "show"); - assert.hasClass(toy.el.querySelector(".o_onboarding_container"), "collapse"); - assert.isNotVisible(toy.el.querySelector(".modal")); + assert.doesNotHaveClass(target.querySelector(".o_onboarding_container"), "show"); + assert.hasClass(target.querySelector(".o_onboarding_container"), "collapse"); + assert.isNotVisible(target.querySelector(".modal")); }); //////////////////////////////////////////////////////////////////////////// @@ -1147,7 +1192,7 @@ QUnit.module("Views", (hooks) => { QUnit.test("rendering with given jsClass", async function (assert) { assert.expect(4); - const view = await makeView({ + await makeView({ serverData, mockRPC: (_, args) => { assert.deepEqual(args.kwargs.views, [[false, "toy"]]); @@ -1160,13 +1205,16 @@ QUnit.module("Views", (hooks) => { resModel: "animal", type: "toy_imp", }); - assert.hasClass(view.el, "o_toy_view_imp"); - assert.strictEqual(view.el.innerText, "Arch content (id=false)"); + assert.containsOnce(target, ".o_toy_view_imp"); + assert.strictEqual( + target.querySelector(".o_toy_view_imp").innerText, + "Arch content (id=false)" + ); }); QUnit.test("rendering with loaded arch attribute 'js_class'", async function (assert) { assert.expect(4); - const view = await makeView({ + await makeView({ serverData, mockRPC: (_, args) => { assert.deepEqual(args.kwargs.views, [[2, "toy"]]); @@ -1180,13 +1228,16 @@ QUnit.module("Views", (hooks) => { type: "toy", viewId: 2, }); - assert.hasClass(view.el, "o_toy_view_imp"); - assert.strictEqual(view.el.innerText, "Arch content (id=2)"); + assert.containsOnce(target, ".o_toy_view_imp"); + assert.strictEqual( + target.querySelector(".o_toy_view_imp").innerText, + "Arch content (id=2)" + ); }); QUnit.test("rendering with given arch attribute 'js_class'", async function (assert) { assert.expect(2); - const view = await makeView({ + await makeView({ serverData, mockRPC: () => { throw new Error("no RPC expected"); @@ -1196,8 +1247,11 @@ QUnit.module("Views", (hooks) => { arch: `Specific arch content for specific class`, fields: {}, }); - assert.hasClass(view.el, "o_toy_view_imp"); - assert.strictEqual(view.el.innerText, "Specific arch content for specific class"); + assert.containsOnce(target, ".o_toy_view_imp"); + assert.strictEqual( + target.querySelector(".o_toy_view_imp").innerText, + "Specific arch content for specific class" + ); }); QUnit.test( @@ -1210,7 +1264,7 @@ QUnit.module("Views", (hooks) => { ToyView2.type = "toy"; viewRegistry.add("toy_2", ToyView2); - const view = await makeView({ + await makeView({ serverData, mockRPC: (_, args) => { assert.deepEqual(args.kwargs.views, [[2, "toy"]]); @@ -1224,7 +1278,7 @@ QUnit.module("Views", (hooks) => { type: "toy_2", viewId: 2, }); - assert.hasClass(view.el, "o_toy_view_imp", "jsClass from arch prefered"); + assert.containsOnce(target, ".o_toy_view_imp", "jsClass from arch prefered"); } ); @@ -1238,7 +1292,7 @@ QUnit.module("Views", (hooks) => { ToyView2.type = "toy"; viewRegistry.add("toy_2", ToyView2); - const view = await makeView({ + await makeView({ serverData, mockRPC: () => { throw new Error("no RPC expected"); @@ -1248,7 +1302,7 @@ QUnit.module("Views", (hooks) => { arch: ``, fields: {}, }); - assert.hasClass(view.el, "o_toy_view_imp", "jsClass from arch prefered"); + assert.containsOnce(target, ".o_toy_view_imp", "jsClass from arch prefered"); } ); diff --git a/addons/web/static/tests/webclient/actions/client_action_tests.js b/addons/web/static/tests/webclient/actions/client_action_tests.js index cf2abfb8583..9db3142c47f 100644 --- a/addons/web/static/tests/webclient/actions/client_action_tests.js +++ b/addons/web/static/tests/webclient/actions/client_action_tests.js @@ -8,6 +8,7 @@ import testUtils from "web.test_utils"; import { registerCleanup } from "../../helpers/cleanup"; import { click, getFixture, legacyExtraNextTick, patchWithCleanup } from "../../helpers/utils"; import { createWebClient, doAction, getActionManagerServerData } from "./../helpers"; +import { LegacyComponent } from "@web/legacy/legacy_component"; const { Component, xml } = owl; @@ -99,7 +100,7 @@ QUnit.module("ActionManager", (hooks) => { QUnit.test("can execute client actions from tag name", async function (assert) { assert.expect(4); - class ClientAction extends Component {} + class ClientAction extends LegacyComponent {} ClientAction.template = xml`
Hello World
`; actionRegistry.add("HelloWorldTest", ClientAction); @@ -231,7 +232,7 @@ QUnit.module("ActionManager", (hooks) => { QUnit.test("action can use a custom control panel (legacy)", async function (assert) { assert.expect(1); - class CustomControlPanel extends Component {} + class CustomControlPanel extends LegacyComponent {} CustomControlPanel.template = xml`
My custom control panel
`; @@ -327,7 +328,7 @@ QUnit.module("ActionManager", (hooks) => { QUnit.test("ClientAction receives breadcrumbs and exports title (wowl)", async (assert) => { assert.expect(4); - class ClientAction extends Component { + class ClientAction extends LegacyComponent { setup() { this.breadcrumbTitle = "myOwlAction"; const { breadcrumbs } = this.env.config; @@ -358,7 +359,7 @@ QUnit.module("ActionManager", (hooks) => { QUnit.test("ClientAction receives arbitrary props from doAction (wowl)", async (assert) => { assert.expect(1); - class ClientAction extends Component { + class ClientAction extends LegacyComponent { setup() { assert.strictEqual(this.props.division, "bell"); } diff --git a/addons/web/static/tests/webclient/actions/concurrency_tests.js b/addons/web/static/tests/webclient/actions/concurrency_tests.js index cff525efdec..686f3db963f 100644 --- a/addons/web/static/tests/webclient/actions/concurrency_tests.js +++ b/addons/web/static/tests/webclient/actions/concurrency_tests.js @@ -9,6 +9,7 @@ import { registry } from "@web/core/registry"; import testUtils from "web.test_utils"; import { useSetupView } from "@web/views/helpers/view_hook"; import * as cpHelpers from "@web/../tests/search/helpers"; +import { LegacyComponent } from "@web/legacy/legacy_component"; const { Component, xml } = owl; const actionRegistry = registry.category("actions"); @@ -439,7 +440,7 @@ QUnit.module("ActionManager", (hooks) => { async function (assert) { assert.expect(3); const slowWillStartDef = testUtils.makeTestPromise(); - class ClientAction extends Component { + class ClientAction extends LegacyComponent { setup() { owl.onWillStart(() => slowWillStartDef); } @@ -587,7 +588,7 @@ QUnit.module("ActionManager", (hooks) => { let def = Promise.resolve(); let id = 1; - class ToyView extends Component { + class ToyView extends LegacyComponent { setup() { this.id = id++; assert.step(JSON.stringify(this.props.state || "no state")); diff --git a/addons/web/static/tests/webclient/actions/error_handling_tests.js b/addons/web/static/tests/webclient/actions/error_handling_tests.js index 18cd2e1d168..a29173bd897 100644 --- a/addons/web/static/tests/webclient/actions/error_handling_tests.js +++ b/addons/web/static/tests/webclient/actions/error_handling_tests.js @@ -5,6 +5,7 @@ import { createWebClient, doAction, getActionManagerServerData } from "./../help import { registerCleanup } from "../../helpers/cleanup"; import { click, getFixture, nextTick, patchWithCleanup } from "../../helpers/utils"; import { errorService } from "@web/core/errors/error_service"; +import { LegacyComponent } from "@web/legacy/legacy_component"; const { Component, xml } = owl; @@ -22,7 +23,7 @@ QUnit.module("ActionManager", (hooks) => { QUnit.test("error in a client action (at rendering)", async function (assert) { assert.expect(4); - class Boom extends Component {} + class Boom extends LegacyComponent {} Boom.template = xml`
`; actionRegistry.add("Boom", Boom); @@ -53,7 +54,7 @@ QUnit.module("ActionManager", (hooks) => { registry.category("services").add("error", errorService); - class Boom extends Component { + class Boom extends LegacyComponent { setup() { this.boom = false; } diff --git a/addons/web/static/tests/webclient/actions/load_state_tests.js b/addons/web/static/tests/webclient/actions/load_state_tests.js index fc9233372ae..e85a7d7d8c3 100644 --- a/addons/web/static/tests/webclient/actions/load_state_tests.js +++ b/addons/web/static/tests/webclient/actions/load_state_tests.js @@ -26,6 +26,7 @@ import { setupWebClientRegistries, } from "./../helpers"; import { errorService } from "@web/core/errors/error_service"; +import { LegacyComponent } from "@web/legacy/legacy_component"; const { Component, xml } = owl; @@ -181,7 +182,7 @@ QUnit.module("ActionManager", (hooks) => { QUnit.test("properly load client actions", async function (assert) { assert.expect(3); - class ClientAction extends Component {} + class ClientAction extends LegacyComponent {} ClientAction.template = xml`
Hello World
`; actionRegistry.add("HelloWorldTest", ClientAction); const mockRPC = async function (route, args) { @@ -1013,7 +1014,7 @@ QUnit.module("ActionManager", (hooks) => { QUnit.test("concurrent hashchange during action mounting -- 1", async (assert) => { assert.expect(5); - class MyAction extends Component { + class MyAction extends LegacyComponent { setup() { owl.onMounted(() => { assert.step("myAction mounted"); @@ -1044,7 +1045,7 @@ QUnit.module("ActionManager", (hooks) => { const baseURL = new URL(browser.location.href).toString(); - class MyAction extends Component { + class MyAction extends LegacyComponent { setup() { owl.onMounted(() => { assert.step("myAction mounted"); diff --git a/addons/web/static/tests/webclient/actions/push_state_tests.js b/addons/web/static/tests/webclient/actions/push_state_tests.js index 73c85a55645..23940270a7e 100644 --- a/addons/web/static/tests/webclient/actions/push_state_tests.js +++ b/addons/web/static/tests/webclient/actions/push_state_tests.js @@ -12,6 +12,7 @@ import { patchWithCleanup, } from "../../helpers/utils"; import { createWebClient, doAction, getActionManagerServerData } from "./../helpers"; +import { LegacyComponent } from "@web/legacy/legacy_component"; const { Component, xml } = owl; @@ -76,7 +77,7 @@ QUnit.module("ActionManager", (hooks) => { QUnit.test("actions can push state", async (assert) => { assert.expect(5); - class ClientActionPushes extends Component { + class ClientActionPushes extends LegacyComponent { setup() { this.router = useService("router"); } @@ -104,7 +105,7 @@ QUnit.module("ActionManager", (hooks) => { QUnit.test("actions override previous state", async (assert) => { assert.expect(5); - class ClientActionPushes extends Component { + class ClientActionPushes extends LegacyComponent { setup() { this.router = useService("router"); } @@ -133,7 +134,7 @@ QUnit.module("ActionManager", (hooks) => { QUnit.test("actions override previous state from menu click", async (assert) => { assert.expect(3); - class ClientActionPushes extends Component { + class ClientActionPushes extends LegacyComponent { setup() { this.router = useService("router"); } diff --git a/addons/web/static/tests/webclient/actions/target_tests.js b/addons/web/static/tests/webclient/actions/target_tests.js index c45abca63db..9eb965901d4 100644 --- a/addons/web/static/tests/webclient/actions/target_tests.js +++ b/addons/web/static/tests/webclient/actions/target_tests.js @@ -17,6 +17,7 @@ import { registerCleanup } from "../../helpers/cleanup"; import { errorService } from "@web/core/errors/error_service"; import { useService } from "@web/core/utils/hooks"; import { ClientErrorDialog } from "@web/core/errors/error_dialogs"; +import { LegacyComponent } from "@web/legacy/legacy_component"; const { Component, onMounted, xml } = owl; @@ -338,7 +339,7 @@ QUnit.module("ActionManager", (hooks) => { onUnhandledRejection: () => {}, }); - class ErrorClientAction extends Component { + class ErrorClientAction extends LegacyComponent { setup() { throw new Error("my error"); } @@ -346,11 +347,11 @@ QUnit.module("ActionManager", (hooks) => { ErrorClientAction.template = xml`
`; registry.category("actions").add("failing", ErrorClientAction); - class ClientActionTargetNew extends Component {} + class ClientActionTargetNew extends LegacyComponent {} ClientActionTargetNew.template = xml`
`; registry.category("actions").add("clientActionNew", ClientActionTargetNew); - class ClientAction extends Component { + class ClientAction extends LegacyComponent { setup() { this.action = useService("action"); } diff --git a/addons/web/static/tests/webclient/helpers.js b/addons/web/static/tests/webclient/helpers.js index 9fd42d88e68..57dbb680782 100644 --- a/addons/web/static/tests/webclient/helpers.js +++ b/addons/web/static/tests/webclient/helpers.js @@ -52,6 +52,7 @@ import { ClientActionAdapter, ViewAdapter } from "@web/legacy/action_adapters"; import { commandService } from "@web/core/commands/command_service"; import { CustomFavoriteItem } from "@web/search/favorite_menu/custom_favorite_item"; import { standaloneAdapter } from "web.OwlCompatibility"; +import { LegacyComponent } from "@web/legacy/legacy_component"; const { Component, onMounted, xml } = owl; @@ -316,7 +317,7 @@ export async function loadState(env, state) { export function getActionManagerServerData() { // additional basic client action - class TestClientAction extends Component {} + class TestClientAction extends LegacyComponent {} TestClientAction.template = xml`
ClientAction_ diff --git a/addons/web/static/tests/webclient/navbar_tests.js b/addons/web/static/tests/webclient/navbar_tests.js index 8a6a141ec6f..634bd817e47 100644 --- a/addons/web/static/tests/webclient/navbar_tests.js +++ b/addons/web/static/tests/webclient/navbar_tests.js @@ -18,12 +18,13 @@ import { patchWithCleanup, makeDeferred, } from "../helpers/utils"; +import { LegacyComponent } from "@web/legacy/legacy_component"; const { Component, xml } = owl; const systrayRegistry = registry.category("systray"); const serviceRegistry = registry.category("services"); -class MySystrayItem extends Component {} +class MySystrayItem extends LegacyComponent {} MySystrayItem.template = xml`
  • my item
  • `; let baseConfig; @@ -142,13 +143,13 @@ QUnit.test("navbar can display systray items", async (assert) => { }); QUnit.test("navbar can display systray items ordered based on their sequence", async (assert) => { - class MyItem1 extends Component {} + class MyItem1 extends LegacyComponent {} MyItem1.template = xml`
  • my item 1
  • `; - class MyItem2 extends Component {} + class MyItem2 extends LegacyComponent {} MyItem2.template = xml`
  • my item 2
  • `; - class MyItem3 extends Component {} + class MyItem3 extends LegacyComponent {} MyItem3.template = xml`
  • my item 3
  • `; - class MyItem4 extends Component {} + class MyItem4 extends LegacyComponent {} MyItem4.template = xml`
  • my item 4
  • `; clearRegistryWithCleanup(systrayRegistry); diff --git a/addons/web/static/tests/webclient/switch_company_menu_tests.js b/addons/web/static/tests/webclient/switch_company_menu_tests.js index 18356f3c87e..8ba32d3980e 100644 --- a/addons/web/static/tests/webclient/switch_company_menu_tests.js +++ b/addons/web/static/tests/webclient/switch_company_menu_tests.js @@ -12,6 +12,8 @@ import { session } from "@web/session"; const serviceRegistry = registry.category("services"); +let target; + async function createSwitchCompanyMenu(routerParams = {}, toggleDelay = 0) { patchWithCleanup(SwitchCompanyMenu, { toggleDelay }); if (routerParams.onPushState) { @@ -28,7 +30,6 @@ async function createSwitchCompanyMenu(routerParams = {}, toggleDelay = 0) { }); } const env = await makeTestEnv(); - const target = getFixture(); const scMenu = await mount(SwitchCompanyMenu, target, { env }); return scMenu; } @@ -46,32 +47,32 @@ QUnit.module("SwitchCompanyMenu", (hooks) => { serviceRegistry.add("ui", uiService); serviceRegistry.add("company", companyService); serviceRegistry.add("hotkey", hotkeyService); + target = getFixture(); }); QUnit.test("basic rendering", async (assert) => { - assert.expect(10); + assert.expect(9); - const scMenu = await createSwitchCompanyMenu(); + await createSwitchCompanyMenu(); - assert.strictEqual(scMenu.el.tagName.toUpperCase(), "DIV"); - assert.hasClass(scMenu.el, "o_switch_company_menu"); - assert.strictEqual(scMenu.el.textContent, "Hermit"); + assert.containsOnce(target, "div.o_switch_company_menu"); + assert.strictEqual(target.querySelector("div.o_switch_company_menu").textContent, "Hermit"); - await click(scMenu.el.querySelector(".dropdown-toggle")); - assert.containsN(scMenu, ".toggle_company", 3); - assert.containsN(scMenu, ".log_into", 3); - assert.containsOnce(scMenu.el, ".fa-check-square"); - assert.containsN(scMenu.el, ".fa-square-o", 2); + await click(target.querySelector(".dropdown-toggle")); + assert.containsN(target, ".toggle_company", 3); + assert.containsN(target, ".log_into", 3); + assert.containsOnce(target, ".fa-check-square"); + assert.containsN(target, ".fa-square-o", 2); assert.strictEqual( - scMenu.el.querySelector(".fa-check-square").closest(".dropdown-item").textContent, + target.querySelector(".fa-check-square").closest(".dropdown-item").textContent, "Hermit" ); assert.strictEqual( - scMenu.el.querySelector(".fa-square-o").closest(".dropdown-item").textContent, + target.querySelector(".fa-square-o").closest(".dropdown-item").textContent, "Herman's" ); assert.strictEqual( - scMenu.el.querySelector(".dropdown-menu").textContent, + target.querySelector(".dropdown-menu").textContent, "HermitHerman'sHeroes TM" ); }); @@ -93,20 +94,20 @@ QUnit.module("SwitchCompanyMenu", (hooks) => { */ assert.deepEqual(scMenu.env.services.company.allowedCompanyIds, [3]); assert.strictEqual(scMenu.env.services.company.currentCompany.id, 3); - await click(scMenu.el.querySelector(".dropdown-toggle")); - assert.containsN(scMenu.el, "[data-company-id]", 3); - assert.containsN(scMenu.el, "[data-company-id] .fa-check-square", 1); - assert.containsN(scMenu.el, "[data-company-id] .fa-square-o", 2); + await click(target.querySelector(".dropdown-toggle")); + assert.containsN(target, "[data-company-id]", 3); + assert.containsN(target, "[data-company-id] .fa-check-square", 1); + assert.containsN(target, "[data-company-id] .fa-square-o", 2); /** * [x] **Hermit** * [x] Herman's -> toggle * [ ] Heroes TM */ - await click(scMenu.el.querySelectorAll(".toggle_company")[1]); - assert.containsOnce(scMenu.el, ".dropdown-menu", "dropdown is still opened"); - assert.containsN(scMenu.el, "[data-company-id] .fa-check-square", 2); - assert.containsN(scMenu.el, "[data-company-id] .fa-square-o", 1); + await click(target.querySelectorAll(".toggle_company")[1]); + assert.containsOnce(target, ".dropdown-menu", "dropdown is still opened"); + assert.containsN(target, "[data-company-id] .fa-check-square", 2); + assert.containsN(target, "[data-company-id] .fa-square-o", 1); await prom; assert.verifySteps(["cids=3%2C2"]); }); @@ -128,22 +129,22 @@ QUnit.module("SwitchCompanyMenu", (hooks) => { */ assert.deepEqual(scMenu.env.services.company.allowedCompanyIds, [3]); assert.strictEqual(scMenu.env.services.company.currentCompany.id, 3); - await click(scMenu.el.querySelector(".dropdown-toggle")); - assert.containsN(scMenu.el, "[data-company-id]", 3); - assert.containsN(scMenu.el, "[data-company-id] .fa-check-square", 1); - assert.containsN(scMenu.el, "[data-company-id] .fa-square-o", 2); + await click(target.querySelector(".dropdown-toggle")); + assert.containsN(target, "[data-company-id]", 3); + assert.containsN(target, "[data-company-id] .fa-check-square", 1); + assert.containsN(target, "[data-company-id] .fa-square-o", 2); /** * [ ] **Hermit** -> toggle all * [x] Herman's -> toggle all * [x] Heroes TM -> toggle all */ - await click(scMenu.el.querySelectorAll(".toggle_company")[0]); - await click(scMenu.el.querySelectorAll(".toggle_company")[1]); - await click(scMenu.el.querySelectorAll(".toggle_company")[2]); - assert.containsOnce(scMenu.el, ".dropdown-menu", "dropdown is still opened"); - assert.containsN(scMenu.el, "[data-company-id] .fa-check-square", 2); - assert.containsN(scMenu.el, "[data-company-id] .fa-square-o", 1); + await click(target.querySelectorAll(".toggle_company")[0]); + await click(target.querySelectorAll(".toggle_company")[1]); + await click(target.querySelectorAll(".toggle_company")[2]); + assert.containsOnce(target, ".dropdown-menu", "dropdown is still opened"); + assert.containsN(target, "[data-company-id] .fa-check-square", 2); + assert.containsN(target, "[data-company-id] .fa-square-o", 1); assert.verifySteps([]); await prom; // await toggle promise @@ -168,23 +169,23 @@ QUnit.module("SwitchCompanyMenu", (hooks) => { assert.deepEqual(scMenu.env.services.router.current.hash, { cids: 3 }); assert.deepEqual(scMenu.env.services.company.allowedCompanyIds, [3]); assert.strictEqual(scMenu.env.services.company.currentCompany.id, 3); - await click(scMenu.el.querySelector(".dropdown-toggle")); - assert.containsN(scMenu.el, "[data-company-id]", 3); - assert.containsN(scMenu.el, "[data-company-id] .fa-check-square", 1); - assert.containsN(scMenu.el, "[data-company-id] .fa-square-o", 2); + await click(target.querySelector(".dropdown-toggle")); + assert.containsN(target, "[data-company-id]", 3); + assert.containsN(target, "[data-company-id] .fa-check-square", 1); + assert.containsN(target, "[data-company-id] .fa-square-o", 2); /** * [ ] **Hermit** -> toggle off * [ ] Herman's * [ ] Heroes TM */ - await click(scMenu.el.querySelectorAll(".toggle_company")[0]); + await click(target.querySelectorAll(".toggle_company")[0]); assert.deepEqual(scMenu.env.services.router.current.hash, { cids: 3 }); assert.deepEqual(scMenu.env.services.company.allowedCompanyIds, [3]); assert.strictEqual(scMenu.env.services.company.currentCompany.id, 3); - assert.containsOnce(scMenu.el, ".dropdown-menu", "dropdown is still opened"); - assert.containsN(scMenu.el, "[data-company-id] .fa-check-square", 0); - assert.containsN(scMenu.el, "[data-company-id] .fa-square-o", 3); + assert.containsOnce(target, ".dropdown-menu", "dropdown is still opened"); + assert.containsN(target, "[data-company-id] .fa-check-square", 0); + assert.containsN(target, "[data-company-id] .fa-square-o", 3); }); QUnit.test("single company mode: companies can be logged in", async (assert) => { @@ -202,18 +203,18 @@ QUnit.module("SwitchCompanyMenu", (hooks) => { */ assert.deepEqual(scMenu.env.services.company.allowedCompanyIds, [3]); assert.strictEqual(scMenu.env.services.company.currentCompany.id, 3); - await click(scMenu.el.querySelector(".dropdown-toggle")); - assert.containsN(scMenu.el, "[data-company-id]", 3); - assert.containsN(scMenu.el, "[data-company-id] .fa-check-square", 1); - assert.containsN(scMenu.el, "[data-company-id] .fa-square-o", 2); + await click(target.querySelector(".dropdown-toggle")); + assert.containsN(target, "[data-company-id]", 3); + assert.containsN(target, "[data-company-id] .fa-check-square", 1); + assert.containsN(target, "[data-company-id] .fa-square-o", 2); /** * [x] **Hermit** * [ ] Herman's -> log into * [ ] Heroes TM */ - await click(scMenu.el.querySelectorAll(".log_into")[1]); - assert.containsNone(scMenu.el, ".dropdown-menu", "dropdown is directly closed"); + await click(target.querySelectorAll(".log_into")[1]); + assert.containsNone(target, ".dropdown-menu", "dropdown is directly closed"); assert.verifySteps(["cids=2"]); }); @@ -233,18 +234,18 @@ QUnit.module("SwitchCompanyMenu", (hooks) => { */ assert.deepEqual(scMenu.env.services.company.allowedCompanyIds, [3, 1]); assert.strictEqual(scMenu.env.services.company.currentCompany.id, 3); - await click(scMenu.el.querySelector(".dropdown-toggle")); - assert.containsN(scMenu.el, "[data-company-id]", 3); - assert.containsN(scMenu.el, "[data-company-id] .fa-check-square", 2); - assert.containsN(scMenu.el, "[data-company-id] .fa-square-o", 1); + await click(target.querySelector(".dropdown-toggle")); + assert.containsN(target, "[data-company-id]", 3); + assert.containsN(target, "[data-company-id] .fa-check-square", 2); + assert.containsN(target, "[data-company-id] .fa-square-o", 1); /** * [x] Hermit * [ ] Herman's -> log into * [x] **Heroes TM** */ - await click(scMenu.el.querySelectorAll(".log_into")[1]); - assert.containsNone(scMenu.el, ".dropdown-menu", "dropdown is directly closed"); + await click(target.querySelectorAll(".log_into")[1]); + assert.containsNone(target, ".dropdown-menu", "dropdown is directly closed"); assert.verifySteps(["cids=2%2C3%2C1"]); }); @@ -264,18 +265,18 @@ QUnit.module("SwitchCompanyMenu", (hooks) => { */ assert.deepEqual(scMenu.env.services.company.allowedCompanyIds, [2, 1]); assert.strictEqual(scMenu.env.services.company.currentCompany.id, 2); - await click(scMenu.el.querySelector(".dropdown-toggle")); - assert.containsN(scMenu.el, "[data-company-id]", 3); - assert.containsN(scMenu.el, "[data-company-id] .fa-check-square", 2); - assert.containsN(scMenu.el, "[data-company-id] .fa-square-o", 1); + await click(target.querySelector(".dropdown-toggle")); + assert.containsN(target, "[data-company-id]", 3); + assert.containsN(target, "[data-company-id] .fa-check-square", 2); + assert.containsN(target, "[data-company-id] .fa-square-o", 1); /** * [ ] Hermit * [x] **Herman's** * [x] Heroes TM -> log into */ - await click(scMenu.el.querySelectorAll(".log_into")[2]); - assert.containsNone(scMenu.el, ".dropdown-menu", "dropdown is directly closed"); + await click(target.querySelectorAll(".log_into")[2]); + assert.containsNone(target, ".dropdown-menu", "dropdown is directly closed"); assert.verifySteps(["cids=1%2C2"]); }); @@ -294,20 +295,20 @@ QUnit.module("SwitchCompanyMenu", (hooks) => { */ assert.deepEqual(scMenu.env.services.company.allowedCompanyIds, [3]); assert.strictEqual(scMenu.env.services.company.currentCompany.id, 3); - await click(scMenu.el.querySelector(".dropdown-toggle")); - assert.containsN(scMenu.el, "[data-company-id]", 3); - assert.containsN(scMenu.el, "[data-company-id] .fa-check-square", 1); - assert.containsN(scMenu.el, "[data-company-id] .fa-square-o", 2); + await click(target.querySelector(".dropdown-toggle")); + assert.containsN(target, "[data-company-id]", 3); + assert.containsN(target, "[data-company-id] .fa-check-square", 1); + assert.containsN(target, "[data-company-id] .fa-square-o", 2); /** * [ ] **Hermit** -> toggled * [ ] Herman's -> logged in * [ ] Heroes TM -> toggled */ - await click(scMenu.el.querySelectorAll(".toggle_company")[2]); - await click(scMenu.el.querySelectorAll(".toggle_company")[0]); - await click(scMenu.el.querySelectorAll(".log_into")[1]); - assert.containsNone(scMenu.el, ".dropdown-menu", "dropdown is directly closed"); + await click(target.querySelectorAll(".toggle_company")[2]); + await click(target.querySelectorAll(".toggle_company")[0]); + await click(target.querySelectorAll(".log_into")[1]); + assert.containsNone(target, ".dropdown-menu", "dropdown is directly closed"); assert.verifySteps(["cids=2"]); }); }); diff --git a/addons/web/static/tests/webclient/user_menu_tests.js b/addons/web/static/tests/webclient/user_menu_tests.js index 829c71625d3..331d095ef20 100644 --- a/addons/web/static/tests/webclient/user_menu_tests.js +++ b/addons/web/static/tests/webclient/user_menu_tests.js @@ -85,25 +85,23 @@ QUnit.test("can be rendered", async (assert) => { }; }); userMenu = await mount(UserMenu, target, { env }); - let userMenuEl = userMenu.el; - assert.containsOnce(userMenuEl, "img.o_user_avatar"); + assert.containsOnce(target, "img.o_user_avatar"); assert.strictEqual( - userMenuEl.querySelector("img.o_user_avatar").dataset.src, + target.querySelector("img.o_user_avatar").dataset.src, "http://lordofthering/web/image?model=res.users&field=avatar_128&id=7" ); - assert.containsOnce(userMenuEl, "span.oe_topbar_name"); - assert.strictEqual(userMenuEl.querySelector(".oe_topbar_name").textContent, "Sauron"); - assert.containsNone(userMenuEl, ".dropdown-menu .dropdown-item"); - await click(userMenu.el.querySelector("button.dropdown-toggle")); - userMenuEl = userMenu.el; - assert.containsN(userMenuEl, ".dropdown-menu .dropdown-item", 3); - assert.containsOnce(userMenuEl, "div.dropdown-divider"); - const children = [...(userMenuEl.querySelector(".dropdown-menu").children || [])]; + assert.containsOnce(target, "span.oe_topbar_name"); + assert.strictEqual(target.querySelector(".oe_topbar_name").textContent, "Sauron"); + assert.containsNone(target, ".dropdown-menu .dropdown-item"); + await click(target.querySelector("button.dropdown-toggle")); + assert.containsN(target, ".dropdown-menu .dropdown-item", 3); + assert.containsOnce(target, "div.dropdown-divider"); + const children = [...(target.querySelector(".dropdown-menu").children || [])]; assert.deepEqual( children.map((el) => el.tagName), ["SPAN", "SPAN", "DIV", "SPAN"] ); - const items = [...userMenuEl.querySelectorAll(".dropdown-menu .dropdown-item")] || []; + const items = [...target.querySelectorAll(".dropdown-menu .dropdown-item")] || []; assert.deepEqual( items.map((el) => el.dataset.menu), ["ring", "bad", "eye"] @@ -122,10 +120,9 @@ QUnit.test("display the correct name in debug mode", async (assert) => { patchWithCleanup(odoo, { debug: "1" }); env = await makeTestEnv(); userMenu = await mount(UserMenu, target, { env }); - let userMenuEl = userMenu.el; - assert.containsOnce(userMenuEl, "img.o_user_avatar"); - assert.containsOnce(userMenuEl, "span.oe_topbar_name"); - assert.strictEqual(userMenuEl.querySelector(".oe_topbar_name").textContent, "Sauron (test)"); + assert.containsOnce(target, "img.o_user_avatar"); + assert.containsOnce(target, "span.oe_topbar_name"); + assert.strictEqual(target.querySelector(".oe_topbar_name").textContent, "Sauron (test)"); }); QUnit.test("can execute the callback of settings", async (assert) => { @@ -157,9 +154,9 @@ QUnit.test("can execute the callback of settings", async (assert) => { env = await makeTestEnv(testConfig); userMenuRegistry.add("profile", preferencesItem); userMenu = await mount(UserMenu, target, { env }); - await click(userMenu.el.querySelector("button.dropdown-toggle")); - assert.containsOnce(userMenu.el, ".dropdown-menu .dropdown-item"); - const item = userMenu.el.querySelector(".dropdown-menu .dropdown-item"); + await click(target.querySelector("button.dropdown-toggle")); + assert.containsOnce(target, ".dropdown-menu .dropdown-item"); + const item = target.querySelector(".dropdown-menu .dropdown-item"); assert.strictEqual(item.textContent, "Preferences"); await click(item); assert.verifySteps(["7", "Change My Preferences"]); diff --git a/addons/web/static/tests/webclient/webclient_tests.js b/addons/web/static/tests/webclient/webclient_tests.js index 8d564d15749..57911402eff 100644 --- a/addons/web/static/tests/webclient/webclient_tests.js +++ b/addons/web/static/tests/webclient/webclient_tests.js @@ -13,6 +13,7 @@ import { WebClient } from "@web/webclient/webclient"; import { clearRegistryWithCleanup, makeTestEnv } from "../helpers/mock_env"; import { fakeTitleService } from "../helpers/mock_services"; import { destroy, getFixture, mount, patchWithCleanup, triggerEvent } from "../helpers/utils"; +import { LegacyComponent } from "@web/legacy/legacy_component"; const { Component, xml } = owl; const mainComponentRegistry = registry.category("main_components"); @@ -47,7 +48,7 @@ QUnit.test("can be rendered", async (assert) => { QUnit.test("can render a main component", async (assert) => { assert.expect(1); - class MyComponent extends Component {} + class MyComponent extends LegacyComponent {} MyComponent.template = xml`MyComponent`; clearRegistryWithCleanup(mainComponentRegistry); mainComponentRegistry.add("mycomponent", { Component: MyComponent }); @@ -74,7 +75,7 @@ QUnit.test("control-click propagation stopped on
    ", async (assert) => { }, }); - class MyComponent extends Component { + class MyComponent extends LegacyComponent { /** @param {MouseEvent} ev */ onclick(ev) { assert.step(ev.ctrlKey ? "ctrl-click" : "click");