Odoo18-Base/addons/spreadsheet/static/tests/links/open_links.test.js
2025-01-06 10:57:38 +07:00

204 lines
7.1 KiB
JavaScript

import { describe, expect, test } from "@odoo/hoot";
import { animationFrame } from "@odoo/hoot-mock";
import * as spreadsheet from "@odoo/o-spreadsheet";
import { defineSpreadsheetModels } from "@spreadsheet/../tests/helpers/data";
import { makeSpreadsheetMockEnv } from "@spreadsheet/../tests/helpers/model";
import { makeMockEnv, mockService, patchWithCleanup } from "@web/../tests/web_test_helpers";
import { getMenuServerData } from "@spreadsheet/../tests/links/menu_data_utils";
import { setCellContent } from "@spreadsheet/../tests/helpers/commands";
import { getEvaluatedCell } from "@spreadsheet/../tests/helpers/getters";
describe.current.tags("headless");
defineSpreadsheetModels();
const { Model } = spreadsheet;
const { urlRepresentation, openLink } = spreadsheet.links;
test("click a web link", async () => {
patchWithCleanup(window, {
open: (href) => {
expect.step(href.toString());
},
});
const env = await makeMockEnv();
const data = {
sheets: [
{
cells: { A1: { content: "[Odoo](https://odoo.com)" } },
},
],
};
const model = new Model(data, { custom: { env } });
const cell = getEvaluatedCell(model, "A1");
expect(urlRepresentation(cell.link, model.getters)).toBe("https://odoo.com");
openLink(cell.link, env);
expect.verifySteps(["https://odoo.com"]);
});
test("click a menu link", async () => {
const fakeActionService = {
doAction(action) {
expect.step(action);
},
// TODO: this is the conversion 1/1 of the old test, where the mock action service didn't contain a loadAction
// method, but that's not something that happens in the real world, so we should probably refactor this test
loadAction: undefined,
};
mockService("action", fakeActionService);
const env = await makeSpreadsheetMockEnv({ serverData: getMenuServerData() });
const data = {
sheets: [
{
cells: { A1: { content: "[label](odoo://ir_menu_xml_id/test_menu)" } },
},
],
};
const model = new Model(data, { custom: { env } });
const cell = getEvaluatedCell(model, "A1");
expect(urlRepresentation(cell.link, model.getters)).toBe("menu with xmlid");
openLink(cell.link, env);
expect.verifySteps(["spreadsheet.action1"]);
});
test("click a menu link [2]", async () => {
const fakeActionService = {
doAction(action) {
expect.step("do-action");
expect(action).toEqual({
name: "an odoo view",
res_model: "partner",
target: "current",
type: "ir.actions.act_window",
views: [[false, "list"]],
});
},
// TODO: same as the above test
loadAction: undefined,
};
mockService("action", fakeActionService);
const env = await makeSpreadsheetMockEnv({ serverData: getMenuServerData() });
const view = {
name: "an odoo view",
viewType: "list",
action: {
modelName: "partner",
views: [[false, "list"]],
},
};
const model = new Model({}, { custom: { env } });
setCellContent(model, "A1", `[a view](odoo://view/${JSON.stringify(view)})`);
const cell = getEvaluatedCell(model, "A1");
expect(urlRepresentation(cell.link, model.getters)).toBe("an odoo view");
openLink(cell.link, env);
expect.verifySteps(["do-action"]);
});
test("Click a link containing an action xml id", async () => {
mockService("action", {
doAction: (action) => {
expect.step("do-action");
expect(action.name).toBe("My Action Name");
expect(action.res_model).toBe("ir.ui.menu");
expect(action.target).toBe("current");
expect(action.type).toBe("ir.actions.act_window");
expect(action.views).toEqual([[1, "list"]]);
expect(action.domain).toEqual([(1, "=", 1)]);
},
});
const env = await makeSpreadsheetMockEnv({ serverData: getMenuServerData() });
const view = {
name: "My Action Name",
viewType: "list",
action: {
modelName: "ir.ui.menu",
views: [[false, "list"]],
domain: [(1, "=", 1)],
xmlId: "spreadsheet.action1",
},
};
const model = new Model({}, { custom: { env } });
setCellContent(model, "A1", `[an action link](odoo://view/${JSON.stringify(view)})`);
const cell = getEvaluatedCell(model, "A1");
expect(urlRepresentation(cell.link, model.getters)).toBe("My Action Name");
await openLink(cell.link, env);
await animationFrame();
expect.verifySteps(["do-action"]);
});
test("Can open link when some views are absent from the referred action", async () => {
const env = await makeSpreadsheetMockEnv({ serverData: getMenuServerData() });
env.services.action = {
...env.services.action,
doAction(action) {
expect.step("do-action");
expect(action.name).toBe("My Action Name");
expect(action.res_model).toBe("ir.ui.menu");
expect(action.target).toBe("current");
expect(action.type).toBe("ir.actions.act_window");
expect(action.views).toEqual([
[false, "list"],
[false, "form"],
]);
expect(action.domain).toEqual([(1, "=", 1)]);
},
};
const view = {
name: "My Action Name",
viewType: "list",
action: {
modelName: "ir.ui.menu",
views: [
[false, "list"],
[false, "form"],
],
domain: [(1, "=", 1)],
xmlId: "spreadsheet.action2",
},
};
const model = new Model({}, { custom: { env } });
setCellContent(model, "A1", `[an action link](odoo://view/${JSON.stringify(view)})`);
const cell = getEvaluatedCell(model, "A1");
expect(urlRepresentation(cell.link, model.getters)).toBe("My Action Name");
await openLink(cell.link, env);
await animationFrame();
expect.verifySteps(["do-action"]);
});
test("Context is passed correctly to the action service", async () => {
const env = await makeSpreadsheetMockEnv({ serverData: getMenuServerData() });
env.services.action = {
...env.services.action,
loadAction(_, context) {
expect.step("load-action");
expect(context).toEqual({ search_default_partner: 1 });
},
};
const view = {
name: "My Action Name",
viewType: "list",
action: {
modelName: "ir.ui.menu",
views: [[false, "list"]],
domain: [(1, "=", 1)],
xmlId: "spreadsheet.action1",
context: { search_default_partner: 1 },
},
};
const model = new Model({}, { custom: { env } });
setCellContent(model, "A1", `[an action link](odoo://view/${JSON.stringify(view)})`);
const cell = getEvaluatedCell(model, "A1");
expect(urlRepresentation(cell.link, model.getters)).toBe("My Action Name");
await openLink(cell.link, env);
await animationFrame();
expect.verifySteps(["load-action"]);
});