Files
goodie/frontend/account/static/tests/account_move_form.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

127 lines
4.6 KiB
JavaScript

import {
click,
insertText,
openFormView,
start,
startServer,
triggerHotkey
} from "@mail/../tests/mail_test_helpers";
import { expect, test } from "@odoo/hoot";
import { asyncStep, contains, defineModels, fields, onRpc, models, waitForSteps} from "@web/../tests/web_test_helpers";
import { defineAccountModels } from "./account_test_helpers";
defineAccountModels();
test("When I switch tabs, it saves", async () => {
const pyEnv = await startServer();
const accountMove = pyEnv["account.move"].create({ name: "move0" });
await start();
onRpc("account.move", "web_save", () => {
asyncStep("tab saved");
});
await openFormView("account.move", accountMove, {
arch: `<form js_class='account_move_form'>
<sheet>
<notebook>
<page id="invoice_tab" name="invoice_tab" string="Invoice Lines">
<field name="name"/>
</page>
<page id="aml_tab" string="Journal Items" name="aml_tab"></page>
</notebook>
</sheet>
</form>`,
});
await insertText("[name='name'] input", "somebody save me!");
triggerHotkey("Enter");
await click('a[name="aml_tab"]');
await waitForSteps(["tab saved"]);
});
test("Confirmation dialog on delete contains a warning", async () => {
const pyEnv = await startServer();
const accountMove = pyEnv["account.move"].create({ name: "move0" });
await start();
onRpc("account.move", "check_move_sequence_chain", () => {
return false;
});
await openFormView("account.move", accountMove, {
arch: `<form js_class='account_move_form'>
<sheet>
<notebook>
<page id="invoice_tab" name="invoice_tab" string="Invoice Lines">
<field name="name"/>
</page>
<page id="aml_tab" string="Journal Items" name="aml_tab"></page>
</notebook>
</sheet>
</form>`,
});
await contains(".o_cp_action_menus button").click();
await contains(".o_menu_item:contains(Delete)").click();
expect(".o_dialog div.text-danger").toHaveText("This operation will create a gap in the sequence.", {
message: "warning message has been added in the dialog"
});
});
class AccountMove extends models.Model {
line_ids = fields.One2many({
string: "Invoice Lines",
relation: "account.move.line",
})
_records = [{ id: 1, name: "account.move" }]
}
class AccountMoveLine extends models.Model {
name = fields.Char();
product_id = fields.Many2one({
string:"Product",
relation:"product",
});
move_id = fields.Many2one({
string: "Account Move",
relation: "account.move",
})
}
class Product extends models.Model {
name = fields.Char();
_records = [{ id: 1, name: "testProduct" }];
}
defineModels({ Product, AccountMoveLine, AccountMove });
test("Update description on product line", async() => {
const pyEnv = await startServer();
const productId = pyEnv["product"].browse([1]);
const accountMove = pyEnv["account.move"].browse([1]);
pyEnv["account.move"].write([accountMove[0].id], {
invoice_line_ids: [[0, 0, { name: productId[0].name, product_id: productId[0].id }]],
});
await start();
onRpc("account.move", "web_save", () => { asyncStep("save")});
await openFormView("account.move", accountMove[0].id, {
arch: `<form js_class="account_move_form">
<sheet>
<notebook>
<page id="invoice_tab" name="invoice_tab" string="Invoice Lines">
<field name="invoice_line_ids" mode="list" widget="product_label_section_and_note_field_o2m">
<list name="journal_items" editable="bottom" string="Journal Items">
<field name="product_id" widget="product_label_section_and_note_field" readonly="0"/>
<field name="name" widget="section_and_note_text" optional="show"/>
</list>
</field>
</page>
</notebook>
</sheet>
</form>`,
});
await click(".o_many2one");
await contains("#labelVisibilityButtonId").click()
await insertText("textarea[placeholder='Enter a description']", "testDescription");
await click(".o_form_button_save");
await waitForSteps(["save"]);
const line = pyEnv["account.move.line"].browse([1])[0];
expect(line.name).toBe("testProduct\ntestDescription");
});