143 lines
5.1 KiB
JavaScript
143 lines
5.1 KiB
JavaScript
import { animationFrame } from "@odoo/hoot-mock";
|
|
import { makeSpreadsheetMockEnv } from "@spreadsheet/../tests/helpers/model";
|
|
import { WebClient } from "@web/webclient/webclient";
|
|
import { getService, mountWithCleanup, patchWithCleanup, makeMockServer } from "@web/../tests/web_test_helpers";
|
|
import {
|
|
prepareWebClientForSpreadsheet,
|
|
getSpreadsheetActionModel,
|
|
getSpreadsheetActionEnv,
|
|
} from "@spreadsheet_edition/../tests/helpers/webclient_helpers";
|
|
import { SpreadsheetTestAction } from "@test_spreadsheet_edition/spreadsheet_test_action";
|
|
import { VersionHistoryAction } from "@spreadsheet_edition/bundle/version_history/version_history_action";
|
|
import { SpreadsheetTest, getDummyBasicServerData } from "./data";
|
|
import { getPyEnv } from "@spreadsheet/../tests/helpers/data";
|
|
import { session } from "@web/session";
|
|
import { mailDataHelpers } from "@mail/../tests/mock_server/mail_mock_server";
|
|
|
|
/**
|
|
* @typedef {import("@spreadsheet/../tests/helpers/data").ServerData} ServerData
|
|
|
|
* @typedef {object} SpreadsheetTestParams
|
|
* @property {number} [spreadsheetId]
|
|
* @property {ServerData} [serverData] Data to be injected in the mock server
|
|
* @property {Function} [mockRPC] Mock rpc function
|
|
* @property {boolean} [fromSnapshot]
|
|
* @property {number | string} [threadId]
|
|
* @property {WebClient} [webClient]
|
|
*/
|
|
|
|
/**
|
|
* @param {string} actionTag Action tag ("spreadsheet_test_action" or "action_open_spreadsheet_history")
|
|
* @param {SpreadsheetTestParams} params
|
|
*/
|
|
export async function createSpreadsheetTestAction(actionTag, params = {}) {
|
|
/** @type {any} */
|
|
let spreadsheetAction;
|
|
let { webClient } = params;
|
|
const SpreadsheetActionComponent =
|
|
actionTag === "spreadsheet_test_action" ? SpreadsheetTestAction : VersionHistoryAction;
|
|
patchWithCleanup(SpreadsheetActionComponent.prototype, {
|
|
setup() {
|
|
super.setup();
|
|
spreadsheetAction = this;
|
|
},
|
|
});
|
|
|
|
const serverData = params.serverData || getDummyBasicServerData();
|
|
let spreadsheetId = params.spreadsheetId;
|
|
if (!spreadsheetId) {
|
|
spreadsheetId = createNewDummySpreadsheet(serverData);
|
|
}
|
|
|
|
if (!webClient) {
|
|
await prepareWebClientForSpreadsheet();
|
|
webClient = await makeSpreadsheetMockEnv({
|
|
serverData,
|
|
mockRPC: params.mockRPC,
|
|
});
|
|
await mountWithCleanup(WebClient);
|
|
}
|
|
|
|
await getService("action").doAction({
|
|
type: "ir.actions.client",
|
|
tag: actionTag,
|
|
params: {
|
|
spreadsheet_id: spreadsheetId,
|
|
res_model: "spreadsheet.test",
|
|
from_snapshot: params.fromSnapshot,
|
|
thread_id: params.threadId,
|
|
},
|
|
});
|
|
await animationFrame();
|
|
return {
|
|
model: getSpreadsheetActionModel(spreadsheetAction),
|
|
env: getSpreadsheetActionEnv(spreadsheetAction),
|
|
action: spreadsheetAction,
|
|
};
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param {ServerData} serverData
|
|
* @param {object} [data] spreadsheet data
|
|
* @returns {number}
|
|
*/
|
|
export function createNewDummySpreadsheet(serverData, data) {
|
|
if (!serverData.models["spreadsheet.test"].records) {
|
|
serverData.models["spreadsheet.test"].records = [];
|
|
}
|
|
const spreadsheetDummy = serverData.models["spreadsheet.test"].records;
|
|
const maxId = spreadsheetDummy.length ? Math.max(...spreadsheetDummy.map((d) => d.id)) : 0;
|
|
const spreadsheetId = maxId + 1;
|
|
spreadsheetDummy.push({
|
|
id: spreadsheetId,
|
|
name: "Untitled Dummy Spreadsheet",
|
|
spreadsheet_data: data ? JSON.stringify(data) : "{}",
|
|
});
|
|
return spreadsheetId;
|
|
}
|
|
|
|
export async function setupWithThreads(workbookdata = {}) {
|
|
SpreadsheetTest._records = [
|
|
{
|
|
id: 1,
|
|
name: "Untitled Dummy Spreadsheet",
|
|
spreadsheet_data: JSON.stringify(workbookdata),
|
|
},
|
|
];
|
|
|
|
// When sending messages, the user needs to exist and be correctly configured in the server data so he can edit his messages.
|
|
const { env: pyEnv } = await makeMockServer();
|
|
if ("res.users" in pyEnv) {
|
|
/** @type {import("mock_models").ResUsers} */
|
|
const ResUsers = pyEnv["res.users"];
|
|
const store = new mailDataHelpers.Store();
|
|
ResUsers._init_store_data(store);
|
|
patchWithCleanup(session, {
|
|
storeData: store.get_result(),
|
|
});
|
|
}
|
|
const result = await createSpreadsheetTestAction("spreadsheet_test_action", {
|
|
spreadsheetId: 1,
|
|
});
|
|
return { ...result, spreadsheetId: 1, pyEnv: getPyEnv() };
|
|
}
|
|
|
|
export async function createThread(model, pyEnv, threadPosition, messages = []) {
|
|
const [spreadsheetId] = pyEnv["spreadsheet.test"].search([], { limit: 1 });
|
|
const threadId = pyEnv["spreadsheet.cell.thread"].create({
|
|
dummy_id: spreadsheetId,
|
|
});
|
|
messages.forEach((msg) =>
|
|
pyEnv["mail.message"].create({
|
|
body: `<p>${msg}</p>`,
|
|
message_type: "comment",
|
|
model: "spreadsheet.cell.thread",
|
|
res_id: threadId,
|
|
})
|
|
);
|
|
const result = model.dispatch("ADD_COMMENT_THREAD", { ...threadPosition, threadId });
|
|
await animationFrame();
|
|
return result;
|
|
}
|