/** @odoo-module **/
import { getFixture, legacyExtraNextTick, patchWithCleanup } from "@web/../tests/helpers/utils";
import {
setupControlPanelServiceRegistry,
switchView,
toggleFilterMenu,
toggleGroupByMenu,
toggleMenuItem,
toggleMenuItemOption,
} from "@web/../tests/search/helpers";
import { makeView } from "@web/../tests/views/helpers";
import { createWebClient, doAction } from "@web/../tests/webclient/helpers";
import { dialogService } from "@web/core/dialog/dialog_service";
import { _lt } from "@web/core/l10n/translation";
import { registry } from "@web/core/registry";
import AbstractModel from "web.AbstractModel";
import AbstractView from "web.AbstractView";
import { controlPanel as cpHelpers, mock } from "web.test_utils";
import legacyViewRegistry from "web.view_registry";
import { browser } from "@web/core/browser/browser";
const patchDate = mock.patchDate;
const serviceRegistry = registry.category("services");
const forecastDomain = (forecastStart) => {
return ["|", ["date_field", "=", false], ["date_field", ">=", forecastStart]];
};
let serverData;
let target;
QUnit.module("Views", (hooks) => {
hooks.beforeEach(async () => {
serverData = {
models: {
foo: {
fields: {
date_field: {
string: "Date Field",
type: "date",
store: true,
sortable: true,
},
bar: {
string: "Bar",
type: "many2one",
relation: "partner",
store: true,
sortable: true,
},
},
records: [],
},
partner: {},
},
views: {
"foo,false,legacy_toy": ``,
"foo,false,graph": ``,
"foo,false,search": `
`,
},
};
setupControlPanelServiceRegistry();
serviceRegistry.add("dialog", dialogService);
target = getFixture();
});
QUnit.module("Forecast views");
QUnit.test("Forecast graph view", async function (assert) {
assert.expect(5);
patchWithCleanup(browser, { setTimeout: (fn) => fn() });
const unpatchDate = patchDate(2021, 8, 16, 16, 54, 0);
const expectedDomains = [
forecastDomain("2021-09-01"), // month granularity due to no groupby
forecastDomain("2021-09-16"), // day granularity due to simple bar groupby
// quarter granularity due to date field groupby activated with quarter interval option
forecastDomain("2021-07-01"),
// quarter granularity due to date field groupby activated with quarter and year interval option
forecastDomain("2021-01-01"),
// forecast filter no more active
[],
];
await makeView({
resModel: "foo",
type: "graph",
serverData,
searchViewId: false,
context: {
search_default_forecast_filter: 1,
forecast_field: "date_field",
},
mockRPC(_, args) {
if (args.method === "web_read_group") {
const { domain } = args.kwargs;
assert.deepEqual(domain, expectedDomains.shift());
}
},
});
await toggleGroupByMenu(target);
await toggleMenuItem(target, "Bar");
await toggleMenuItem(target, "Date Field");
await toggleMenuItemOption(target, "Date Field", "Quarter");
await toggleMenuItemOption(target, "Date Field", "Year");
await toggleFilterMenu(target);
await toggleMenuItem(target, "Forecast Filter");
unpatchDate();
});
QUnit.test(
"forecast filter domain is combined with other domains with an AND",
async function (assert) {
assert.expect(1);
const unpatchDate = patchDate(2021, 8, 16, 16, 54, 0);
serverData.views["foo,false,search"] = `
`;
await makeView({
resModel: "foo",
type: "graph",
serverData,
searchViewId: false,
context: {
search_default_other_filter: 1,
search_default_forecast_filter: 1,
forecast_field: "date_field",
},
mockRPC(_, args) {
if (args.method === "web_read_group") {
const { domain } = args.kwargs;
assert.deepEqual(domain, [
"&",
["bar", "=", 2],
"|",
["date_field", "=", false],
["date_field", ">=", "2021-09-01"],
]);
}
},
});
// note that the facets of the two filters are combined with an OR.
// --> current behavior in legacy
unpatchDate();
}
);
/** @todo remove this legacy test when conversion of all forecast views is done */
QUnit.test(
"legacy and new forecast views can share search model state",
async function (assert) {
assert.expect(16);
patchWithCleanup(browser, { setTimeout: (fn) => fn() });
const unpatchDate = patchDate(2021, 8, 16, 16, 54, 0);
const expectedDomains = [
// first doAction
forecastDomain("2021-09-01"), // initial load of forecast_graph
forecastDomain("2021-07-01"), // toggle date field groupby with quarter option
forecastDomain("2021-07-01"), // initial load of legacy_toy
forecastDomain("2021-01-01"), // toggle date field groupby with year option
forecastDomain("2021-01-01"), // switch back to forecast_graph
// second doAction
forecastDomain("2021-09-01"), // initial load of legacy_toy
forecastDomain("2021-07-01"), // toggle date field groupby with quarter option
forecastDomain("2021-07-01"), // switch to forecast_graph
forecastDomain("2021-01-01"), // toggle date field groupby with year option
forecastDomain("2021-01-01"), // switch back to legacy_toy
];
patchWithCleanup(AbstractModel.prototype, {
async load(params) {
assert.deepEqual(params.domain, expectedDomains.shift());
return this._super(...arguments);
},
async reload(_, params) {
assert.deepEqual(params.domain, expectedDomains.shift());
return this._super(...arguments);
},
});
const LegacyForecastView = AbstractView.extend({
display_name: _lt("Legacy toy view"),
icon: "fa fa-bars",
multiRecord: true,
viewType: "legacy_toy",
searchMenuTypes: ["filter", "groupBy"],
_createSearchModel(params, extraExtensions = {}) {
Object.assign(extraExtensions, { forecast: {} });
return this._super(params, extraExtensions);
},
});
legacyViewRegistry.add("legacy_toy", LegacyForecastView);
const webClient = await createWebClient({
serverData,
mockRPC(_, args) {
if (args.method === "web_read_group") {
const { domain } = args.kwargs;
assert.deepEqual(domain, expectedDomains.shift());
}
},
});
// first doAction forecast_graph -> legacy_toy -> forecast_graph
await doAction(webClient, {
name: "Action name",
res_model: "foo",
type: "ir.actions.act_window",
views: [
[false, "graph"],
[false, "legacy_toy"],
],
context: {
search_default_forecast_filter: 1,
forecast_field: "date_field",
},
});
assert.containsOnce(target, ".o_switch_view.o_graph.active");
await toggleGroupByMenu(target);
await toggleMenuItem(target, "Date Field");
await toggleMenuItemOption(target, "Date Field", "Quarter");
await switchView(target, "legacy_toy");
await legacyExtraNextTick();
assert.containsOnce(target, ".o_switch_view.o_legacy_toy.active");
await cpHelpers.toggleGroupByMenu(target);
await toggleMenuItem(target, "Date Field");
await toggleMenuItemOption(target, "Date Field", "Year");
await switchView(target, "graph");
assert.containsOnce(target, ".o_switch_view.o_graph.active");
// second doAction legacy_toy -> forecast_graph -> legacy_toy
await doAction(webClient, {
name: "Action name",
res_model: "foo",
type: "ir.actions.act_window",
views: [
[false, "legacy_toy"],
[false, "graph"],
],
context: {
search_default_forecast_filter: 1,
forecast_field: "date_field",
},
});
await legacyExtraNextTick();
assert.containsOnce(target, ".o_switch_view.o_legacy_toy.active");
await cpHelpers.toggleGroupByMenu(target);
await toggleMenuItem(target, "Date Field");
await toggleMenuItemOption(target, "Date Field", "Quarter");
await switchView(target, "graph");
assert.containsOnce(target, ".o_switch_view.o_graph.active");
await toggleGroupByMenu(target);
await toggleMenuItem(target, "Date Field");
await toggleMenuItemOption(target, "Date Field", "Year");
await switchView(target, "legacy_toy");
await legacyExtraNextTick();
assert.containsOnce(target, ".o_switch_view.o_legacy_toy.active");
unpatchDate();
}
);
});