Files
enterprise-addons/spreadsheet_edition/static/tests/helpers/collaborative_helpers.js
T

137 lines
3.9 KiB
JavaScript

import { Model } from "@odoo/o-spreadsheet";
import { MockSpreadsheetCollaborativeChannel } from "./mock_spreadsheet_collaborative_channel";
import {
makeSpreadsheetMockEnv,
setupDataSourceEvaluation,
} from "@spreadsheet/../tests/helpers/model";
import { OdooDataProvider } from "@spreadsheet/data_sources/odoo_data_provider";
import { expect } from "@odoo/hoot";
import { OdooPivot } from "@spreadsheet/pivot/odoo_pivot";
import { waitForDataLoaded } from "@spreadsheet/helpers/model";
/**
* @typedef {import("@spreadsheet").OdooSpreadsheetModel} Model
* @typedef {import("@spreadsheet").OdooPivotDefinition} OdooPivotDefinition
*/
export function makeFakeSpreadsheetService() {
return {
makeCollaborativeChannel() {
return new MockSpreadsheetCollaborativeChannel();
},
};
}
export function joinSession(spreadsheetChannel, client) {
spreadsheetChannel.broadcast({
type: "CLIENT_JOINED",
client: {
position: {
sheetId: "1",
col: 1,
row: 1,
},
name: "Raoul Grosbedon",
...client,
},
});
}
export function leaveSession(spreadsheetChannel, clientId) {
spreadsheetChannel.broadcast({
type: "CLIENT_LEFT",
clientId,
});
}
/**
* Setup a realtime collaborative test environment, with the given data
*/
export async function setupCollaborativeEnv(serverData) {
const env = await makeSpreadsheetMockEnv({ serverData });
const network = new MockSpreadsheetCollaborativeChannel();
const model = new Model();
const alice = new Model(model.exportData(), {
custom: {
env,
odooDataProvider: new OdooDataProvider(env),
},
transportService: network,
client: { id: "alice", name: "Alice" },
});
const bob = new Model(model.exportData(), {
custom: {
odooDataProvider: new OdooDataProvider(env),
env,
},
transportService: network,
client: { id: "bob", name: "Bob" },
});
const charlie = new Model(model.exportData(), {
custom: {
odooDataProvider: new OdooDataProvider(env),
env,
},
transportService: network,
client: { id: "charlie", name: "Charlie" },
});
setupDataSourceEvaluation(alice);
setupDataSourceEvaluation(bob);
setupDataSourceEvaluation(charlie);
return { network, alice, bob, charlie };
}
export function spExpect(models) {
return {
toHaveSynchronizedValue(callback, expectedValue) {
const actualValues = models.map(callback);
expect(actualValues).toEqual(Array(models.length).fill(expectedValue));
},
};
}
export async function insertPivot(model, sheetId = model.getters.getActiveSheetId()) {
const pivotId = "PIVOT#1";
/** @type {OdooPivotDefinition} */
const pivot = {
columns: [{ fieldName: "foo" }],
rows: [{ fieldName: "bar" }],
measures: [
{
id: "probability:sum",
fieldName: "probability",
aggregator: "sum",
},
],
model: "partner",
domain: [],
context: {},
name: "Partner",
type: "ODOO",
};
model.dispatch("ADD_PIVOT", {
pivotId: pivotId,
pivot,
});
const ds = model.getters.getPivot(pivotId);
if (!(ds instanceof OdooPivot)) {
throw new Error("The pivot data source is not an OdooPivot");
}
await ds.load();
const table = ds.getCollapsedTableStructure().export();
model.dispatch("INSERT_PIVOT", {
sheetId,
col: 0,
row: 0,
pivotId,
table,
});
const columns = [];
for (let col = 0; col <= table.cols[table.cols.length - 1].length; col++) {
columns.push(col);
}
model.dispatch("AUTORESIZE_COLUMNS", { sheetId, cols: columns });
await waitForDataLoaded(model);
}