odoo18/addons/analytic/static/tests/analytic_widget.test.js

120 lines
6.3 KiB
JavaScript

import { beforeEach, expect, test } from "@odoo/hoot";
import { animationFrame, runAllTimers } from "@odoo/hoot-mock";
import { contains, makeMockServer, mountView, onRpc } from "@web/../tests/web_test_helpers";
import { defineAnalyticModels } from "./analytic_test_helpers";
defineAnalyticModels()
beforeEach(async () => {
const { env } = await makeMockServer();
const plan = env['account.analytic.plan'].create({ name: "State", root_id: 1 });
const accounts = env['account.analytic.account'].create([
{ plan_id: plan, name: "Brussels" },
{ plan_id: plan, name: "Antwerpen" },
{ plan_id: plan, name: "Paris" },
{ plan_id: plan, name: "Marseille" },
{ plan_id: plan, name: "New York" },
{ plan_id: plan, name: "Los Angeles" },
])
env["account.analytic.line"].create([
{ x_plan1_id: accounts[0], analytic_distribution: {[accounts[0]]: 100}, amount: 1 },
{ x_plan1_id: accounts[1], analytic_distribution: {[accounts[1]]: 100}, amount: 10 },
{ x_plan1_id: accounts[2], analytic_distribution: {[accounts[2]]: 100}, amount: 100 },
{ x_plan1_id: accounts[3], analytic_distribution: {[accounts[3]]: 100}, amount: 1000 },
{ x_plan1_id: accounts[4], analytic_distribution: {[accounts[4]]: 100}, amount: 10000 },
{ x_plan1_id: accounts[5], analytic_distribution: {[accounts[5]]: 100}, amount: 100000 },
]);
});
test.tags("desktop");
test("Analytic single-edit no dynamic", async () => {
onRpc("account.analytic.line", "write", (params) => {
// don't have "to update" information if not in multi edit
expect(params.args[1].analytic_distribution.__update__).toBe(undefined);
});
await mountView({
type: "list",
resModel: "account.analytic.line",
arch: `
<list multi_edit="1" default_order="id DESC">
<field name="account_id"/>
<field name="x_plan1_id"/>
<field name="analytic_distribution" widget="analytic_distribution" options="{'multi_edit': False}"/>
</list>`,
});
// select the first 2 lines to be able to edit
await contains(".o_list_table tbody tr:nth-child(1) .o_list_record_selector input").click();
await contains(".o_list_table tbody tr:nth-child(2) .o_list_record_selector input").click();
await contains(".o_list_table tbody tr:first .o_field_analytic_distribution").click();
await animationFrame();
expect(".analytic_distribution_popup").toHaveCount(1);
// all the fields should be displayed
expect(".analytic_distribution_popup tbody tr:first .o_field_many2one").toHaveCount(1);
// we shouldn't display the button-links to hide/display the fields
expect(".analytic_distribution_popup .o_list_table thead th:first a").toHaveCount(0);
await contains(".o_list_renderer").click();
})
test.tags("desktop");
test("Analytic dynamic multi-edit", async () => {
let to_update;
onRpc("account.analytic.line", "write", (params) => {
expect(params.args[1].analytic_distribution.__update__).toEqual(to_update);
});
await mountView({
type: "list",
resModel: "account.analytic.line",
arch: `
<list multi_edit="1" default_order="id DESC">
<field name="account_id"/>
<field name="x_plan1_id"/>
<field name="analytic_distribution" widget="analytic_distribution" options="{'multi_edit': True}"/>
</list>`,
});
expect(".o_list_table tbody tr:nth-child(1) .o_field_analytic_distribution .o_tag_badge_text").toHaveText("Los Angeles");
expect(".o_list_table tbody tr:nth-child(2) .o_field_analytic_distribution .o_tag_badge_text").toHaveText("New York");
// select the first 2 lines to be able to edit
await contains(".o_list_table tbody tr:nth-child(1) .o_list_record_selector input").click();
await contains(".o_list_table tbody tr:nth-child(2) .o_list_record_selector input").click();
// everything is empty when opening the widget
await contains(".o_list_table tbody tr:first .o_field_analytic_distribution").click();
await animationFrame();
expect(".analytic_distribution_popup").toHaveCount(1);
expect(".analytic_distribution_popup tbody tr:first .o_field_many2one").toHaveCount(0);
await contains(".o_list_renderer").click(); // close the widget
await contains(".modal-footer .btn-secondary").click(); // cancel confirmation
// update the right columns when ticked
to_update = ["x_plan1_id"];
await contains(".o_list_table tbody tr:first .o_field_analytic_distribution").click();
await animationFrame();
await contains(".analytic_distribution_popup .o_list_table thead th:first a").click();
expect(".analytic_distribution_popup tbody tr:first .o_field_many2one").toHaveCount(1);
await contains(".analytic_distribution_popup tbody tr:first .o_field_many2one").click();
await contains(".analytic_distribution_popup tbody tr:first .o_field_many2one input").edit("Brussels", {confirm: false});
await runAllTimers();
await contains(".analytic_distribution_popup tbody tr:first .o_field_many2one .o_input_dropdown a").click();
await contains(".o_list_renderer").click(); // close the widget
// we don't change the value until it's saved
expect(".o_list_table tbody tr:nth-child(1) .o_field_analytic_distribution .o_tag_badge_text").toHaveText("Los Angeles");
expect(".o_list_table tbody tr:nth-child(2) .o_field_analytic_distribution .o_tag_badge_text").toHaveText("New York");
await contains(".modal-footer .btn-primary").click(); // validate confirmation
await runAllTimers();
expect(".o_list_table tbody tr:nth-child(1) .o_field_analytic_distribution .o_tag_badge_text").toHaveText("Brussels");
expect(".o_list_table tbody tr:nth-child(2) .o_field_analytic_distribution .o_tag_badge_text").toHaveText("Brussels");
// everything should be back to like the first time we opened it
to_update = [];
await contains(".o_list_table tbody tr:first .o_field_analytic_distribution").click();
await animationFrame();
expect(".analytic_distribution_popup").toHaveCount(1);
expect(".analytic_distribution_popup tbody tr:first .o_field_many2one").toHaveCount(0);
await contains(".o_list_renderer").click(); // close the widget
await contains(".modal-footer .btn-primary").click(); // validate confirmation
})