From f065276a4611ddad67fd3d200fc131f2e30907b5 Mon Sep 17 00:00:00 2001 From: Aaron Bohy Date: Fri, 25 Aug 2023 14:41:26 +0200 Subject: [PATCH] [FIX] web: tests: click helper: throw error if target is disabled Before chrome 116, programmatic clicks on disabled buttons weren't actually fired. With chrome 116, they are. As a consequence, some tests fails on chrome 116 because they click (on purpose) on disabled button to highlight the fact that nothing happens. This commit improves the click helper to make it throw an error when the target is disabled. It also adapts the tests that were clicking on disabled button, in general to simply assert that the button is disabled instead. closes odoo/odoo#133196 Related: odoo/enterprise#46398 Signed-off-by: Samuel Degueldre (sad) --- addons/web/static/tests/core/checkbox_tests.js | 12 +++--------- addons/web/static/tests/core/pager_tests.js | 6 ++---- addons/web/static/tests/helpers/utils.js | 3 +++ .../tests/views/fields/many2one_field_tests.js | 4 +--- .../tests/views/fields/one2many_field_tests.js | 1 - .../static/tests/views/form/form_view_tests.js | 18 ++++++++++-------- .../tests/views/kanban/kanban_view_tests.js | 3 ++- .../web/static/tests/views/list_view_tests.js | 4 ++-- 8 files changed, 23 insertions(+), 28 deletions(-) diff --git a/addons/web/static/tests/core/checkbox_tests.js b/addons/web/static/tests/core/checkbox_tests.js index d3b967b5c89..020ebac0557 100644 --- a/addons/web/static/tests/core/checkbox_tests.js +++ b/addons/web/static/tests/core/checkbox_tests.js @@ -69,22 +69,16 @@ QUnit.module("Components", (hooks) => { assert.strictEqual(value, false); }); - QUnit.test("does not call onChange prop when disabled", async (assert) => { + QUnit.test("checkbox with props disabled", async (assert) => { const env = await makeTestEnv(); - let onChangeCalled = false; - class Parent extends Component { - onChange(checked) { - onChangeCalled = true; - } - } + class Parent extends Component {} Parent.template = xml``; Parent.components = { CheckBox }; await mount(Parent, target, { env }); assert.containsOnce(target, ".o-checkbox input"); - await click(target.querySelector("input")); - assert.strictEqual(onChangeCalled, false); + assert.ok(target.querySelector(".o-checkbox input").disabled); }); QUnit.test("can toggle value by pressing ENTER", async (assert) => { diff --git a/addons/web/static/tests/core/pager_tests.js b/addons/web/static/tests/core/pager_tests.js index 1e327678ac9..b3bd2899301 100644 --- a/addons/web/static/tests/core/pager_tests.js +++ b/addons/web/static/tests/core/pager_tests.js @@ -183,8 +183,6 @@ QUnit.module("Components", ({ beforeEach }) => { }); QUnit.test("pager disabling", async function (assert) { - assert.expect(9); - const reloadPromise = makeDeferred(); const pager = await makePager({ @@ -203,9 +201,9 @@ QUnit.module("Components", ({ beforeEach }) => { }); const pagerButtons = target.querySelectorAll("button"); - // Click twice - await click(target.querySelector(`.o_pager button.o_pager_next`)); + // Click and check button is disabled await click(target.querySelector(`.o_pager button.o_pager_next`)); + assert.ok(target.querySelector(`.o_pager button.o_pager_next`).disabled); // Try to edit the pager value await click(target, ".o_pager_value"); diff --git a/addons/web/static/tests/helpers/utils.js b/addons/web/static/tests/helpers/utils.js index b9a30c739c9..14664263ae2 100644 --- a/addons/web/static/tests/helpers/utils.js +++ b/addons/web/static/tests/helpers/utils.js @@ -446,6 +446,9 @@ export async function triggerScroll( } export function click(el, selector, skipVisibilityCheck = false) { + if (el.disabled) { + throw new Error("Can't click on a disabled button"); + } return triggerEvents( el, selector, diff --git a/addons/web/static/tests/views/fields/many2one_field_tests.js b/addons/web/static/tests/views/fields/many2one_field_tests.js index cc01710a6bb..84ab854dc70 100644 --- a/addons/web/static/tests/views/fields/many2one_field_tests.js +++ b/addons/web/static/tests/views/fields/many2one_field_tests.js @@ -2557,9 +2557,7 @@ QUnit.module("Fields", (hooks) => { await click(buttons[0]); assert.verifySteps(["action"]); - - await click(buttons[1]); - assert.verifySteps([]); // the second button is disabled, it can't be clicked + assert.ok(buttons[1].disabled); def.resolve(); await nextTick(); diff --git a/addons/web/static/tests/views/fields/one2many_field_tests.js b/addons/web/static/tests/views/fields/one2many_field_tests.js index 53486d9ae87..7652ea657b4 100644 --- a/addons/web/static/tests/views/fields/one2many_field_tests.js +++ b/addons/web/static/tests/views/fields/one2many_field_tests.js @@ -12042,7 +12042,6 @@ QUnit.module("Fields", (hooks) => { assert.strictEqual(target.querySelector(".o_data_cell").innerText, "leonardo"); - await click(target.querySelector(".o_field_widget[name=turtles] .o_pager_next")); await click(target.querySelector(".o_field_widget[name=turtles] .o_pager_next")); assert.ok(target.querySelector(".o_field_widget[name=turtles] .o_pager_next").disabled); diff --git a/addons/web/static/tests/views/form/form_view_tests.js b/addons/web/static/tests/views/form/form_view_tests.js index 449975e8be9..1c5a85c22ac 100644 --- a/addons/web/static/tests/views/form/form_view_tests.js +++ b/addons/web/static/tests/views/form/form_view_tests.js @@ -9688,7 +9688,8 @@ QUnit.module("Views", (hooks) => { click(target.querySelector(".modal-footer button.btn-primary")); await Promise.resolve(); - await click(target.querySelector(".modal-footer button.btn-primary")); + assert.ok(target.querySelector(".modal-footer button.btn-primary").disabled); + await nextTick(); assert.verifySteps(["create", "web_read", "execute_action"]); }); @@ -10557,7 +10558,7 @@ QUnit.module("Views", (hooks) => { assert.strictEqual( target.querySelector('.o-tooltip--technical > li[data-item="invisible"]').lastChild .textContent, - 'product_id == 33', + "product_id == 33", "invisible should be properly stringified" ); @@ -11172,10 +11173,9 @@ QUnit.module("Views", (hooks) => { resId: 2, }); + assert.ok(target.querySelector(".o_form_view button.mybutton").disabled); await click(target.querySelector(".o_form_view .o_content button.btn-primary")); assert.verifySteps(["doActionButton"]); - await click(target.querySelector(".o_form_view button.mybutton")); - assert.verifySteps([]); } ); @@ -13780,7 +13780,9 @@ QUnit.module("Views", (hooks) => { QUnit.test("containing a nested x2many list view should not overflow", async function (assert) { serverData.models.partner_type.records.push({ - id: 3, display_name: 'very'.repeat(30) + '_long_name', color: 10, + id: 3, + display_name: "very".repeat(30) + "_long_name", + color: 10, }); const record = serverData.models.partner.records[0]; @@ -13809,11 +13811,11 @@ QUnit.module("Views", (hooks) => { `, }); - const table = target.querySelector('table'); - const group = target.querySelector('.o_inner_group:last-child'); + const table = target.querySelector("table"); + const group = target.querySelector(".o_inner_group:last-child"); assert.equal(group.clientWidth, group.scrollWidth); - table.style.tableLayout = 'auto'; + table.style.tableLayout = "auto"; assert.ok(group.clientWidth < group.scrollWidth); }); }); diff --git a/addons/web/static/tests/views/kanban/kanban_view_tests.js b/addons/web/static/tests/views/kanban/kanban_view_tests.js index 8eb61142545..80e03bb276b 100644 --- a/addons/web/static/tests/views/kanban/kanban_view_tests.js +++ b/addons/web/static/tests/views/kanban/kanban_view_tests.js @@ -8217,7 +8217,8 @@ QUnit.module("Views", (hooks) => { }, }); click(target.querySelector("button.a1")); - await click(target.querySelector("button.a1")); + assert.ok(target.querySelector("button.a1").disabled); + await nextTick(); assert.strictEqual(count, 1, "should have triggered an execute action only once"); assert.verifySteps( diff --git a/addons/web/static/tests/views/list_view_tests.js b/addons/web/static/tests/views/list_view_tests.js index babbdde5b76..8e9761a9c99 100644 --- a/addons/web/static/tests/views/list_view_tests.js +++ b/addons/web/static/tests/views/list_view_tests.js @@ -11056,9 +11056,9 @@ QUnit.module("Views", (hooks) => { assert.containsN(target, ".o_data_row", 4, "should contain 4 records"); - // click on Add twice, and delay the onchange - click($(".o_list_button_add:visible").get(0)); + // click on Add and delay the onchange (check that the button is correctly disabled) click($(".o_list_button_add:visible").get(0)); + assert.ok($(".o_list_button_add:visible").get(0).disabled); prom.resolve(); await nextTick();