Odoo18-Base/extra-addons/web_studio/static/tests/approval/form_approval.test.js

234 lines
6.2 KiB
JavaScript

import { before, expect, test } from "@odoo/hoot";
import {
contains,
defineModels,
fields,
makeServerError,
models,
mountView,
onRpc,
} from "@web/../tests/web_test_helpers";
import { defineMailModels } from "@mail/../tests/mail_test_helpers";
import { animationFrame } from "@odoo/hoot-mock";
class ApprovalModel extends models.Model {
async get_views() {
const res = await super.get_views(...arguments);
res.models[this._name].has_approval_rules = true;
return res;
}
}
class Partner extends ApprovalModel {
display_name = fields.Char();
image = fields.Binary();
empty_image = fields.Binary();
_records = [
{
id: 1,
display_name: "jean",
},
];
}
function getAllRules() {
return {
43: {
id: 43,
name: false,
message: false,
exclusive_user: true,
can_validate: false,
action_id: false,
method: "my_method",
approver_ids: [6],
users_to_notify: [],
approval_group_id: false,
notification_order: "1",
domain: false,
},
2: {
id: 2,
name: false,
message: false,
exclusive_user: true,
can_validate: false,
action_id: false,
method: "my_method",
approver_ids: [6],
users_to_notify: [],
approval_group_id: false,
notification_order: "1",
domain: false,
},
3: {
id: 3,
name: false,
message: false,
exclusive_user: true,
can_validate: true,
action_id: false,
method: "my_method",
approver_ids: [6],
users_to_notify: [],
approval_group_id: false,
notification_order: "2",
domain: false,
},
};
}
defineModels([Partner]);
defineMailModels();
let ALL_RULES;
let MODEL_ENTRIES;
before(() => {
ALL_RULES = getAllRules();
MODEL_ENTRIES = {
partner: [
[
[1, "my_method", false],
{
rules: [43, 2, 3],
entries: [
{
id: 67,
approved: true,
user_id: [77, "Mitchell Admin"],
write_date: "2024-09-25 08:45:36",
rule_id: [43, "Step 1"],
model: "sale.order",
res_id: 1,
},
],
},
],
],
};
});
onRpc("studio.approval.rule", "get_approval_spec", async (...args) => {
return {
all_rules: { ...ALL_RULES },
...MODEL_ENTRIES,
};
});
test("approval can revoke below rules", async () => {
onRpc("studio.approval.rule", "delete_approval", (args) => {
expect.step({ ruleIds: args.args[0], res_id: args.kwargs.res_id });
return true;
});
await mountView({
type: "form",
resModel: "partner",
arch: `<form>
<button type="object" name="my_method" />
</form>
`,
resId: 1,
});
await contains(".o_web_studio_approval").click();
expect(".o_web_approval_cancel").toHaveCount(1);
expect(".o_web_studio_approval_rule:eq(0) .o_web_approval_cancel").toHaveCount(1);
await contains(".o_web_approval_cancel").click();
expect.verifySteps([
{
res_id: 1,
ruleIds: [43],
},
]);
});
test("reload record when setting/deleting approval", async () => {
onRpc("studio.approval.rule", "set_approval", async (args) => {
expect.step({
ruleIds: args.args[0],
res_id: args.kwargs.res_id,
approved: args.kwargs.approved,
});
return true;
});
onRpc("studio.approval.rule", "delete_approval", (args) => {
expect.step("delete_approval");
return true;
});
onRpc("partner", "web_read", () => {
expect.step("web_read");
});
onRpc("studio.approval.rule", "get_approval_spec", async (args) => {
expect.step("get_approval_spec");
});
await mountView({
type: "form",
resModel: "partner",
arch: `<form>
<button type="object" name="my_method" />
</form>
`,
resId: 1,
});
expect.verifySteps(["web_read", "get_approval_spec"]);
await contains(".o_web_studio_approval").click();
await contains(".o_web_approval_approve").click();
expect.verifySteps([
{
approved: true,
res_id: 1,
ruleIds: [3],
},
"web_read",
"get_approval_spec",
]);
await contains(".o_web_approval_cancel").click();
expect.verifySteps(["delete_approval", "web_read", "get_approval_spec"]);
});
test("don't reload model when setting approval in error", async () => {
expect.errors(1);
const error = makeServerError({
subType: "Odoo Client Error",
message: "Crash",
errorName: "crash",
});
onRpc("studio.approval.rule", "set_approval", async (args) => {
expect.step({
ruleIds: args.args[0],
res_id: args.kwargs.res_id,
approved: args.kwargs.approved,
});
throw error;
});
onRpc("partner", "web_read", () => {
expect.step("web_read");
});
onRpc("studio.approval.rule", "get_approval_spec", async (args) => {
expect.step("get_approval_spec");
});
await mountView({
type: "form",
resModel: "partner",
arch: `<form>
<button type="object" name="my_method" />
</form>
`,
resId: 1,
});
expect.verifySteps(["web_read", "get_approval_spec"]);
await contains(".o_web_studio_approval").click();
await contains(".o_web_approval_approve").click();
await animationFrame();
expect.verifyErrors(['Crash']);
expect.verifySteps([
{
approved: true,
res_id: 1,
ruleIds: [3],
},
"get_approval_spec",
]);
});