Files
goodie/frontend/account/static/tests/x2many_buttons.test.js
Marc 8741282322 Eliminate Python dependency: embed frontend assets in odoo-go
- Copy all OWL frontend assets (JS/CSS/XML/fonts/images) into frontend/
  directory (2925 files, 43MB) — no more runtime reads from Python Odoo
- Replace OdooAddonsPath config with FrontendDir pointing to local frontend/
- Rewire bundle.go, static.go, templates.go, webclient.go to read from
  frontend/ instead of external Python Odoo addons directory
- Auto-detect frontend/ and build/ dirs relative to binary in main.go
- Delete obsolete Python helper scripts (tools/*.py)

The Go server is now fully self-contained: single binary + frontend/ folder.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 23:09:12 +02:00

139 lines
4.4 KiB
JavaScript

import { defineMailModels } from "@mail/../tests/mail_test_helpers";
import { expect, test } from "@odoo/hoot";
import {
contains,
defineModels,
fields,
mockService,
models,
mountView,
onRpc,
} from "@web/../tests/web_test_helpers";
class AccountMove extends models.Model {
_name = "account.move";
name = fields.Char();
duplicated_ref_ids = fields.Many2many({
string: "Duplicated Bills",
relation: "account.move",
});
ref = fields.Char({ string: "Bill Reference" });
_records = [
// for the sake of mocking data, we don't care about the consistency of duplicated refs across records
{ id: 1, display_name: "Bill 1", duplicated_ref_ids: [2, 3], ref: "b1" },
{ id: 2, display_name: "Bill 2", duplicated_ref_ids: [1], ref: "b2" },
{ id: 3, display_name: "Bill 3", duplicated_ref_ids: [1], ref: "b3" },
{ id: 4, display_name: "Bill 4", duplicated_ref_ids: [1, 2, 3], ref: "b4" },
{ id: 5, display_name: "Bill 5", duplicated_ref_ids: [], ref: "b5" },
{ id: 6, display_name: "Bill 6", duplicated_ref_ids: [1, 2, 3, 4, 5], ref: "b6" },
];
_views = {
form: `
<form>
<field name="display_name"/>
<field name="ref"/>
<field name="duplicated_ref_ids" widget="x2many_buttons"/>
</form>
`,
};
}
defineModels([AccountMove]);
defineMailModels();
test("component rendering: less than 3 records on field", async () => {
expect.assertions(2);
await mountView({
resModel: "account.move",
resId: 1,
type: "form",
});
expect(".o_field_x2many_buttons").toHaveCount(1);
expect(".o_field_x2many_buttons button").toHaveCount(2);
});
test("component rendering: exactly 3 records on field", async () => {
expect.assertions(2);
await mountView({
resModel: "account.move",
resId: 4,
type: "form",
});
expect(".o_field_x2many_buttons").toHaveCount(1);
expect(".o_field_x2many_buttons button").toHaveCount(3);
});
test("component rendering: more than 3 records on field", async () => {
expect.assertions(3);
await mountView({
resModel: "account.move",
resId: 6,
type: "form",
});
expect(".o_field_x2many_buttons").toHaveCount(1);
expect(".o_field_x2many_buttons button").toHaveCount(4);
expect(".o_field_x2many_buttons button:eq(3)").toHaveText("... (View all)");
});
test("edit record and check if edits get discarded when click on one of the buttons and redirects to proper record", async () => {
onRpc("account.move", "action_open_business_doc", ({ args }) => {
expect.step("action_open_business_doc");
expect(args.length).toBe(1);
expect(args[0]).toBe(2);
return {
res_model: "account.move",
res_id: 2,
type: "ir.actions.act_window",
views: [[false, "form"]],
};
});
await mountView({
resModel: "account.move",
resId: 1,
type: "form",
});
await contains("[name='ref'] input").edit("new ref");
expect("[name='ref'] input").toHaveValue("new ref");
await contains(".o_field_x2many_buttons button").click();
expect("[name='ref'] input").toHaveValue("b1");
expect.verifySteps(["action_open_business_doc"]);
});
// test if clicking on last button redirects to records in list view
test("redirect to list view and discards edits when clicking on last button with more than 3 records on field", async () => {
expect.assertions(3);
mockService("action", {
doAction(action) {
expect(action).toEqual({
domain: [["id", "in", [1, 2, 3, 4, 5]]],
name: "Duplicated Bills",
res_model: "account.move",
type: "ir.actions.act_window",
views: [
[false, "list"],
[false, "form"],
],
context: {
list_view_ref: "account.view_duplicated_moves_tree_js",
},
});
},
});
await mountView({
resModel: "account.move",
resId: 6,
type: "form",
});
await contains("[name='ref'] input").edit("new ref");
expect("[name='ref'] input").toHaveValue("new ref");
await contains(".o_field_x2many_buttons button:eq(3)").click();
expect("[name='ref'] input").toHaveValue("b6");
});