[FIX] web: mockServer onChange should only return fields from view

Before this commit, when calling onchange, the mockServer returned all
the changes present in the onchanges functions defined on fields.
The expected behaviour is to return only the changes required by the view.

Part-of: odoo/odoo#137828
This commit is contained in:
FrancoisGe
2023-10-06 13:09:02 +00:00
parent 4e3710879f
commit 2e735d2832
2 changed files with 24 additions and 4 deletions
@@ -861,7 +861,7 @@ export class MockServer {
const onchanges = this.models[modelName].onchanges || {};
const firstOnChange = !fields.length;
const fieldsFromView = Object.keys(specification);
const fieldsFromView = new Set(Object.keys(specification));
let serverValues = {};
const onchangeValues = {};
@@ -874,17 +874,17 @@ export class MockServer {
}
}
if (resId) {
serverValues = this.mockRead(modelName, [args[0], fieldsFromView], kwargs)[0];
serverValues = this.mockRead(modelName, [args[0], [...fieldsFromView]], kwargs)[0];
} else if (firstOnChange) {
// It is the new semantics: no field in arguments means we are in
// a default_get + onchange situation
fields = fieldsFromView;
fields = [...fieldsFromView];
fields
.filter((fName) => !Object.keys(serverValues).includes(fName) && fName !== "id")
.forEach((fName) => {
onchangeValues[fName] = false;
});
const defaultValues = this.mockDefaultGet(modelName, [fieldsFromView], kwargs);
const defaultValues = this.mockDefaultGet(modelName, [[...fieldsFromView]], kwargs);
for (const fieldName in defaultValues) {
const fieldType = this.models[modelName].fields[fieldName].type;
if (["one2many", "many2many"].includes(fieldType)) {
@@ -913,6 +913,11 @@ export class MockServer {
onchanges[field](new Proxy(target, handler));
}
});
for (const fieldName in onchangeValues) {
if (!fieldsFromView.has(fieldName)) {
delete onchangeValues[fieldName];
}
}
return {
value: this.convertToOnChange(modelName, onchangeValues, specification),
@@ -1425,4 +1425,19 @@ QUnit.module("MockServer", (hooks) => {
assert.strictEqual(data.models.bar.records.find((r) => r.id === 7).foo, "A");
assert.strictEqual(data.models.bar.records.find((r) => r.id === 8).foo, "B");
});
QUnit.test("performRPC: trigger onchange for new record", async function (assert) {
data.models.bar.onchanges = {
foo: (obj) => {
obj.bool = true;
},
};
const server = new MockServer(data, {});
const result = await server.performRPC("", {
model: "bar",
method: "onchange",
args: [[], {}, [], { foo: {} }],
});
assert.deepEqual(result.value, { foo: 0 });
});
});