summaryrefslogtreecommitdiff
path: root/addons/web/static/tests/helpers/mock_server.js
diff options
context:
space:
mode:
Diffstat (limited to 'addons/web/static/tests/helpers/mock_server.js')
-rw-r--r--addons/web/static/tests/helpers/mock_server.js88
1 files changed, 53 insertions, 35 deletions
diff --git a/addons/web/static/tests/helpers/mock_server.js b/addons/web/static/tests/helpers/mock_server.js
index dbe1a2c49e0..8a44e1eb1e7 100644
--- a/addons/web/static/tests/helpers/mock_server.js
+++ b/addons/web/static/tests/helpers/mock_server.js
@@ -2,10 +2,8 @@ odoo.define('web.MockServer', function (require) {
"use strict";
var Class = require('web.Class');
-var data_manager = require('web.data_manager');
var Domain = require('web.Domain');
var pyeval = require('web.pyeval');
-var utils = require('web.utils');
var MockServer = Class.extend({
/**
@@ -57,6 +55,15 @@ var MockServer = Class.extend({
//--------------------------------------------------------------------------
/**
+ * Mocks a fields_get RPC for a given model.
+ *
+ * @param {string} model
+ * @returns {Object}
+ */
+ fieldsGet: function (model) {
+ return this.data[model].fields;
+ },
+ /**
* helper: read a string describing an arch, and returns a simulated
* 'field_view_get' call to the server. Calls processViews() of data_manager
* to mimick the real behavior of a call to loadViews().
@@ -77,13 +84,10 @@ var MockServer = Class.extend({
}
var fields = $.extend(true, {}, this.data[model].fields);
var fvg = this._fieldsViewGet(params.arch, model, fields, viewOptions.context);
- var fields_views = {};
- fields_views[fvg.type] = fvg;
- data_manager.processViews(fields_views, fields);
if (toolbar) {
fvg.toolbar = toolbar;
}
- return fields_views[fvg.type];
+ return fvg;
},
/**
* Simulate a complete RPC call. This is the main method for this class.
@@ -166,7 +170,7 @@ var MockServer = Class.extend({
* 'fields_view_get' call to the server.
*
* @private
- * @param {string|Object} arch a string OR a parsed xml document
+ * @param {string} arch a string OR a parsed xml document
* @param {string} model a model name (that should be in this.data)
* @param {Object} fields
* @param {Object} context
@@ -179,29 +183,32 @@ var MockServer = Class.extend({
var onchanges = this.data[model].onchanges || {};
var fieldNodes = {};
+ var doc;
if (typeof arch === 'string') {
- var doc = $.parseXML(arch).documentElement;
- arch = utils.xml_to_json(doc, true);
+ doc = $.parseXML(arch).documentElement;
+ } else {
+ doc = arch;
}
- var inTreeView = (arch.tag === 'tree');
+ var inTreeView = (doc.tagName === 'tree');
- this._traverse(arch, function (node) {
- if (typeof node === "string") {
+ this._traverse(doc, function (node) {
+ if (node.nodeType === Node.TEXT_NODE) {
return false;
}
var modifiers = {};
- var isField = (node.tag === 'field');
+ var isField = (node.tagName === 'field');
if (isField) {
- fieldNodes[node.attrs.name] = node;
+ var fieldName = node.getAttribute('name');
+ fieldNodes[fieldName] = node;
// 'transfer_field_to_modifiers' simulation
- var field = fields[node.attrs.name];
+ var field = fields[fieldName];
if (!field) {
- throw new Error("Field " + node.attrs.name + " does not exist");
+ throw new Error("Field " + fieldName + " does not exist");
}
var defaultValues = {};
var stateExceptions = {};
@@ -209,7 +216,7 @@ var MockServer = Class.extend({
stateExceptions[attr] = [];
defaultValues[attr] = !!field[attr];
});
- _.each(field['states'] || {}, function (modifs, state) {
+ _.each(field.states || {}, function (modifs, state) {
_.each(modifs, function (modif) {
if (defaultValues[modif[0]] !== modif[1]) {
stateExceptions[modif[0]].append(state);
@@ -226,36 +233,42 @@ var MockServer = Class.extend({
}
// 'transfer_node_to_modifiers' simulation
- if (node.attrs.attrs) {
- var attrs = pyeval.py_eval(node.attrs.attrs);
+ var attrs = node.getAttribute('attrs');
+ if (attrs) {
+ attrs = pyeval.py_eval(attrs);
_.extend(modifiers, attrs);
- delete node.attrs.attrs;
+ node.removeAttribute('attrs');
}
- if (node.attrs.states) {
+
+ var states = node.getAttribute('states');
+ if (states) {
if (!modifiers.invisible) {
modifiers.invisible = [];
}
- modifiers.invisible.push(["state", "not in", node.attrs.states.split(",")]);
+ modifiers.invisible.push(["state", "not in", states.split(",")]);
}
_.each(modifiersNames, function (a) {
- if (node.attrs[a]) {
+ var mod = node.getAttribute(a);
+ if (mod) {
var pyevalContext = window.py.dict.fromJSON(context || {});
- var v = pyeval.py_eval(node.attrs[a], {context: pyevalContext}) ? true: false;
+ var v = pyeval.py_eval(mod, {context: pyevalContext}) ? true: false;
if (inTreeView && a === 'invisible') {
- modifiers['column_invisible'] = v;
+ modifiers.column_invisible = v;
} else if (v || !(a in modifiers) || !_.isArray(modifiers[a])) {
modifiers[a] = v;
}
}
});
- // 'transfer_modifiers_to_node' simulation
_.each(modifiersNames, function (a) {
if (a in modifiers && (!!modifiers[a] === false || (_.isArray(modifiers[a]) && !modifiers[a].length))) {
delete modifiers[a];
}
});
- node.attrs.modifiers = JSON.stringify(modifiers);
+
+ if (Object.keys(modifiers).length) {
+ node.setAttribute('modifiers', JSON.stringify(modifiers));
+ }
return !isField;
});
@@ -264,29 +277,34 @@ var MockServer = Class.extend({
_.each(fieldNodes, function (node, name) {
var field = fields[name];
if (field.type === "many2one" || field.type === "many2many") {
- node.attrs.can_create = node.attrs.can_create || "true";
- node.attrs.can_write = node.attrs.can_write || "true";
+ var canCreate = node.getAttribute('can_create');
+ node.setAttribute('can_create', canCreate || "true");
+ var canWrite = node.getAttribute('can_write');
+ node.setAttribute('can_write', canWrite || "true");
}
if (field.type === "one2many" || field.type === "many2many") {
field.views = {};
- _.each(node.children, function (children) {
+ _.each(node.childNodes, function (children) {
relModel = field.relation;
relFields = $.extend(true, {}, self.data[relModel].fields);
- field.views[children.tag] = self._fieldsViewGet(children, relModel,
+ field.views[children.tagName] = self._fieldsViewGet(children, relModel,
relFields, context);
});
}
// add onchanges
if (name in onchanges) {
- node.attrs.on_change="1";
+ node.setAttribute('on_change', "1");
}
});
+
+ var xmlSerializer = new XMLSerializer();
+ var processedArch = xmlSerializer.serializeToString(doc);
return {
- arch: arch,
+ arch: processedArch,
fields: _.pick(fields, _.keys(fieldNodes)),
model: model,
- type: arch.tag === 'tree' ? 'list' : arch.tag,
+ type: doc.tagName === 'tree' ? 'list' : doc.tagName,
};
},
/**
@@ -1040,7 +1058,7 @@ var MockServer = Class.extend({
_traverse: function (tree, f) {
var self = this;
if (f(tree)) {
- _.each(tree.children, function (c) { self._traverse(c, f); });
+ _.each(tree.childNodes, function (c) { self._traverse(c, f); });
}
},
/**