import { defineMailModels } from "@mail/../tests/mail_test_helpers"; import { describe, expect, test } from "@odoo/hoot"; import { Deferred, edit } from "@odoo/hoot-dom"; import { animationFrame } from "@odoo/hoot-mock"; import { contains, defineModels, fields, getService, models, mountView, mountWithCleanup, onRpc, patchWithCleanup, } from "@web/../tests/web_test_helpers"; import { user } from "@web/core/user"; import { WebClientEnterprise } from "@web_enterprise/webclient/webclient"; describe.current.tags("desktop"); defineMailModels(); class Partner extends models.Model { _name = "partner"; int_field = fields.Integer({ string: "int_field" }); bar = fields.Boolean(); _records = [ { display_name: "first record", int_field: 42, bar: true, }, { display_name: "second record", int_field: 27, bar: true, }, { display_name: "another record", int_field: 21, bar: false, }, ]; _views = { form: `
`, }); await contains("#mainButton").click(); expect.verifySteps(["get_approval_spec", "attempt_action", "get_approval_spec"]); }); test("approval check: rpc is batched", async () => { onRpc("get_approval_spec", () => { expect.step("get_approval_spec"); return { all_rules: defaultRules, partner: [ [[2, "someMethod", false], { rules: [1], entries: [] }], [[2, "someMethod2", false], { rules: [1], entries: [] }], ], }; }); await mountView({ resModel: "partner", type: "form", resId: 2, arch: `
`, }); expect.verifySteps(["get_approval_spec"]); }); test("approval widget basic flow", async () => { patchWithCleanup(user, { userId: 42, }); let hasValidatedRule; onRpc("get_approval_spec", () => { const entries = []; if (hasValidatedRule !== undefined) { entries.push({ id: 1, approved: hasValidatedRule, user_id: [42, "Some rando"], write_date: "2020-04-07 12:43:48", rule_id: [1, "someMethod/partner (Internal User)"], model: "partner", res_id: 2, }); } return { all_rules: defaultRules, partner: [[[2, "someMethod", false], { rules: [1], entries }]], }; }); onRpc("set_approval", ({ kwargs }) => { hasValidatedRule = kwargs.approved; expect.step(hasValidatedRule ? "approve_rule" : "reject_rule"); return true; }); onRpc("delete_approval", () => { hasValidatedRule = undefined; expect.step("delete_approval"); return true; }); await mountView({ resModel: "partner", type: "form", resId: 2, arch: `
`, }); await contains("button[name='someMethod'] .o_web_studio_approval").click(); expect(".o_popover").toHaveCount(1); await contains(".o_popover button.o_web_approval_approve").click(); await contains(".o_popover button.o_web_approval_cancel").click(); await contains(".o_popover button.o_web_approval_reject").click(); expect.verifySteps(["approve_rule", "delete_approval", "reject_rule"]); }); test("approval widget basic flow with domain rule", async () => { expect.assertions(3); let index = 0; const recordIds = [1, 2, 3]; onRpc("get_approval_spec", ({ args }) => { const currentIndex = index++; defaultRules[currentIndex] = { ...defaultRules[1], id: currentIndex }; expect(recordIds[currentIndex]).toEqual(args[0][0].res_id); return { all_rules: defaultRules, partner: [ [[args[0][0].res_id, "someMethod", false], { rules: [currentIndex], entries: [] }], ], }; }); await mountWithCleanup(WebClientEnterprise); await animationFrame(); await getService("action").doAction({ name: "Partner", res_model: "partner", type: "ir.actions.act_window", views: [ [false, "list"], [false, "form"], ], }); await contains(".o_data_row .o_data_cell").click(); await contains(".o_pager_next").click(); await contains("button[name='someMethod'] .o_web_studio_approval").click(); await contains(".o_pager_next").click(); await contains("button[name='someMethod'] .o_web_studio_approval").click(); }); test("approval on new record: save before check", async () => { onRpc("get_approval_spec", ({ args }) => { expect.step(`get_approval_spec: ${JSON.stringify(args)}`); return { all_rules: defaultRules, partner: [[[args[0][0].res_id, false, "someMethod"], { rules: [1], entries: [] }]], }; }); onRpc("web_save", () => { expect.step("web_save"); }); onRpc("check_approval", ({ args }) => { expect.step(`check_approval: ${JSON.stringify(args)}`); return { approved: false, rules: [ { id: 1, group_id: [1, "Internal User"], domain: false, can_validate: true, message: false, exclusive_user: false, }, ], entries: [], }; }); await mountView({ resModel: "partner", type: "form", arch: `