Odoo18-Base/addons/web/static/tests/webclient/loading_indicator_tests.js
2025-03-10 10:52:11 +07:00

154 lines
5.9 KiB
JavaScript

/** @odoo-module **/
import { browser as originalBrowser } from "@web/core/browser/browser";
import { registry } from "@web/core/registry";
import { uiService } from "@web/core/ui/ui_service";
import { LoadingIndicator } from "@web/webclient/loading_indicator/loading_indicator";
import { makeTestEnv } from "../helpers/mock_env";
import {
getFixture,
mockTimeout,
mount,
nextTick,
patchWithCleanup,
} from "@web/../tests/helpers/utils";
const serviceRegistry = registry.category("services");
let target;
QUnit.module("LoadingIndicator", {
async beforeEach() {
target = getFixture();
serviceRegistry.add("ui", uiService);
patchWithCleanup(originalBrowser, {
setTimeout: async (f) => {
await Promise.resolve();
f();
},
});
},
});
const payload = (id) => ({ data: { id }, settings: {} });
QUnit.test("displays the loading indicator in non debug mode", async (assert) => {
const env = await makeTestEnv();
await mount(LoadingIndicator, target, { env });
let loadingIndicator = target.querySelector(".o_loading_indicator");
assert.strictEqual(loadingIndicator, null, "the loading indicator should not be displayed");
env.bus.trigger("RPC:REQUEST", payload(1));
await nextTick();
loadingIndicator = target.querySelector(".o_loading_indicator");
assert.notStrictEqual(loadingIndicator, null, "the loading indicator should be displayed");
assert.strictEqual(
loadingIndicator.textContent,
"Loading",
"the loading indicator should display 'Loading'"
);
env.bus.trigger("RPC:RESPONSE", payload(1));
await nextTick();
loadingIndicator = target.querySelector(".o_loading_indicator");
assert.strictEqual(loadingIndicator, null, "the loading indicator should not be displayed");
});
QUnit.test("displays the loading indicator for one rpc in debug mode", async (assert) => {
patchWithCleanup(odoo, { debug: "1" });
const env = await makeTestEnv();
await mount(LoadingIndicator, target, { env });
let loadingIndicator = target.querySelector(".o_loading_indicator");
assert.strictEqual(loadingIndicator, null, "the loading indicator should not be displayed");
env.bus.trigger("RPC:REQUEST", payload(1));
await nextTick();
loadingIndicator = target.querySelector(".o_loading_indicator");
assert.notStrictEqual(loadingIndicator, null, "the loading indicator should be displayed");
assert.strictEqual(
loadingIndicator.textContent,
"Loading (1)",
"the loading indicator should indicate 1 request in progress"
);
env.bus.trigger("RPC:RESPONSE", payload(1));
await nextTick();
loadingIndicator = target.querySelector(".o_loading_indicator");
assert.strictEqual(loadingIndicator, null, "the loading indicator should not be displayed");
});
QUnit.test("displays the loading indicator for multi rpc in debug mode", async (assert) => {
patchWithCleanup(odoo, { debug: "1" });
const env = await makeTestEnv();
await mount(LoadingIndicator, target, { env });
let loadingIndicator = target.querySelector(".o_loading_indicator");
assert.strictEqual(loadingIndicator, null, "the loading indicator should not be displayed");
env.bus.trigger("RPC:REQUEST", payload(1));
env.bus.trigger("RPC:REQUEST", payload(2));
await nextTick();
loadingIndicator = target.querySelector(".o_loading_indicator");
assert.notStrictEqual(loadingIndicator, null, "the loading indicator should be displayed");
assert.strictEqual(
loadingIndicator.textContent,
"Loading (2)",
"the loading indicator should indicate 2 requests in progress."
);
env.bus.trigger("RPC:REQUEST", payload(3));
await nextTick();
loadingIndicator = target.querySelector(".o_loading_indicator");
assert.strictEqual(
loadingIndicator.textContent,
"Loading (3)",
"the loading indicator should indicate 3 requests in progress."
);
env.bus.trigger("RPC:RESPONSE", payload(1));
await nextTick();
loadingIndicator = target.querySelector(".o_loading_indicator");
assert.strictEqual(
loadingIndicator.textContent,
"Loading (2)",
"the loading indicator should indicate 2 requests in progress."
);
env.bus.trigger("RPC:REQUEST", payload(4));
await nextTick();
loadingIndicator = target.querySelector(".o_loading_indicator");
assert.strictEqual(
loadingIndicator.textContent,
"Loading (3)",
"the loading indicator should indicate 3 requests in progress."
);
env.bus.trigger("RPC:RESPONSE", payload(2));
env.bus.trigger("RPC:RESPONSE", payload(3));
await nextTick();
loadingIndicator = target.querySelector(".o_loading_indicator");
assert.strictEqual(
loadingIndicator.textContent,
"Loading (1)",
"the loading indicator should indicate 1 request in progress."
);
env.bus.trigger("RPC:RESPONSE", payload(4));
await nextTick();
loadingIndicator = target.querySelector(".o_loading_indicator");
assert.strictEqual(loadingIndicator, null, "the loading indicator should not be displayed");
});
QUnit.test("loading indicator is not displayed immediately", async (assert) => {
const env = await makeTestEnv();
const { advanceTime } = mockTimeout();
const ui = env.services.ui;
ui.bus.addEventListener("BLOCK", () => {
assert.step("block");
});
ui.bus.addEventListener("UNBLOCK", () => {
assert.step("unblock");
});
await mount(LoadingIndicator, target, { env });
env.bus.trigger("RPC:REQUEST", payload(1));
await nextTick();
assert.containsNone(target, ".o_loading_indicator");
await advanceTime(400);
await nextTick();
assert.containsOnce(target, ".o_loading_indicator");
env.bus.trigger("RPC:RESPONSE", payload(1));
await nextTick();
assert.containsNone(target, ".o_loading_indicator");
});