Responsive mixins usage
For grouping style rules in certain media queries .media-width() mixin used.
.media-width(<@extremum>, <@break>);
-
@extremum: max|min
- sets whether to use min-width or max-width in media query condition
- @break: value
- sets the value of breakpoint to compare with in media query condition.
+
@extremum: max|min
- sets whether to use min-width or max-width in media query condition
+ @break: value
- sets the value of breakpoint to compare with in media query condition.
For example
.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__s) {
your styles
diff --git a/lib/web/css/docs/source/_layout.less b/lib/web/css/docs/source/_layout.less
index 09fd183e30ba0..8c1c707ff358c 100644
--- a/lib/web/css/docs/source/_layout.less
+++ b/lib/web/css/docs/source/_layout.less
@@ -57,25 +57,25 @@ footer.footer {
//
// @layout-class-1column
// page-layout-1column
-// '' | false | page-layout-1column | page-layout-2columns-left | page-layout-2columns-right | page-layout-3columns
+// '' | false | page-layout-1column | page-layout-2columns-left | page-layout-2columns-right | page-layout-3columns
// Class name for one column layout
//
//
// @layout-class-2columns__left
// page-layout-2columns-left
-// '' | false | page-layout-1column | page-layout-2columns-left | page-layout-2columns-right | page-layout-3columns
+// '' | false | page-layout-1column | page-layout-2columns-left | page-layout-2columns-right | page-layout-3columns
// Class name for two columns layout with left sidebar
//
//
// @layout-class-2columns__right
// page-layout-2columns-right
-// '' | false | page-layout-1column | page-layout-2columns-left | page-layout-2columns-right | page-layout-3columns
+// '' | false | page-layout-1column | page-layout-2columns-left | page-layout-2columns-right | page-layout-3columns
// Class name for two columns layout with right sidebar
//
//
// @layout-class-3columns
// page-layout-3columns
-// '' | false | page-layout-1column | page-layout-2columns-left | page-layout-2columns-right | page-layout-3columns
+// '' | false | page-layout-1column | page-layout-2columns-left | page-layout-2columns-right | page-layout-3columns
// Class name for three columns layout with left sidebar
//
//
diff --git a/lib/web/css/docs/source/_responsive.less b/lib/web/css/docs/source/_responsive.less
index 8e7397d6ad6f3..dca60791bfacf 100644
--- a/lib/web/css/docs/source/_responsive.less
+++ b/lib/web/css/docs/source/_responsive.less
@@ -4,7 +4,7 @@
// */
// # Responsive
-// Magento UI library provides a strong approach for working with media queries. It`s based on recursive call of .media-width()
mixin defined anywhere in project but invoked in one place in lib/web/css/source/lib/_responsive.less
. That's why in the resulting styles.css
we have every media query only once with all the rules there, not a multiple calls for the same query.
+// Magento UI library provides a strong approach for working with media queries. It`s based on recursive call of .media-width()
mixin defined anywhere in project but invoked in one place in lib/web/css/source/lib/_responsive.less
. That's why in the resulting styles.css
we have every media query only once with all the rules there, not a multiple calls for the same query.
//
// To see the media queries work resize window to understand which breakpoint is applied.
// ```
@@ -43,8 +43,8 @@
// ```css
// .media-width(<@extremum>, <@break>);
// ```
-// @extremum: max|min
- sets whether to use **min-width** or **max-width** in media query condition
-// @break: value
- sets the value of breakpoint to compare with in media query condition.
+// @extremum: max|min
- sets whether to use **min-width** or **max-width** in media query condition
+// @break: value
- sets the value of breakpoint to compare with in media query condition.
// For example
// ```css
// .media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__s) {
diff --git a/lib/web/css/docs/source/_variables.less b/lib/web/css/docs/source/_variables.less
index e1845786067c8..74cbabdd07378 100644
--- a/lib/web/css/docs/source/_variables.less
+++ b/lib/web/css/docs/source/_variables.less
@@ -4169,25 +4169,25 @@
//
// @layout-class-1column
// page-layout-1column
-// '' | false | page-layout-1column | page-layout-2columns-left | page-layout-2columns-right | page-layout-3columns
+// '' | false | page-layout-1column | page-layout-2columns-left | page-layout-2columns-right | page-layout-3columns
// Class name for one column layout
//
//
// @layout-class-2columns__left
// page-layout-2columns-left
-// '' | false | page-layout-1column | page-layout-2columns-left | page-layout-2columns-right | page-layout-3columns
+// '' | false | page-layout-1column | page-layout-2columns-left | page-layout-2columns-right | page-layout-3columns
// Class name for two columns layout with left sidebar
//
//
// @layout-class-2columns__right
// page-layout-2columns-right
-// '' | false | page-layout-1column | page-layout-2columns-left | page-layout-2columns-right | page-layout-3columns
+// '' | false | page-layout-1column | page-layout-2columns-left | page-layout-2columns-right | page-layout-3columns
// Class name for two columns layout with right sidebar
//
//
// @layout-class-3columns
// page-layout-3columns
-// '' | false | page-layout-1column | page-layout-2columns-left | page-layout-2columns-right | page-layout-3columns
+// '' | false | page-layout-1column | page-layout-2columns-left | page-layout-2columns-right | page-layout-3columns
// Class name for three columns layout with left sidebar
//
//
diff --git a/lib/web/css/docs/variables.html b/lib/web/css/docs/variables.html
index ebbf2122ab209..3c5a583e5101d 100644
--- a/lib/web/css/docs/variables.html
+++ b/lib/web/css/docs/variables.html
@@ -4168,25 +4168,25 @@ Layout variables
@layout-class-1column
page-layout-1column
- '' | false | page-layout-1column | page-layout-2columns-left | page-layout-2columns-right | page-layout-3columns
+ '' | false | page-layout-1column | page-layout-2columns-left | page-layout-2columns-right | page-layout-3columns
Class name for one column layout
@layout-class-2columns__left
page-layout-2columns-left
- '' | false | page-layout-1column | page-layout-2columns-left | page-layout-2columns-right | page-layout-3columns
+ '' | false | page-layout-1column | page-layout-2columns-left | page-layout-2columns-right | page-layout-3columns
Class name for two columns layout with left sidebar
@layout-class-2columns__right
page-layout-2columns-right
- '' | false | page-layout-1column | page-layout-2columns-left | page-layout-2columns-right | page-layout-3columns
+ '' | false | page-layout-1column | page-layout-2columns-left | page-layout-2columns-right | page-layout-3columns
Class name for two columns layout with right sidebar
@layout-class-3columns
page-layout-3columns
- '' | false | page-layout-1column | page-layout-2columns-left | page-layout-2columns-right | page-layout-3columns
+ '' | false | page-layout-1column | page-layout-2columns-left | page-layout-2columns-right | page-layout-3columns
Class name for three columns layout with left sidebar
diff --git a/lib/web/mage/adminhtml/grid.js b/lib/web/mage/adminhtml/grid.js
index 1c9319f95a647..28bdb96e5cdb7 100644
--- a/lib/web/mage/adminhtml/grid.js
+++ b/lib/web/mage/adminhtml/grid.js
@@ -63,6 +63,7 @@ define([
this.initRowCallback = false;
this.doFilterCallback = false;
this.sortableUpdateCallback = false;
+ this.filterKeyPressCallback = false;
this.reloadParams = false;
@@ -511,6 +512,10 @@ define([
if (event.keyCode == Event.KEY_RETURN) { //eslint-disable-line eqeqeq
this.doFilter();
}
+
+ if (this.filterKeyPressCallback) {
+ this.filterKeyPressCallback(this, event);
+ }
},
/**
diff --git a/lib/web/mage/backend/button.js b/lib/web/mage/backend/button.js
index c06d2dedab054..453fc7443a7c0 100644
--- a/lib/web/mage/backend/button.js
+++ b/lib/web/mage/backend/button.js
@@ -3,18 +3,10 @@
* See COPYING.txt for license details.
*/
-(function (factory) {
- 'use strict';
-
- if (typeof define === 'function' && define.amd) {
- define([
- 'jquery',
- 'jquery/ui'
- ], factory);
- } else {
- factory(jQuery);
- }
-}(function ($) {
+define([
+ 'jquery',
+ 'jquery/ui'
+], function ($) {
'use strict';
$.widget('ui.button', $.ui.button, {
@@ -58,4 +50,4 @@
});
return $.ui.button;
-}));
+});
diff --git a/lib/web/mage/backend/form.js b/lib/web/mage/backend/form.js
index 36b33d0a59d50..de270c8ccd202 100644
--- a/lib/web/mage/backend/form.js
+++ b/lib/web/mage/backend/form.js
@@ -2,18 +2,10 @@
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
-(function (factory) {
- 'use strict';
-
- if (typeof define === 'function' && define.amd) {
- define([
- 'jquery',
- 'jquery/ui'
- ], factory);
- } else {
- factory(jQuery);
- }
-}(function ($) {
+define([
+ 'jquery',
+ 'jquery/ui'
+], function ($) {
'use strict';
$.widget('mage.form', {
@@ -209,4 +201,4 @@
});
return $.mage.form;
-}));
+});
diff --git a/lib/web/mage/backend/menu.js b/lib/web/mage/backend/menu.js
index b56d49086c4f0..35a851fa0de47 100644
--- a/lib/web/mage/backend/menu.js
+++ b/lib/web/mage/backend/menu.js
@@ -3,18 +3,10 @@
* See COPYING.txt for license details.
*/
-(function (factory) {
- 'use strict';
-
- if (typeof define === 'function' && define.amd) {
- define([
- 'jquery',
- 'jquery/ui'
- ], factory);
- } else {
- factory(jQuery);
- }
-}(function ($) {
+define([
+ 'jquery',
+ 'jquery/ui'
+], function ($) {
'use strict';
$.widget('mage.menu', {
@@ -784,4 +776,4 @@
});
return $.mage.menu;
-}));
+});
diff --git a/lib/web/mage/backend/suggest.js b/lib/web/mage/backend/suggest.js
index d34be10420912..ffd615a62a220 100644
--- a/lib/web/mage/backend/suggest.js
+++ b/lib/web/mage/backend/suggest.js
@@ -3,22 +3,14 @@
* See COPYING.txt for license details.
*/
-(function (root, factory) {
- 'use strict';
-
- if (typeof define === 'function' && define.amd) {
- define([
- 'jquery',
- 'mage/template',
- 'mage/mage',
- 'jquery/ui',
- 'mage/backend/menu',
- 'mage/translate'
- ], factory);
- } else {
- factory(root.jQuery, root.mageTemplate);
- }
-}(this, function ($, mageTemplate) {
+define([
+ 'jquery',
+ 'mage/template',
+ 'mage/mage',
+ 'jquery/ui',
+ 'mage/backend/menu',
+ 'mage/translate'
+], function ($, mageTemplate) {
'use strict';
/**
@@ -1196,4 +1188,4 @@
});
return $.mage.suggest;
-}));
+});
diff --git a/lib/web/mage/backend/tabs.js b/lib/web/mage/backend/tabs.js
index 849b73c20b5b2..5b602fda580ee 100644
--- a/lib/web/mage/backend/tabs.js
+++ b/lib/web/mage/backend/tabs.js
@@ -4,18 +4,10 @@
*/
/* global FORM_KEY */
-(function (factory) {
- 'use strict';
-
- if (typeof define === 'function' && define.amd) {
- define([
- 'jquery',
- 'jquery/ui'
- ], factory);
- } else {
- factory(jQuery);
- }
-}(function ($) {
+define([
+ 'jquery',
+ 'jquery/ui'
+], function ($) {
'use strict';
var rhash, isLocal;
@@ -423,4 +415,4 @@
});
return $.mage.tabs;
-}));
+});
diff --git a/lib/web/mage/backend/tree-suggest.js b/lib/web/mage/backend/tree-suggest.js
index 47f034b0b2431..8d09ce4dc1194 100644
--- a/lib/web/mage/backend/tree-suggest.js
+++ b/lib/web/mage/backend/tree-suggest.js
@@ -3,20 +3,12 @@
* See COPYING.txt for license details.
*/
-(function (root, factory) {
- 'use strict';
-
- if (typeof define === 'function' && define.amd) {
- define([
- 'jquery',
- 'jquery/ui',
- 'jquery/jstree/jquery.jstree',
- 'mage/backend/suggest'
- ], factory);
- } else {
- factory(root.jQuery);
- }
-}(this, function ($) {
+define([
+ 'jquery',
+ 'jquery/ui',
+ 'jquery/jstree/jquery.jstree',
+ 'mage/backend/suggest'
+], function ($) {
'use strict';
/* jscs:disable requireCamelCaseOrUpperCaseIdentifiers */
@@ -274,4 +266,4 @@
});
return $.mage.treeSuggest;
-}));
+});
diff --git a/lib/web/mage/backend/validation.js b/lib/web/mage/backend/validation.js
index 1043f45a7402e..c07fcd1542079 100644
--- a/lib/web/mage/backend/validation.js
+++ b/lib/web/mage/backend/validation.js
@@ -4,23 +4,15 @@
*/
/* global BASE_URL, alertAlreadyDisplayed */
-(function (factory) {
- 'use strict';
-
- if (typeof define === 'function' && define.amd) {
- define([
- 'jquery',
- 'underscore',
- 'Magento_Ui/js/modal/alert',
- 'jquery/ui',
- 'jquery/validate',
- 'mage/translate',
- 'mage/validation'
- ], factory);
- } else {
- factory(jQuery);
- }
-}(function ($, _, alert) {
+define([
+ 'jquery',
+ 'underscore',
+ 'Magento_Ui/js/modal/alert',
+ 'jquery/ui',
+ 'jquery/validate',
+ 'mage/translate',
+ 'mage/validation'
+], function ($, _, alert) {
'use strict';
$.extend(true, $.validator.prototype, {
@@ -307,4 +299,4 @@
});
return $.mage.validation;
-}));
+});
diff --git a/lib/web/mage/calendar.css b/lib/web/mage/calendar.css
index 071270feeeb3e..da19f389d3085 100644
--- a/lib/web/mage/calendar.css
+++ b/lib/web/mage/calendar.css
@@ -141,7 +141,6 @@
padding: 0;
}
.ui-datepicker {
- background: #ffffff;
padding: 15px;
border: #ffffff 4px solid;
-webkit-box-sizing: border-box;
diff --git a/lib/web/mage/calendar.js b/lib/web/mage/calendar.js
index 85f1904c0e194..d3eb055d29d81 100644
--- a/lib/web/mage/calendar.js
+++ b/lib/web/mage/calendar.js
@@ -4,20 +4,12 @@
*/
/*eslint max-depth: 0*/
-(function (factory) {
- 'use strict';
-
- if (typeof define === 'function' && define.amd) {
- define([
- 'jquery',
- 'jquery-ui-modules/widget',
- 'jquery-ui-modules/datepicker',
- 'jquery-ui-modules/timepicker'
- ], factory);
- } else {
- factory(window.jQuery);
- }
-}(function ($) {
+define([
+ 'jquery',
+ 'jquery-ui-modules/widget',
+ 'jquery-ui-modules/datepicker',
+ 'jquery-ui-modules/timepicker'
+], function ($) {
'use strict';
var calendarBasePrototype,
@@ -566,4 +558,4 @@
dateRange: $.mage.dateRange,
calendar: $.mage.calendar
};
-}));
+});
diff --git a/lib/web/mage/cookies.js b/lib/web/mage/cookies.js
index ee47d69949ead..627e22ade323b 100644
--- a/lib/web/mage/cookies.js
+++ b/lib/web/mage/cookies.js
@@ -3,19 +3,11 @@
* See COPYING.txt for license details.
*/
-(function (factory) {
- 'use strict';
-
- if (typeof define === 'function' && define.amd) {
- define([
- 'jquery',
- 'mage/mage',
- 'jquery/jquery.cookie'
- ], factory);
- } else {
- factory(jQuery);
- }
-}(function ($) {
+define([
+ 'jquery',
+ 'mage/mage',
+ 'jquery/jquery.cookie'
+], function ($) {
'use strict';
/**
@@ -154,4 +146,4 @@
$.extend($.mage.cookies.defaults, pageOptions);
$.extend($.cookie.defaults, $.mage.cookies.defaults);
};
-}));
+});
diff --git a/lib/web/mage/decorate.js b/lib/web/mage/decorate.js
index 238735ac455b9..437dee1be2888 100644
--- a/lib/web/mage/decorate.js
+++ b/lib/web/mage/decorate.js
@@ -4,16 +4,10 @@
*/
/* eslint-disable strict */
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define([
- 'jquery',
- 'mage/translate'
- ], factory);
- } else {
- factory(jQuery);
- }
-}(function ($) {
+define([
+ 'jquery',
+ 'mage/translate'
+], function ($) {
var methods = {
/**
* Decorate a list (e.g. a containing ) recursively if specified.
@@ -25,7 +19,7 @@
items;
if (list.length > 0) {
- items = typeof isRecursive === undefined || isRecursive ?
+ items = typeof isRecursive === 'undefined' || isRecursive ?
list.find('li') :
list.children();
items.decorate('generic', ['odd', 'even', 'last']);
@@ -129,4 +123,4 @@
message = $.mage.__('Method %s does not exist on jQuery.decorate');
$.error(message.replace('%s', method));
};
-}));
+});
diff --git a/lib/web/mage/edit-trigger.js b/lib/web/mage/edit-trigger.js
index e28a826ec87ee..30d26d8626df3 100644
--- a/lib/web/mage/edit-trigger.js
+++ b/lib/web/mage/edit-trigger.js
@@ -6,19 +6,11 @@
/**
* @deprecated since version 2.2.0
*/
-(function (root, factory) {
- 'use strict';
-
- if (typeof define === 'function' && define.amd) {
- define([
- 'jquery',
- 'mage/template',
- 'jquery-ui-modules/widget'
- ], factory);
- } else {
- factory(root.jQuery, root.mageTemplate);
- }
-}(this, function ($, mageTemplate) {
+define([
+ 'jquery',
+ 'mage/template',
+ 'jquery-ui-modules/widget'
+], function ($, mageTemplate) {
'use strict';
var editTriggerPrototype;
@@ -220,4 +212,4 @@
}));
return $.mage.editTrigger;
-}));
+});
diff --git a/lib/web/mage/loader_old.js b/lib/web/mage/loader_old.js
index f759758acd12a..f72191f5b634b 100644
--- a/lib/web/mage/loader_old.js
+++ b/lib/web/mage/loader_old.js
@@ -3,20 +3,12 @@
* See COPYING.txt for license details.
*/
-(function (root, factory) {
- 'use strict';
-
- if (typeof define === 'function' && define.amd) {
- define([
- 'jquery',
- 'mage/template',
- 'jquery-ui-modules/widget',
- 'mage/translate'
- ], factory);
- } else {
- factory(root.jQuery, root.mageTemplate);
- }
-}(this, function ($, mageTemplate) {
+define([
+ 'jquery',
+ 'mage/template',
+ 'jquery-ui-modules/widget',
+ 'mage/translate'
+], function ($, mageTemplate) {
'use strict';
$.widget('mage.loader', {
@@ -232,4 +224,4 @@
loader: $.mage.loader,
loaderAjax: $.mage.loaderAjax
};
-}));
+});
diff --git a/lib/web/mage/mage.js b/lib/web/mage/mage.js
index ba9aa678aaef6..9e479016fecc5 100644
--- a/lib/web/mage/mage.js
+++ b/lib/web/mage/mage.js
@@ -3,18 +3,10 @@
* See COPYING.txt for license details.
*/
-(function (root, factory) {
- 'use strict';
-
- if (typeof define === 'function' && define.amd) {
- define([
- 'jquery',
- 'mage/apply/main'
- ], factory);
- } else {
- factory(root.jQuery);
- }
-}(this, function ($, mage) {
+define([
+ 'jquery',
+ 'mage/apply/main'
+], function ($, mage) {
'use strict';
/**
@@ -100,4 +92,4 @@
});
return $.mage;
-}));
+});
diff --git a/lib/web/mage/popup-window.js b/lib/web/mage/popup-window.js
index 5d7b0d1ddfd55..86a12a0954423 100644
--- a/lib/web/mage/popup-window.js
+++ b/lib/web/mage/popup-window.js
@@ -57,8 +57,8 @@ define([
settings.windowURL = settings.windowURL || element.attr('href');
if (settings.centerBrowser) {
- centeredY = window.screenY + ((window.outerHeight / 2 - settings.height / 2));
- centeredX = window.screenX + ((window.outerWidth / 2 - settings.width / 2));
+ centeredY = window.screenY + (window.outerHeight / 2 - settings.height / 2);
+ centeredX = window.screenX + (window.outerWidth / 2 - settings.width / 2);
windowFeatures += ',left=' + centeredX + ',top=' + centeredY;
} else if (settings.centerScreen) {
centeredY = (screen.height - settings.height) / 2;
diff --git a/lib/web/mage/template.js b/lib/web/mage/template.js
index 3da9693eb5340..db34bd4c4a1a4 100644
--- a/lib/web/mage/template.js
+++ b/lib/web/mage/template.js
@@ -3,17 +3,9 @@
* See COPYING.txt for license details.
*/
-(function (root, factory) {
- 'use strict';
-
- if (typeof define === 'function' && define.amd) {
- define([
- 'underscore'
- ], factory);
- } else {
- root.mageTemplate = factory(root._);
- }
-}(this, function (_) {
+define([
+ 'underscore'
+], function (_) {
'use strict';
/**
@@ -84,4 +76,4 @@
render(data) :
render;
};
-}));
+});
diff --git a/lib/web/mage/translate-inline-vde.css b/lib/web/mage/translate-inline-vde.css
index 369c1fb9a2f07..f898bb01c43d9 100644
--- a/lib/web/mage/translate-inline-vde.css
+++ b/lib/web/mage/translate-inline-vde.css
@@ -52,7 +52,6 @@
}
.translate-dialog .ui-dialog-buttonset {
- padding-right: 0;
margin-right: 0;
float: right;
background: rgba(223, 243, 250, 1.0);
diff --git a/lib/web/mage/translate-inline-vde.js b/lib/web/mage/translate-inline-vde.js
index 485413e3c9289..e39a86934b03b 100644
--- a/lib/web/mage/translate-inline-vde.js
+++ b/lib/web/mage/translate-inline-vde.js
@@ -6,22 +6,14 @@
/**
* @deprecated since version 2.2.0
*/
-(function (root, factory) {
- 'use strict';
-
- if (typeof define === 'function' && define.amd) {
- define([
- 'jquery',
- 'mage/template',
- 'jquery-ui-modules/widget',
- 'jquery-ui-modules/core',
- 'mage/translate-inline',
- 'mage/translate'
- ], factory);
- } else {
- factory(root.jQuery, root.mageTemplate);
- }
-}(this, function ($, mageTemplate) {
+define([
+ 'jquery',
+ 'mage/template',
+ 'jquery-ui-modules/widget',
+ 'jquery-ui-modules/core',
+ 'mage/translate-inline',
+ 'mage/translate'
+], function ($, mageTemplate) {
'use strict';
/**
@@ -598,4 +590,4 @@
}
}
});
-}));
+});
diff --git a/lib/web/mage/translate-inline.js b/lib/web/mage/translate-inline.js
index cdd2b8ad322f2..56acef5a49a42 100644
--- a/lib/web/mage/translate-inline.js
+++ b/lib/web/mage/translate-inline.js
@@ -3,20 +3,12 @@
* See COPYING.txt for license details.
*/
-(function (root, factory) {
- 'use strict';
-
- if (typeof define === 'function' && define.amd) {
- define([
- 'jquery',
- 'mage/template',
- 'jquery-ui-modules/dialog',
- 'mage/translate'
- ], factory);
- } else {
- factory(root.jQuery, root.mageTemplate);
- }
-}(this, function ($, mageTemplate) {
+define([
+ 'jquery',
+ 'mage/template',
+ 'jquery-ui-modules/dialog',
+ 'mage/translate'
+], function ($, mageTemplate) {
'use strict';
$.widget('mage.translateInline', $.ui.dialog, {
@@ -201,4 +193,4 @@
});
return $.mage.translateInline;
-}));
+});
diff --git a/lib/web/mage/translate.js b/lib/web/mage/translate.js
index a9c30bf577918..65ec33266aebd 100644
--- a/lib/web/mage/translate.js
+++ b/lib/web/mage/translate.js
@@ -3,17 +3,13 @@
* See COPYING.txt for license details.
*/
-/* eslint-disable strict */
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define([
- 'jquery',
- 'mage/mage'
- ], factory);
- } else {
- factory(jQuery);
- }
-}(function ($) {
+define([
+ 'jquery',
+ 'mage/mage',
+ 'mageTranslationDictionary'
+], function ($, mage, dictionary) {
+ 'use strict';
+
$.extend(true, $, {
mage: {
translate: (function () {
@@ -22,33 +18,33 @@
* @type {Object}
* @private
*/
- var _data = {};
+ var _data = dictionary;
- /**
- * Add new translation (two string parameters) or several translations (object)
- */
- this.add = function () {
- if (arguments.length > 1) {
- _data[arguments[0]] = arguments[1];
- } else if (typeof arguments[0] === 'object') {
- $.extend(_data, arguments[0]);
- }
- };
+ return {
+ /**
+ * Add new translation (two string parameters) or several translations (object)
+ */
+ add: function () {
+ if (arguments.length > 1) {
+ _data[arguments[0]] = arguments[1];
+ } else if (typeof arguments[0] === 'object') {
+ $.extend(_data, arguments[0]);
+ }
+ },
- /**
- * Make a translation with parsing (to handle case when _data represents tuple)
- * @param {String} text
- * @return {String}
- */
- this.translate = function (text) {
- return _data[text] ? _data[text] : text;
+ /**
+ * Make a translation with parsing (to handle case when _data represents tuple)
+ * @param {String} text
+ * @return {String}
+ */
+ translate: function (text) {
+ return _data[text] ? _data[text] : text;
+ }
};
-
- return this;
}())
}
});
$.mage.__ = $.proxy($.mage.translate.translate, $.mage.translate);
return $.mage.__;
-}));
+});
diff --git a/lib/web/mage/validation.js b/lib/web/mage/validation.js
index b284f0002bc66..51c23a9b28c66 100644
--- a/lib/web/mage/validation.js
+++ b/lib/web/mage/validation.js
@@ -3,21 +3,13 @@
* See COPYING.txt for license details.
*/
-(function (factory) {
- 'use strict';
-
- if (typeof define === 'function' && define.amd) {
- define([
- 'jquery',
- 'moment',
- 'jquery-ui-modules/widget',
- 'jquery/validate',
- 'mage/translate'
- ], factory);
- } else {
- factory(jQuery);
- }
-}(function ($, moment) {
+define([
+ 'jquery',
+ 'moment',
+ 'jquery-ui-modules/widget',
+ 'jquery/validate',
+ 'mage/translate'
+], function ($, moment) {
'use strict';
var creditCartTypes, rules, showLabel, originValidateDelegate;
@@ -559,7 +551,7 @@
/* eslint-enable max-len */
'pattern': [
function (value, element, param) {
- return this.optional(element) || param.test(value);
+ return this.optional(element) || new RegExp(param).test(value);
},
$.mage.__('Invalid format.')
],
@@ -1925,7 +1917,6 @@
* @protected
*/
_create: function () {
- this._prepareArrayInputs();
this.validate = this.element.validate(this.options);
// ARIA (adding aria-required attribute)
@@ -1938,50 +1929,6 @@
this._listenFormValidate();
},
- /**
- * Validation creation.
- *
- * @protected
- */
- _prepareArrayInputs: function () {
- /* Store original names for array inputs */
- var originalElements = [],
- originalSubmitHandler = this.options.submitHandler;
-
- /* For all array inputs, assign index so that validation is proper */
- this.element.find('[name$="[]"]').each(function (key, input) {
- var originalName, name;
-
- input = $(input);
- originalName = input.attr('name');
- name = originalName.replace('[]', '[' + key + ']');
- $(input).attr('name', name);
- $(input).attr('orig-name', originalName);
- originalElements.push({
- element: $(input),
- name: originalName
- });
- });
-
- if (originalElements.length) {
- /**
- * Before submitting the actual form, remove the previously assigned indices
- * @param {Object} form
- */
- this.options.submitHandler = function (form) {
- originalElements.forEach(function (element) {
- element.element.attr('name', element.name);
- element.element.removeAttr('orig-name');
- });
-
- console.error(this.submit);
-
- /* Call the originalSubmitHandler if it's a function */
- typeof originalSubmitHandler === 'function' ? originalSubmitHandler(form) : form.submit();
- };
- }
- },
-
/**
* Validation listening.
*
@@ -2032,4 +1979,4 @@
});
return $.mage.validation;
-}));
+});
diff --git a/lib/web/mage/validation/validation.js b/lib/web/mage/validation/validation.js
index 69cb984b0d82d..c8478ac84edd4 100644
--- a/lib/web/mage/validation/validation.js
+++ b/lib/web/mage/validation/validation.js
@@ -3,19 +3,11 @@
* See COPYING.txt for license details.
*/
-(function (factory) {
- 'use strict';
-
- if (typeof define === 'function' && define.amd) {
- define([
- 'jquery',
- 'mage/validation',
- 'mage/translate'
- ], factory);
- } else {
- factory(jQuery);
- }
-}(function ($) {
+define([
+ 'jquery',
+ 'mage/validation',
+ 'mage/translate'
+], function ($) {
'use strict';
$.each({
@@ -49,23 +41,18 @@
'validate-one-checkbox-required-by-name': [
function (value, element, params) {
var checkedCount = 0,
- selector,
- container,
- origNameSelector,
- nameSelector;
+ container;
if (element.type === 'checkbox') {
- /* If orig-name attribute is present, use it for validation. Else use name */
- origNameSelector = '[orig-name="' + element.getAttribute('orig-name') + '"]';
- nameSelector = '[name="' + element.name + '"]';
- selector = element.getAttribute('orig-name') ? origNameSelector : nameSelector;
- $(selector).each(function () {
- if ($(this).is(':checked')) {
- checkedCount += 1;
-
- return false;
+ $('[name="' + element.name + '"]').each(
+ function () {
+ if ($(this).is(':checked')) {
+ checkedCount += 1;
+
+ return false;
+ }
}
- });
+ );
}
container = '#' + params;
@@ -180,4 +167,4 @@
rule.unshift(i);
$.validator.addMethod.apply($.validator, rule);
});
-}));
+});
diff --git a/lib/web/mage/webapi.js b/lib/web/mage/webapi.js
index 3aa61b6f97752..ccb5efb85f64f 100644
--- a/lib/web/mage/webapi.js
+++ b/lib/web/mage/webapi.js
@@ -6,18 +6,10 @@
/**
* @deprecated since version 2.2.0
*/
-(function (factory) {
- 'use strict';
-
- if (typeof define === 'function' && define.amd) {
- define([
- 'jquery',
- 'mage/mage'
- ], factory);
- } else {
- factory(jQuery);
- }
-}(function ($) {
+define([
+ 'jquery',
+ 'mage/mage'
+], function ($) {
'use strict';
/**
@@ -208,4 +200,4 @@
}
};
};
-}));
+});
diff --git a/lib/web/mage/zoom.js b/lib/web/mage/zoom.js
index a7ad19fb560a0..cd7dd738158d0 100644
--- a/lib/web/mage/zoom.js
+++ b/lib/web/mage/zoom.js
@@ -6,19 +6,11 @@
/**
* @deprecated since version 2.2.0
*/
-(function (root, factory) {
- 'use strict';
-
- if (typeof define === 'function' && define.amd) {
- define([
- 'jquery',
- 'mage/template',
- 'jquery-ui-modules/widget'
- ], factory);
- } else {
- factory(root.jQuery, root.mageTemplate);
- }
-}(this, function ($, mageTemplate) {
+define([
+ 'jquery',
+ 'mage/template',
+ 'jquery-ui-modules/widget'
+], function ($, mageTemplate) {
'use strict';
$.widget('mage.zoom', {
@@ -538,4 +530,4 @@
});
return $.mage.zoom;
-}));
+});
diff --git a/setup/performance-toolkit/benchmark.jmx b/setup/performance-toolkit/benchmark.jmx
index 40983a097c58d..723814432b7e1 100644
--- a/setup/performance-toolkit/benchmark.jmx
+++ b/setup/performance-toolkit/benchmark.jmx
@@ -504,6 +504,11 @@
${__P(graphqlGetCmsPageByIdPercentage,0)}
=
+
+ graphqlGetCmsPageWithPageBuilderProductListPercentage
+ ${__P(graphqlGetCmsPageWithPageBuilderProductListPercentage,0)}
+ =
+
graphqlGetConfigurableProductDetailsByNamePercentage
${__P(graphqlGetConfigurableProductDetailsByNamePercentage,0)}
@@ -574,11 +579,21 @@
${__P(graphqlUpdateConfigurableProductQtyInCartPercentage,0)}
=
+
+ graphqlUpdateConfigurableProductQtyInCartWithPricesPercentage
+ ${__P(graphqlUpdateConfigurableProductQtyInCartWithPricesPercentage,0)}
+ =
+
graphqlUpdateSimpleProductQtyInCartPercentage
${__P(graphqlUpdateSimpleProductQtyInCartPercentage,0)}
=
+
+ graphqlUpdateSimpleProductQtyInCartWithPricesPercentage
+ ${__P(graphqlUpdateSimpleProductQtyInCartWithPricesPercentage,0)}
+ =
+
graphqlUrlInfoByUrlKeyPercentage
${__P(graphqlUrlInfoByUrlKeyPercentage,0)}
@@ -36057,6 +36072,187 @@ vars.put("configurable_sku", "Configurable Product - ${__time(YMD)}-${__threadNu
+
+
+
+
+ mpaf/tool/fragments/ee/admin_create_cms_page_with_page_builder_product_list/admin_create_cms_page_with_page_builder_product_list.jmx
+
+
+
+
+
+
+
+
+ 60000
+ 200000
+ ${request_protocol}
+
+ ${base_path}${admin_path}/cms/page/new
+ GET
+ true
+ false
+ true
+ false
+ false
+
+
+
+
+
+
+
+ true
+ <div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-element="inner" style="justify-content: flex-start; display: flex; flex-direction: column; background-position: left top; background-size: cover; background-repeat: no-repeat; background-attachment: scroll; border-style: none; border-width: 1px; border-radius: 0px; margin: 0px 0px 10px; padding: 10px;"><div data-content-type="products" data-appearance="grid" data-element="main" style="border-style: none; border-width: 1px; border-radius: 0px; margin: 0px; padding: 0px;">{{widget type="Magento\CatalogWidget\Block\Product\ProductsList" template="Magento_CatalogWidget::product/widget/content/grid.phtml" anchor_text="" id_path="" show_pager="0" products_count="5" sort_order="date_newest_top" type_name="Catalog Products List" conditions_encoded="^[`1`:^[`type`:`Magento||CatalogWidget||Model||Rule||Condition||Combine`,`aggregator`:`any`,`value`:`1`,`new_child`:``^]^]"}}</div></div></div>
+ =
+ true
+ content
+
+
+ true
+
+ =
+ true
+ content_heading
+
+
+ true
+ ${admin_form_key}
+ =
+ true
+ form_key
+
+
+ true
+
+ =
+ true
+ identifier
+
+
+ true
+ 1
+ =
+ true
+ is_active
+
+
+ true
+
+ =
+ true
+ layout_update_xml
+
+
+ true
+
+ =
+ true
+ meta_description
+
+
+ true
+
+ =
+ true
+ meta_keywords
+
+
+ true
+
+ =
+ true
+ meta_title
+
+
+ false
+ {}
+ =
+ true
+ nodes_data
+
+
+ true
+
+ =
+ true
+ node_ids
+
+
+ true
+
+ =
+ true
+ page_id
+
+
+ true
+ 1column
+ =
+ true
+ page_layout
+
+
+ true
+ 0
+ =
+ true
+ store_id[0]
+
+
+ true
+ Page Builder Products ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}
+ =
+ true
+ title
+
+
+ true
+ 0
+ =
+ true
+ website_root
+
+
+
+
+
+ 60000
+ 200000
+ ${request_protocol}
+
+ ${base_path}${admin_path}/cms/page/save/back/edit
+ POST
+ true
+ false
+ true
+ false
+ false
+
+
+
+
+
+ You saved the page.
+
+ Assertion.response_data
+ false
+ 16
+
+
+
+ URL
+ cms_page_id
+ /page_id\/([0-9]*)\/back/
+ $1$
+
+ 1
+
+
+
+
+
@@ -39428,6 +39624,104 @@ if (name == null) {
+
+
+ true
+
+
+
+ false
+ {"query":"{\n categoryList{\n name\n id\n level\n description\n path\n path_in_store\n url_key\n url_path\n children {\n id\n description\n default_sort_by\n children {\n id\n description\n level\n children {\n level\n id\n children {\n id\n }\n }\n }\n }\n }\n}","variables":null,"operationName":null}
+ =
+
+
+
+
+
+
+
+ ${request_protocol}
+
+ ${base_path}graphql
+ POST
+ true
+ false
+ true
+ false
+ false
+
+ mpaf/tool/fragments/ce/graphql/query_root_category_list.jmx
+
+
+
+ graphql_categoryList_query_name
+ $.data.categoryList[0].name
+
+
+ BODY
+ JSON
+
+
+
+ String name = vars.get("graphql_categoryList_query_name");
+if (name == null) {
+ Failure = true;
+ FailureMessage = "Not Expected \"children\" to be null";
+} else {
+ if (!name.equals("Default Category")) {
+ Failure = true;
+ FailureMessage = "Expected \"name\" to equal \"Default Category\", Actual: " + name;
+ } else {
+ Failure = false;
+ }
+}
+
+
+
+ false
+
+
+
+
+
+ true
+
+
+
+ false
+
+ {"query":"query getCmsPage($id: Int!, $onServer: Boolean!) {\n cmsPage(id: $id) {\n url_key\n content\n content_heading\n title\n page_layout\n meta_title @include(if: $onServer)\n meta_keywords @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n}","variables":{"id":${cms_page_id},"onServer":false},"operationName":"getCmsPage"}
+
+ =
+
+
+
+
+ ${graphql_port_number}
+ 60000
+ 200000
+ ${request_protocol}
+
+ ${base_path}graphql
+ POST
+ true
+ false
+ true
+ false
+ false
+
+ mpaf/tool/fragments/ce/graphql/get_get_cms_page_by_id.jmx
+
+
+ $.data.cmsPage.url_key
+ ${cms_page_id}
+ false
+ false
+ false
+ false
+
+
+
@@ -40358,11 +40652,11 @@ function assertCategoryChildren(category, response) {
-
+
1
false
1
- ${graphqlUrlInfoByUrlKeyPercentage}
+ ${graphqlGetCategoryListByCategoryIdPercentage}
mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx
@@ -40383,7 +40677,7 @@ if (testLabel
- vars.put("testLabel", "GraphQL Get Url Info by url_key");
+ vars.put("testLabel", "GraphQL Get Category List by category_url_key");
true
@@ -40439,15 +40733,13 @@ vars.putObject("category", categories[number]);
mpaf/tool/fragments/ce/common/extract_category_setup.jmx
-
+
true
false
-
- {"query":"query resolveUrl($urlKey: String!) {\n urlResolver(url: $urlKey) {\n type\n id\n }\n}","variables":{"urlKey":"${category_url_key}${url_suffix}"},"operationName":"resolveUrl"}
-
+ {"query" : "{\n categoryList(filters:{url_key: {in: [\"${category_url_key}\"]}}) {\n id\n children {\n id\n name\n url_key\n url_path\n children_count\n path\n image\n productImagePreview: products(pageSize: 1, sort: {name: ASC}) {\n items {\n small_image {\n label\n url\n }\n }\n }\n }\n }\n}"}
=
@@ -40466,26 +40758,52 @@ vars.putObject("category", categories[number]);
false
false
- mpaf/tool/fragments/ce/graphql/get_url_info_by_url_key.jmx
+ mpaf/tool/fragments/ce/graphql/get_category_list_by_category_url_key.jmx
+
-
-
- {"type":"CATEGORY","id":${category_id}}
-
- Assertion.response_data
- false
- 2
-
+
+ javascript
+
+
+
+ var category = vars.getObject("category");
+var response = JSON.parse(prev.getResponseDataAsString());
+
+assertCategoryId(category, response);
+assertCategoryChildren(category, response);
+
+function assertCategoryId(category, response) {
+ if (response.data == undefined || response.data.categoryList == undefined || response.data.categoryList[0].id != category.id) {
+ AssertionResult.setFailureMessage("Cannot find category with id \"" + category.id + "\"");
+ AssertionResult.setFailure(true);
+ }
+}
+
+function assertCategoryChildren(category, response) {
+ foundCategory = response.data && response.data.categoryList ? response.data.categoryList[0] : null;
+ if (foundCategory) {
+ var childrenFound = foundCategory.children.map(function (c) {return parseInt(c.id)});
+ var children = category.children.map(function (c) {return parseInt(c)});
+ if (JSON.stringify(children.sort()) != JSON.stringify(childrenFound.sort())) {
+ AssertionResult.setFailureMessage("Cannot math children categories \"" + JSON.stringify(children) + "\" for to found one: \"" + JSON.stringify(childrenFound) + "\"");
+ AssertionResult.setFailure(true);
+ }
+ }
+
+}
+
+
+
-
+
1
false
1
- ${graphqlGetCmsPageByIdPercentage}
+ ${graphqlGetCategoryListByCategoryIdPercentage}
mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx
@@ -40506,7 +40824,7 @@ if (testLabel
- vars.put("testLabel", "GraphQL Get Cms Page by id");
+ vars.put("testLabel", "GraphQL Get Multiple Categories");
true
@@ -40544,30 +40862,47 @@ vars.putObject("randomIntGenerator", random);
-
+
javascript
random = vars.getObject("randomIntGenerator");
-var cmsPages = props.get("cms_pages");
-var number = random.nextInt(cmsPages.length);
+var categories = props.get("categories");
-vars.put("cms_page_id", cmsPages[number].id);
-
- mpaf/tool/fragments/ce/setup/prepare_cms_page.jmx
+var numbers = [];
+
+var sanity = 0;
+for(var i = 0; i < 4; i++){
+ sanity++;
+ if(sanity > 100){
+ break;
+ }
+ var number = random.nextInt(categories.length)
+ if(numbers.indexOf(number) >= 0){
+ i--;
+ continue;
+ }
+ numbers.push(number);
+}
+
+vars.put("category_id_1", categories[numbers[0]].id);
+vars.put("category_id_2", categories[numbers[1]].id);
+vars.put("category_id_3", categories[numbers[2]].id);
+vars.put("category_id_4", categories[numbers[3]].id);
+
+ mpaf/tool/fragments/ce/common/extract_multiple_categories_setup.jmx
+
-
+
true
false
-
- {"query":"query getCmsPage($id: Int!, $onServer: Boolean!) {\n cmsPage(id: $id) {\n url_key\n content\n content_heading\n title\n page_layout\n meta_title @include(if: $onServer)\n meta_keywords @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n}","variables":{"id":${cms_page_id},"onServer":false},"operationName":"getCmsPage"}
-
+ {"query" : "{\n categoryList(filters:{ids: {in: [\"${category_id_1}\", \"${category_id_2}\", \"${category_id_3}\", \"${category_id_4}\"]}}) {\n id\n children {\n id\n name\n url_key\n url_path\n children_count\n path\n image\n productImagePreview: products(pageSize: 1, sort: {name: ASC}) {\n items {\n small_image {\n label\n url\n }\n }\n }\n }\n }\n}"}
=
@@ -40586,26 +40921,37 @@ vars.put("cms_page_id", cmsPages[number].id);
false
false
- mpaf/tool/fragments/ce/graphql/get_get_cms_page_by_id.jmx
+ mpaf/tool/fragments/ce/graphql/get_multiple_categories_by_id.jmx
+
-
- $.data.cmsPage.url_key
- ${cms_page_id}
- false
- false
- false
- false
-
+
+ javascript
+
+
+
+ var response = JSON.parse(prev.getResponseDataAsString());
+
+if(response.data == undefined || response.data.categoryList == undefined){
+ AssertionResult.setFailureMessage("CategoryList results are empty.");
+ AssertionResult.setFailure(true);
+}
+
+if(response.data.categoryList.length !== 4){
+ AssertionResult.setFailureMessage("CategoryList query expected to find 4 categories. " + response.data.categoryList.length + " returned.");
+ AssertionResult.setFailure(true);
+}
+
+
-
+
1
false
1
- ${graphqlGetNavigationMenuByCategoryIdPercentage}
+ ${graphqlUrlInfoByUrlKeyPercentage}
mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx
@@ -40626,7 +40972,7 @@ if (testLabel
- vars.put("testLabel", "GraphQL Get Navigation Menu by category_id");
+ vars.put("testLabel", "GraphQL Get Url Info by url_key");
true
@@ -40682,13 +41028,15 @@ vars.putObject("category", categories[number]);
mpaf/tool/fragments/ce/common/extract_category_setup.jmx
-
+
true
false
- {"query":"query navigationMenu($id: Int!) {\n category(id: $id) {\n id\n name\n product_count\n path\n children {\n id\n name\n position\n level\n url_key\n url_path\n product_count\n children_count\n path\n productImagePreview: products(pageSize: 1, sort: {name: ASC}) {\n items {\n small_image {\n label\n url\n }\n }\n }\n }\n }\n}","variables":{"id":${category_id}},"operationName":"navigationMenu"}
+
+ {"query":"query resolveUrl($urlKey: String!) {\n urlResolver(url: $urlKey) {\n type\n id\n }\n}","variables":{"urlKey":"${category_url_key}${url_suffix}"},"operationName":"resolveUrl"}
+
=
@@ -40707,12 +41055,11 @@ vars.putObject("category", categories[number]);
false
false
- mpaf/tool/fragments/ce/graphql/get_navigation_menu_by_category_id.jmx
-
+ mpaf/tool/fragments/ce/graphql/get_url_info_by_url_key.jmx
- "id":${category_id},"name":"${category_name}","product_count"
+ {"type":"CATEGORY","id":${category_id}}
Assertion.response_data
false
@@ -40723,11 +41070,11 @@ vars.putObject("category", categories[number]);
-
+
1
false
1
- ${graphqlCreateEmptyCartPercentage}
+ ${graphqlGetCmsPageByIdPercentage}
mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx
@@ -40748,7 +41095,7 @@ if (testLabel
- vars.put("testLabel", "GraphQL Create Empty Cart");
+ vars.put("testLabel", "GraphQL Get Cms Page by id");
true
@@ -40786,13 +41133,30 @@ vars.putObject("randomIntGenerator", random);
-
+
+ javascript
+
+
+
+ random = vars.getObject("randomIntGenerator");
+
+var cmsPages = props.get("cms_pages");
+var number = random.nextInt(cmsPages.length);
+
+vars.put("cms_page_id", cmsPages[number].id);
+
+ mpaf/tool/fragments/ce/setup/prepare_cms_page.jmx
+
+
+
true
false
- {"query":"mutation {\n createEmptyCart\n}","variables":null,"operationName":null}
+
+ {"query":"query getCmsPage($id: Int!, $onServer: Boolean!) {\n cmsPage(id: $id) {\n url_key\n content\n content_heading\n title\n page_layout\n meta_title @include(if: $onServer)\n meta_keywords @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n}","variables":{"id":${cms_page_id},"onServer":false},"operationName":"getCmsPage"}
+
=
@@ -40811,35 +41175,26 @@ vars.putObject("randomIntGenerator", random);
false
false
- mpaf/tool/fragments/ce/graphql/create_empty_cart.jmx
-
+ mpaf/tool/fragments/ce/graphql/get_get_cms_page_by_id.jmx
-
- quote_id
- $.data.createEmptyCart
-
-
- BODY
-
-
-
-
- {"data":{"createEmptyCart":"
-
- Assertion.response_data
- false
- 2
-
+
+ $.data.cmsPage.url_key
+ ${cms_page_id}
+ false
+ false
+ false
+ false
+
-
+
1
false
1
- ${graphqlGetEmptyCartPercentage}
+ ${graphqlGetNavigationMenuByCategoryIdPercentage}
mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx
@@ -40860,7 +41215,7 @@ if (testLabel
- vars.put("testLabel", "GraphQL Get Empty Cart");
+ vars.put("testLabel", "GraphQL Get Navigation Menu by category_id");
true
@@ -40898,60 +41253,31 @@ vars.putObject("randomIntGenerator", random);
-
- true
-
-
-
- false
- {"query":"mutation {\n createEmptyCart\n}","variables":null,"operationName":null}
- =
-
-
-
-
- ${graphql_port_number}
- 60000
- 200000
- ${request_protocol}
-
- ${base_path}graphql
- POST
- true
- false
- true
- false
- false
-
- mpaf/tool/fragments/ce/graphql/create_empty_cart.jmx
-
-
-
- quote_id
- $.data.createEmptyCart
-
-
- BODY
-
-
-
-
- {"data":{"createEmptyCart":"
-
- Assertion.response_data
- false
- 2
-
-
-
+
+ javascript
+
+
+
+ random = vars.getObject("randomIntGenerator");
+
+var categories = props.get("categories");
+number = random.nextInt(categories.length);
+
+vars.put("category_url_key", categories[number].url_key);
+vars.put("category_name", categories[number].name);
+vars.put("category_id", categories[number].id);
+vars.putObject("category", categories[number]);
+
+ mpaf/tool/fragments/ce/common/extract_category_setup.jmx
+
-
+
true
false
- {"query":"{\n cart(cart_id: \"${quote_id}\") {\n items {\n id\n quantity\n product {\n sku\n }\n }\n }\n}","variables":null,"operationName":null}
+ {"query":"query navigationMenu($id: Int!) {\n category(id: $id) {\n id\n name\n product_count\n path\n children {\n id\n name\n position\n level\n url_key\n url_path\n product_count\n children_count\n path\n productImagePreview: products(pageSize: 1, sort: {name: ASC}) {\n items {\n small_image {\n label\n url\n }\n }\n }\n }\n }\n}","variables":{"id":${category_id}},"operationName":"navigationMenu"}
=
@@ -40970,27 +41296,27 @@ vars.putObject("randomIntGenerator", random);
false
false
- mpaf/tool/fragments/ce/graphql/get_empty_cart.jmx
+ mpaf/tool/fragments/ce/graphql/get_navigation_menu_by_category_id.jmx
- {"data":{"cart":{"items":[]}}}
+ "id":${category_id},"name":"${category_name}","product_count"
Assertion.response_data
false
- 8
+ 2
-
+
1
false
1
- ${graphqlSetShippingAddressOnCartPercentage}
+ ${graphqlCreateEmptyCartPercentage}
mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx
@@ -41011,7 +41337,7 @@ if (testLabel
- vars.put("testLabel", "GraphQL Set Shipping Address On Cart");
+ vars.put("testLabel", "GraphQL Create Empty Cart");
true
@@ -41095,92 +41421,355 @@ vars.putObject("randomIntGenerator", random);
-
-
- true
-
-
-
- false
- {"query":"{\n cart(cart_id: \"${quote_id}\") {\n items {\n id\n quantity\n product {\n sku\n }\n }\n }\n}","variables":null,"operationName":null}
- =
-
-
-
-
- ${graphql_port_number}
- 60000
- 200000
- ${request_protocol}
-
- ${base_path}graphql
- POST
- true
- false
- true
- false
- false
-
- mpaf/tool/fragments/ce/graphql/get_empty_cart.jmx
-
-
-
-
- {"data":{"cart":{"items":[]}}}
-
- Assertion.response_data
- false
- 8
-
-
-
-
-
- true
-
-
-
- false
- {"query":"mutation {\n setShippingAddressesOnCart(\n input: {\n cart_id: \"${quote_id}\"\n shipping_addresses: [\n {\n address: {\n firstname: \"test firstname\"\n lastname: \"test lastname\"\n company: \"test company\"\n street: [\"test street 1\", \"test street 2\"]\n city: \"test city\"\n region: \"test region\"\n postcode: \"887766\"\n country_code: \"US\"\n telephone: \"88776655\"\n save_in_address_book: false\n }\n }\n ]\n }\n ) {\n cart {\n shipping_addresses {\n firstname\n lastname\n company\n street\n city\n postcode\n telephone\n country {\n code\n label\n }\n }\n }\n }\n}","variables":null,"operationName":null}
- =
-
-
-
-
- ${graphql_port_number}
- 60000
- 200000
- ${request_protocol}
-
- ${base_path}graphql
- POST
- true
- false
- true
- false
- false
-
- mpaf/tool/fragments/ce/graphql/set_shipping_address_on_cart.jmx
-
-
-
-
- {"data":{"setShippingAddressesOnCart":{"cart":{"shipping_addresses":[{"firstname":"test firstname","lastname":"test lastname","company":"test company","street":["test street 1","test street 2"],"city":"test city","postcode":"887766","telephone":"88776655","country":{"code":"US","label":"US"}}]}}}}
-
- Assertion.response_data
- false
- 8
-
-
-
-
+
1
false
1
- ${graphqlSetBillingAddressOnCartPercentage}
+ ${graphqlGetEmptyCartPercentage}
+ mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx
+
+
+
+var testLabel = "${testLabel}" ? " (${testLabel})" : "";
+if (testLabel
+ && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy'
+) {
+ if (sampler.getName().indexOf(testLabel) == -1) {
+ sampler.setName(sampler.getName() + testLabel);
+ }
+} else if (sampler.getName().indexOf("SetUp - ") == -1) {
+ sampler.setName("SetUp - " + sampler.getName());
+}
+
+ javascript
+ mpaf/tool/fragments/_system/setup_label.jmx
+
+
+
+ vars.put("testLabel", "GraphQL Get Empty Cart");
+
+ true
+
+
+
+
+
+
+ Content-Type
+ application/json
+
+
+ Accept
+ */*
+
+
+ mpaf/tool/fragments/ce/api/header_manager_before_token.jmx
+
+
+
+ mpaf/tool/fragments/ce/common/init_random_generator_setup.jmx
+
+import java.util.Random;
+
+Random random = new Random();
+if (${seedForRandom} > 0) {
+ random.setSeed(${seedForRandom} + ${__threadNum});
+}
+
+vars.putObject("randomIntGenerator", random);
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+ false
+ {"query":"mutation {\n createEmptyCart\n}","variables":null,"operationName":null}
+ =
+
+
+
+
+ ${graphql_port_number}
+ 60000
+ 200000
+ ${request_protocol}
+
+ ${base_path}graphql
+ POST
+ true
+ false
+ true
+ false
+ false
+
+ mpaf/tool/fragments/ce/graphql/create_empty_cart.jmx
+
+
+
+ quote_id
+ $.data.createEmptyCart
+
+
+ BODY
+
+
+
+
+ {"data":{"createEmptyCart":"
+
+ Assertion.response_data
+ false
+ 2
+
+
+
+
+
+ true
+
+
+
+ false
+ {"query":"{\n cart(cart_id: \"${quote_id}\") {\n items {\n id\n quantity\n product {\n sku\n }\n }\n }\n}","variables":null,"operationName":null}
+ =
+
+
+
+
+ ${graphql_port_number}
+ 60000
+ 200000
+ ${request_protocol}
+
+ ${base_path}graphql
+ POST
+ true
+ false
+ true
+ false
+ false
+
+ mpaf/tool/fragments/ce/graphql/get_empty_cart.jmx
+
+
+
+
+ {"data":{"cart":{"items":[]}}}
+
+ Assertion.response_data
+ false
+ 8
+
+
+
+
+
+
+
+ 1
+ false
+ 1
+ ${graphqlSetShippingAddressOnCartPercentage}
+ mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx
+
+
+
+var testLabel = "${testLabel}" ? " (${testLabel})" : "";
+if (testLabel
+ && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy'
+) {
+ if (sampler.getName().indexOf(testLabel) == -1) {
+ sampler.setName(sampler.getName() + testLabel);
+ }
+} else if (sampler.getName().indexOf("SetUp - ") == -1) {
+ sampler.setName("SetUp - " + sampler.getName());
+}
+
+ javascript
+ mpaf/tool/fragments/_system/setup_label.jmx
+
+
+
+ vars.put("testLabel", "GraphQL Set Shipping Address On Cart");
+
+ true
+
+
+
+
+
+
+ Content-Type
+ application/json
+
+
+ Accept
+ */*
+
+
+ mpaf/tool/fragments/ce/api/header_manager_before_token.jmx
+
+
+
+ mpaf/tool/fragments/ce/common/init_random_generator_setup.jmx
+
+import java.util.Random;
+
+Random random = new Random();
+if (${seedForRandom} > 0) {
+ random.setSeed(${seedForRandom} + ${__threadNum});
+}
+
+vars.putObject("randomIntGenerator", random);
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+ false
+ {"query":"mutation {\n createEmptyCart\n}","variables":null,"operationName":null}
+ =
+
+
+
+
+ ${graphql_port_number}
+ 60000
+ 200000
+ ${request_protocol}
+
+ ${base_path}graphql
+ POST
+ true
+ false
+ true
+ false
+ false
+
+ mpaf/tool/fragments/ce/graphql/create_empty_cart.jmx
+
+
+
+ quote_id
+ $.data.createEmptyCart
+
+
+ BODY
+
+
+
+
+ {"data":{"createEmptyCart":"
+
+ Assertion.response_data
+ false
+ 2
+
+
+
+
+
+ true
+
+
+
+ false
+ {"query":"{\n cart(cart_id: \"${quote_id}\") {\n items {\n id\n quantity\n product {\n sku\n }\n }\n }\n}","variables":null,"operationName":null}
+ =
+
+
+
+
+ ${graphql_port_number}
+ 60000
+ 200000
+ ${request_protocol}
+
+ ${base_path}graphql
+ POST
+ true
+ false
+ true
+ false
+ false
+
+ mpaf/tool/fragments/ce/graphql/get_empty_cart.jmx
+
+
+
+
+ {"data":{"cart":{"items":[]}}}
+
+ Assertion.response_data
+ false
+ 8
+
+
+
+
+
+ true
+
+
+
+ false
+ {"query":"mutation {\n setShippingAddressesOnCart(\n input: {\n cart_id: \"${quote_id}\"\n shipping_addresses: [\n {\n address: {\n firstname: \"test firstname\"\n lastname: \"test lastname\"\n company: \"test company\"\n street: [\"test street 1\", \"test street 2\"]\n city: \"test city\"\n region: \"test region\"\n postcode: \"887766\"\n country_code: \"US\"\n telephone: \"88776655\"\n save_in_address_book: false\n }\n }\n ]\n }\n ) {\n cart {\n shipping_addresses {\n firstname\n lastname\n company\n street\n city\n postcode\n telephone\n country {\n code\n label\n }\n }\n }\n }\n}","variables":null,"operationName":null}
+ =
+
+
+
+
+ ${graphql_port_number}
+ 60000
+ 200000
+ ${request_protocol}
+
+ ${base_path}graphql
+ POST
+ true
+ false
+ true
+ false
+ false
+
+ mpaf/tool/fragments/ce/graphql/set_shipping_address_on_cart.jmx
+
+
+
+
+ {"data":{"setShippingAddressesOnCart":{"cart":{"shipping_addresses":[{"firstname":"test firstname","lastname":"test lastname","company":"test company","street":["test street 1","test street 2"],"city":"test city","postcode":"887766","telephone":"88776655","country":{"code":"US","label":"US"}}]}}}}
+
+ Assertion.response_data
+ false
+ 8
+
+
+
+
+
+
+
+ 1
+ false
+ 1
+ ${graphqlSetBillingAddressOnCartPercentage}
mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx
@@ -41286,13 +41875,395 @@ vars.putObject("randomIntGenerator", random);
-
+
+ true
+
+
+
+ false
+ {"query":"{\n cart(cart_id: \"${quote_id}\") {\n items {\n id\n quantity\n product {\n sku\n }\n }\n }\n}","variables":null,"operationName":null}
+ =
+
+
+
+
+ ${graphql_port_number}
+ 60000
+ 200000
+ ${request_protocol}
+
+ ${base_path}graphql
+ POST
+ true
+ false
+ true
+ false
+ false
+
+ mpaf/tool/fragments/ce/graphql/get_empty_cart.jmx
+
+
+
+
+ {"data":{"cart":{"items":[]}}}
+
+ Assertion.response_data
+ false
+ 8
+
+
+
+
+
+ true
+
+
+
+ false
+ {"query":"mutation {\n setBillingAddressOnCart(\n input: {\n cart_id: \"${quote_id}\"\n billing_address: {\n address: {\n firstname: \"test firstname\"\n lastname: \"test lastname\"\n company: \"test company\"\n street: [\"test street 1\", \"test street 2\"]\n city: \"test city\"\n region: \"test region\"\n postcode: \"887766\"\n country_code: \"US\"\n telephone: \"88776655\"\n save_in_address_book: false\n }\n }\n }\n ) {\n cart {\n billing_address {\n firstname\n lastname\n company\n street\n city\n postcode\n telephone\n country {\n code\n label\n }\n }\n }\n }\n}","variables":null,"operationName":null}
+ =
+
+
+
+
+ ${graphql_port_number}
+ 60000
+ 200000
+ ${request_protocol}
+
+ ${base_path}graphql
+ POST
+ true
+ false
+ true
+ false
+ false
+
+ mpaf/tool/fragments/ce/graphql/set_billing_address_on_cart.jmx
+
+
+
+
+ {"data":{"setBillingAddressOnCart":{"cart":{"billing_address":{"firstname":"test firstname","lastname":"test lastname","company":"test company","street":["test street 1","test street 2"],"city":"test city","postcode":"887766","telephone":"88776655","country":{"code":"US","label":"US"}}}}}}
+
+ Assertion.response_data
+ false
+ 8
+
+
+
+
+
+
+
+ 1
+ false
+ 1
+ ${graphqlAddSimpleProductToCartPercentage}
+ mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx
+
+
+
+var testLabel = "${testLabel}" ? " (${testLabel})" : "";
+if (testLabel
+ && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy'
+) {
+ if (sampler.getName().indexOf(testLabel) == -1) {
+ sampler.setName(sampler.getName() + testLabel);
+ }
+} else if (sampler.getName().indexOf("SetUp - ") == -1) {
+ sampler.setName("SetUp - " + sampler.getName());
+}
+
+ javascript
+ mpaf/tool/fragments/_system/setup_label.jmx
+
+
+
+ vars.put("testLabel", "GraphQL Add Simple Product To Cart");
+
+ true
+
+
+
+
+
+
+ Content-Type
+ application/json
+
+
+ Accept
+ */*
+
+
+ mpaf/tool/fragments/ce/api/header_manager_before_token.jmx
+
+
+
+ mpaf/tool/fragments/ce/common/init_random_generator_setup.jmx
+
+import java.util.Random;
+
+Random random = new Random();
+if (${seedForRandom} > 0) {
+ random.setSeed(${seedForRandom} + ${__threadNum});
+}
+
+vars.putObject("randomIntGenerator", random);
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+ false
+ {"query":"mutation {\n createEmptyCart\n}","variables":null,"operationName":null}
+ =
+
+
+
+
+ ${graphql_port_number}
+ 60000
+ 200000
+ ${request_protocol}
+
+ ${base_path}graphql
+ POST
+ true
+ false
+ true
+ false
+ false
+
+ mpaf/tool/fragments/ce/graphql/create_empty_cart.jmx
+
+
+
+ quote_id
+ $.data.createEmptyCart
+
+
+ BODY
+
+
+
+
+ {"data":{"createEmptyCart":"
+
+ Assertion.response_data
+ false
+ 2
+
+
+
+
+
+
+import java.util.Random;
+
+Random random = vars.getObject("randomIntGenerator");
+number = random.nextInt(props.get("simple_products_list").size());
+product = props.get("simple_products_list").get(number);
+
+vars.put("product_url_key", product.get("url_key"));
+vars.put("product_id", product.get("id"));
+vars.put("product_name", product.get("title"));
+vars.put("product_uenc", product.get("uenc"));
+vars.put("product_sku", product.get("sku"));
+
+
+
+ true
+ mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx
+
+
+
+ true
+
+
+
+ false
+ {"query":"mutation { \n addSimpleProductsToCart(\n input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n data: {\n quantity: 2\n sku: \"${product_sku}\"\n }\n }\n ]\n }\n ) {\n cart {\n items {\n quantity\n product {\n sku\n }\n }\n }\n }\n}","variables":null,"operationName":null}
+ =
+
+
+
+
+ ${graphql_port_number}
+ 60000
+ 200000
+ ${request_protocol}
+
+ ${base_path}graphql
+ POST
+ true
+ false
+ true
+ false
+ false
+
+ mpaf/tool/fragments/ce/graphql/add_simple_product_to_cart.jmx
+
+
+
+
+ addSimpleProductsToCart
+ "sku":"${product_sku}"
+
+ Assertion.response_data
+ false
+ 2
+
+
+
+
+
+
+
+ 1
+ false
+ 1
+ ${graphqlAddConfigurableProductToCartPercentage}
+ mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx
+
+
+
+var testLabel = "${testLabel}" ? " (${testLabel})" : "";
+if (testLabel
+ && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy'
+) {
+ if (sampler.getName().indexOf(testLabel) == -1) {
+ sampler.setName(sampler.getName() + testLabel);
+ }
+} else if (sampler.getName().indexOf("SetUp - ") == -1) {
+ sampler.setName("SetUp - " + sampler.getName());
+}
+
+ javascript
+ mpaf/tool/fragments/_system/setup_label.jmx
+
+
+
+ vars.put("testLabel", "GraphQL Add Configurable Product To Cart");
+
+ true
+
+
+
+
+
+
+ Content-Type
+ application/json
+
+
+ Accept
+ */*
+
+
+ mpaf/tool/fragments/ce/api/header_manager_before_token.jmx
+
+
+
+ mpaf/tool/fragments/ce/common/init_random_generator_setup.jmx
+
+import java.util.Random;
+
+Random random = new Random();
+if (${seedForRandom} > 0) {
+ random.setSeed(${seedForRandom} + ${__threadNum});
+}
+
+vars.putObject("randomIntGenerator", random);
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+ false
+ {"query":"mutation {\n createEmptyCart\n}","variables":null,"operationName":null}
+ =
+
+
+
+
+ ${graphql_port_number}
+ 60000
+ 200000
+ ${request_protocol}
+
+ ${base_path}graphql
+ POST
+ true
+ false
+ true
+ false
+ false
+
+ mpaf/tool/fragments/ce/graphql/create_empty_cart.jmx
+
+
+
+ quote_id
+ $.data.createEmptyCart
+
+
+ BODY
+
+
+
+
+ {"data":{"createEmptyCart":"
+
+ Assertion.response_data
+ false
+ 2
+
+
+
+
+
+
+import java.util.Random;
+
+Random random = vars.getObject("randomIntGenerator");
+number = random.nextInt(props.get("configurable_products_list").size());
+product = props.get("configurable_products_list").get(number);
+
+vars.put("product_url_key", product.get("url_key"));
+vars.put("product_id", product.get("id"));
+vars.put("product_name", product.get("title"));
+vars.put("product_uenc", product.get("uenc"));
+vars.put("product_sku", product.get("sku"));
+
+
+
+ true
+ mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx
+
+
+
true
false
- {"query":"{\n cart(cart_id: \"${quote_id}\") {\n items {\n id\n quantity\n product {\n sku\n }\n }\n }\n}","variables":null,"operationName":null}
+ {"query":"query productDetailByName($product_sku: String, $onServer: Boolean!) {\n products(filter: { sku: { eq: $product_sku } }, sort: {name: ASC}) {\n items {\n id\n sku\n name\n ... on ConfigurableProduct {\n configurable_options {\n attribute_code\n attribute_id\n id\n label\n values {\n default_label\n label\n store_label\n use_default_value\n value_index\n }\n }\n variants {\n product {\n #fashion_color\n #fashion_size\n id\n media_gallery_entries {\n disabled\n file\n label\n position\n }\n sku\n stock_status\n }\n }\n }\n meta_title @include(if: $onServer)\n meta_keyword @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n }\n}","variables":{"product_sku":"${product_sku}","onServer":false},"operationName":"productDetailByName"}
=
@@ -41311,27 +42282,36 @@ vars.putObject("randomIntGenerator", random);
false
false
- mpaf/tool/fragments/ce/graphql/get_empty_cart.jmx
+ mpaf/tool/fragments/ce/graphql/get_configurable_product_details_by_name.jmx
- {"data":{"cart":{"items":[]}}}
+ "sku":"${product_sku}","name":"${product_name}"
Assertion.response_data
false
- 8
+ 2
-
+
+
+ product_option
+ $.data.products.items[0].variants[0].product.sku
+
+
+ BODY
+ mpaf/tool/fragments/ce/graphql/extract_configurable_product_option.jmx
+
+
-
+
true
false
- {"query":"mutation {\n setBillingAddressOnCart(\n input: {\n cart_id: \"${quote_id}\"\n billing_address: {\n address: {\n firstname: \"test firstname\"\n lastname: \"test lastname\"\n company: \"test company\"\n street: [\"test street 1\", \"test street 2\"]\n city: \"test city\"\n region: \"test region\"\n postcode: \"887766\"\n country_code: \"US\"\n telephone: \"88776655\"\n save_in_address_book: false\n }\n }\n }\n ) {\n cart {\n billing_address {\n firstname\n lastname\n company\n street\n city\n postcode\n telephone\n country {\n code\n label\n }\n }\n }\n }\n}","variables":null,"operationName":null}
+ {"query":"mutation {\n addConfigurableProductsToCart(\n input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n variant_sku: \"${product_option}\"\n data: {\n quantity: 2\n sku: \"${product_option}\"\n }\n }\n ]\n }\n ) {\n cart {\n items {\n id\n quantity\n product {\n name\n sku\n }\n ... on ConfigurableCartItem {\n configurable_options {\n option_label\n }\n }\n }\n }\n }\n}","variables":null,"operationName":null}
=
@@ -41350,27 +42330,28 @@ vars.putObject("randomIntGenerator", random);
false
false
- mpaf/tool/fragments/ce/graphql/set_billing_address_on_cart.jmx
+ mpaf/tool/fragments/ce/graphql/add_configurable_product_to_cart.jmx
- {"data":{"setBillingAddressOnCart":{"cart":{"billing_address":{"firstname":"test firstname","lastname":"test lastname","company":"test company","street":["test street 1","test street 2"],"city":"test city","postcode":"887766","telephone":"88776655","country":{"code":"US","label":"US"}}}}}}
+ addConfigurableProductsToCart
+ "sku":"${product_option}"
Assertion.response_data
false
- 8
+ 2
-
+
1
false
1
- ${graphqlAddSimpleProductToCartPercentage}
+ ${graphqlUpdateSimpleProductQtyInCartPercentage}
mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx
@@ -41391,7 +42372,7 @@ if (testLabel
- vars.put("testLabel", "GraphQL Add Simple Product To Cart");
+ vars.put("testLabel", "GraphQL Update Simple Product Qty In Cart");
true
@@ -41535,14 +42516,100 @@ vars.put("product_sku", product.get("sku"));
+
+
+ true
+
+
+
+ false
+ {"query":"{\n cart(cart_id: \"${quote_id}\") {\n items {\n id\n quantity\n product {\n sku\n }\n }\n }\n}","variables":null,"operationName":null}
+ =
+
+
+
+
+ ${graphql_port_number}
+ 60000
+ 200000
+ ${request_protocol}
+
+ ${base_path}graphql
+ POST
+ true
+ false
+ true
+ false
+ false
+
+ mpaf/tool/fragments/ce/graphql/get_cart.jmx
+
+
+
+ item_id
+ $.data.cart.items[0].id
+
+
+ BODY
+
+
+
+
+ {"data":{"cart":{"items":
+
+ Assertion.response_data
+ false
+ 2
+
+
+
+
+
+ true
+
+
+
+ false
+ {"query":"mutation {\n updateCartItems(input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n cart_item_id: ${item_id}\n quantity: 5\n }\n ]\n }) {\n cart {\n items {\n id\n quantity\n }\n }\n }\n}","variables":null,"operationName":null}
+ =
+
+
+
+
+ ${graphql_port_number}
+ 60000
+ 200000
+ ${request_protocol}
+
+ ${base_path}graphql
+ POST
+ true
+ false
+ true
+ false
+ false
+
+ mpaf/tool/fragments/ce/graphql/update_simple_product_qty_in_cart.jmx
+
+
+
+
+ {"data":{"updateCartItems":{"cart":{"items":[{"id":"${item_id}","quantity":5}]}}}}
+
+ Assertion.response_data
+ false
+ 8
+
+
+
-
+
1
false
1
- ${graphqlAddConfigurableProductToCartPercentage}
+ ${graphqlUpdateConfigurableProductQtyInCartPercentage}
mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx
@@ -41563,7 +42630,7 @@ if (testLabel
- vars.put("testLabel", "GraphQL Add Configurable Product To Cart");
+ vars.put("testLabel", "GraphQL Update Configurable Product Qty In Cart");
true
@@ -41755,14 +42822,100 @@ vars.put("product_sku", product.get("sku"));
+
+
+ true
+
+
+
+ false
+ {"query":"{\n cart(cart_id: \"${quote_id}\") {\n items {\n id\n quantity\n product {\n sku\n }\n }\n }\n}","variables":null,"operationName":null}
+ =
+
+
+
+
+ ${graphql_port_number}
+ 60000
+ 200000
+ ${request_protocol}
+
+ ${base_path}graphql
+ POST
+ true
+ false
+ true
+ false
+ false
+
+ mpaf/tool/fragments/ce/graphql/get_cart.jmx
+
+
+
+ item_id
+ $.data.cart.items[0].id
+
+
+ BODY
+
+
+
+
+ {"data":{"cart":{"items":
+
+ Assertion.response_data
+ false
+ 2
+
+
+
+
+
+ true
+
+
+
+ false
+ {"query":"mutation {\n updateCartItems(input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n cart_item_id: ${item_id}\n quantity: 5\n }\n ]\n }) {\n cart {\n items {\n id\n quantity\n }\n }\n }\n}","variables":null,"operationName":null}
+ =
+
+
+
+
+ ${graphql_port_number}
+ 60000
+ 200000
+ ${request_protocol}
+
+ ${base_path}graphql
+ POST
+ true
+ false
+ true
+ false
+ false
+
+ mpaf/tool/fragments/ce/graphql/update_configurable_product_qty_in_cart.jmx
+
+
+
+
+ {"data":{"updateCartItems":{"cart":{"items":[{"id":"${item_id}","quantity":5}]}}}}
+
+ Assertion.response_data
+ false
+ 8
+
+
+
-
+
1
false
1
- ${graphqlUpdateSimpleProductQtyInCartPercentage}
+ ${graphqlUpdateSimpleProductQtyInCartWithPricesPercentage}
mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx
@@ -41783,7 +42936,7 @@ if (testLabel
- vars.put("testLabel", "GraphQL Update Simple Product Qty In Cart");
+ vars.put("testLabel", "GraphQL Update Simple Product Qty In Cart with Prices");
true
@@ -41888,13 +43041,13 @@ vars.put("product_sku", product.get("sku"));
mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx
-
+
true
false
- {"query":"mutation { \n addSimpleProductsToCart(\n input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n data: {\n quantity: 2\n sku: \"${product_sku}\"\n }\n }\n ]\n }\n ) {\n cart {\n items {\n quantity\n product {\n sku\n }\n }\n }\n }\n}","variables":null,"operationName":null}
+ {"query":"mutation { \n addSimpleProductsToCart(\n input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n data: {\n quantity: 2\n sku: \"${product_sku}\"\n }\n }\n ]\n }\n ) {\n cart {\n items {\n quantity\n prices {\n row_total{\n value\n }\n total_item_discount {\n currency\n value\n }\n discounts {\n amount {\n currency\n value\n }\n label\n }\n row_total_including_tax{\n value\n }\n }\n product {\n sku\n }\n }\n prices {\n applied_taxes {\n amount {\n currency\n value\n }\n label\n }\n discounts {\n amount {\n currency\n value\n }\n label\n }\n grand_total {\n currency\n value\n }\n subtotal_excluding_tax {\n value\n currency\n }\n subtotal_including_tax {\n value\n currency\n }\n subtotal_with_discount_excluding_tax {\n value\n currency\n }\n }\n }\n }\n}\n","variables":null}
=
@@ -41913,7 +43066,7 @@ vars.put("product_sku", product.get("sku"));
false
false
- mpaf/tool/fragments/ce/graphql/add_simple_product_to_cart.jmx
+ mpaf/tool/fragments/ce/graphql/add_simple_product_to_cart_with_prices.jmx
@@ -41928,13 +43081,13 @@ vars.put("product_sku", product.get("sku"));
-
+
true
false
- {"query":"{\n cart(cart_id: \"${quote_id}\") {\n items {\n id\n quantity\n product {\n sku\n }\n }\n }\n}","variables":null,"operationName":null}
+ {"query":"{\n cart(cart_id: \"${quote_id}\") {\n items {\n id\n quantity\n prices {\n row_total{\n value\n }\n row_total_including_tax{\n value\n }\n total_item_discount{value}\n discounts{\n amount{value}\n label\n }\n }\n product {\n sku\n }\n }\n prices {\n applied_taxes {\n amount {\n currency\n value\n }\n label\n }\n discounts {\n amount {\n currency\n value\n }\n label\n }\n grand_total {\n currency\n value\n }\n subtotal_excluding_tax {\n value\n currency\n }\n subtotal_including_tax {\n value\n currency\n }\n subtotal_with_discount_excluding_tax {\n value\n currency\n }\n }\n }\n}\n","variables":null,"operationName":null}
=
@@ -41953,7 +43106,7 @@ vars.put("product_sku", product.get("sku"));
false
false
- mpaf/tool/fragments/ce/graphql/get_cart.jmx
+ mpaf/tool/fragments/ce/graphql/get_cart_with_prices.jmx
@@ -41975,13 +43128,13 @@ vars.put("product_sku", product.get("sku"));
-
+
true
false
- {"query":"mutation {\n updateCartItems(input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n cart_item_id: ${item_id}\n quantity: 5\n }\n ]\n }) {\n cart {\n items {\n id\n quantity\n }\n }\n }\n}","variables":null,"operationName":null}
+ {"query":"mutation {\n updateCartItems(input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n cart_item_id: ${item_id}\n quantity: 5\n }\n ]\n }) {\n cart {\n items {\n id\n quantity\n prices {\n row_total{\n value\n }\n total_item_discount {\n currency\n value\n }\n discounts {\n amount {\n currency\n value\n }\n label\n }\n row_total_including_tax{\n value\n }\n }\n product {\n sku\n }\n }\n prices {\n applied_taxes {\n amount {\n currency\n value\n }\n label\n }\n discounts {\n amount {\n currency\n value\n }\n label\n }\n grand_total {\n currency\n value\n }\n subtotal_excluding_tax {\n value\n currency\n }\n subtotal_including_tax {\n value\n currency\n }\n subtotal_with_discount_excluding_tax {\n value\n currency\n }\n }\n }\n }\n}","variables":null,"operationName":null}
=
@@ -42000,27 +43153,28 @@ vars.put("product_sku", product.get("sku"));
false
false
- mpaf/tool/fragments/ce/graphql/update_simple_product_qty_in_cart.jmx
+ mpaf/tool/fragments/ce/graphql/update_simple_product_qty_in_cart_with_prices.jmx
- {"data":{"updateCartItems":{"cart":{"items":[{"id":"${item_id}","quantity":5}]}}}}
+ "quantity":5
+ "id":"${item_id}"
Assertion.response_data
false
- 8
+ 2
-
+
1
false
1
- ${graphqlUpdateConfigurableProductQtyInCartPercentage}
+ ${graphqlUpdateConfigurableProductQtyInCartWithPricesPercentage}
mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx
@@ -42041,7 +43195,7 @@ if (testLabel
- vars.put("testLabel", "GraphQL Update Configurable Product Qty In Cart");
+ vars.put("testLabel", "GraphQL Update Configurable Product Qty In Cart with Prices");
true
@@ -42194,13 +43348,13 @@ vars.put("product_sku", product.get("sku"));
-
+
true
false
- {"query":"mutation {\n addConfigurableProductsToCart(\n input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n variant_sku: \"${product_option}\"\n data: {\n quantity: 2\n sku: \"${product_option}\"\n }\n }\n ]\n }\n ) {\n cart {\n items {\n id\n quantity\n product {\n name\n sku\n }\n ... on ConfigurableCartItem {\n configurable_options {\n option_label\n }\n }\n }\n }\n }\n}","variables":null,"operationName":null}
+ {"query":"mutation {\n addConfigurableProductsToCart(\n input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n variant_sku: \"${product_option}\"\n data: {\n quantity: 2\n sku: \"${product_option}\"\n }\n }\n ]\n }\n ) {\n cart {\n items {\n id\n quantity\n prices {\n row_total{\n value\n }\n total_item_discount {\n currency\n value\n }\n discounts {\n amount {\n currency\n value\n }\n label\n }\n row_total_including_tax{\n value\n }\n }\n product {\n name\n sku\n }\n ... on ConfigurableCartItem {\n configurable_options {\n option_label\n }\n }\n }\n prices {\n applied_taxes {\n amount {\n currency\n value\n }\n label\n }\n discounts {\n amount {\n currency\n value\n }\n label\n }\n grand_total {\n currency\n value\n }\n subtotal_excluding_tax {\n value\n currency\n }\n subtotal_including_tax {\n value\n currency\n }\n subtotal_with_discount_excluding_tax {\n value\n currency\n }\n }\n }\n }\n}\n","variables":null}
=
@@ -42219,7 +43373,7 @@ vars.put("product_sku", product.get("sku"));
false
false
- mpaf/tool/fragments/ce/graphql/add_configurable_product_to_cart.jmx
+ mpaf/tool/fragments/ce/graphql/add_configurable_product_to_cart_with_prices.jmx
@@ -42234,13 +43388,13 @@ vars.put("product_sku", product.get("sku"));
-
+
true
false
- {"query":"{\n cart(cart_id: \"${quote_id}\") {\n items {\n id\n quantity\n product {\n sku\n }\n }\n }\n}","variables":null,"operationName":null}
+ {"query":"{\n cart(cart_id: \"${quote_id}\") {\n items {\n id\n quantity\n prices {\n row_total{\n value\n }\n row_total_including_tax{\n value\n }\n total_item_discount{value}\n discounts{\n amount{value}\n label\n }\n }\n product {\n sku\n }\n }\n prices {\n applied_taxes {\n amount {\n currency\n value\n }\n label\n }\n discounts {\n amount {\n currency\n value\n }\n label\n }\n grand_total {\n currency\n value\n }\n subtotal_excluding_tax {\n value\n currency\n }\n subtotal_including_tax {\n value\n currency\n }\n subtotal_with_discount_excluding_tax {\n value\n currency\n }\n }\n }\n}\n","variables":null,"operationName":null}
=
@@ -42259,7 +43413,7 @@ vars.put("product_sku", product.get("sku"));
false
false
- mpaf/tool/fragments/ce/graphql/get_cart.jmx
+ mpaf/tool/fragments/ce/graphql/get_cart_with_prices.jmx
@@ -42281,13 +43435,13 @@ vars.put("product_sku", product.get("sku"));
-
+
true
false
- {"query":"mutation {\n updateCartItems(input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n cart_item_id: ${item_id}\n quantity: 5\n }\n ]\n }) {\n cart {\n items {\n id\n quantity\n }\n }\n }\n}","variables":null,"operationName":null}
+ {"query":"mutation {\n updateCartItems(input: {\n cart_id: \"${quote_id}\"\n cart_items: [\n {\n cart_item_id: ${item_id}\n quantity: 5\n }\n ]\n }) {\n cart {\n items {\n id\n quantity\n prices {\n row_total{\n value\n }\n total_item_discount {\n currency\n value\n }\n discounts {\n amount {\n currency\n value\n }\n label\n }\n row_total_including_tax{\n value\n }\n }\n product {\n name\n sku\n }\n ... on ConfigurableCartItem {\n configurable_options {\n option_label\n }\n }\n }\n prices {\n applied_taxes {\n amount {\n currency\n value\n }\n label\n }\n discounts {\n amount {\n currency\n value\n }\n label\n }\n grand_total {\n currency\n value\n }\n subtotal_excluding_tax {\n value\n currency\n }\n subtotal_including_tax {\n value\n currency\n }\n subtotal_with_discount_excluding_tax {\n value\n currency\n }\n }\n }\n }\n}","variables":null,"operationName":null}
=
@@ -42306,16 +43460,17 @@ vars.put("product_sku", product.get("sku"));
false
false
- mpaf/tool/fragments/ce/graphql/update_configurable_product_qty_in_cart.jmx
+ mpaf/tool/fragments/ce/graphql/update_configurable_product_qty_in_cart_with_prices.jmx
- {"data":{"updateCartItems":{"cart":{"items":[{"id":"${item_id}","quantity":5}]}}}}
+ "quantity":5
+ "id":"${item_id}"
Assertion.response_data
false
- 8
+ 2
diff --git a/setup/src/Magento/Setup/Model/Installer.php b/setup/src/Magento/Setup/Model/Installer.php
index 7a097e49c6289..23f8a13c8bfe8 100644
--- a/setup/src/Magento/Setup/Model/Installer.php
+++ b/setup/src/Magento/Setup/Model/Installer.php
@@ -429,7 +429,7 @@ private function createModulesConfig($request, $dryRun = false)
$disable = $this->readListOfModules($all, $request, InstallCommand::INPUT_KEY_DISABLE_MODULES);
$result = [];
foreach ($all as $module) {
- if ((isset($currentModules[$module]) && !$currentModules[$module])) {
+ if (isset($currentModules[$module]) && !$currentModules[$module]) {
$result[$module] = 0;
} else {
$result[$module] = 1;
@@ -925,7 +925,7 @@ private function throwExceptionForNotWritablePaths(array $paths)
*/
private function handleDBSchemaData($setup, $type, array $request)
{
- if (!(($type === 'schema') || ($type === 'data'))) {
+ if (!($type === 'schema' || $type === 'data')) {
throw new \Magento\Setup\Exception("Unsupported operation type $type is requested");
}
$resource = new \Magento\Framework\Module\ModuleResource($this->context);
diff --git a/setup/src/Magento/Setup/Module/Di/Code/Reader/ClassesScanner.php b/setup/src/Magento/Setup/Module/Di/Code/Reader/ClassesScanner.php
index d78e259ec06e0..b3a2f14aa922a 100644
--- a/setup/src/Magento/Setup/Module/Di/Code/Reader/ClassesScanner.php
+++ b/setup/src/Magento/Setup/Module/Di/Code/Reader/ClassesScanner.php
@@ -10,6 +10,11 @@
use Magento\Framework\App\ObjectManager;
use Magento\Framework\Exception\FileSystemException;
+/**
+ * Class ClassesScanner
+ *
+ * @package Magento\Setup\Module\Di\Code\Reader
+ */
class ClassesScanner implements ClassesScannerInterface
{
/**
@@ -29,7 +34,8 @@ class ClassesScanner implements ClassesScannerInterface
/**
* @param array $excludePatterns
- * @param string $generationDirectory
+ * @param DirectoryList|null $directoryList
+ * @throws FileSystemException
*/
public function __construct(array $excludePatterns = [], DirectoryList $directoryList = null)
{
@@ -61,7 +67,7 @@ public function addExcludePatterns(array $excludePatterns)
*/
public function getList($path)
{
-
+ // phpcs:ignore
$realPath = realpath($path);
$isGeneration = strpos($realPath, $this->generationDirectory) === 0;
@@ -94,7 +100,7 @@ public function getList($path)
*/
private function extract(\RecursiveIteratorIterator $recursiveIterator)
{
- $classes = [];
+ $classes = [[]];
foreach ($recursiveIterator as $fileItem) {
/** @var $fileItem \SplFileInfo */
if ($fileItem->isDir() || $fileItem->getExtension() !== 'php' || $fileItem->getBasename()[0] == '.') {
@@ -109,12 +115,14 @@ private function extract(\RecursiveIteratorIterator $recursiveIterator)
$fileScanner = new FileClassScanner($fileItemPath);
$classNames = $fileScanner->getClassNames();
$this->includeClasses($classNames, $fileItemPath);
- $classes = array_merge($classes, $classNames);
+ $classes [] = $classNames;
}
- return $classes;
+ return array_merge(...$classes);
}
/**
+ * Include classes from file path
+ *
* @param array $classNames
* @param string $fileItemPath
* @return bool Whether the class is included or not
@@ -123,6 +131,7 @@ private function includeClasses(array $classNames, $fileItemPath)
{
foreach ($classNames as $className) {
if (!class_exists($className)) {
+ // phpcs:ignore
require_once $fileItemPath;
return true;
}
diff --git a/setup/src/Magento/Setup/Module/Di/Code/Reader/FileClassScanner.php b/setup/src/Magento/Setup/Module/Di/Code/Reader/FileClassScanner.php
index e34fcbd041c76..9a91006564d7f 100644
--- a/setup/src/Magento/Setup/Module/Di/Code/Reader/FileClassScanner.php
+++ b/setup/src/Magento/Setup/Module/Di/Code/Reader/FileClassScanner.php
@@ -6,8 +6,24 @@
namespace Magento\Setup\Module\Di\Code\Reader;
+/**
+ * Class FileClassScanner
+ *
+ * @package Magento\Setup\Module\Di\Code\Reader
+ */
class FileClassScanner
{
+ private const NAMESPACE_TOKENS = [
+ T_WHITESPACE => true,
+ T_STRING => true,
+ T_NS_SEPARATOR => true
+ ];
+
+ private const ALLOWED_OPEN_BRACES_TOKENS = [
+ T_CURLY_OPEN => true,
+ T_DOLLAR_OPEN_CURLY_BRACES => true,
+ T_STRING_VARNAME => true];
+
/**
* The filename of the file to introspect
*
@@ -34,7 +50,9 @@ class FileClassScanner
*/
public function __construct($filename)
{
+ // phpcs:ignore
$filename = realpath($filename);
+ // phpcs:ignore
if (!file_exists($filename) || !\is_file($filename)) {
throw new InvalidFileException(
sprintf(
@@ -53,12 +71,14 @@ public function __construct($filename)
*/
public function getFileContents()
{
+ // phpcs:ignore
return file_get_contents($this->filename);
}
/**
- * Extracts the fully qualified class name from a file. It only searches for the first match and stops looking
- * as soon as it enters the class definition itself.
+ * Extracts the fully qualified class name from a file.
+ *
+ * It only searches for the first match and stops looking as soon as it enters the class definition itself.
*
* Warnings are suppressed for this method due to a micro-optimization that only really shows up when this logic
* is called several millions of times, which can happen quite easily with even moderately sized codebases.
@@ -69,35 +89,36 @@ public function getFileContents()
*/
private function extract()
{
- $allowedOpenBraces = [T_CURLY_OPEN, T_DOLLAR_OPEN_CURLY_BRACES, T_STRING_VARNAME];
$classes = [];
- $namespace = '';
+ $namespaceParts = [];
$class = '';
$triggerClass = false;
$triggerNamespace = false;
$braceLevel = 0;
$bracedNamespace = false;
+ // phpcs:ignore
$this->tokens = token_get_all($this->getFileContents());
foreach ($this->tokens as $index => $token) {
+ $tokenIsArray = is_array($token);
// Is either a literal brace or an interpolated brace with a variable
- if ($token == '{' || (is_array($token) && in_array($token[0], $allowedOpenBraces))) {
+ if ($token === '{' || ($tokenIsArray && isset(self::ALLOWED_OPEN_BRACES_TOKENS[$token[0]]))) {
$braceLevel++;
- } else if ($token == '}') {
+ } elseif ($token === '}') {
$braceLevel--;
}
// The namespace keyword was found in the last loop
if ($triggerNamespace) {
// A string ; or a discovered namespace that looks like "namespace name { }"
- if (!is_array($token) || ($namespace && $token[0] == T_WHITESPACE)) {
+ if (!$tokenIsArray || ($namespaceParts && $token[0] === T_WHITESPACE)) {
$triggerNamespace = false;
- $namespace .= '\\';
+ $namespaceParts[] = '\\';
continue;
}
- $namespace .= $token[1];
+ $namespaceParts[] = $token[1];
- // The class keyword was found in the last loop
- } else if ($triggerClass && $token[0] == T_STRING) {
+ // The class keyword was found in the last loop
+ } elseif ($triggerClass && $token[0] === T_STRING) {
$triggerClass = false;
$class = $token[1];
}
@@ -106,7 +127,7 @@ private function extract()
case T_NAMESPACE:
// Current loop contains the namespace keyword. Between this and the semicolon is the namespace
$triggerNamespace = true;
- $namespace = '';
+ $namespaceParts = [];
$bracedNamespace = $this->isBracedNamespace($index);
break;
case T_CLASS:
@@ -118,9 +139,8 @@ private function extract()
}
// We have a class name, let's concatenate and store it!
- if ($class != '') {
- $namespace = trim($namespace);
- $fqClassName = $namespace . trim($class);
+ if ($class !== '') {
+ $fqClassName = trim(join('', $namespaceParts)) . trim($class);
$classes[] = $fqClassName;
$class = '';
}
@@ -139,15 +159,15 @@ private function isBracedNamespace($index)
$len = count($this->tokens);
while ($index++ < $len) {
if (!is_array($this->tokens[$index])) {
- if ($this->tokens[$index] == ';') {
+ if ($this->tokens[$index] === ';') {
return false;
- } else if ($this->tokens[$index] == '{') {
+ } elseif ($this->tokens[$index] === '{') {
return true;
}
continue;
}
- if (!in_array($this->tokens[$index][0], [T_WHITESPACE, T_STRING, T_NS_SEPARATOR])) {
+ if (!isset(self::NAMESPACE_TOKENS[$this->tokens[$index][0]])) {
throw new InvalidFileException('Namespace not defined properly');
}
}
@@ -155,8 +175,9 @@ private function isBracedNamespace($index)
}
/**
- * Retrieves the first class found in a class file. The return value is in an array format so it retains the
- * same usage as the FileScanner.
+ * Retrieves the first class found in a class file.
+ *
+ * The return value is in an array format so it retains the same usage as the FileScanner.
*
* @return array
*/
diff --git a/setup/src/Magento/Setup/Module/Di/Code/Scanner/PhpScanner.php b/setup/src/Magento/Setup/Module/Di/Code/Scanner/PhpScanner.php
index ab66a63e24498..1cd242acbe50b 100644
--- a/setup/src/Magento/Setup/Module/Di/Code/Scanner/PhpScanner.php
+++ b/setup/src/Magento/Setup/Module/Di/Code/Scanner/PhpScanner.php
@@ -11,6 +11,11 @@
use Magento\Setup\Module\Di\Compiler\Log\Log;
use \Magento\Framework\Reflection\TypeProcessor;
+/**
+ * Class PhpScanner
+ *
+ * @package Magento\Setup\Module\Di\Code\Scanner
+ */
class PhpScanner implements ScannerInterface
{
/**
@@ -167,48 +172,51 @@ protected function _fetchMissingExtensionAttributesClasses($reflectionClass, $fi
*
* @param array $files
* @return array
+ * @throws \ReflectionException
*/
public function collectEntities(array $files)
{
- $output = [];
+ $output = [[]];
foreach ($files as $file) {
$classes = $this->_getDeclaredClasses($file);
foreach ($classes as $className) {
$reflectionClass = new \ReflectionClass($className);
- $output = array_merge(
- $output,
- $this->_fetchFactories($reflectionClass, $file),
- $this->_fetchMissingExtensionAttributesClasses($reflectionClass, $file)
- );
+ $output [] = $this->_fetchFactories($reflectionClass, $file);
+ $output [] = $this->_fetchMissingExtensionAttributesClasses($reflectionClass, $file);
}
}
- return array_unique($output);
+ return array_unique(array_merge(...$output));
}
/**
- * @param $tokenIterator int
- * @param $count int
- * @param $tokens array
+ * Fetch namespaces from tokenized PHP file
+ *
+ * @param int $tokenIterator
+ * @param int $count
+ * @param array $tokens
* @return string
*/
protected function _fetchNamespace($tokenIterator, $count, $tokens)
{
- $namespace = '';
+ $namespaceParts = [];
for ($tokenOffset = $tokenIterator + 1; $tokenOffset < $count; ++$tokenOffset) {
if ($tokens[$tokenOffset][0] === T_STRING) {
- $namespace .= "\\" . $tokens[$tokenOffset][1];
+ $namespaceParts[] = "\\";
+ $namespaceParts[] = $tokens[$tokenOffset][1];
} elseif ($tokens[$tokenOffset] === '{' || $tokens[$tokenOffset] === ';') {
break;
}
}
- return $namespace;
+ return join('', $namespaceParts);
}
/**
- * @param $namespace string
- * @param $tokenIterator int
- * @param $count int
- * @param $tokens array
+ * Fetch class names from tokenized PHP file
+ *
+ * @param string $namespace
+ * @param int $tokenIterator
+ * @param int $count
+ * @param array $tokens
* @return array
*/
protected function _fetchClasses($namespace, $tokenIterator, $count, $tokens)
@@ -230,23 +238,24 @@ protected function _fetchClasses($namespace, $tokenIterator, $count, $tokens)
*/
protected function _getDeclaredClasses($file)
{
- $classes = [];
- $namespace = '';
+ $classes = [[]];
+ $namespaceParts = [];
+ // phpcs:ignore
$tokens = token_get_all(file_get_contents($file));
$count = count($tokens);
for ($tokenIterator = 0; $tokenIterator < $count; $tokenIterator++) {
if ($tokens[$tokenIterator][0] == T_NAMESPACE) {
- $namespace .= $this->_fetchNamespace($tokenIterator, $count, $tokens);
+ $namespaceParts[] = $this->_fetchNamespace($tokenIterator, $count, $tokens);
}
if (($tokens[$tokenIterator][0] == T_CLASS || $tokens[$tokenIterator][0] == T_INTERFACE)
&& $tokens[$tokenIterator - 1][0] != T_DOUBLE_COLON
) {
- $classes = array_merge($classes, $this->_fetchClasses($namespace, $tokenIterator, $count, $tokens));
+ $classes[] = $this->_fetchClasses(join('', $namespaceParts), $tokenIterator, $count, $tokens);
}
}
- return array_unique($classes);
+ return array_unique(array_merge(...$classes));
}
/**
@@ -263,7 +272,7 @@ private function shouldGenerateClass($missingClassName, $entityType, $file)
if (class_exists($missingClassName)) {
return false;
}
- } catch (\RuntimeException $e) {
+ } catch (\RuntimeException $e) { //phpcs:ignore
}
$sourceClassName = $this->getSourceClassName($missingClassName, $entityType);
if (!class_exists($sourceClassName) && !interface_exists($sourceClassName)) {
diff --git a/setup/src/Magento/Setup/Module/Di/Compiler/Config/Chain/BackslashTrim.php b/setup/src/Magento/Setup/Module/Di/Compiler/Config/Chain/BackslashTrim.php
index 10b6b941df8e1..ce0fa5dbac121 100644
--- a/setup/src/Magento/Setup/Module/Di/Compiler/Config/Chain/BackslashTrim.php
+++ b/setup/src/Magento/Setup/Module/Di/Compiler/Config/Chain/BackslashTrim.php
@@ -8,8 +8,21 @@
use Magento\Setup\Module\Di\Compiler\Config\ModificationInterface;
+/**
+ * Class BackslashTrim
+ *
+ * @package Magento\Setup\Module\Di\Compiler\Config\Chain
+ */
class BackslashTrim implements ModificationInterface
{
+ /**
+ * Argument keys which require recursive resolving
+ */
+ private const RECURSIVE_ARGUMENT_KEYS = [
+ '_i_' => true, // shared instance of a class or interface
+ '_ins_' => true // non-shared instance of a class or interface
+ ];
+
/**
* Modifies input config
*
@@ -48,7 +61,6 @@ private function resolveInstancesNames(array $arguments)
* Resolves instances arguments
*
* @param array $argument
- * @return array
*/
private function resolveArguments(&$argument)
{
@@ -57,15 +69,12 @@ private function resolveArguments(&$argument)
}
foreach ($argument as $key => &$value) {
- if (in_array($key, ['_i_', '_ins_'], true)) {
+ if (isset(self::RECURSIVE_ARGUMENT_KEYS[$key])) {
$value = ltrim($value, '\\');
continue;
}
- if (is_array($value)) {
- $this->resolveArguments($value);
- }
+ $this->resolveArguments($value);
}
- return;
}
}
diff --git a/setup/src/Magento/Setup/Module/Di/Compiler/Config/Chain/PreferencesResolving.php b/setup/src/Magento/Setup/Module/Di/Compiler/Config/Chain/PreferencesResolving.php
index 8624ce39df09c..d902c0c0eb62a 100644
--- a/setup/src/Magento/Setup/Module/Di/Compiler/Config/Chain/PreferencesResolving.php
+++ b/setup/src/Magento/Setup/Module/Di/Compiler/Config/Chain/PreferencesResolving.php
@@ -8,8 +8,21 @@
use Magento\Setup\Module\Di\Compiler\Config\ModificationInterface;
+/**
+ * Class PreferencesResolving
+ *
+ * @package Magento\Setup\Module\Di\Compiler\Config\Chain
+ */
class PreferencesResolving implements ModificationInterface
{
+ /**
+ * Argument keys which require recursive resolving
+ */
+ private const RECURSIVE_ARGUMENT_KEYS = [
+ '_i_' => true, // shared instance of a class or interface
+ '_ins_' => true // non-shared instance of a class or interface
+ ];
+
/**
* Modifies input config
*
@@ -32,7 +45,6 @@ public function modify(array $config)
*
* @param array $argument
* @param array $preferences
- * @return array
*/
private function resolvePreferences(&$argument, &$preferences)
{
@@ -41,14 +53,12 @@ private function resolvePreferences(&$argument, &$preferences)
}
foreach ($argument as $key => &$value) {
- if (in_array($key, ['_i_', '_ins_'], true)) {
+ if (isset(self::RECURSIVE_ARGUMENT_KEYS[$key])) {
$value = $this->resolvePreferenceRecursive($value, $preferences);
continue;
}
- if (is_array($value)) {
- $this->resolvePreferences($value, $preferences);
- }
+ $this->resolvePreferences($value, $preferences);
}
}
diff --git a/setup/src/Magento/Setup/Module/Di/Compiler/Config/Reader.php b/setup/src/Magento/Setup/Module/Di/Compiler/Config/Reader.php
index 353e15d2da5d2..3b8d301fb3d0e 100644
--- a/setup/src/Magento/Setup/Module/Di/Compiler/Config/Reader.php
+++ b/setup/src/Magento/Setup/Module/Di/Compiler/Config/Reader.php
@@ -15,6 +15,7 @@
/**
* Class Reader
+ *
* @package Magento\Setup\Module\Di\Compiler\Config
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
@@ -84,7 +85,7 @@ public function generateCachePerScope(
}
$config = [];
-
+
$this->fillThirdPartyInterfaces($areaConfig, $definitionsCollection);
$config['arguments'] = $this->getConfigForScope($definitionsCollection, $areaConfig);
@@ -98,6 +99,12 @@ public function generateCachePerScope(
foreach (array_keys($areaConfig->getVirtualTypes()) as $virtualType) {
$config['instanceTypes'][$virtualType] = $areaConfig->getInstanceType($virtualType);
}
+
+ // sort configuration to have it in the same order on every build
+ ksort($config['arguments']);
+ ksort($config['preferences']);
+ ksort($config['instanceTypes']);
+
return $config;
}
@@ -113,11 +120,10 @@ private function getConfigForScope(DefinitionsCollection $definitionsCollection,
{
$constructors = [];
$argumentsResolver = $this->argumentsResolverFactory->create($config);
- foreach ($definitionsCollection->getInstancesNamesList() as $instanceType) {
+ foreach ($definitionsCollection->getCollection() as $instanceType => $constructor) {
if (!$this->typeReader->isConcrete($instanceType)) {
continue;
}
- $constructor = $definitionsCollection->getInstanceArguments($instanceType);
$constructors[$instanceType] = $argumentsResolver->getResolvedConstructorArguments(
$instanceType,
$constructor
@@ -151,14 +157,9 @@ private function getConfigForScope(DefinitionsCollection $definitionsCollection,
*/
private function fillThirdPartyInterfaces(ConfigInterface $config, DefinitionsCollection $definitionsCollection)
{
- $definedInstances = $definitionsCollection->getInstancesNamesList();
-
- foreach (array_keys($config->getPreferences()) as $interface) {
- if (in_array($interface, $definedInstances)) {
- continue;
- }
-
- $definitionsCollection->addDefinition($interface, []);
- }
+ $definedInstances = $definitionsCollection->getCollection();
+ $newInstances = array_fill_keys(array_keys($config->getPreferences()), []);
+ $newCollection = array_merge($newInstances, $definedInstances);
+ $definitionsCollection->initialize($newCollection);
}
}
diff --git a/setup/src/Magento/Setup/Test/Unit/Console/Command/ModuleConfigStatusCommandTest.php b/setup/src/Magento/Setup/Test/Unit/Console/Command/ModuleConfigStatusCommandTest.php
index 16577ed2db738..23879bf005f85 100644
--- a/setup/src/Magento/Setup/Test/Unit/Console/Command/ModuleConfigStatusCommandTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Console/Command/ModuleConfigStatusCommandTest.php
@@ -49,6 +49,9 @@ public function testExecute(array $currentConfig, array $correctConfig, string $
$this->assertEquals($expectedOutput, $tester->getDisplay());
}
+ /**
+ * @return array
+ */
public function executeDataProvider()
{
$successMessage = 'The modules configuration is up to date.' . PHP_EOL;
diff --git a/setup/src/Magento/Setup/Test/Unit/Controller/EnvironmentTest.php b/setup/src/Magento/Setup/Test/Unit/Controller/EnvironmentTest.php
index aa16ea1f8cd60..6050122d78521 100644
--- a/setup/src/Magento/Setup/Test/Unit/Controller/EnvironmentTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Controller/EnvironmentTest.php
@@ -294,6 +294,13 @@ public function testIndexAction()
$this->assertInstanceOf(\Zend\View\Model\JsonModel::class, $model);
}
+ /**
+ * @param \PHPUnit\Framework\MockObject\MockObject $request
+ * @param \PHPUnit\Framework\MockObject\MockObject $response
+ * @param \PHPUnit\Framework\MockObject\MockObject $routeMatch
+ *
+ * @return \PHPUnit\Framework\MockObject\MockObject
+ */
protected function getMvcEventMock(
MockObject $request,
MockObject $response,