119 lines
3.5 KiB
JavaScript
119 lines
3.5 KiB
JavaScript
/** @odoo-module **/
|
|
|
|
import { beforeEach, expect, test } from "@odoo/hoot";
|
|
import { animationFrame } from "@odoo/hoot-mock";
|
|
import { FormController } from "@web/views/form/form_controller";
|
|
import {
|
|
contains,
|
|
defineModels,
|
|
fields,
|
|
models,
|
|
mountView,
|
|
onRpc,
|
|
patchWithCleanup,
|
|
} from "@web/../tests/web_test_helpers";
|
|
import { barcodeService } from "@barcodes/barcode_service";
|
|
import { press } from "@odoo/hoot-dom";
|
|
|
|
async function simulateBarCode(chars) {
|
|
for (const char of chars) {
|
|
await press(char);
|
|
}
|
|
}
|
|
class Product extends models.Model {
|
|
name = fields.Char({ string: "Product name" });
|
|
float_field = fields.Float({ string: "Float" });
|
|
float_field_2 = fields.Float({ string: "Float" });
|
|
barcode = fields.Char({ string: "Barcode" });
|
|
_records = [
|
|
{ id: 1, name: "Large Cabinet", barcode: "1234567890" },
|
|
{ id: 2, name: "Cabinet with Doors", barcode: "0987654321" },
|
|
];
|
|
}
|
|
|
|
defineModels([Product]);
|
|
|
|
beforeEach(() => {
|
|
patchWithCleanup(barcodeService, {
|
|
maxTimeBetweenKeysInMs: 0,
|
|
});
|
|
});
|
|
|
|
test.tags("mobile");
|
|
test("widget field_float_scannable", async () => {
|
|
Product._records[0].float_field = 4;
|
|
|
|
const onBarcodeScanned = (event) => {
|
|
expect.step(`barcode scanned ${event.detail.barcode}`);
|
|
};
|
|
|
|
const view = await mountView({
|
|
type: "form",
|
|
resModel: "product",
|
|
resId: 1,
|
|
arch: /*xml*/ `
|
|
<form>press
|
|
<field name="display_name"/>
|
|
<field name="float_field" widget="field_float_scannable"/>
|
|
<field name="float_field_2"/>
|
|
</form>
|
|
`,
|
|
});
|
|
view.env.services.barcode.bus.addEventListener("barcode_scanned", onBarcodeScanned);
|
|
|
|
expect(".o_field_widget[name=float_field] input").toHaveValue("4.00");
|
|
|
|
// we check here that a scan on the field_float_scannable widget triggers a
|
|
// barcode event
|
|
await contains(".o_field_widget[name=float_field] input").focus();
|
|
await simulateBarCode(["6", "0", "1", "6", "4", "7", "8", "5"]);
|
|
await animationFrame();
|
|
expect.verifySteps(["barcode scanned 60164785"]);
|
|
expect(".o_field_widget[name=float_field] input").toBeFocused();
|
|
|
|
// we check here that a scan on the field without widget does not trigger a
|
|
// barcode event
|
|
await contains(".o_field_widget[name=float_field_2] input").focus();
|
|
await simulateBarCode(["6", "0", "1", "6", "4", "7", "8", "5"]);
|
|
await animationFrame();
|
|
expect.verifySteps([]);
|
|
|
|
view.env.services.barcode.bus.removeEventListener("barcode_scanned", onBarcodeScanned);
|
|
});
|
|
|
|
test.tags("mobile");
|
|
test("do no update form twice after a command barcode scanned", async () => {
|
|
patchWithCleanup(FormController.prototype, {
|
|
onPagerUpdate(...args) {
|
|
expect.step("update");
|
|
super.onPagerUpdate(...args);
|
|
},
|
|
});
|
|
|
|
onRpc("web_read", () => {
|
|
expect.step("web_read");
|
|
});
|
|
|
|
await mountView({
|
|
type: "form",
|
|
resModel: "product",
|
|
arch: /*xml*/ `
|
|
<form>
|
|
<field name="display_name"/>
|
|
<field name="float_field" widget="field_float_scannable"/>
|
|
</form>
|
|
`,
|
|
resId: 1,
|
|
resIds: [1, 2],
|
|
});
|
|
|
|
expect.verifySteps(["web_read"]);
|
|
|
|
// switch to next record
|
|
await simulateBarCode(["O", "C", "D", "N", "E", "X", "T", "Enter"]);
|
|
|
|
// a first update is done to reload the data (thus followed by a read), but
|
|
// update shouldn't be called afterwards
|
|
expect.verifySteps(["update", "web_read"]);
|
|
});
|