Files
test/web_enterprise/static/tests/views/list_tests.js
2023-04-14 17:42:23 +08:00

248 lines
9.3 KiB
JavaScript

/** @odoo-module */
import { getFixture, patchWithCleanup, click, nextTick } from "@web/../tests/helpers/utils";
import { makeView, setupViewRegistries } from "@web/../tests/views/helpers";
import { patch, unpatch } from "@web/core/utils/patch";
import { session } from "@web/session";
import { ListRenderer } from "@web/views/list/list_renderer";
import { browser } from "@web/core/browser/browser";
import { patchListRendererDesktop } from "@web_enterprise/views/list/list_renderer_desktop";
let config;
let serverData;
let target;
QUnit.module(
"web_enterprise",
{
beforeEach() {
target = getFixture();
config = {
actionId: 1,
actionType: "ir.actions.act_window",
};
serverData = {
models: {
foo: {
fields: {
foo: { string: "Foo", type: "char" },
bar: { string: "Bar", type: "boolean" },
},
records: [
{ id: 1, bar: true, foo: "yop" },
{ id: 2, bar: true, foo: "blip" },
{ id: 3, bar: true, foo: "gnap" },
{ id: 4, bar: false, foo: "blip" },
],
},
},
};
patch(
ListRenderer.prototype,
"web_enterprise.ListRendererDesktop",
patchListRendererDesktop
);
setupViewRegistries();
},
afterEach() {
unpatch(ListRenderer.prototype, "web_enterprise.ListRendererDesktop");
},
},
function () {
QUnit.module("ListView");
QUnit.test(
"add custom field button with other optional columns - studio not installed",
async function (assert) {
assert.expect(11);
patchWithCleanup(session, { is_system: true });
await makeView({
serverData,
type: "list",
resModel: "foo",
arch: `
<tree>
<field name="foo"/>
<field name="bar" optional="hide"/>
</tree>`,
mockRPC(route, args) {
if (args.method === "search_read" && args.model === "ir.module.module") {
assert.step("studio_module_id");
return Promise.resolve([{ id: 42 }]);
}
if (
args.method === "button_immediate_install" &&
args.model === "ir.module.module"
) {
assert.deepEqual(
args.args[0],
[42],
"Should be the id of studio module returned by the search read"
);
assert.step("studio_module_install");
return true;
}
},
config,
});
patchWithCleanup(browser.location, {
reload: function () {
assert.step("window_reload");
},
});
assert.containsN(target, ".o_data_row", 4);
assert.containsOnce(target, ".o_optional_columns_dropdown_toggle");
await click(target, ".o_optional_columns_dropdown_toggle");
const dropdown = target.querySelector(".o_optional_columns_dropdown");
assert.containsN(dropdown, ".dropdown-item", 2);
assert.containsOnce(dropdown, ".dropdown-item-studio");
await click(target, ".o_optional_columns_dropdown .dropdown-item-studio");
await nextTick();
assert.containsOnce(target, ".modal-studio");
await click(target, ".modal .o_install_studio");
assert.equal(browser.localStorage.getItem("openStudioOnReload"), "main");
assert.verifySteps(["studio_module_id", "studio_module_install", "window_reload"]);
}
);
QUnit.test(
"add custom field button without other optional columns - studio not installed",
async function (assert) {
assert.expect(11);
patchWithCleanup(session, { is_system: true });
await makeView({
serverData,
type: "list",
resModel: "foo",
config,
arch: `
<tree>
<field name="foo"/>
<field name="bar"/>
</tree>`,
mockRPC: function (route, args) {
if (args.method === "search_read" && args.model === "ir.module.module") {
assert.step("studio_module_id");
return Promise.resolve([{ id: 42 }]);
}
if (
args.method === "button_immediate_install" &&
args.model === "ir.module.module"
) {
assert.deepEqual(
args.args[0],
[42],
"Should be the id of studio module returned by the search read"
);
assert.step("studio_module_install");
return true;
}
},
});
patchWithCleanup(browser.location, {
reload: function () {
assert.step("window_reload");
},
});
assert.containsN(target, ".o_data_row", 4);
assert.containsOnce(target, ".o_optional_columns_dropdown_toggle");
await click(target, ".o_optional_columns_dropdown_toggle");
const dropdown = target.querySelector(".o_optional_columns_dropdown");
assert.containsOnce(dropdown, ".dropdown-item");
assert.containsOnce(dropdown, ".dropdown-item-studio");
await click(target, ".o_optional_columns_dropdown .dropdown-item-studio");
await nextTick();
assert.containsOnce(target, ".modal-studio");
await click(target, ".modal .o_install_studio");
assert.equal(browser.localStorage.getItem("openStudioOnReload"), "main");
assert.verifySteps(["studio_module_id", "studio_module_install", "window_reload"]);
}
);
QUnit.test(
"add custom field button not shown to non-system users (with opt. col.)",
async function (assert) {
assert.expect(3);
patchWithCleanup(session, { is_system: false });
await makeView({
serverData,
type: "list",
resModel: "foo",
config,
arch: `
<tree>
<field name="foo"/>
<field name="bar" optional="hide"/>
</tree>`,
});
assert.containsOnce(target, ".o_optional_columns_dropdown_toggle");
await click(target, ".o_optional_columns_dropdown_toggle");
const dropdown = target.querySelector(".o_optional_columns_dropdown");
assert.containsOnce(dropdown, ".dropdown-item");
assert.containsNone(dropdown, ".dropdown-item-studio");
}
);
QUnit.test(
"add custom field button not shown to non-system users (wo opt. col.)",
async function (assert) {
assert.expect(1);
patchWithCleanup(session, { is_system: false });
await makeView({
serverData,
type: "list",
resModel: "foo",
config,
arch: `
<tree>
<field name="foo"/>
<field name="bar"/>
</tree>`,
});
assert.containsNone(target, ".o_optional_columns_dropdown_toggle");
}
);
QUnit.test(
"add custom field button not shown with invalid action",
async function (assert) {
assert.expect(1);
patchWithCleanup(session, { is_system: false });
config.actionId = null;
await makeView({
serverData,
type: "list",
resModel: "foo",
config,
arch: `
<tree>
<field name="foo"/>
<field name="bar"/>
</tree>`,
});
assert.containsNone(target, ".o_optional_columns_dropdown_toggle");
}
);
}
);