diff options
| author | Géry Debongnie <ged@odoo.com> | 2018-01-05 13:09:43 +0100 |
|---|---|---|
| committer | Aaron Bohy <aab@odoo.com> | 2018-01-26 19:26:03 +0100 |
| commit | cb339842d4d8b19f3870127c00a6868af2e95004 (patch) | |
| tree | 5a738a06894b0318e4398e737ebadf1157b8c073 /addons/web/static/tests | |
| parent | 12fa4e565a734bd4e0be7cb83ff320f32cb4f33e (diff) | |
[REF] web,*: move fvg processing from DataManager to Views
*: mail, web_diagram
Diffstat (limited to 'addons/web/static/tests')
| -rw-r--r-- | addons/web/static/tests/helpers/mock_server.js | 88 | ||||
| -rw-r--r-- | addons/web/static/tests/helpers/test_utils.js | 23 | ||||
| -rw-r--r-- | addons/web/static/tests/views/calendar_tests.js | 36 |
3 files changed, 79 insertions, 68 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); }); } }, /** diff --git a/addons/web/static/tests/helpers/test_utils.js b/addons/web/static/tests/helpers/test_utils.js index 850301fb981..260436ff152 100644 --- a/addons/web/static/tests/helpers/test_utils.js +++ b/addons/web/static/tests/helpers/test_utils.js @@ -127,6 +127,23 @@ var createActionManager = function (params) { }; /** + * performs a fields_view_get, and mocks the postprocessing done by the + * data_manager to return an equivalent structure. + * + * @param {MockServer} server + * @param {Object} params + * @param {string} params.model + * @returns {Object} an object with 3 keys: arch, fields and viewFields + */ +function fieldsViewGet(server, params) { + var fieldsView = server.fieldsViewGet(params); + // mock the structure produced by the DataManager + fieldsView.viewFields = fieldsView.fields; + fieldsView.fields = server.fieldsGet(params.model); + return fieldsView; +} + +/** * create a view synchronously. This method uses the createAsyncView method. * Most views are synchronous, so the deferred can be resolved immediately and * this method will work. @@ -189,8 +206,7 @@ function createAsyncView(params) { // add mock environment: mock server, session, fieldviewget, ... var mockServer = addMockEnvironment(widget, params); - var viewInfo = mockServer.fieldsViewGet(params); - + var viewInfo = fieldsViewGet(mockServer, params); // create the view var viewOptions = { modelName: params.model || 'foo', @@ -419,7 +435,7 @@ function addMockEnvironment(widget, params) { model: event.data.modelName, }).then(function (views) { views = _.mapObject(views, function (viewParams) { - return mockServer.fieldsViewGet(viewParams); + return fieldsViewGet(mockServer, viewParams); }); event.data.on_success(views); }); @@ -694,6 +710,7 @@ return $.when( createParent: createParent, createView: createView, dragAndDrop: dragAndDrop, + fieldsViewGet: fieldsViewGet, intercept: intercept, observe: observe, patch: patch, diff --git a/addons/web/static/tests/views/calendar_tests.js b/addons/web/static/tests/views/calendar_tests.js index 48a8faf4f3e..835aa628ced 100644 --- a/addons/web/static/tests/views/calendar_tests.js +++ b/addons/web/static/tests/views/calendar_tests.js @@ -114,36 +114,12 @@ QUnit.module('Views', { '<field name="stop_date"/>'+ '</group>'+ '</form>', - "event,1,form": { - attrs: {}, - children: [ - { - attrs: { - modifiers: '{"invisible": true}', - name: "allday" - }, - children: [], - tag: 'field' - }, - { - attrs: { - modifiers: '{"invisible": [["allday","=",false]]}', - name: "start" - }, - children: [], - tag: 'field' - }, - { - attrs: { - modifiers: '{"invisible": [["allday","=",true]]}', - name: "stop" - }, - children: [], - tag: 'field' - } - ], - tag: "form" - } + "event,1,form": + '<form>' + + '<field name="allday" invisible="1"/>' + + '<field name="start" attrs=\'{"invisible": [["allday","=",false]]}\'/>' + + '<field name="stop" attrs=\'{"invisible": [["allday","=",true]]}\'/>' + + '</form>', }; QUnit.test('simple calendar rendering', function (assert) { |
