From 07d6f1c654ccfd385e5191e37d01064b1af9f01f Mon Sep 17 00:00:00 2001 From: Volodymyr Zaets Date: Wed, 18 Jan 2017 16:06:12 +0200 Subject: [PATCH] MAGETWO-54733: Unable to save product with all unchecked values for multiple select attribute #7687 --- .../{ArrayTest.php => ArrayBackendTest.php} | 0 .../Ui/view/base/web/js/form/client.js | 2 - .../Magento/Ui/base/js/form/client.test.js | 67 ++++++++++++++++++- .../js/jasmine/tests/lib/mage/misc.test.js | 1 + lib/web/mage/utils/misc.js | 19 ++++-- 5 files changed, 80 insertions(+), 9 deletions(-) rename app/code/Magento/Eav/Test/Unit/Model/Entity/Attribute/Backend/{ArrayTest.php => ArrayBackendTest.php} (100%) diff --git a/app/code/Magento/Eav/Test/Unit/Model/Entity/Attribute/Backend/ArrayTest.php b/app/code/Magento/Eav/Test/Unit/Model/Entity/Attribute/Backend/ArrayBackendTest.php similarity index 100% rename from app/code/Magento/Eav/Test/Unit/Model/Entity/Attribute/Backend/ArrayTest.php rename to app/code/Magento/Eav/Test/Unit/Model/Entity/Attribute/Backend/ArrayBackendTest.php diff --git a/app/code/Magento/Ui/view/base/web/js/form/client.js b/app/code/Magento/Ui/view/base/web/js/form/client.js index d1874508483e8..1007c7bbd2b36 100644 --- a/app/code/Magento/Ui/view/base/web/js/form/client.js +++ b/app/code/Magento/Ui/view/base/web/js/form/client.js @@ -22,9 +22,7 @@ define([ function beforeSave(data, url, selectorPrefix, messagesClass) { var save = $.Deferred(); - data = utils.filterFormData(data) data = utils.serialize(utils.filterFormData(data)); - data['form_key'] = window.FORM_KEY; if (!url || url === 'undefined') { diff --git a/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/form/client.test.js b/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/form/client.test.js index 8a14feccd6910..285f2ac454584 100644 --- a/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/form/client.test.js +++ b/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/form/client.test.js @@ -10,18 +10,21 @@ define([ 'underscore', 'uiRegistry', - 'Magento_Ui/js/form/client' -], function (_, registry, Constr) { + 'Magento_Ui/js/form/client', + 'jquery', + 'mageUtils' +], function (_, registry, Constr, $, utils) { 'use strict'; describe('Magento_Ui/js/form/client', function () { - var obj = new Constr({ provider: 'provName', name: '', index: '' }); + window.FORM_KEY = 'magentoFormKey'; + registry.set('provName', { on: function () { }, @@ -50,7 +53,65 @@ define([ expect(type).toEqual('object'); }); + it('Check "beforeSave" method. Check call "filterFormData" inside themselves.', function () { + var data = { + key: { + anotherKey: 'value' + }, + anotherKey: [] + }; + + obj.urls.beforeSave = 'requestPath'; + obj.selectorPrefix = 'selectorPrefix'; + obj.messagesClass = 'messagesClass'; + utils.filterFormData = jasmine.createSpy().and.returnValue(utils.filterFormData(data)); + + obj.save(data); + expect(utils.filterFormData).toHaveBeenCalledWith(data); + }); + it('Check "beforeSave" method. Check call "serialize" inside themselves.', function () { + var data = { + key: { + anotherKey: 'value' + }, + anotherKey: [] + }; + + obj.urls.beforeSave = 'requestPath'; + obj.selectorPrefix = 'selectorPrefix'; + obj.messagesClass = 'messagesClass'; + utils.serialize = jasmine.createSpy().and.returnValue(utils.serialize(data)); + + obj.save(data); + expect(utils.serialize).toHaveBeenCalledWith(data); + }); + it('Check "beforeSave" method. Check call "ajax" inside themselves.', function () { + var data = { + key: { + anotherKey: 'value' + }, + 'anotherKey-prepared-for-send': [] + }, + result = { + url: obj.urls.beforeSave, + data: { + 'key[anotherKey]': 'value', + 'form_key': 'magentoFormKey' + }, + success: jasmine.any(Function), + complete: jasmine.any(Function) + }; + + obj.urls.beforeSave = 'requestPath'; + obj.selectorPrefix = 'selectorPrefix'; + obj.messagesClass = 'messagesClass'; + $.ajax = jasmine.createSpy(); + + obj.save(data); + expect($.ajax).toHaveBeenCalledWith(result); + }); }); + describe('"initialize" method', function () { it('Check for defined ', function () { expect(obj.hasOwnProperty('initialize')).toBeDefined(); diff --git a/dev/tests/js/jasmine/tests/lib/mage/misc.test.js b/dev/tests/js/jasmine/tests/lib/mage/misc.test.js index 0f399b13fe841..170177b42ccb0 100644 --- a/dev/tests/js/jasmine/tests/lib/mage/misc.test.js +++ b/dev/tests/js/jasmine/tests/lib/mage/misc.test.js @@ -28,6 +28,7 @@ define([ expect(utils.filterFormData(data, suffix, separator)).toEqual(data); expect(utils.filterFormData(data, suffix)).toEqual(data); expect(utils.filterFormData(data)).toEqual(data); + expect(utils.filterFormData()).toEqual({}); }); it('Check convertToMomentFormat function for all Magento supported locales', function () { diff --git a/lib/web/mage/utils/misc.js b/lib/web/mage/utils/misc.js index 0aa07577f1df8..ed0452ceef64e 100644 --- a/lib/web/mage/utils/misc.js +++ b/lib/web/mage/utils/misc.js @@ -209,14 +209,25 @@ define([ return formData; }, - filterFormData: function (data, sufix, separator) { - sufix = sufix || 'prepared-for-send'; + /** + * Filters data. Find properties with suffix + * and set his value to original properties. + * + * @param {Object} data + * @param {String} suffix + * @param {String} separator + * + * @returns {Object} + */ + filterFormData: function (data, suffix, separator) { + data = data || {}; + suffix = suffix || 'prepared-for-send'; separator = separator || '-'; _.each(data, function (value, key) { if (_.isObject(value) && !value.length) { - this.filterFormData(value, sufix, separator) - } else if (_.isString(key) && ~key.indexOf(sufix)) { + this.filterFormData(value, suffix, separator) + } else if (_.isString(key) && ~key.indexOf(suffix)) { data[key.split(separator)[0]] = value; delete data[key]; }