').text($.mage.__('Sending swatch values as package.')));
+ });
+ });
});
window.saveAttributeInNewSet = swatchProductAttributes.saveAttributeInNewSet;
diff --git a/app/code/Magento/TaxGraphQl/etc/schema.graphqls b/app/code/Magento/TaxGraphQl/etc/schema.graphqls
index b39673f5431..2b819834784 100644
--- a/app/code/Magento/TaxGraphQl/etc/schema.graphqls
+++ b/app/code/Magento/TaxGraphQl/etc/schema.graphqls
@@ -1,18 +1,6 @@
# Copyright © Magento, Inc. All rights reserved.
# See COPYING.txt for license details.
-input ProductFilterInput {
- tax_class_id: FilterTypeInput
-}
-
-interface ProductInterface {
- tax_class_id: Int
-}
-
-input ProductSortInput {
- tax_class_id: SortEnum
-}
-
enum PriceAdjustmentCodesEnum {
TAX
}
diff --git a/app/code/Magento/Ui/view/base/web/js/modal/modal.js b/app/code/Magento/Ui/view/base/web/js/modal/modal.js
index af2b31f7eab..6c9b4b89bec 100644
--- a/app/code/Magento/Ui/view/base/web/js/modal/modal.js
+++ b/app/code/Magento/Ui/view/base/web/js/modal/modal.js
@@ -336,11 +336,12 @@ define([
* Set z-index and margin for modal and overlay.
*/
_setActive: function () {
- var zIndex = this.modal.zIndex();
+ var zIndex = this.modal.zIndex(),
+ baseIndex = zIndex + this._getVisibleCount();
+ this.overlay.zIndex(++baseIndex);
this.prevOverlayIndex = this.overlay.zIndex();
- this.modal.zIndex(zIndex + this._getVisibleCount());
- this.overlay.zIndex(zIndex + (this._getVisibleCount() - 1));
+ this.modal.zIndex(this.overlay.zIndex() + 1);
if (this._getVisibleSlideCount()) {
this.modal.css('marginLeft', this.options.modalLeftMargin * this._getVisibleSlideCount());
@@ -354,7 +355,14 @@ define([
this.modal.removeAttr('style');
if (this.overlay) {
- this.overlay.zIndex(this.prevOverlayIndex);
+ // In cases when one modal is closed but there is another modal open (e.g. admin notifications)
+ // to avoid collisions between overlay and modal zIndexes
+ // overlay zIndex is set to be less than modal one
+ if (this._getVisibleCount() === 1) {
+ this.overlay.zIndex(this.prevOverlayIndex - 1);
+ } else {
+ this.overlay.zIndex(this.prevOverlayIndex);
+ }
}
},
diff --git a/app/code/Magento/UrlRewrite/Block/Catalog/Product/Edit.php b/app/code/Magento/UrlRewrite/Block/Catalog/Product/Edit.php
index fa06a47bb56..ca3756a356a 100644
--- a/app/code/Magento/UrlRewrite/Block/Catalog/Product/Edit.php
+++ b/app/code/Magento/UrlRewrite/Block/Catalog/Product/Edit.php
@@ -55,7 +55,7 @@ protected function _prepareLayoutFeatures()
}
if ($this->_getProduct()->getId()) {
- $this->_addProductLinkBlock($this->_getProduct());
+ $this->_addProductLinkBlock();
}
if ($this->_getCategory()->getId()) {
diff --git a/app/code/Magento/Webapi/Model/Rest/Swagger/Generator.php b/app/code/Magento/Webapi/Model/Rest/Swagger/Generator.php
index 61c56fb691a..855f455120d 100644
--- a/app/code/Magento/Webapi/Model/Rest/Swagger/Generator.php
+++ b/app/code/Magento/Webapi/Model/Rest/Swagger/Generator.php
@@ -39,7 +39,7 @@ class Generator extends AbstractSchemaGenerator
const UNAUTHORIZED_DESCRIPTION = '401 Unauthorized';
/** Array signifier */
- const ARRAY_SIGNIFIER = '[]';
+ const ARRAY_SIGNIFIER = '[0]';
/**
* Swagger factory instance.
diff --git a/app/code/Magento/Wishlist/view/frontend/templates/item/list.phtml b/app/code/Magento/Wishlist/view/frontend/templates/item/list.phtml
index c2172afab94..ef02768c46a 100644
--- a/app/code/Magento/Wishlist/view/frontend/templates/item/list.phtml
+++ b/app/code/Magento/Wishlist/view/frontend/templates/item/list.phtml
@@ -19,7 +19,7 @@ $columns = $block->getColumns();
- setItem($item); echo $column->toHtml($item);?>
+ = $column->setItem($item)->toHtml();?>
diff --git a/app/design/adminhtml/Magento/backend/web/app/setup/styles/less/lib/forms/_checkbox-radio.less b/app/design/adminhtml/Magento/backend/web/app/setup/styles/less/lib/forms/_checkbox-radio.less
index 44b6a1568ef..82a6f7b2f19 100644
--- a/app/design/adminhtml/Magento/backend/web/app/setup/styles/less/lib/forms/_checkbox-radio.less
+++ b/app/design/adminhtml/Magento/backend/web/app/setup/styles/less/lib/forms/_checkbox-radio.less
@@ -87,7 +87,7 @@
.form-el-checkbox {
&:checked {
+ .form-label {
- &::before {
+ &:before {
content: @checkbox-icon__content;
font-family: @icons__font-family;
}
diff --git a/app/design/adminhtml/Magento/backend/web/app/updater/styles/less/components/_data-grid.less b/app/design/adminhtml/Magento/backend/web/app/updater/styles/less/components/_data-grid.less
index 2e8f06c0912..313efe6cdbc 100644
--- a/app/design/adminhtml/Magento/backend/web/app/updater/styles/less/components/_data-grid.less
+++ b/app/design/adminhtml/Magento/backend/web/app/updater/styles/less/components/_data-grid.less
@@ -22,8 +22,8 @@
vertical-align: middle;
width: @component-indicator__size;
- &::before,
- &::after {
+ &:before,
+ &:after {
background: @color-white;
display: block;
opacity: 0;
@@ -32,7 +32,7 @@
visibility: hidden;
}
- &::before {
+ &:before {
border: 1px solid @color-gray68;
border-radius: 1px;
box-shadow: 0 0 2px rgba(0,0,0,.4);
@@ -43,7 +43,7 @@
padding: 4px 5px;
}
- &::after {
+ &:after {
border-color: darken(@color-gray68, 8);
border-style: solid;
border-width: 1px 0 0 1px;
@@ -56,8 +56,8 @@
}
&:hover {
- &::before,
- &::after {
+ &:before,
+ &:after {
opacity: 1;
transition: opacity .2s linear;
visibility: visible;
diff --git a/app/design/adminhtml/Magento/backend/web/css/source/components/_file-uploader.less b/app/design/adminhtml/Magento/backend/web/css/source/components/_file-uploader.less
index 959b37de5a5..79e3975a41b 100644
--- a/app/design/adminhtml/Magento/backend/web/css/source/components/_file-uploader.less
+++ b/app/design/adminhtml/Magento/backend/web/css/source/components/_file-uploader.less
@@ -66,6 +66,7 @@
opacity: 0;
overflow: hidden;
position: absolute;
+ visibility: hidden;
width: 0;
&:focus {
@@ -241,7 +242,7 @@
}
}
-// Placeholder for multiple uploader
+// Placeholder for multiple uploader
.file-uploader-placeholder {
&.placeholder-document {
.lib-icon-font(
diff --git a/app/design/frontend/Magento/blank/Magento_Catalog/web/css/source/module/_toolbar.less b/app/design/frontend/Magento/blank/Magento_Catalog/web/css/source/module/_toolbar.less
index a0bd5e695a6..aceccb06d47 100644
--- a/app/design/frontend/Magento/blank/Magento_Catalog/web/css/source/module/_toolbar.less
+++ b/app/design/frontend/Magento/blank/Magento_Catalog/web/css/source/module/_toolbar.less
@@ -188,11 +188,10 @@
.lib-icon-font-symbol(@icon-list);
}
- .limiter {
- float: right;
-
- .products.wrapper ~ .toolbar & {
+ .toolbar {
+ .products.wrapper ~ & .limiter {
display: block;
+ float: right;
}
}
}
diff --git a/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/checkout/_authentication.less b/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/checkout/_authentication.less
index e1e23a9ffbb..f583c5dae0c 100644
--- a/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/checkout/_authentication.less
+++ b/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/checkout/_authentication.less
@@ -94,7 +94,7 @@
padding-top: @indent__xl;
position: relative;
- &::before {
+ &:before {
.lib-css(height, @block-auth__or-label__size);
.lib-css(line-height, @block-auth__or-label__size - 2px);
.lib-css(margin, -(@block-auth__or-label__size/2 + 1px) 0 0 -(@block-auth__or-label__size / 2));
@@ -212,7 +212,7 @@
margin: 0;
padding: @indent__s 0 0 @indent__xl;
- &::before {
+ &:before {
left: 0;
top: 50%;
}
diff --git a/app/design/frontend/Magento/blank/web/css/source/_extends.less b/app/design/frontend/Magento/blank/web/css/source/_extends.less
index a36934111eb..c177f91e9e7 100644
--- a/app/design/frontend/Magento/blank/web/css/source/_extends.less
+++ b/app/design/frontend/Magento/blank/web/css/source/_extends.less
@@ -1402,7 +1402,7 @@
&.active {
> .title {
.lib-icon-font-symbol(
- @_icon-font-content: @icon-prev,
+ @_icon-font-content: @icon-up,
@_icon-font-position: after
);
}
diff --git a/app/design/frontend/Magento/blank/web/css/source/_sections.less b/app/design/frontend/Magento/blank/web/css/source/_sections.less
index d5d6e5a3d10..f0a3518c92a 100644
--- a/app/design/frontend/Magento/blank/web/css/source/_sections.less
+++ b/app/design/frontend/Magento/blank/web/css/source/_sections.less
@@ -20,9 +20,7 @@
.media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) {
.product.data.items {
- .lib-data-tabs(
- @_tab-content-border-top-status: true
- );
+ .lib-data-tabs();
}
}
diff --git a/app/design/frontend/Magento/blank/web/css/source/_variables.less b/app/design/frontend/Magento/blank/web/css/source/_variables.less
index 5d946dd8a82..256bc796dba 100644
--- a/app/design/frontend/Magento/blank/web/css/source/_variables.less
+++ b/app/design/frontend/Magento/blank/web/css/source/_variables.less
@@ -15,6 +15,16 @@
@font-family-name__base: 'Open Sans';
@font-family__base: @font-family-name__base, @font-family__sans-serif;
+//
+// Sections variables
+// _____________________________________________
+
+//
+// Tabs
+// ---------------------------------------------
+@tab-content__border-top-status: true;
+
+
//
// Sidebar
// ---------------------------------------------
diff --git a/app/design/frontend/Magento/luma/Magento_Catalog/web/css/source/_module.less b/app/design/frontend/Magento/luma/Magento_Catalog/web/css/source/_module.less
index 6f7da202c16..228c6947c93 100644
--- a/app/design/frontend/Magento/luma/Magento_Catalog/web/css/source/_module.less
+++ b/app/design/frontend/Magento/luma/Magento_Catalog/web/css/source/_module.less
@@ -336,6 +336,11 @@
.lib-css(margin-top, @indent__xs);
}
}
+ .field {
+ .note.mage-error {
+ color: @error__color;
+ }
+ }
}
.product-options-bottom .price-box,
@@ -789,7 +794,7 @@
clear: both;
max-width: 100%;
overflow-x: auto;
- position: relative; // Needed for Safari(iOS) to properly render "overflow-x" rule.
+ position: relative; // Needed for Safari(iOS) to properly render 'overflow-x' rule.
.table-comparison > tbody > tr {
> th,
diff --git a/app/design/frontend/Magento/luma/Magento_Catalog/web/css/source/module/_listings.less b/app/design/frontend/Magento/luma/Magento_Catalog/web/css/source/module/_listings.less
index 01b8c7be93a..d0382d34d39 100644
--- a/app/design/frontend/Magento/luma/Magento_Catalog/web/css/source/module/_listings.less
+++ b/app/design/frontend/Magento/luma/Magento_Catalog/web/css/source/module/_listings.less
@@ -167,11 +167,11 @@
.column.main {
.product {
&-items {
- margin-left: -@indent__base;
+ margin-left: 0;
}
&-item {
- padding-left: @indent__base;
+ padding-left: 0;
}
}
}
@@ -277,8 +277,8 @@
}
.sidebar & {
.product-item-photo {
- top: 9px;
left: 9px;
+ top: 9px;
}
}
}
@@ -310,8 +310,8 @@
.actions-primary + .actions-secondary {
display: table-cell;
padding-left: 10px;
- width: 50%;
vertical-align: middle;
+ width: 50%;
> .action {
margin-right: 10px;
@@ -443,7 +443,7 @@
.product-item {
margin-left: calc(~'(100% - 4 * 24.439%) / 3');
- padding: 0;
+ padding: 5px;
width: 24.439%;
&:nth-child(4n + 1) {
diff --git a/app/design/frontend/Magento/luma/Magento_Catalog/web/css/source/module/_toolbar.less b/app/design/frontend/Magento/luma/Magento_Catalog/web/css/source/module/_toolbar.less
index 580abf264ca..0997b973912 100644
--- a/app/design/frontend/Magento/luma/Magento_Catalog/web/css/source/module/_toolbar.less
+++ b/app/design/frontend/Magento/luma/Magento_Catalog/web/css/source/module/_toolbar.less
@@ -233,10 +233,10 @@
}
}
- .limiter {
- float: right;
- .products.wrapper ~ .toolbar & {
+ .toolbar {
+ .products.wrapper ~ & .limiter {
display: block;
+ float: right;
}
}
}
diff --git a/app/design/frontend/Magento/luma/Magento_Checkout/web/css/source/module/checkout/_payments.less b/app/design/frontend/Magento/luma/Magento_Checkout/web/css/source/module/checkout/_payments.less
index c7fa7a62fd6..dd9db0e7153 100644
--- a/app/design/frontend/Magento/luma/Magento_Checkout/web/css/source/module/checkout/_payments.less
+++ b/app/design/frontend/Magento/luma/Magento_Checkout/web/css/source/module/checkout/_payments.less
@@ -63,6 +63,10 @@
}
}
}
+
+ #po_number {
+ margin-bottom: 20px;
+ }
}
.payment-method-title {
diff --git a/bin/UpgradeScripts/pre_composer_update_2.3.php b/bin/UpgradeScripts/pre_composer_update_2.3.php
deleted file mode 100644
index 1658c8a4e66..00000000000
--- a/bin/UpgradeScripts/pre_composer_update_2.3.php
+++ /dev/null
@@ -1,251 +0,0 @@
-#!/usr/bin/php
-" [--composer=]
- [--edition=
] [--version=] [--repo=]
- [--help]
-
-Required:
- --root=""
- Path to the Magento installation root directory
-
-Optional:
- --composer=""
- Path to the composer executable
- - Default: The composer found in PATH
-
- --edition=
- The Magento edition to upgrade to. Open Source = 'community', Commerce = 'enterprise'
- - Default: The edition currently required in composer.json
-
- --version=
- The Magento version to upgrade to
- - Default: The value for the "version" field in composer.json
-
- --repo=
- The Magento composer repository to pull new packages from
- - Default: The Magento repository configured in composer.json
-
- --help
- Display this message
-SYNOPSIS
-);
-
-
-$opts = getopt('', [
- 'root:',
- 'composer:',
- 'edition:',
- 'version:',
- 'repo:',
- 'help'
-]);
-
-if (isset($opts['help'])) {
- echo SYNOPSIS . PHP_EOL;
- exit(0);
-}
-
-try {
- if (empty($opts['root'])) {
- throw new BadMethodCallException("Magento root must be given with '--root'" . PHP_EOL . PHP_EOL . SYNOPSIS);
- }
-
- $rootDir = $opts['root'];
- if (!is_dir($rootDir)) {
- throw new InvalidArgumentException("Magento root directory '$rootDir' does not exist");
- }
-
- $cmd = (!empty($opts['composer']) ? $opts['composer'] : 'composer') . " --working-dir='$rootDir'";
- $jsonData = json_decode(file_get_contents("$rootDir/composer.json"), true);
-
- $version = !empty($opts['version']) ? $opts['version'] : $jsonData['version'];
- if (empty($version)) {
- throw new InvalidArgumentException('Value not found for "version" field in composer.json');
- }
-
- if (!empty($opts['edition'])) {
- $edition = $opts['edition'];
- }
- else {
- $editionRegex = '|^magento/product\-(?[a-z]+)\-edition$|';
-
- foreach (array_keys($jsonData["require"]) as $requiredPackage) {
- if (preg_match($editionRegex, $requiredPackage, $matches)) {
- $edition = $matches['edition'];
- break;
- }
- }
- if (empty($edition)) {
- throw new InvalidArgumentException('No valid Magento edition found in composer.json requirements');
- }
- }
-
- echo "Backing up $rootDir/composer.json" . PHP_EOL;
- copy("$rootDir/composer.json", "$rootDir/composer.json.bak");
-
- echo "Updating Magento product requirement to magento/product-$edition-edition=$version" . PHP_EOL;
- if ($edition == "enterprise") {
- execVerbose("$cmd remove --verbose magento/product-community-edition --no-update");
- }
- execVerbose("$cmd require --verbose magento/product-$edition-edition=$version --no-update");
-
- echo 'Updating "require-dev" section of composer.json' . PHP_EOL;
- execVerbose("$cmd require --dev --verbose " .
- "phpunit/phpunit:~6.2.0 " .
- "friendsofphp/php-cs-fixer:~2.10.1 " .
- "lusitanian/oauth:~0.8.10 " .
- "pdepend/pdepend:2.5.2 " .
- "sebastian/phpcpd:~3.0.0 " .
- "squizlabs/php_codesniffer:3.2.2 --no-update");
-
- execVerbose("$cmd remove --dev --verbose sjparkinson/static-review fabpot/php-cs-fixer --no-update");
-
- echo 'Adding "Zend\\\\Mvc\\\\Controller\\\\": "setup/src/Zend/Mvc/Controller/" to "autoload":"psr-4"' . PHP_EOL;
- $jsonData = json_decode(file_get_contents("$rootDir/composer.json"), true);
- $jsonData["autoload"]["psr-4"]["Zend\\Mvc\\Controller\\"] = "setup/src/Zend/Mvc/Controller/";
-
- $jsonData["version"] = $version;
- file_put_contents("$rootDir/composer.json", json_encode($jsonData, JSON_UNESCAPED_SLASHES|JSON_PRETTY_PRINT));
-
- if (file_exists("$rootDir/update")) {
- echo "Replacing Magento/Updater" . PHP_EOL;
-
- $mageUrls = [];
- if (isset($opts['repo'])) {
- $mageUrls[] = $opts['repo'];
- }
- else {
- $composerUrls = array_map(function ($r) { return $r["url"]; },
- array_filter($jsonData['repositories']), function ($r) { return $r["type"] == "composer"; });
- $mageUrls = array_filter($composerUrls, function($u) { return strpos($u, ".mage") !== false; });
-
- if (count($mageUrls) == 0) {
- throw new InvalidArgumentException('No Magento composer repository urls found in composer.json');
- }
- }
-
- echo "Backing up $rootDir/update" . PHP_EOL;
- rename("$rootDir/update", "$rootDir/update.bak");
- $newPackage = "magento/project-$edition-edition=$version";
- foreach ($mageUrls as $repoUrl) {
- try {
- deleteFilepath("$rootDir/temp_update");
- execVerbose("$cmd create-project --repository=$repoUrl $newPackage $rootDir/temp_update --no-install");
- rename("$rootDir/temp_update/update", "$rootDir/update");
- echo "Upgraded Magento/Updater from magento/project-$edition-edition $version on $repoUrl" . PHP_EOL;
- unset($exception);
- break;
- }
- catch (Exception $e) {
- echo "Failed to find Magento package on $repoUrl" . PHP_EOL;
- $exception = $e;
- }
- }
- deleteFilepath("$rootDir/temp_update");
-
- if (isset($exception)) {
- throw $exception;
- }
- }
-} catch (Exception $e) {
- if ($e->getPrevious()) {
- $message = (string)$e->getPrevious();
- } else {
- $message = $e->getMessage();
- }
-
- try {
- error_log($message . PHP_EOL . PHP_EOL . "Error encountered; resetting backups" . PHP_EOL);
- if (file_exists("$rootDir/update.bak")) {
- deleteFilepath("$rootDir/update_temp");
- deleteFilepath("$rootDir/update");
- rename("$rootDir/update.bak", "$rootDir/update");
- }
-
- if (file_exists("$rootDir/composer.json.bak")) {
- deleteFilepath("$rootDir/composer.json");
- rename("$rootDir/composer.json.bak", "$rootDir/composer.json");
- }
- }
- catch (Exception $e) {
- error_log($e->getMessage() . PHP_EOL);
- }
-
- exit($e->getCode() == 0 ? 1 : $e->getCode());
-}
-
-/**
- * Execute a command with automatic escaping of arguments
- *
- * @param string $command
- * @return array
- * @throws Exception
- */
-function execVerbose($command)
-{
- $args = func_get_args();
- $args = array_map('escapeshellarg', $args);
- $args[0] = $command;
- $command = call_user_func_array('sprintf', $args);
- echo $command . PHP_EOL;
- exec($command . " 2>&1", $output, $exitCode);
- $outputString = join(PHP_EOL, $output);
- if (0 !== $exitCode) {
- throw new Exception($outputString, $exitCode);
- }
- echo $outputString . PHP_EOL;
- return $output;
-}
-
-/**
- * Deletes a file or a directory and all its contents
- *
- * @param string $path
- * @throws Exception
- */
-function deleteFilepath($path) {
- if (!file_exists($path)) {
- return;
- }
- if (is_dir($path)) {
- $files = array_diff(scandir($path), array('..', '.'));
- foreach ($files as $file) {
- deleteFilepath("$path/$file");
- }
- rmdir($path);
- }
- else {
- unlink($path);
- }
- if (file_exists($path)) {
- throw new Exception("Failed to delete $path");
- }
-}
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Analytics/Data/UserData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Analytics/Data/UserData.xml
index 65ddfa7bb95..c15e6004ed6 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Analytics/Data/UserData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Analytics/Data/UserData.xml
@@ -18,5 +18,16 @@
en_US
true
123123q
+
+
+ restrictedWebUser
+ restricted
+ webUser
+ restrictedWebUser@example.com
+ 123123q
+ 123123q
+ en_US
+ true
+ 123123q
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Data/BundleLinkData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Data/BundleLinkData.xml
new file mode 100644
index 00000000000..65add76a12a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Data/BundleLinkData.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+ 1
+ 1
+ 1.11
+ 1
+ 1
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Data/BundleOptionData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Data/BundleOptionData.xml
new file mode 100644
index 00000000000..02f70ec15ca
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Data/BundleOptionData.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+ bundle-option-dropdown
+ true
+ dropdown
+ 1
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Data/CustomAttributeData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Data/CustomAttributeData.xml
new file mode 100644
index 00000000000..c7f150e7ad6
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Data/CustomAttributeData.xml
@@ -0,0 +1,22 @@
+
+
+
+
+ price_type
+ 0
+
+
+ price_type
+ 1
+
+
+ price_view
+ 1
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Data/ProductData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Data/ProductData.xml
index a8598ded6ec..69741ccd502 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Data/ProductData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Data/ProductData.xml
@@ -19,4 +19,18 @@
1
bundleproduct
+
+ Api Bundle Product
+ api-bundle-product
+ bundle
+ 4
+ 4
+ 1
+ api-bundle-product
+ EavStockItem
+ ApiProductDescription
+ ApiProductShortDescription
+ CustomAttributeDynamicPrice
+ CustomAttributePriceView
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Metadata/bundle_link-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Metadata/bundle_link-meta.xml
new file mode 100644
index 00000000000..be881a7e98d
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Metadata/bundle_link-meta.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+ application/json
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Metadata/bundle_option-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Metadata/bundle_option-meta.xml
new file mode 100644
index 00000000000..991c01ec4c6
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Metadata/bundle_option-meta.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+ application/json
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Metadata/bundle_options-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Metadata/bundle_options-meta.xml
new file mode 100644
index 00000000000..a81d5dda6a4
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Metadata/bundle_options-meta.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+ application/json
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/ActionGroup/AddProductToCartActionGroup.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/ActionGroup/AddProductToCartActionGroup.xml
index 6caa4fef770..9380c3052a5 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/ActionGroup/AddProductToCartActionGroup.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/ActionGroup/AddProductToCartActionGroup.xml
@@ -14,5 +14,6 @@
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/ActionGroup/AdminCategoryActionGroup.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/ActionGroup/AdminCategoryActionGroup.xml
index 96e40e348a6..e8e5d0730fd 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/ActionGroup/AdminCategoryActionGroup.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/ActionGroup/AdminCategoryActionGroup.xml
@@ -57,7 +57,7 @@
-
+
@@ -81,7 +81,7 @@
-
+
@@ -118,6 +118,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -128,6 +190,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/ActionGroup/AdminProductActionGroup.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/ActionGroup/AdminProductActionGroup.xml
index c4843260f93..3ef8b961a81 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/ActionGroup/AdminProductActionGroup.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/ActionGroup/AdminProductActionGroup.xml
@@ -77,14 +77,14 @@
-
+
-
-
+
+
@@ -139,6 +139,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/ActionGroup/CustomOptionsActionGroup.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/ActionGroup/CustomOptionsActionGroup.xml
new file mode 100644
index 00000000000..0409c3f1950
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/ActionGroup/CustomOptionsActionGroup.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/ActionGroup/StorefrontProductPageActionGroup.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/ActionGroup/StorefrontProductPageActionGroup.xml
index 0644cdf3cc0..4923b1d969b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/ActionGroup/StorefrontProductPageActionGroup.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/ActionGroup/StorefrontProductPageActionGroup.xml
@@ -21,4 +21,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductData.xml
index 34110d04176..3c6e7d3ddc3 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductData.xml
@@ -154,12 +154,13 @@
EavStockItem
CustomAttributeProductUrlKey
-
+
Image1
1.00
Upload File
Yes
magento-logo.png
+ magento-logo
MagentoLogo
@@ -281,4 +282,41 @@
EavStockItem
ApiProductNewsFromDate
+
+ Double Quote"
+ doubleQuote
+ simple
+ 4
+ 10.00
+ 4
+ 1
+ 1000
+ 1
+ EavStockItem
+
+
+
+
+
+
+
+
+
+
+
+ api-simple-product
+ simple
+ 4
+ 4
+ Api Simple Product
+ 1.00
+
+
+ api-simple-product
+ simple
+ 4
+ 4
+ Api Simple Product
+ 100.00
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductOptionData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductOptionData.xml
index f2f6e1a6f55..2abc557d44d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductOptionData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductOptionData.xml
@@ -18,6 +18,16 @@
fixed
0
+
+
+ OptionField2
+ field
+ true
+ 1
+ 20
+ fixed
+ 0
+
OptionArea
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product-meta.xml
index edbf1133d4f..b04b4bb98c8 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product-meta.xml
@@ -60,7 +60,10 @@
boolean
-
+
+ application/json
+
+
application/json
@@ -115,7 +118,43 @@
boolean
-
+
+ application/json
+
+
+ application/json
+
+
+
+ application/json
+
+
+
+
+ application/json
+
+
application/json
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link-meta.xml
index a6d418dc675..899dc3a7f4a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link-meta.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_link-meta.xml
@@ -14,9 +14,9 @@
string
string
integer
-
- product_link_extension_attribute
-
+
string
@@ -24,8 +24,8 @@
string
string
integer
-
- product_link_extension_attribute
-
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_links-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_links-meta.xml
new file mode 100644
index 00000000000..34e8d0fca68
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Metadata/product_links-meta.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+ application/json
+
+ product_link
+
+
+
+ application/json
+ product_link
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryBasicFieldSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryBasicFieldSection.xml
index 26f56f6176f..7de2390e534 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryBasicFieldSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryBasicFieldSection.xml
@@ -11,9 +11,12 @@
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMainActionsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMainActionsSection.xml
index 3c806fbbea6..e726e5bfb7c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMainActionsSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategoryMainActionsSection.xml
@@ -11,5 +11,8 @@
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySEOSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySEOSection.xml
index 679cd2d7bee..0e01660d5fc 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySEOSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySEOSection.xml
@@ -11,6 +11,8 @@
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarTreeSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarTreeSection.xml
index e914c80c3e6..5e080bbb7fd 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarTreeSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminCategorySidebarTreeSection.xml
@@ -14,5 +14,7 @@
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductAttributeSetSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductAttributeSetSection.xml
index 19e59d1cd22..011b2fce3a7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductAttributeSetSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductAttributeSetSection.xml
@@ -17,4 +17,8 @@
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductCategoryCreationSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductCategoryCreationSection.xml
new file mode 100644
index 00000000000..a4566115099
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductCategoryCreationSection.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductContentSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductContentSection.xml
new file mode 100644
index 00000000000..12a00ae8b37
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductContentSection.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductCustomizableOptionsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductCustomizableOptionsSection.xml
index 703ba081e31..cb80dade856 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductCustomizableOptionsSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductCustomizableOptionsSection.xml
@@ -15,6 +15,12 @@
+
+
+
+
+
+
@@ -23,5 +29,14 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductImagesSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductImagesSection.xml
index a9749ac6779..b31bcaf04e4 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductImagesSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductImagesSection.xml
@@ -14,5 +14,6 @@
+
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontCategoryProductSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontCategoryProductSection.xml
index e736378ca8c..e8df8650e8d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontCategoryProductSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontCategoryProductSection.xml
@@ -19,5 +19,6 @@
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductInfoMainSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductInfoMainSection.xml
index 5abc388a7d6..a981f125c5e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductInfoMainSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductInfoMainSection.xml
@@ -18,12 +18,20 @@
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductPageSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductPageSection.xml
index 8e902b111fc..a3703839601 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductPageSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductPageSection.xml
@@ -13,5 +13,7 @@
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminAddImageForCategoryTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminAddImageForCategoryTest.xml
index ba90296d123..04e34871c8b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminAddImageForCategoryTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminAddImageForCategoryTest.xml
@@ -43,6 +43,6 @@
-
+
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminCreateCategoryFromProductPageTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminCreateCategoryFromProductPageTest.xml
new file mode 100644
index 00000000000..7c81f4472e9
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminCreateCategoryFromProductPageTest.xml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminUpdateCategoryStoreUrlKeyTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminUpdateCategoryStoreUrlKeyTest.xml
new file mode 100644
index 00000000000..e29890befd8
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminUpdateCategoryStoreUrlKeyTest.xml
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdvanceCatalogSearchSimpleProductTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdvanceCatalogSearchSimpleProductTest.xml
new file mode 100644
index 00000000000..a302fa58ec2
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdvanceCatalogSearchSimpleProductTest.xml
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/ConfigurableOptionTextInputLengthValidationHint.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/ConfigurableOptionTextInputLengthValidationHint.xml
new file mode 100644
index 00000000000..45db40dd2e3
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/ConfigurableOptionTextInputLengthValidationHint.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/EndToEndB2CAdminTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/EndToEndB2CAdminTest.xml
index 7ce754e8f00..0f466ccc3d9 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/EndToEndB2CAdminTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/EndToEndB2CAdminTest.xml
@@ -39,7 +39,7 @@
-
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/SaveProductWithCustomOptionsSecondWebsiteTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/SaveProductWithCustomOptionsSecondWebsiteTest.xml
index cc33059dd10..cf7f996736e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/SaveProductWithCustomOptionsSecondWebsiteTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/SaveProductWithCustomOptionsSecondWebsiteTest.xml
@@ -32,6 +32,7 @@
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/SimpleProductTwoCustomOptionsTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/SimpleProductTwoCustomOptionsTest.xml
new file mode 100644
index 00000000000..2710002d625
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/SimpleProductTwoCustomOptionsTest.xml
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/StorefrontProductNameWithDoubleQuote.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/StorefrontProductNameWithDoubleQuote.xml
new file mode 100644
index 00000000000..a848515aee8
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/StorefrontProductNameWithDoubleQuote.xml
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/Test/AdvanceCatalogSearchSimpleProductTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/Test/AdvanceCatalogSearchSimpleProductTest.xml
new file mode 100644
index 00000000000..11bc308902c
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/Test/AdvanceCatalogSearchSimpleProductTest.xml
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/Test/AdvanceCatalogSearchSimpleProductsTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/Test/AdvanceCatalogSearchSimpleProductsTest.xml
deleted file mode 100644
index f52a8681084..00000000000
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/Test/AdvanceCatalogSearchSimpleProductsTest.xml
+++ /dev/null
@@ -1,140 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/Test/AdvanceCatalogSearchVirtualProductsTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/Test/AdvanceCatalogSearchVirtualProductsTest.xml
deleted file mode 100644
index 80b1b294fec..00000000000
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/CatalogSearch/Test/AdvanceCatalogSearchVirtualProductsTest.xml
+++ /dev/null
@@ -1,141 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/GuestCheckoutReviewAndPaymentsPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/GuestCheckoutReviewAndPaymentsPage.xml
new file mode 100644
index 00000000000..3fb6e99ed67
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Page/GuestCheckoutReviewAndPaymentsPage.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutCartSummarySection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutCartSummarySection.xml
index 32a57a14cd9..24807094054 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutCartSummarySection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutCartSummarySection.xml
@@ -15,5 +15,9 @@
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingGuestInfoSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingGuestInfoSection.xml
index f20ae4dac07..f2cca89be6c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingGuestInfoSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingGuestInfoSection.xml
@@ -17,5 +17,7 @@
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Data/CmsPageData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Data/CmsPageData.xml
index 857ac2a2f1b..25e55ea756a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Data/CmsPageData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Data/CmsPageData.xml
@@ -37,6 +37,7 @@
1.00
Upload File
Yes
+ magento.jpg
magento.jpg
magento
jpg
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ConfigurableProductData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ConfigurableProductData.xml
index 0a2429fa8f9..70e758a5140 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ConfigurableProductData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Data/ConfigurableProductData.xml
@@ -34,6 +34,19 @@
EavStockItem
CustomAttributeCategoryIds
+
+ api-configurable-product
+ configurable
+ 4
+ 4
+ API Configurable Product
+ api-configurable-product
+ 1
+ 100
+ EavStockItem
+ ApiProductDescription
+ ApiProductShortDescription
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Section/StorefrontProductInfoMainSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Section/StorefrontProductInfoMainSection.xml
index cebb76e68a6..45bf8665513 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Section/StorefrontProductInfoMainSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Section/StorefrontProductInfoMainSection.xml
@@ -14,5 +14,8 @@
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Test/AdminConfigurableProductOutOfStockTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Test/AdminConfigurableProductOutOfStockTest.xml
new file mode 100644
index 00000000000..96651e303c5
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Test/AdminConfigurableProductOutOfStockTest.xml
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Test/AdminConfigurableProductUpdateAttributeTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Test/AdminConfigurableProductUpdateAttributeTest.xml
new file mode 100644
index 00000000000..2a2c331aa15
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Test/AdminConfigurableProductUpdateAttributeTest.xml
@@ -0,0 +1,142 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/Data/LinkData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/Data/LinkData.xml
index 6276f340f85..1498f4b96b3 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/Data/LinkData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/Data/LinkData.xml
@@ -41,4 +41,13 @@
URL
https://static.magento.com/sites/all/themes/mag_redesign/images/magento-logo.svg
+
+ Api Downloadable Link
+ 2.00
+ url
+ No
+ 1000
+ 0
+ https://static.magento.com/sites/all/themes/mag_redesign/images/magento-logo.svg
+
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/Data/ProductData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/Data/ProductData.xml
index 427f2577a8a..f71ebd481a9 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/Data/ProductData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/Data/ProductData.xml
@@ -19,4 +19,19 @@
1
downloadableproduct
+
+ api-downloadable-product
+ downloadable
+ 4
+ 4
+ Api Downloadable Product
+ 123.00
+ api-downloadable-product
+ 1
+ 100
+ EavStockItem
+ ApiProductDescription
+ ApiProductShortDescription
+ apiDownloadableLink
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/Metadata/downloadable_link-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/Metadata/downloadable_link-meta.xml
new file mode 100644
index 00000000000..dc86c4e8d79
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/Metadata/downloadable_link-meta.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+ application/json
+
+ boolean
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/Metadata/link_file_content-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/Metadata/link_file_content-meta.xml
new file mode 100644
index 00000000000..72f643e0680
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/Metadata/link_file_content-meta.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+ string
+ string
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/Metadata/sample_file_content-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/Metadata/sample_file_content-meta.xml
new file mode 100644
index 00000000000..144ce67bb25
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Downloadable/Metadata/sample_file_content-meta.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+ string
+ string
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/Data/GroupedProductData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/Data/GroupedProductData.xml
index 019b0d24dec..9960d698a78 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/Data/GroupedProductData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/Data/GroupedProductData.xml
@@ -17,4 +17,15 @@
groupedproduct
EavStockItem
+
+ api-grouped-product
+ grouped
+ 4
+ Api Grouped Product
+ 1
+ api-grouped-product
+ EavStockItem
+ ApiProductDescription
+ ApiProductShortDescription
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/Data/ProductLinkData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/Data/ProductLinkData.xml
new file mode 100644
index 00000000000..9a5df1e379a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/Data/ProductLinkData.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+ associated
+ simple
+ 1
+ Qty1000
+
+
+
+
+ associated
+ simple
+ 2
+ Qty1000
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/Data/ProductLinkExtensionAttributeData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/Data/ProductLinkExtensionAttributeData.xml
new file mode 100644
index 00000000000..5f5dcb3a0ef
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/Data/ProductLinkExtensionAttributeData.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+ 1000
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/Data/ProductLinksData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/Data/ProductLinksData.xml
new file mode 100644
index 00000000000..523517aa700
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/GroupedProduct/Data/ProductLinksData.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+ ProductLinkSimple1
+
+
+ ProductLinkSimple2
+
+
+
+ - ProductLinkSimple1
+ - ProductLinkSimple2
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/Data/PersistentData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/Data/PersistentData.xml
new file mode 100644
index 00000000000..4ba2e1ae738
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/Data/PersistentData.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+ persistentDefaultState
+
+
+ 0
+
+
+
+ persistentEnabledState
+
+
+ 1
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/Metadata/persistent_config-meta.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/Metadata/persistent_config-meta.xml
new file mode 100644
index 00000000000..69a835aa703
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/Metadata/persistent_config-meta.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/Test/GuestCheckoutWithEnabledPersistentTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/Test/GuestCheckoutWithEnabledPersistentTest.xml
new file mode 100644
index 00000000000..f7f76da7d38
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Persistent/Test/GuestCheckoutWithEnabledPersistentTest.xml
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/ActionGroup/AdminCartPriceRuleActionGroup.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/ActionGroup/AdminCartPriceRuleActionGroup.xml
new file mode 100644
index 00000000000..24d881ee608
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/ActionGroup/AdminCartPriceRuleActionGroup.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Section/PriceRuleConditionsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Section/PriceRuleConditionsSection.xml
index 39c6dd6b319..93ed408ce7a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Section/PriceRuleConditionsSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Section/PriceRuleConditionsSection.xml
@@ -16,5 +16,9 @@
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Test/StorefrontCartPriceRuleCountry.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Test/StorefrontCartPriceRuleCountry.xml
new file mode 100644
index 00000000000..a6a0d669f34
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Test/StorefrontCartPriceRuleCountry.xml
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Test/StorefrontCartPriceRulePostcode.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Test/StorefrontCartPriceRulePostcode.xml
new file mode 100644
index 00000000000..97936382e60
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Test/StorefrontCartPriceRulePostcode.xml
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Test/StorefrontCartPriceRuleQuantity.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Test/StorefrontCartPriceRuleQuantity.xml
new file mode 100644
index 00000000000..f4342b5d480
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Test/StorefrontCartPriceRuleQuantity.xml
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Test/StorefrontCartPriceRuleState.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Test/StorefrontCartPriceRuleState.xml
new file mode 100644
index 00000000000..e2de2117d78
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Test/StorefrontCartPriceRuleState.xml
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Test/StorefrontCartPriceRuleSubtotal.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Test/StorefrontCartPriceRuleSubtotal.xml
new file mode 100644
index 00000000000..6c49534ee43
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SalesRule/Test/StorefrontCartPriceRuleSubtotal.xml
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/Section/AdminEditRoleInfoSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/Section/AdminEditRoleInfoSection.xml
index 3e5b4ac6ecc..69d1fdea9cb 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/Section/AdminEditRoleInfoSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/User/Section/AdminEditRoleInfoSection.xml
@@ -12,6 +12,10 @@
+
+
+
+
diff --git a/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/CategoryTest.php b/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/CategoryTest.php
index 223fa75006d..dca3bf9abd1 100644
--- a/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/CategoryTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/CategoryTest.php
@@ -232,7 +232,6 @@ public function testCategoryProducts()
special_price
special_to_date
swatch_image
- tax_class_id
thumbnail
thumbnail_label
tier_price
@@ -358,7 +357,6 @@ private function assertAttributes($actualResponse)
'meta_keyword',
'meta_title',
'short_description',
- 'tax_class_id',
'country_of_manufacture',
'gift_message_available',
'new_from_date',
diff --git a/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/ProductViewTest.php b/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/ProductViewTest.php
index aaf22c8b373..b5aa73a5a7a 100644
--- a/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/ProductViewTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/ProductViewTest.php
@@ -211,7 +211,6 @@ public function testQueryAllFieldsSimpleProduct()
special_price
special_to_date
swatch_image
- tax_class_id
thumbnail
thumbnail_label
tier_price
@@ -460,7 +459,6 @@ public function testQueryMediaGalleryEntryFieldsSimpleProduct()
special_price
special_to_date
swatch_image
- tax_class_id
thumbnail
thumbnail_label
tier_price
@@ -922,7 +920,6 @@ private function assertEavAttributes($product, $actualResponse)
'meta_keyword',
'meta_title',
'short_description',
- 'tax_class_id',
'country_of_manufacture',
'gift_message_available',
'news_from_date',
diff --git a/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/VirtualProductViewTest.php b/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/VirtualProductViewTest.php
index f38d71c9b40..df3386f2f78 100644
--- a/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/VirtualProductViewTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/VirtualProductViewTest.php
@@ -36,7 +36,6 @@ public function testQueryAllFieldsVirtualProduct()
name
sku
type_id
- tax_class_id
updated_at
... on PhysicalProductInterface {
weight
@@ -96,7 +95,6 @@ public function testCannotQueryWeightOnVirtualProductException()
name
sku
type_id
- tax_class_id
updated_at
... on PhysicalProductInterface {
weight
@@ -130,7 +128,6 @@ private function assertBaseFields($product, $actualResponse)
['response_field' => 'attribute_set_id', 'expected_value' => $product->getAttributeSetId()],
['response_field' => 'id', 'expected_value' => $product->getId()],
['response_field' => 'name', 'expected_value' => $product->getName()],
- ['response_field' => 'tax_class_id', 'expected_value' => $product->getTaxClassId()],
['response_field' => 'sku', 'expected_value' => $product->getSku()],
['response_field' => 'type_id', 'expected_value' => $product->getTypeId()]
];
diff --git a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/ShipmentCreateTest.php b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/ShipmentCreateTest.php
index 8c8130d2b39..d8b3c5cac52 100644
--- a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/ShipmentCreateTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/ShipmentCreateTest.php
@@ -43,13 +43,13 @@ public function testInvoke()
'qty' => $orderItem->getQtyOrdered(),
'additional_data' => null,
'description' => null,
- 'entity_id' => null,
+ 'entity_id' => 1,
'name' => null,
'parent_id' => null,
'price' => null,
'product_id' => null,
'row_total' => null,
- 'sku' => null,
+ 'sku' => 'simple',
'weight' => null,
],
];
diff --git a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/ShipmentGetTest.php b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/ShipmentGetTest.php
index aaa7a5a6d44..2b7e76aee07 100644
--- a/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/ShipmentGetTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/ShipmentGetTest.php
@@ -5,6 +5,8 @@
*/
namespace Magento\Sales\Service\V1;
+use Magento\Framework\Api\ExtensibleDataInterface;
+use Magento\Framework\Api\SimpleDataObjectConverter;
use Magento\TestFramework\TestCase\WebapiAbstract;
/**
@@ -57,7 +59,18 @@ public function testShipmentGet()
unset($data['tracks']);
foreach ($data as $key => $value) {
if (!empty($value)) {
- $this->assertEquals($shipment->getData($key), $value, $key);
+ if ($key === ExtensibleDataInterface::EXTENSION_ATTRIBUTES_KEY) {
+ foreach ($value as $extensionAttributeKey => $extensionAttributeValue) {
+ $methodName = 'get' .
+ SimpleDataObjectConverter::snakeCaseToUpperCamelCase($extensionAttributeKey);
+ $this->assertEquals(
+ $shipment->getExtensionAttributes()->$methodName(),
+ $extensionAttributeValue
+ );
+ }
+ } else {
+ $this->assertEquals($shipment->getData($key), $value, $key);
+ }
}
}
$shipmentItem = $this->objectManager->get(\Magento\Sales\Model\Order\Shipment\Item::class);
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateOrderBackendTest.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateOrderBackendTest.xml
index 8ffcab68cdc..acf15c0e282 100644
--- a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateOrderBackendTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateOrderBackendTest.xml
@@ -27,8 +27,8 @@
braintree
braintree
Processing
- Back, Cancel, Send Email, Hold, Invoice, Ship, Reorder, Edit
-
+ Back, Cancel, Send Email, Invoice, Reorder, Edit
+
@@ -55,9 +55,9 @@
visa_default
braintree
braintree, braintree_sale
- Processing
- Back, Send Email, Hold, Ship, Reorder
-
+ Complete
+ Back, Send Email, Reorder
+
@@ -83,7 +83,7 @@
visa_braintree_fraud_rejected
braintree
Processing
-
+
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/View/CustomOptions.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/View/CustomOptions.php
index 5e9e5526eb6..9f05a4ade8a 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/View/CustomOptions.php
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/View/CustomOptions.php
@@ -58,7 +58,7 @@ class CustomOptions extends Form
*
* @var string
*/
- protected $maxCharacters = './/div[@class="control"]/p[@class="note"]/strong';
+ protected $maxCharacters = './/div[@class="control"]/p[contains(@class, "note")]';
/**
* Selector for label of option value element
@@ -72,7 +72,7 @@ class CustomOptions extends Form
*
* @var string
*/
- protected $noteByNumber = './/*[@class="note"][%d]/strong';
+ protected $noteByNumber = './/*[contains(@class, "note")][%d]/strong';
/**
* Selector for select element of option
@@ -220,13 +220,19 @@ public function isJsMessageVisible($customOptionTitle)
protected function getFieldData(SimpleElement $option)
{
$price = $this->getOptionPriceNotice($option);
- $maxCharacters = $option->find($this->maxCharacters, Locator::SELECTOR_XPATH);
+ $maxCharactersElement = $option->find($this->maxCharacters, Locator::SELECTOR_XPATH);
+
+ $maxCharacters = null;
+ if ($maxCharactersElement->isVisible()) {
+ preg_match('/\s([0-9]+)\s/', $maxCharactersElement->getText(), $match);
+ $maxCharacters = isset($match[1]) ? $match[1] : $maxCharactersElement->getText();
+ }
return [
'options' => [
[
'price' => floatval($price),
- 'max_characters' => $maxCharacters->isVisible() ? $maxCharacters->getText() : null,
+ 'max_characters' => $maxCharacters,
],
]
];
diff --git a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Page/Adminhtml/CatalogRuleNew.xml b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Page/Adminhtml/CatalogRuleNew.xml
index 1823dd1e1bb..ba4ff8d42d9 100644
--- a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Page/Adminhtml/CatalogRuleNew.xml
+++ b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Page/Adminhtml/CatalogRuleNew.xml
@@ -9,6 +9,6 @@
-
+
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Actions.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Actions.php
index 573f28f09b7..7a6903ef47a 100644
--- a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Actions.php
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Actions.php
@@ -137,6 +137,16 @@ class Actions extends Block
*/
protected $confirmModal = '.confirm._show[data-role=modal]';
+ /**
+ * Is shipment can be created.
+ *
+ * @return bool
+ */
+ public function canShip()
+ {
+ return $this->_rootElement->find($this->ship)->isVisible();
+ }
+
/**
* Ship order.
*
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/CreateOrderBackendTest.xml b/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/CreateOrderBackendTest.xml
index 439b8a4492a..c4e03b94d2a 100644
--- a/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/CreateOrderBackendTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/CreateOrderBackendTest.xml
@@ -19,7 +19,7 @@
cashondelivery
cashondelivery
-
+
@@ -35,7 +35,7 @@
cashondelivery
cashondelivery
-
+
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/TestStep/CreateShipmentStep.php b/dev/tests/functional/tests/app/Magento/Sales/Test/TestStep/CreateShipmentStep.php
index 79abd438a1f..dcee66b4464 100644
--- a/dev/tests/functional/tests/app/Magento/Sales/Test/TestStep/CreateShipmentStep.php
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/TestStep/CreateShipmentStep.php
@@ -99,13 +99,21 @@ public function run()
{
$this->orderIndex->open();
$this->orderIndex->getSalesOrderGrid()->searchAndOpen(['id' => $this->order->getId()]);
- $this->salesOrderView->getPageActions()->ship();
- if (!empty($this->data)) {
- $this->orderShipmentNew->getFormBlock()->fillData($this->data, $this->order->getEntityId()['products']);
+ $shipmentIds = [];
+ /**
+ * As this step is used in general scenarios and not all test cases has shippable items(ex: virtual product)
+ * we need to check, if it possible to create shipment for given order.
+ */
+ if ($this->salesOrderView->getPageActions()->canShip()) {
+ $this->salesOrderView->getPageActions()->ship();
+ if (!empty($this->data)) {
+ $this->orderShipmentNew->getFormBlock()->fillData($this->data, $this->order->getEntityId()['products']);
+ }
+ $this->orderShipmentNew->getFormBlock()->submit();
+ $shipmentIds = $this->getShipmentIds();
}
- $this->orderShipmentNew->getFormBlock()->submit();
- return ['shipmentIds' => $this->getShipmentIds()];
+ return ['shipmentIds' => $shipmentIds];
}
/**
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/etc/testcase.xml b/dev/tests/functional/tests/app/Magento/Sales/Test/etc/testcase.xml
index c7c4a2276e4..28b7e3a69f6 100644
--- a/dev/tests/functional/tests/app/Magento/Sales/Test/etc/testcase.xml
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/etc/testcase.xml
@@ -36,7 +36,8 @@
-
+
+
diff --git a/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/BundlePriceAbstract.php b/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/BundlePriceAbstract.php
index ca219405c9c..e30916810b1 100644
--- a/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/BundlePriceAbstract.php
+++ b/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/BundlePriceAbstract.php
@@ -8,6 +8,7 @@
/**
* Abstract class for testing bundle prices
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
abstract class BundlePriceAbstract extends \PHPUnit\Framework\TestCase
{
@@ -34,6 +35,13 @@ protected function setUp()
$this->productRepository = $this->objectManager->create(\Magento\Catalog\Api\ProductRepositoryInterface::class);
$this->productCollectionFactory =
$this->objectManager->create(\Magento\Catalog\Model\ResourceModel\Product\CollectionFactory::class);
+
+ $scopeConfig = $this->objectManager->get(\Magento\Framework\App\Config\MutableScopeConfigInterface::class);
+ $scopeConfig->setValue(
+ \Magento\CatalogInventory\Model\Configuration::XML_PATH_SHOW_OUT_OF_STOCK,
+ true,
+ \Magento\Store\Model\ScopeInterface::SCOPE_STORE
+ );
}
/**
diff --git a/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/DynamicBundlePriceCalculatorTest.php b/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/DynamicBundlePriceCalculatorTest.php
index 75fbf827a3a..1775f09eb58 100644
--- a/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/DynamicBundlePriceCalculatorTest.php
+++ b/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/DynamicBundlePriceCalculatorTest.php
@@ -28,26 +28,24 @@ public function testPriceForDynamicBundle(array $strategyModifiers, array $expec
$priceInfo = $bundleProduct->getPriceInfo();
$priceCode = \Magento\Catalog\Pricing\Price\FinalPrice::PRICE_CODE;
- $priceInfoFromIndexer = $this->productCollectionFactory->create()
- ->addFieldToFilter('sku', 'bundle_product')
- ->addPriceData()
- ->load()
- ->getFirstItem();
-
$this->assertEquals(
$expectedResults['minimalPrice'],
$priceInfo->getPrice($priceCode)->getMinimalPrice()->getValue(),
'Failed to check minimal price on product'
);
-
$this->assertEquals(
$expectedResults['maximalPrice'],
$priceInfo->getPrice($priceCode)->getMaximalPrice()->getValue(),
'Failed to check maximal price on product'
);
- $this->assertEquals($expectedResults['minimalPrice'], $priceInfoFromIndexer->getMinimalPrice());
+ $priceInfoFromIndexer = $this->productCollectionFactory->create()
+ ->addFieldToFilter('sku', 'bundle_product')
+ ->addPriceData()
+ ->load()
+ ->getFirstItem();
+ $this->assertEquals($expectedResults['minimalPrice'], $priceInfoFromIndexer->getMinimalPrice());
$this->assertEquals($expectedResults['maximalPrice'], $priceInfoFromIndexer->getMaxPrice());
}
@@ -74,12 +72,20 @@ public function testPriceForDynamicBundleInWebsiteScope(array $strategyModifiers
$priceInfo->getPrice($priceCode)->getMinimalPrice()->getValue(),
'Failed to check minimal price on product'
);
-
$this->assertEquals(
$expectedResults['maximalPrice'],
$priceInfo->getPrice($priceCode)->getMaximalPrice()->getValue(),
'Failed to check maximal price on product'
);
+
+ $priceInfoFromIndexer = $this->productCollectionFactory->create()
+ ->addFieldToFilter('sku', 'bundle_product')
+ ->addPriceData()
+ ->load()
+ ->getFirstItem();
+
+ $this->assertEquals($expectedResults['minimalPrice'], $priceInfoFromIndexer->getMinimalPrice());
+ $this->assertEquals($expectedResults['maximalPrice'], $priceInfoFromIndexer->getMaxPrice());
}
/**
diff --git a/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/DynamicBundleWithSpecialPriceCalculatorTest.php b/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/DynamicBundleWithSpecialPriceCalculatorTest.php
index e95c9f6d1e2..8a76047cbe3 100644
--- a/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/DynamicBundleWithSpecialPriceCalculatorTest.php
+++ b/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/DynamicBundleWithSpecialPriceCalculatorTest.php
@@ -28,17 +28,11 @@ public function testPriceForDynamicBundle(array $strategyModifiers, array $expec
$priceInfo = $bundleProduct->getPriceInfo();
$priceCode = \Magento\Catalog\Pricing\Price\FinalPrice::PRICE_CODE;
- $priceInfoFromIndexer = $this->productCollectionFactory->create()
- ->addFieldToFilter('sku', 'bundle_product')
- ->addPriceData()
- ->load()
- ->getFirstItem();
$this->assertEquals(
$expectedResults['minimalPrice'],
$priceInfo->getPrice($priceCode)->getMinimalPrice()->getValue(),
'Failed to check minimal price on product'
);
-
$this->assertEquals(
$expectedResults['maximalPrice'],
$priceInfo->getPrice($priceCode)->getMaximalPrice()->getValue(),
@@ -63,9 +57,14 @@ public function testPriceForDynamicBundle(array $strategyModifiers, array $expec
);
}
- $this->assertEquals($expectedResults['indexerMinimalPrice'], $priceInfoFromIndexer->getMinimalPrice());
+ $priceInfoFromIndexer = $this->productCollectionFactory->create()
+ ->addFieldToFilter('sku', 'bundle_product')
+ ->addPriceData()
+ ->load()
+ ->getFirstItem();
- $this->assertEquals($expectedResults['indexerMaximumPrice'], $priceInfoFromIndexer->getMaxPrice());
+ $this->assertEquals($expectedResults['minimalPrice'], $priceInfoFromIndexer->getMinimalPrice());
+ $this->assertEquals($expectedResults['maximalPrice'], $priceInfoFromIndexer->getMaxPrice());
}
/**
@@ -83,8 +82,6 @@ public function getTestCases()
'minimalPrice' => 5,
// 0.5 * 10
'maximalPrice' => 5,
- 'indexerMinimalPrice' => 10,
- 'indexerMaximumPrice' => 10
]
],
@@ -95,8 +92,6 @@ public function getTestCases()
'minimalPrice' => 10,
// 0.5 * 2 * 10
'maximalPrice' => 10,
- 'indexerMinimalPrice' => 20,
- 'indexerMaximumPrice' => 20
]
],
@@ -111,8 +106,6 @@ public function getTestCases()
'minimalPrice' => 5,
// 0.5 * (1 * 10 + 3 * 30)
'maximalPrice' => 50,
- 'indexerMinimalPrice' => 10,
- 'indexerMaximumPrice' => 100
]
],
@@ -126,8 +119,6 @@ public function getTestCases()
'minimalPrice' => 4.95,
// 0.5 * ( 1 * 9.9 + 2.5 * 4)
'maximalPrice' => 9.95,
- 'indexerMinimalPrice' => 9.9,
- 'indexerMaximumPrice' => 19.9
]
],
@@ -142,8 +133,6 @@ public function getTestCases()
'regularMinimalPrice' => '10',
// 3 * 20 + (30 * 1 + 13 * 3)
'regularMaximalPrice' => '129',
- 'indexerMinimalPrice' => 7.5,
- 'indexerMaximumPrice' => 79
]
],
@@ -154,8 +143,6 @@ public function getTestCases()
'minimalPrice' => 4.95,
// 0.5 * max(4 * 2.5, 1 * 9.9)
'maximalPrice' => 5,
- 'indexerMinimalPrice' => 9.9,
- 'indexerMaximumPrice' => 10
]
],
];
diff --git a/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/DynamicBundleWithTierPriceCalculatorTest.php b/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/DynamicBundleWithTierPriceCalculatorTest.php
index cf15ee5602b..589a385c3df 100644
--- a/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/DynamicBundleWithTierPriceCalculatorTest.php
+++ b/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/DynamicBundleWithTierPriceCalculatorTest.php
@@ -39,26 +39,25 @@ public function testPriceForDynamicBundle(array $strategyModifiers, array $expec
$priceInfo = $bundleProduct->getPriceInfo();
$priceCode = \Magento\Catalog\Pricing\Price\FinalPrice::PRICE_CODE;
- $priceInfoFromIndexer = $this->productCollectionFactory->create()
- ->addFieldToFilter('sku', 'bundle_product')
- ->addPriceData()
- ->load()
- ->getFirstItem();
$this->assertEquals(
$expectedResults['minimalPrice'],
$priceInfo->getPrice($priceCode)->getMinimalPrice()->getValue(),
'Failed to check minimal price on product'
);
-
$this->assertEquals(
$expectedResults['maximalPrice'],
$priceInfo->getPrice($priceCode)->getMaximalPrice()->getValue(),
'Failed to check maximal price on product'
);
- $this->assertEquals($expectedResults['indexerMinimalPrice'], $priceInfoFromIndexer->getMinimalPrice());
+ $priceInfoFromIndexer = $this->productCollectionFactory->create()
+ ->addFieldToFilter('sku', 'bundle_product')
+ ->addPriceData()
+ ->load()
+ ->getFirstItem();
- $this->assertEquals($expectedResults['indexerMaximumPrice'], $priceInfoFromIndexer->getMaxPrice());
+ $this->assertEquals($expectedResults['minimalPrice'], $priceInfoFromIndexer->getMinimalPrice());
+ $this->assertEquals($expectedResults['maximalPrice'], $priceInfoFromIndexer->getMaxPrice());
}
/**
@@ -79,8 +78,6 @@ public function getTestCases()
'minimalPrice' => 5,
// 0.5 * 10
'maximalPrice' => 5,
- 'indexerMinimalPrice' => 0,
- 'indexerMaximumPrice' => 10
]
],
@@ -94,8 +91,6 @@ public function getTestCases()
'minimalPrice' => 10,
// 0.5 * 2 * 10
'maximalPrice' => 10,
- 'indexerMinimalPrice' => 0,
- 'indexerMaximumPrice' => 20
]
],
@@ -109,8 +104,6 @@ public function getTestCases()
'minimalPrice' => 5,
// 0.5 * (1 * 10 + 3 * 20)
'maximalPrice' => 35,
- 'indexerMinimalPrice' => 0,
- 'indexerMaximumPrice' => 70
]
],
@@ -124,8 +117,6 @@ public function getTestCases()
'minimalPrice' => 5,
// 0.5 * (1 * 10 + 3 * 20)
'maximalPrice' => 35,
- 'indexerMinimalPrice' => 0,
- 'indexerMaximumPrice' => 70
]
],
@@ -139,8 +130,6 @@ public function getTestCases()
'minimalPrice' => 5,
// 0.5 * 3 * 20
'maximalPrice' => 30,
- 'indexerMinimalPrice' => 0,
- 'indexerMaximumPrice' => 60
]
],
@@ -155,8 +144,6 @@ public function getTestCases()
'minimalPrice' => 10,
// 0.5 * (3 * 20 + 1 * 10 + 3 * 20)
'maximalPrice' => 65,
- 'indexerMinimalPrice' => 0,
- 'indexerMaximumPrice' => 130
]
],
@@ -170,8 +157,6 @@ public function getTestCases()
'minimalPrice' => 5,
// 0.5 * (3 * 20 + 1 * 10 + 3 * 20)
'maximalPrice' => 65,
- 'indexerMinimalPrice' => 0,
- 'indexerMaximumPrice' => 130
]
],
@@ -185,8 +170,6 @@ public function getTestCases()
'minimalPrice' => 5,
// 0.5 * (3 * 20 + 1 * 10 + 3 * 20)
'maximalPrice' => 65,
- 'indexerMinimalPrice' => 0,
- 'indexerMaximumPrice' => 130
]
],
@@ -200,8 +183,6 @@ public function getTestCases()
'minimalPrice' => 1.25,
// 0.5 * 3 * 20
'maximalPrice' => 30,
- 'indexerMinimalPrice' => 0,
- 'indexerMaximumPrice' => 60
]
],
];
diff --git a/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/FixedBundlePriceCalculatorTest.php b/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/FixedBundlePriceCalculatorTest.php
index 325f663c5e1..34dbb90e142 100644
--- a/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/FixedBundlePriceCalculatorTest.php
+++ b/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/FixedBundlePriceCalculatorTest.php
@@ -30,23 +30,25 @@ public function testPriceForFixedBundle(array $strategyModifiers, array $expecte
$priceInfo = $bundleProduct->getPriceInfo();
$priceCode = \Magento\Catalog\Pricing\Price\FinalPrice::PRICE_CODE;
- $priceInfoFromIndexer = $this->productCollectionFactory->create()
- ->addIdFilter([42])
- ->addPriceData()
- ->load()
- ->getFirstItem();
$this->assertEquals(
$expectedResults['minimalPrice'],
$priceInfo->getPrice($priceCode)->getMinimalPrice()->getValue(),
'Failed to check minimal price on product'
);
-
$this->assertEquals(
$expectedResults['maximalPrice'],
$priceInfo->getPrice($priceCode)->getMaximalPrice()->getValue(),
'Failed to check maximal price on product'
);
- $this->assertEquals($expectedResults['indexerMinimalPrice'], $priceInfoFromIndexer->getMinimalPrice());
+
+ $priceInfoFromIndexer = $this->productCollectionFactory->create()
+ ->addIdFilter([42])
+ ->addPriceData()
+ ->load()
+ ->getFirstItem();
+
+ $this->assertEquals($expectedResults['minimalPrice'], $priceInfoFromIndexer->getMinimalPrice());
+ $this->assertEquals($expectedResults['maximalPrice'], $priceInfoFromIndexer->getMaxPrice());
}
/**
@@ -67,23 +69,25 @@ public function testPriceForFixedBundleInWebsiteScope(array $strategyModifiers,
$priceInfo = $bundleProduct->getPriceInfo();
$priceCode = \Magento\Catalog\Pricing\Price\FinalPrice::PRICE_CODE;
- $priceInfoFromIndexer = $this->productCollectionFactory->create()
- ->addFieldToFilter('sku', 'bundle_product')
- ->addPriceData()
- ->load()
- ->getFirstItem();
$this->assertEquals(
$expectedResults['minimalPrice'],
$priceInfo->getPrice($priceCode)->getMinimalPrice()->getValue(),
'Failed to check minimal price on product'
);
-
$this->assertEquals(
$expectedResults['maximalPrice'],
$priceInfo->getPrice($priceCode)->getMaximalPrice()->getValue(),
'Failed to check maximal price on product'
);
- $this->assertEquals($expectedResults['indexerMinimalPrice'], $priceInfoFromIndexer->getMinimalPrice());
+
+ $priceInfoFromIndexer = $this->productCollectionFactory->create()
+ ->addFieldToFilter('sku', 'bundle_product')
+ ->addPriceData()
+ ->load()
+ ->getFirstItem();
+
+ $this->assertEquals($expectedResults['minimalPrice'], $priceInfoFromIndexer->getMinimalPrice());
+ $this->assertEquals($expectedResults['maximalPrice'], $priceInfoFromIndexer->getMaxPrice());
}
/**
@@ -101,7 +105,6 @@ public function getTestCases()
'minimalPrice' => 120,
// 110 + 10 (sum of simple price)
'maximalPrice' => 120,
- 'indexerMinimalPrice' => 120
]
],
@@ -112,7 +115,6 @@ public function getTestCases()
'minimalPrice' => 120,
// 110 + (3 * 10) + (2 * 10) + 10
'maximalPrice' => 170,
- 'indexerMinimalPrice' => 120
]
],
@@ -123,7 +125,6 @@ public function getTestCases()
'minimalPrice' => 120,
// 110 + 60
'maximalPrice' => 170,
- 'indexerMinimalPrice' => 120
]
],
@@ -134,7 +135,6 @@ public function getTestCases()
'minimalPrice' => 120,
// 110 + 30
'maximalPrice' => 140,
- 'indexerMinimalPrice' => 120
]
],
@@ -152,7 +152,6 @@ public function getTestCases()
// 110 + 1 * 20 + 100
'maximalPrice' => 230,
- 'indexerMinimalPrice' => 130
]
],
@@ -170,7 +169,6 @@ public function getTestCases()
// 110 + 110 * 0.2 + 110 * 1
'maximalPrice' => 242,
- 'indexerMinimalPrice' => 132
]
],
@@ -188,7 +186,6 @@ public function getTestCases()
// 110 + 1 * 20 + 110 * 1
'maximalPrice' => 240,
- 'indexerMinimalPrice' => 130
]
],
@@ -206,7 +203,6 @@ public function getTestCases()
// 110 + 110 * 0.2 + 100
'maximalPrice' => 232,
- 'indexerMinimalPrice' => 132
]
],
];
diff --git a/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/FixedBundleWithSpecialPriceCalculatorTest.php b/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/FixedBundleWithSpecialPriceCalculatorTest.php
index 1113b46b1cb..1fcc205ddc3 100644
--- a/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/FixedBundleWithSpecialPriceCalculatorTest.php
+++ b/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/FixedBundleWithSpecialPriceCalculatorTest.php
@@ -30,23 +30,25 @@ public function testPriceForFixedBundle(array $strategyModifiers, array $expecte
$priceInfo = $bundleProduct->getPriceInfo();
$priceCode = \Magento\Catalog\Pricing\Price\FinalPrice::PRICE_CODE;
- $priceInfoFromIndexer = $this->productCollectionFactory->create()
- ->addFieldToFilter('sku', 'bundle_product')
- ->addPriceData()
- ->load()
- ->getFirstItem();
$this->assertEquals(
$expectedResults['minimalPrice'],
$priceInfo->getPrice($priceCode)->getMinimalPrice()->getValue(),
'Failed to check minimal price on product'
);
-
$this->assertEquals(
$expectedResults['maximalPrice'],
$priceInfo->getPrice($priceCode)->getMaximalPrice()->getValue(),
'Failed to check maximal price on product'
);
- $this->assertEquals($expectedResults['indexerMinimalPrice'], $priceInfoFromIndexer->getMinimalPrice());
+
+ $priceInfoFromIndexer = $this->productCollectionFactory->create()
+ ->addFieldToFilter('sku', 'bundle_product')
+ ->addPriceData()
+ ->load()
+ ->getFirstItem();
+
+ $this->assertEquals($expectedResults['minimalPrice'], $priceInfoFromIndexer->getMinimalPrice());
+ $this->assertEquals($expectedResults['maximalPrice'], $priceInfoFromIndexer->getMaxPrice());
}
/**
@@ -68,7 +70,6 @@ public function getTestCases()
// 110 * 0.5
'maximalPrice' => 55,
- 'indexerMinimalPrice' => null
]
],
@@ -86,7 +87,6 @@ public function getTestCases()
// 0.5 * (110 + 1 * 20) + 100
'maximalPrice' => 165,
- 'indexerMinimalPrice' => 130
]
],
@@ -104,7 +104,6 @@ public function getTestCases()
// 0.5 * (110 + 110 * 0.2 + 110 * 1)
'maximalPrice' => 121,
- 'indexerMinimalPrice' => 132
]
],
@@ -122,7 +121,6 @@ public function getTestCases()
// 0.5 * (110 + 1 * 20 + 110 * 1)
'maximalPrice' => 120,
- 'indexerMinimalPrice' => 130
]
],
@@ -140,7 +138,6 @@ public function getTestCases()
// 0.5 * (110 + 110 * 0.2) + 100
'maximalPrice' => 166,
- 'indexerMinimalPrice' => 132
]
],
@@ -158,7 +155,6 @@ public function getTestCases()
// 0.5 * (110 + 2 * 20) + 100
'maximalPrice' => 175,
- 'indexerMinimalPrice' => 150
]
],
@@ -176,7 +172,6 @@ public function getTestCases()
// 0.5 * (110 + 2 * 110 * 0.2 + 1 * 110)
'maximalPrice' => 132,
- 'indexerMinimalPrice' => 154
]
],
@@ -194,7 +189,6 @@ public function getTestCases()
// 0.5 * (110 + 2 * 20 + 1 * 110)
'maximalPrice' => 130,
- 'indexerMinimalPrice' => 150
]
],
@@ -212,7 +206,6 @@ public function getTestCases()
// 0.5 * (110 + 2 * 0.2 * 110) + 100
'maximalPrice' => 177,
- 'indexerMinimalPrice' => 154
]
],
@@ -230,7 +223,6 @@ public function getTestCases()
// 0.5 * (110 + 3 * 10 + 1 * 40) + 100
'maximalPrice' => 190,
- 'indexerMinimalPrice' => 140
]
],
@@ -248,7 +240,6 @@ public function getTestCases()
// 0.5 * (110 + 3 * 110 * 0.1 + 1 * 110 * 0.4 + 110 * 1)
'maximalPrice' => 148.5,
- 'indexerMinimalPrice' => 143
]
],
@@ -266,7 +257,6 @@ public function getTestCases()
// 0.5 * (110 + 3 * 10 + 1 * 40 + 1 * 110)
'maximalPrice' => 145,
- 'indexerMinimalPrice' => 140
]
],
@@ -284,7 +274,6 @@ public function getTestCases()
// 0.5 * (110 + 3 * 110 * 0.1 + 1 * 110 * 0.4) + 100
'maximalPrice' => 193.5,
- 'indexerMinimalPrice' => 143
]
],
@@ -302,7 +291,6 @@ public function getTestCases()
// 0.5 * (110 + 1 * 40 + 3 * 15) + 100
'maximalPrice' => 197.5,
- 'indexerMinimalPrice' => 150
]
],
@@ -320,7 +308,6 @@ public function getTestCases()
// 0.5 * (110 + 1 * 110 * 0.4 + 3 * 110 * 0.15 + 110 * 1)
'maximalPrice' => 156.75,
- 'indexerMinimalPrice' => 154
]
],
@@ -338,7 +325,6 @@ public function getTestCases()
// 0.5 * (110 + 1 * 40 + 3 * 15 + 1 * 110)
'maximalPrice' => 152.5,
- 'indexerMinimalPrice' => 150
]
],
@@ -356,7 +342,6 @@ public function getTestCases()
// 0.5 * (110 + 1 * 110 * 0.4 + 3 * 110 * 0.15) + 100
'maximalPrice' => 201.75,
- 'indexerMinimalPrice' => 154
]
],
@@ -374,7 +359,6 @@ public function getTestCases()
// 0.5 * (110 + 3 * 15) + 100
'maximalPrice' => 177.5,
- 'indexerMinimalPrice' => 150
]
],
@@ -392,7 +376,6 @@ public function getTestCases()
// 0.5 * (110 + 3 * 110 * 0.15 + 1 * 110)
'maximalPrice' => 134.75,
- 'indexerMinimalPrice' => 154
]
],
@@ -410,7 +393,6 @@ public function getTestCases()
// 0.5 * (110 + 3 * 15 + 110 * 1)
'maximalPrice' => 132.5,
- 'indexerMinimalPrice' => 150
]
],
@@ -428,7 +410,6 @@ public function getTestCases()
// 0.5 * (110 + 3 * 110 * 0.15) + 100
'maximalPrice' => 179.75,
- 'indexerMinimalPrice' => 154
]
],
@@ -446,7 +427,6 @@ public function getTestCases()
// 0.5 * (110 + 3 * 15 + 1 * 20 + 3 * 10) + 100
'maximalPrice' => 202.5,
- 'indexerMinimalPrice' => 170
]
],
@@ -464,7 +444,6 @@ public function getTestCases()
// 0.5 * (110 + 3 * 110 * 0.15 + 1 * 110 * 0.2 + 3 * 110 * 0.1 + 110 * 1)
'maximalPrice' => 162.25,
- 'indexerMinimalPrice' => 176
]
],
@@ -482,7 +461,6 @@ public function getTestCases()
// 0.5 * (110 + 3 * 15 + 1 * 20 + 3 * 10 + 1 * 110)
'maximalPrice' => 157.5,
- 'indexerMinimalPrice' => 170,
]
],
@@ -500,7 +478,6 @@ public function getTestCases()
// 0.5 * (110 + 3 * 110 * 0.15 + 1 * 110 * 0.2 + 3 * 110 * 0.1) + 100
'maximalPrice' => 207.25,
- 'indexerMinimalPrice' => 176
]
],
];
diff --git a/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/FixedBundleWithTierPriceCalculatorTest.php b/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/FixedBundleWithTierPriceCalculatorTest.php
index 103304a86f2..3285b1e6450 100644
--- a/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/FixedBundleWithTierPriceCalculatorTest.php
+++ b/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/FixedBundleWithTierPriceCalculatorTest.php
@@ -41,23 +41,26 @@ public function testPriceForFixedBundle(array $strategyModifiers, array $expecte
/** @var \Magento\Framework\Pricing\PriceInfo\Base $priceInfo */
$priceInfo = $bundleProduct->getPriceInfo();
$priceCode = \Magento\Catalog\Pricing\Price\FinalPrice::PRICE_CODE;
- $priceInfoFromIndexer = $this->productCollectionFactory->create()
- ->addFieldToFilter('sku', 'bundle_product')
- ->addPriceData()
- ->load()
- ->getFirstItem();
+
$this->assertEquals(
$expectedResults['minimalPrice'],
$priceInfo->getPrice($priceCode)->getMinimalPrice()->getValue(),
'Failed to check minimal price on product'
);
-
$this->assertEquals(
$expectedResults['maximalPrice'],
$priceInfo->getPrice($priceCode)->getMaximalPrice()->getValue(),
'Failed to check maximal price on product'
);
- $this->assertEquals($expectedResults['indexerMinimalPrice'], $priceInfoFromIndexer->getMinimalPrice());
+
+ $priceInfoFromIndexer = $this->productCollectionFactory->create()
+ ->addFieldToFilter('sku', 'bundle_product')
+ ->addPriceData()
+ ->load()
+ ->getFirstItem();
+
+ $this->assertEquals($expectedResults['minimalPrice'], $priceInfoFromIndexer->getMinimalPrice());
+ $this->assertEquals($expectedResults['maximalPrice'], $priceInfoFromIndexer->getMaxPrice());
}
/**
@@ -79,7 +82,6 @@ public function getTestCases()
// 110 * 0.5
'maximalPrice' => 55,
- 'indexerMinimalPrice' => null
]
],
@@ -97,7 +99,6 @@ public function getTestCases()
// 0.5 * (110 + 1 * 20) + 100
'maximalPrice' => 165,
- 'indexerMinimalPrice' => 65
]
],
@@ -115,7 +116,6 @@ public function getTestCases()
// 0.5 * (110 + 110 * 0.2 + 110 * 1)
'maximalPrice' => 121,
- 'indexerMinimalPrice' => 66
]
],
@@ -133,7 +133,6 @@ public function getTestCases()
// 0.5 * (110 + 1 * 20 + 110 * 1)
'maximalPrice' => 120,
- 'indexerMinimalPrice' => 65
]
],
@@ -151,7 +150,6 @@ public function getTestCases()
// 0.5 * (110 + 110 * 0.2) + 100
'maximalPrice' => 166,
- 'indexerMinimalPrice' => 66
]
],
@@ -169,7 +167,6 @@ public function getTestCases()
// 0.5 * (110 + 2 * 20) + 100
'maximalPrice' => 175,
- 'indexerMinimalPrice' => 75,
]
],
@@ -187,7 +184,6 @@ public function getTestCases()
// 0.5 * (110 + 2 * 110 * 0.2 + 1 * 110)
'maximalPrice' => 132,
- 'indexerMinimalPrice' => 77
]
],
@@ -205,7 +201,6 @@ public function getTestCases()
// 0.5 * (110 + 2 * 20 + 1 * 110)
'maximalPrice' => 130,
- 'indexerMinimalPrice' => 75
]
],
@@ -224,7 +219,6 @@ public function getTestCases()
// 0.5 * (110 + 2 * 0.2 * 110) + 100
'maximalPrice' => 177,
- 'indexerMinimalPrice' => 77
]
],
@@ -242,7 +236,6 @@ public function getTestCases()
// 0.5 * (110 + 3 * 10 + 1 * 40) + 100
'maximalPrice' => 190,
- 'indexerMinimalPrice' => 70
]
],
@@ -260,7 +253,6 @@ public function getTestCases()
// 0.5 * (110 + 3 * 110 * 0.1 + 1 * 110 * 0.4 + 110 * 1)
'maximalPrice' => 148.5,
- 'indexerMinimalPrice' => 71.5
]
],
@@ -278,7 +270,6 @@ public function getTestCases()
// 0.5 * (110 + 3 * 10 + 1 * 40 + 1 * 110)
'maximalPrice' => 145,
- 'indexerMinimalPrice' => 70
]
],
@@ -296,7 +287,6 @@ public function getTestCases()
// 0.5 * (110 + 3 * 110 * 0.1 + 1 * 110 * 0.4) + 100
'maximalPrice' => 193.5,
- 'indexerMinimalPrice' => 71.5
]
],
@@ -314,7 +304,6 @@ public function getTestCases()
// 0.5 * (110 + 1 * 40 + 3 * 15) + 100
'maximalPrice' => 197.5,
- 'indexerMinimalPrice' => 75
]
],
@@ -332,7 +321,6 @@ public function getTestCases()
// 0.5 * (110 + 1 * 110 * 0.4 + 3 * 110 * 0.15 + 110 * 1)
'maximalPrice' => 156.75,
- 'indexerMinimalPrice' => 77
]
],
@@ -350,7 +338,6 @@ public function getTestCases()
// 0.5 * (110 + 1 * 40 + 3 * 15 + 1 * 110)
'maximalPrice' => 152.5,
- 'indexerMinimalPrice' => 75
]
],
@@ -368,7 +355,6 @@ public function getTestCases()
// 0.5 * (110 + 1 * 110 * 0.4 + 3 * 110 * 0.15) + 100
'maximalPrice' => 201.75,
- 'indexerMinimalPrice' => 77
]
],
@@ -386,7 +372,6 @@ public function getTestCases()
// 0.5 * (110 + 3 * 15) + 100
'maximalPrice' => 177.5,
- 'indexerMinimalPrice' => 75
]
],
@@ -404,7 +389,6 @@ public function getTestCases()
// 0.5 * (110 + 3 * 110 * 0.15 + 1 * 110)
'maximalPrice' => 134.75,
- 'indexerMinimalPrice' => 77
]
],
@@ -422,7 +406,6 @@ public function getTestCases()
// 0.5 * (110 + 3 * 15 + 110 * 1)
'maximalPrice' => 132.5,
- 'indexerMinimalPrice' => 75
]
],
@@ -440,7 +423,6 @@ public function getTestCases()
// 0.5 * (110 + 3 * 110 * 0.15) + 100
'maximalPrice' => 179.75,
- 'indexerMinimalPrice' => 77
]
],
@@ -458,7 +440,6 @@ public function getTestCases()
// 0.5 * (110 + 3 * 15 + 1 * 20 + 3 * 10) + 100
'maximalPrice' => 202.5,
- 'indexerMinimalPrice' => 85
]
],
@@ -476,7 +457,6 @@ public function getTestCases()
// 0.5 * (110 + 3 * 110 * 0.15 + 1 * 110 * 0.2 + 3 * 110 * 0.1 + 110 * 1)
'maximalPrice' => 162.25,
- 'indexerMinimalPrice' => 88
]
],
@@ -494,7 +474,6 @@ public function getTestCases()
// 0.5 * (110 + 3 * 15 + 1 * 20 + 3 * 10 + 1 * 110)
'maximalPrice' => 157.5,
- 'indexerMinimalPrice' => 85
]
],
@@ -512,7 +491,6 @@ public function getTestCases()
// 0.5 * (110 + 3 * 110 * 0.15 + 1 * 110 * 0.2 + 3 * 110 * 0.1) + 100
'maximalPrice' => 207.25,
- 'indexerMinimalPrice' => 88
]
],
];
diff --git a/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/SaveHandlerTest.php b/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/SaveHandlerTest.php
new file mode 100644
index 00000000000..381675d01ae
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/SaveHandlerTest.php
@@ -0,0 +1,89 @@
+objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+ $this->store = $this->objectManager->create(\Magento\Store\Model\Store::class);
+ /** @var ProductRepositoryInterface $productRepository */
+ $this->productRepository = $this->objectManager->create(ProductRepositoryInterface::class);
+ }
+
+ /**
+ * @return void
+ */
+ public function testOptionTitlesOnDifferentStores(): void
+ {
+ /**
+ * @var \Magento\Bundle\Model\Product\OptionList $optionList
+ */
+ $optionList = $this->objectManager->create(\Magento\Bundle\Model\Product\OptionList::class);
+
+ $secondStoreId = $this->store->load('fixture_second_store')->getId();
+ $thirdStoreId = $this->store->load('fixture_third_store')->getId();
+
+ $product = $this->productRepository->get('bundle-product', true, $secondStoreId, true);
+ $options = $optionList->getItems($product);
+ $title = $options[0]->getTitle();
+ $newTitle = $title . ' ' . $this->store->load('fixture_second_store')->getCode();
+ $options[0]->setTitle($newTitle);
+ $extension = $product->getExtensionAttributes();
+ $extension->setBundleProductOptions($options);
+ $product->setExtensionAttributes($extension);
+ $product->save();
+
+ $product = $this->productRepository->get('bundle-product', true, $thirdStoreId, true);
+ $options = $optionList->getItems($product);
+ $newTitle = $title . ' ' . $this->store->load('fixture_third_store')->getCode();
+ $options[0]->setTitle($newTitle);
+ $extension = $product->getExtensionAttributes();
+ $extension->setBundleProductOptions($options);
+ $product->setExtensionAttributes($extension);
+ $product->save();
+
+ $product = $this->productRepository->get('bundle-product', false, $secondStoreId, true);
+ $options = $optionList->getItems($product);
+ $this->assertEquals(1, count($options));
+ $this->assertEquals(
+ $title . ' ' . $this->store->load('fixture_second_store')->getCode(),
+ $options[0]->getTitle()
+ );
+ }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Bundle/_files/quote_with_bundle_and_options.php b/dev/tests/integration/testsuite/Magento/Bundle/_files/quote_with_bundle_and_options.php
new file mode 100644
index 00000000000..03949115ea6
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Bundle/_files/quote_with_bundle_and_options.php
@@ -0,0 +1,54 @@
+create(\Magento\Catalog\Model\Product::class);
+$product->load(3);
+
+/** @var $typeInstance \Magento\Bundle\Model\Product\Type */
+$typeInstance = $product->getTypeInstance();
+$typeInstance->setStoreFilter($product->getStoreId(), $product);
+$optionCollection = $typeInstance->getOptionsCollection($product);
+
+$bundleOptions = [];
+$bundleOptionsQty = [];
+foreach ($optionCollection as $option) {
+ /** @var $option \Magento\Bundle\Model\Option */
+ $selectionsCollection = $typeInstance->getSelectionsCollection([$option->getId()], $product);
+ if ($option->isMultiSelection()) {
+ $bundleOptions[$option->getId()] = array_column($selectionsCollection->toArray(), 'selection_id');
+ } else {
+ $bundleOptions[$option->getId()] = $selectionsCollection->getFirstItem()->getSelectionId();
+ }
+ $bundleOptionsQty[$option->getId()] = 1;
+}
+
+$requestInfo = new \Magento\Framework\DataObject(
+ [
+ 'product' => $product->getId(),
+ 'bundle_option' => $bundleOptions,
+ 'bundle_option_qty' => $bundleOptionsQty,
+ 'qty' => 1,
+ ]
+);
+
+/** @var $cart \Magento\Checkout\Model\Cart */
+$cart = Bootstrap::getObjectManager()->create(\Magento\Checkout\Model\Cart::class);
+$cart->addProduct($product, $requestInfo);
+$cart->getQuote()->setReservedOrderId('test_cart_with_bundle_and_options');
+$cart->save();
+
+/** @var $objectManager \Magento\TestFramework\ObjectManager */
+$objectManager = Bootstrap::getObjectManager();
+$objectManager->removeSharedInstance(\Magento\Checkout\Model\Session::class);
diff --git a/dev/tests/integration/testsuite/Magento/Bundle/_files/quote_with_bundle_and_options_rollback.php b/dev/tests/integration/testsuite/Magento/Bundle/_files/quote_with_bundle_and_options_rollback.php
new file mode 100644
index 00000000000..d32d6fab333
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Bundle/_files/quote_with_bundle_and_options_rollback.php
@@ -0,0 +1,28 @@
+get(\Magento\Framework\Registry::class);
+
+$registry->unregister('isSecureArea');
+$registry->register('isSecureArea', true);
+
+/** @var $objectManager \Magento\TestFramework\ObjectManager */
+$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+$quote = $objectManager->create(\Magento\Quote\Model\Quote::class);
+$quote->load('test_cart_with_bundle_and_options', 'reserved_order_id');
+$quote->delete();
+
+/** @var \Magento\Quote\Model\QuoteIdMask $quoteIdMask */
+$quoteIdMask = $objectManager->create(\Magento\Quote\Model\QuoteIdMask::class);
+$quoteIdMask->delete($quote->getId());
+
+require __DIR__ . 'product_with_multiple_options_rollback.php';
+
+$registry->unregister('isSecureArea');
+$registry->register('isSecureArea', false);
diff --git a/dev/tests/integration/testsuite/Magento/BundleImportExport/Model/Export/RowCustomizerTest.php b/dev/tests/integration/testsuite/Magento/BundleImportExport/Model/Export/RowCustomizerTest.php
index 6f81421c902..53e8281ffbd 100644
--- a/dev/tests/integration/testsuite/Magento/BundleImportExport/Model/Export/RowCustomizerTest.php
+++ b/dev/tests/integration/testsuite/Magento/BundleImportExport/Model/Export/RowCustomizerTest.php
@@ -20,6 +20,9 @@ class RowCustomizerTest extends \PHPUnit\Framework\TestCase
*/
private $objectManager;
+ /**
+ * @inheritdoc
+ */
protected function setUp()
{
$this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
@@ -30,8 +33,10 @@ protected function setUp()
/**
* @magentoDataFixture Magento/Bundle/_files/product.php
+ *
+ * @return void
*/
- public function testPrepareData()
+ public function testPrepareData(): void
{
$parsedAdditionalAttributes = 'text_attribute=!@#$%^&*()_+1234567890-=|\\:;"\'<,>.?/'
. ',text_attribute2=,';
@@ -56,4 +61,56 @@ public function testPrepareData()
$this->assertEquals([], $this->model->addData([], $ids['simple']));
$this->assertEquals($parsedAdditionalAttributes, $result['additional_attributes']);
}
+
+ /**
+ * @magentoDataFixture Magento/Store/_files/second_store.php
+ * @magentoDataFixture Magento/Bundle/_files/product.php
+ * @magentoDbIsolation disabled
+ *
+ * @return void
+ */
+ public function testPrepareDataWithDifferentStoreValues(): void
+ {
+ $storeCode = 'default';
+ $expectedNames = [
+ 'name' => 'Bundle Product Items',
+ 'name_' . $storeCode => 'Bundle Product Items_' . $storeCode,
+ ];
+ $parsedAdditionalAttributes = 'text_attribute=!@#$%^&*()_+1234567890-=|\\:;"\'<,>.?/'
+ . ',text_attribute2=,';
+ $allAdditionalAttributes = $parsedAdditionalAttributes . ',weight_type=0,price_type=1';
+ $collection = $this->objectManager->get(\Magento\Catalog\Model\ResourceModel\Product\Collection::class);
+ /** @var \Magento\Store\Model\Store $store */
+ $store = $this->objectManager->create(\Magento\Store\Model\Store::class);
+ $store->load($storeCode, 'code');
+ /** @var \Magento\Catalog\Api\ProductRepositoryInterface $productRepository */
+ $productRepository = $this->objectManager->get(\Magento\Catalog\Api\ProductRepositoryInterface::class);
+ $product = $productRepository->get('bundle-product', 1, $store->getId());
+
+ $extension = $product->getExtensionAttributes();
+ $options = $extension->getBundleProductOptions();
+
+ foreach ($options as $productOption) {
+ $productOption->setTitle($productOption->getTitle() . '_' . $store->getCode());
+ }
+ $extension->setBundleProductOptions($options);
+ $product->setExtensionAttributes($extension);
+ $productRepository->save($product);
+ $this->model->prepareData($collection, [$product->getId()]);
+ $result = $this->model->addData(['additional_attributes' => $allAdditionalAttributes], $product->getId());
+ $bundleValues = array_map(
+ function ($input) {
+ $data = explode('=', $input);
+
+ return [$data[0] => $data[1]];
+ },
+ explode(',', $result['bundle_values'])
+ );
+ $actualNames = [
+ 'name' => array_column($bundleValues, 'name')[0],
+ 'name' . '_' . $store->getCode() => array_column($bundleValues, 'name' . '_' . $store->getCode())[0],
+ ];
+
+ self::assertSame($expectedNames, $actualNames);
+ }
}
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/AttributeTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/AttributeTest.php
index fdc85941b32..4261873cc8e 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/AttributeTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/AttributeTest.php
@@ -5,6 +5,8 @@
*/
namespace Magento\Catalog\Controller\Adminhtml\Product;
+use Magento\Framework\Exception\LocalizedException;
+
/**
* @magentoAppArea adminhtml
* @magentoDbIsolation enabled
@@ -224,6 +226,109 @@ public function testSaveActionCleanAttributeLabelCache()
$this->assertEquals('new string translation', $this->_translate('string to translate'));
}
+ /**
+ * Get attribute data preset.
+ *
+ * @return array
+ */
+ private function getLargeOptionsSetAttributeData()
+ {
+ return [
+ 'frontend_label' => [
+ 0 => 'testdrop1',
+ 1 => '',
+ 2 => '',
+ ],
+ 'frontend_input' => 'select',
+ 'is_required' => '0',
+ 'update_product_preview_image' => '0',
+ 'use_product_image_for_swatch' => '0',
+ 'visual_swatch_validation' => '',
+ 'visual_swatch_validation_unique' => '',
+ 'text_swatch_validation' => '',
+ 'text_swatch_validation_unique' => '',
+ 'attribute_code' => 'test_many_options',
+ 'is_global' => '0',
+ 'default_value_text' => '',
+ 'default_value_yesno' => '0',
+ 'default_value_date' => '',
+ 'default_value_textarea' => '',
+ 'is_unique' => '0',
+ 'is_used_in_grid' => '1',
+ 'is_visible_in_grid' => '1',
+ 'is_filterable_in_grid' => '1',
+ 'is_searchable' => '0',
+ 'is_comparable' => '0',
+ 'is_filterable' => '0',
+ 'is_filterable_in_search' => '0',
+ 'is_used_for_promo_rules' => '0',
+ 'is_html_allowed_on_front' => '1',
+ 'is_visible_on_front' => '0',
+ 'used_in_product_listing' => '0',
+ 'used_for_sort_by' => '0',
+ 'swatch_input_type' => 'dropdown',
+ ];
+ }
+
+ /**
+ * Test attribute saving with large amount of options exceeding maximum allowed by max_input_vars limit.
+ * @return void
+ */
+ public function testLargeOptionsDataSet()
+ {
+ $maxInputVars = ini_get('max_input_vars');
+ // Each option is at least 4 variables array (order, admin value, first store view value, delete flag).
+ // Set options count to exceed max_input_vars by 100 options (400 variables).
+ $optionsCount = floor($maxInputVars / 4) + 100;
+ $attributeData = $this->getLargeOptionsSetAttributeData();
+ $optionsData = [];
+ $expectedOptionsLabels = [];
+ for ($i = 0; $i < $optionsCount; $i++) {
+ $order = $i + 1;
+ $expectedOptionLabelOnStoreView = "value_{$i}_store_1";
+ $expectedOptionsLabels[$i+1] = $expectedOptionLabelOnStoreView;
+ $optionsData []= "option[order][option_{$i}]={$order}";
+ $optionsData []= "option[value][option_{$i}][0]=value_{$i}_admin";
+ $optionsData []= "option[value][option_{$i}][1]={$expectedOptionLabelOnStoreView}";
+ $optionsData []= "option[delete][option_{$i}=";
+ }
+ $attributeData['serialized_options'] = json_encode($optionsData);
+ $this->getRequest()->setPostValue($attributeData);
+ $this->dispatch('backend/catalog/product_attribute/save');
+ $entityTypeId = $this->_objectManager->create(
+ \Magento\Eav\Model\Entity::class
+ )->setType(
+ \Magento\Catalog\Model\Product::ENTITY
+ )->getTypeId();
+
+ /** @var $attribute \Magento\Catalog\Model\ResourceModel\Eav\Attribute */
+ $attribute = $this->_objectManager->create(
+ \Magento\Catalog\Model\ResourceModel\Eav\Attribute::class
+ )->setEntityTypeId(
+ $entityTypeId
+ );
+ try {
+ $attribute->loadByCode($entityTypeId, 'test_many_options');
+ $options = $attribute->getOptions();
+ // assert that all options are saved without truncation
+ $this->assertEquals(
+ $optionsCount + 1,
+ count($options),
+ 'Expected options count does not match (regarding first empty option for non-required attribute)'
+ );
+
+ foreach ($expectedOptionsLabels as $optionOrderNum => $label) {
+ $this->assertEquals(
+ $label,
+ $options[$optionOrderNum]->getLabel(),
+ "Label for option #{$optionOrderNum} does not match expected."
+ );
+ }
+ } catch (LocalizedException $e) {
+ $this->fail('Test failed with exception on attribute model load: ' . $e);
+ }
+ }
+
/**
* Return translation for a string literal belonging to backend area
*
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Category/ProductTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Category/ProductTest.php
index 6efd2638c0d..dab47c818ec 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Category/ProductTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Category/ProductTest.php
@@ -27,6 +27,11 @@ class ProductTest extends \PHPUnit\Framework\TestCase
*/
protected $productResource;
+ /**
+ * @var \Magento\Catalog\Api\CategoryRepositoryInterface
+ */
+ private $categoryRepository;
+
protected function setUp()
{
/** @var \Magento\Framework\Indexer\IndexerInterface indexer */
@@ -39,6 +44,10 @@ protected function setUp()
$this->productResource = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
\Magento\Catalog\Model\ResourceModel\Product::class
);
+
+ $this->categoryRepository = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
+ \Magento\Catalog\Api\CategoryRepositoryInterface::class
+ );
}
/**
@@ -200,6 +209,25 @@ public function testCategoryCreate()
}
}
+ /**
+ * @magentoAppArea adminhtml
+ * @depends testReindexAll
+ */
+ public function testCatalogCategoryProductIndexInvalidateAfterDelete()
+ {
+ $indexerShouldBeValid = (bool)$this->indexer->isInvalid();
+
+ $categories = $this->getCategories(1);
+ $this->categoryRepository->delete(array_pop($categories));
+
+ $state = $this->indexer->getState();
+ $state->loadByIndexer($this->indexer->getId());
+ $status = $state->getStatus();
+
+ $this->assertFalse($indexerShouldBeValid);
+ $this->assertEquals(\Magento\Framework\Indexer\StateInterface::STATUS_INVALID, $status);
+ }
+
/**
* @param int $count
* @return Category[]
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductPriceTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductPriceTest.php
index b867b403f34..594133e984a 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductPriceTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductPriceTest.php
@@ -3,6 +3,11 @@
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
+namespace Magento\Catalog\Model;
+
+use Magento\TestFramework\Helper\Bootstrap;
+use Magento\Catalog\Api\ProductRepositoryInterface;
+use Magento\Catalog\Model\ResourceModel\Product\Collection;
/**
* Tests product model:
@@ -11,8 +16,6 @@
* @see \Magento\Catalog\Model\ProductTest
* @see \Magento\Catalog\Model\ProductExternalTest
*/
-namespace Magento\Catalog\Model;
-
class ProductPriceTest extends \PHPUnit\Framework\TestCase
{
/**
@@ -22,9 +25,7 @@ class ProductPriceTest extends \PHPUnit\Framework\TestCase
protected function setUp()
{
- $this->_model = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
- \Magento\Catalog\Model\Product::class
- );
+ $this->_model = Bootstrap::getObjectManager()->create(Product::class);
}
public function testGetPrice()
@@ -72,4 +73,22 @@ public function testSetGetFinalPrice()
$this->_model->setFinalPrice(10);
$this->assertEquals(10, $this->_model->getFinalPrice());
}
+
+ /**
+ * @magentoDbIsolation disabled
+ * @magentoDataFixture Magento/Catalog/_files/product_with_options.php
+ * @return void
+ */
+ public function testGetMinPrice(): void
+ {
+ $productRepository = Bootstrap::getObjectManager()->create(ProductRepositoryInterface::class);
+ $product = $productRepository->get('simple');
+ $collection = Bootstrap::getObjectManager()->create(Collection::class);
+ $collection->addIdFilter($product->getId());
+ $collection->addPriceData();
+ $collection->load();
+ /** @var \Magento\Catalog\Model\Product $product */
+ $product = $collection->getFirstItem();
+ $this->assertEquals(333, $product->getData('min_price'));
+ }
}
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/CategoriesTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/CategoriesTest.php
index fd0f6e98840..22bb76ca922 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/CategoriesTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/CategoriesTest.php
@@ -6,6 +6,7 @@
namespace Magento\Catalog\Ui\DataProvider\Product\Form\Modifier;
+use Magento\Catalog\Model\Product;
use Magento\TestFramework\Helper\CacheCleaner;
/**
@@ -29,6 +30,8 @@ protected function setUp()
$store = $objectManager->create(\Magento\Store\Model\Store::class);
$store->load('admin');
$registry->register('current_store', $store);
+ $product = $objectManager->create(Product::class);
+ $registry->register('current_product', $product);
$this->object = $objectManager->create(Categories::class);
}
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/product_with_options.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_with_options.php
index 9b8a629d24c..a6e01370dfe 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/_files/product_with_options.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_with_options.php
@@ -11,6 +11,8 @@
$product->setTypeId(
'simple'
+)->setId(
+ 1
)->setAttributeSetId(
4
)->setWebsiteIds(
diff --git a/dev/tests/integration/testsuite/Magento/CatalogSearch/Model/Indexer/Fulltext/Model/Plugin/CategoryTest.php b/dev/tests/integration/testsuite/Magento/CatalogSearch/Model/Indexer/Fulltext/Model/Plugin/CategoryTest.php
new file mode 100644
index 00000000000..ec2a14abafc
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/CatalogSearch/Model/Indexer/Fulltext/Model/Plugin/CategoryTest.php
@@ -0,0 +1,69 @@
+indexerProcessor = Bootstrap::getObjectManager()->create(Processor::class);
+ $this->categoryRepository = Bootstrap::getObjectManager()->create(CategoryRepositoryInterface::class);
+ }
+
+ /**
+ * @magentoDataFixture Magento/Catalog/_files/indexer_catalog_category.php
+ * @magentoAppArea adminhtml
+ */
+ public function testIndexerInvalidatedAfterCategoryDelete()
+ {
+ $this->indexerProcessor->reindexAll();
+ $isIndexerValid = (bool)$this->indexerProcessor->getIndexer()->isValid();
+
+ $category = $this->getCategories(1);
+ $this->categoryRepository->delete(array_pop($category));
+
+ $state = $this->indexerProcessor->getIndexer()->getState();
+ $state->loadByIndexer($this->indexerProcessor->getIndexerId());
+ $status = $state->getStatus();
+
+ $this->assertTrue($isIndexerValid);
+ $this->assertEquals(\Magento\Framework\Indexer\StateInterface::STATUS_INVALID, $status);
+ }
+
+ /**
+ * @param int $count
+ * @return Category[]
+ */
+ private function getCategories($count)
+ {
+ /** @var Category $category */
+ $category = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
+ \Magento\Catalog\Model\Category::class
+ );
+
+ $result = $category->getCollection()->addAttributeToSelect('name')->getItems();
+ $result = array_slice($result, 2);
+
+ return array_slice($result, 0, $count);
+ }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Customer/_files/import_export/customers_for_address_import.php b/dev/tests/integration/testsuite/Magento/Customer/_files/import_export/customers_for_address_import.php
index 80b3613378d..9a90061a6de 100644
--- a/dev/tests/integration/testsuite/Magento/Customer/_files/import_export/customers_for_address_import.php
+++ b/dev/tests/integration/testsuite/Magento/Customer/_files/import_export/customers_for_address_import.php
@@ -4,6 +4,7 @@
* See COPYING.txt for license details.
*/
//Create customer
+/** @var Magento\Customer\Model\Customer $customer */
$customer = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
\Magento\Customer\Model\Customer::class
);
@@ -75,5 +76,4 @@
$addressSecond->isObjectNew(true);
$customer->addAddress($addressSecond);
$customer->setDefaultShipping($addressSecond->getId());
-$customer->isObjectNew(true);
$customer->save();
diff --git a/dev/tests/integration/testsuite/Magento/CustomerImportExport/Model/Import/AddressTest.php b/dev/tests/integration/testsuite/Magento/CustomerImportExport/Model/Import/AddressTest.php
index 0915506f061..96b7f8ce8ed 100644
--- a/dev/tests/integration/testsuite/Magento/CustomerImportExport/Model/Import/AddressTest.php
+++ b/dev/tests/integration/testsuite/Magento/CustomerImportExport/Model/Import/AddressTest.php
@@ -132,15 +132,6 @@ public function testConstruct()
);
$this->assertAttributeNotEmpty('_attributes', $this->_entityAdapter, 'Attributes must not be empty');
- // check addresses
- $this->assertAttributeInternalType(
- 'array',
- '_addresses',
- $this->_entityAdapter,
- 'Addresses must be an array.'
- );
- $this->assertAttributeNotEmpty('_addresses', $this->_entityAdapter, 'Addresses must not be empty');
-
// check country regions and regions
$this->assertAttributeInternalType(
'array',
@@ -154,62 +145,6 @@ public function testConstruct()
$this->assertAttributeNotEmpty('_regions', $this->_entityAdapter, 'Regions must not be empty');
}
- /**
- * Test _initAddresses
- *
- * @magentoDataFixture Magento/Customer/_files/import_export/customer_with_addresses.php
- */
- public function testInitAddresses()
- {
- /** @var $objectManager \Magento\TestFramework\ObjectManager */
- $objectManager = Bootstrap::getObjectManager();
-
- // get addressed from fixture
- $customers = $objectManager->get(\Magento\Framework\Registry::class)->registry($this->_fixtureKey);
- $correctAddresses = [];
- /** @var $customer \Magento\Customer\Model\Customer */
- foreach ($customers as $customer) {
- $correctAddresses[$customer->getId()] = [];
- /** @var $address \Magento\Customer\Model\Address */
- foreach ($customer->getAddressesCollection() as $address) {
- $correctAddresses[$customer->getId()][] = $address->getId();
- }
- }
-
- // invoke _initAddresses
- $initAddresses = new \ReflectionMethod($this->_testClassName, '_initAddresses');
- $initAddresses->setAccessible(true);
- $initAddresses->invoke($this->_entityAdapter);
-
- // check addresses
- $this->assertAttributeInternalType(
- 'array',
- '_addresses',
- $this->_entityAdapter,
- 'Addresses must be an array.'
- );
- $this->assertAttributeNotEmpty('_addresses', $this->_entityAdapter, 'Addresses must not be empty');
-
- $addressesReflection = new \ReflectionProperty($this->_testClassName, '_addresses');
- $addressesReflection->setAccessible(true);
- $testAddresses = $addressesReflection->getValue($this->_entityAdapter);
-
- $correctCustomerIds = array_keys($correctAddresses);
- $testCustomerIds = array_keys($testAddresses);
- sort($correctCustomerIds);
- sort($testCustomerIds);
- $this->assertEquals($correctCustomerIds, $testCustomerIds, 'Incorrect customer IDs in addresses array.');
-
- foreach ($correctCustomerIds as $customerId) {
- $this->assertInternalType('array', $correctAddresses[$customerId], 'Addresses must be an array.');
- $correctAddressIds = $correctAddresses[$customerId];
- $testAddressIds = $testAddresses[$customerId];
- sort($correctAddressIds);
- sort($testAddressIds);
- $this->assertEquals($correctAddressIds, $testAddressIds, 'Incorrect addresses IDs.');
- }
- }
-
/**
* Test _saveAddressEntity
*
diff --git a/dev/tests/integration/testsuite/Magento/CustomerImportExport/_files/two_addresses_rollback.php b/dev/tests/integration/testsuite/Magento/CustomerImportExport/_files/two_addresses_rollback.php
index 510ad2e360b..6e371a102d4 100644
--- a/dev/tests/integration/testsuite/Magento/CustomerImportExport/_files/two_addresses_rollback.php
+++ b/dev/tests/integration/testsuite/Magento/CustomerImportExport/_files/two_addresses_rollback.php
@@ -17,29 +17,6 @@
/** @var Registry $registry */
$registry = Bootstrap::getObjectManager()->get(Registry::class);
-//Removing addresses
-$registry->unregister('isSecureArea');
-$registry->register('isSecureArea', true);
-/** @var Address $customerAddress */
-$customerAddress = Bootstrap::getObjectManager()->create(Address::class);
-$customerAddress->load(1);
-if ($customerAddress->getId()) {
- $customerAddress->delete();
-}
-$registry->unregister('isSecureArea');
-$registry->register('isSecureArea', false);
-//Second address
-$registry->unregister('isSecureArea');
-$registry->register('isSecureArea', true);
-/** @var Address $customerAddress */
-$customerAddress = Bootstrap::getObjectManager()->create(Address::class);
-$customerAddress->load(2);
-if ($customerAddress->getId()) {
- $customerAddress->delete();
-}
-$registry->unregister('isSecureArea');
-$registry->register('isSecureArea', false);
-
//Removing customers.
$registry->unregister('isSecureArea');
$registry->register('isSecureArea', true);
diff --git a/dev/tests/integration/testsuite/Magento/Elasticsearch/Model/Client/ElasticsearchTest.php b/dev/tests/integration/testsuite/Magento/Elasticsearch/Model/Client/ElasticsearchTest.php
index 0731871b4bd..61add5f7d0e 100644
--- a/dev/tests/integration/testsuite/Magento/Elasticsearch/Model/Client/ElasticsearchTest.php
+++ b/dev/tests/integration/testsuite/Magento/Elasticsearch/Model/Client/ElasticsearchTest.php
@@ -100,7 +100,7 @@ private function search($text)
*/
public function testSearchConfigurableProductBySimpleProductName()
{
- $this->assertProductWithSkuFound('configurable', $this->search('Configurable OptionOption'));
+ $this->assertProductWithSkuFound('configurable', $this->search('Configurable Option'));
}
/**
diff --git a/dev/tests/integration/testsuite/Magento/Elasticsearch/Model/Indexer/IndexHandlerTest.php b/dev/tests/integration/testsuite/Magento/Elasticsearch/Model/Indexer/IndexHandlerTest.php
index 4cdff533af7..014aaf7679b 100755
--- a/dev/tests/integration/testsuite/Magento/Elasticsearch/Model/Indexer/IndexHandlerTest.php
+++ b/dev/tests/integration/testsuite/Magento/Elasticsearch/Model/Indexer/IndexHandlerTest.php
@@ -5,13 +5,18 @@
*/
namespace Magento\Elasticsearch\Model\Indexer;
-use Magento\Catalog\Model\Product;
+use Magento\Catalog\Model\Product\Action as ProductAction;
+use Magento\Catalog\Api\ProductRepositoryInterface;
+use Magento\CatalogInventory\Api\StockRegistryInterface;
+use Magento\CatalogInventory\Api\StockItemRepositoryInterface;
+use Magento\CatalogSearch\Model\Indexer\Fulltext as CatalogSearchFulltextIndexer;
use Magento\TestFramework\Helper\Bootstrap;
use Magento\Store\Model\StoreManagerInterface;
use Magento\Elasticsearch\SearchAdapter\ConnectionManager;
use Magento\Elasticsearch\Model\Client\Elasticsearch as ElasticsearchClient;
use Magento\Elasticsearch\Model\Config;
use Magento\Elasticsearch\SearchAdapter\SearchIndexNameResolver;
+use Magento\Indexer\Model\Indexer;
/**
* Important: Please make sure that each integration test file works with unique elastic search index. In order to
@@ -20,107 +25,79 @@
*
* @magentoDbIsolation disabled
* @magentoDataFixture Magento/Elasticsearch/_files/indexer.php
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class IndexHandlerTest extends \PHPUnit\Framework\TestCase
{
/**
- * @var ConnectionManager
+ * @var ProductRepositoryInterface
*/
- protected $connectionManager;
+ private $productRepository;
/**
* @var ElasticsearchClient
*/
- protected $client;
+ private $client;
/**
* @var StoreManagerInterface
*/
- protected $storeManager;
+ private $storeManager;
/**
* @var int[]
*/
- protected $storeIds;
+ private $storeIds;
/**
- * @var Config
+ * @var string
*/
- protected $clientConfig;
+ private $entityType;
/**
- * @var SearchIndexNameResolver
- */
- protected $searchIndexNameResolver;
-
- /**
- * @var Product
- */
- protected $productApple;
-
- /**
- * @var Product
- */
- protected $productBanana;
-
- /**
- * @var Product
- */
- protected $productOrange;
-
- /**
- * @var Product
+ * @var Indexer
*/
- protected $productPapaya;
+ private $indexer;
/**
- * @var Product
+ * @var SearchIndexNameResolver
*/
- protected $productCherry;
+ private $searchIndexNameResolver;
/**
- * Setup method
+ * {@inheritdoc}
*/
protected function setUp()
{
- $this->connectionManager = Bootstrap::getObjectManager()->create(
- \Magento\Elasticsearch\SearchAdapter\ConnectionManager::class
- );
-
- $this->client = $this->connectionManager->getConnection();
+ $connectionManager = Bootstrap::getObjectManager()->create(ConnectionManager::class);
+ $this->client = $connectionManager->getConnection();
- $this->storeManager = Bootstrap::getObjectManager()->create(
- \Magento\Store\Model\StoreManagerInterface::class
- );
+ $this->storeManager = Bootstrap::getObjectManager()->create(StoreManagerInterface::class);
$this->storeIds = array_keys($this->storeManager->getStores());
- $this->clientConfig = Bootstrap::getObjectManager()->create(
- \Magento\Elasticsearch\Model\Config::class
- );
+ $clientConfig = Bootstrap::getObjectManager()->create(Config::class);
+ $this->entityType = $clientConfig->getEntityType();
- $this->searchIndexNameResolver = Bootstrap::getObjectManager()->create(
- \Magento\Elasticsearch\SearchAdapter\SearchIndexNameResolver::class
- );
+ $this->indexer = Bootstrap::getObjectManager()->create(Indexer::class);
+ $this->indexer->load(CatalogSearchFulltextIndexer::INDEXER_ID);
+ $this->indexer->reindexAll();
- $this->productApple = $this->getProductBySku('fulltext-1');
- $this->productBanana = $this->getProductBySku('fulltext-2');
- $this->productOrange = $this->getProductBySku('fulltext-3');
- $this->productPapaya = $this->getProductBySku('fulltext-4');
- $this->productCherry = $this->getProductBySku('fulltext-5');
+ $this->searchIndexNameResolver = Bootstrap::getObjectManager()->create(SearchIndexNameResolver::class);
+ $this->productRepository = Bootstrap::getObjectManager()->create(ProductRepositoryInterface::class);
}
/**
- * Test reindex process
* @magentoConfigFixture default/catalog/search/engine elasticsearch
* @magentoConfigFixture current_store catalog/search/elasticsearch_index_prefix indexerhandlertest
+ * @return void
*/
- public function testReindexAll()
+ public function testReindexAll(): void
{
- $this->reindexAll();
+ $productApple = $this->productRepository->get('fulltext-1');
foreach ($this->storeIds as $storeId) {
$products = $this->searchByName('Apple', $storeId);
$this->assertCount(1, $products);
- $this->assertEquals($this->productApple->getId(), $products[0]['_id']);
+ $this->assertEquals($productApple->getId(), $products[0]['_id']);
$products = $this->searchByName('Simple Product', $storeId);
$this->assertCount(5, $products);
@@ -128,19 +105,17 @@ public function testReindexAll()
}
/**
+ * @magentoAppIsolation enabled
* @magentoConfigFixture default/catalog/search/engine elasticsearch
* @magentoConfigFixture current_store catalog/search/elasticsearch_index_prefix indexerhandlertest
+ * @return void
*/
- public function testReindexRowAfterEdit()
+ public function testReindexRowAfterEdit(): void
{
- // The test executes fine locally. On bamboo there is some issue with parallel test execution or other
- // test interaction. It is being marked as skipped until more time is available to investigate and
- // fix the issue.
- $this->markTestSkipped('MAGETWO-53851 - Ticket to investiage this test failure on Bamboo and fix it.');
-
- $this->productApple->setData('name', 'Simple Product Cucumber');
- $this->productApple->save();
- $this->reindexAll();
+ $this->storeManager->setCurrentStore('admin');
+ $productApple = $this->productRepository->get('fulltext-1');
+ $productApple->setName('Simple Product Cucumber');
+ $this->productRepository->save($productApple);
foreach ($this->storeIds as $storeId) {
$products = $this->searchByName('Apple', $storeId);
@@ -148,7 +123,7 @@ public function testReindexRowAfterEdit()
$products = $this->searchByName('Cucumber', $storeId);
$this->assertCount(1, $products);
- $this->assertEquals($this->productApple->getId(), $products[0]['_id']);
+ $this->assertEquals($productApple->getId(), $products[0]['_id']);
$products = $this->searchByName('Simple Product', $storeId);
$this->assertCount(5, $products);
@@ -158,22 +133,21 @@ public function testReindexRowAfterEdit()
/**
* @magentoConfigFixture default/catalog/search/engine elasticsearch
* @magentoConfigFixture current_store catalog/search/elasticsearch_index_prefix indexerhandlertest
+ * @return void
*/
- public function testReindexRowAfterMassAction()
+ public function testReindexRowAfterMassAction(): void
{
- $this->reindexAll();
+ $productApple = $this->productRepository->get('fulltext-1');
+ $productBanana = $this->productRepository->get('fulltext-2');
$productIds = [
- $this->productApple->getId(),
- $this->productBanana->getId(),
+ $productApple->getId(),
+ $productBanana->getId(),
];
$attrData = [
'name' => 'Simple Product Common',
];
-
- /** @var \Magento\Catalog\Model\Product\Action $action */
- $action = Bootstrap::getObjectManager()->get(
- \Magento\Catalog\Model\Product\Action::class
- );
+ /** @var ProductAction $action */
+ $action = Bootstrap::getObjectManager()->get(ProductAction::class);
foreach ($this->storeIds as $storeId) {
$action->updateAttributes($productIds, $attrData, $storeId);
@@ -199,30 +173,67 @@ public function testReindexRowAfterMassAction()
* @magentoConfigFixture default/catalog/search/engine elasticsearch
* @magentoConfigFixture current_store catalog/search/elasticsearch_index_prefix indexerhandlertest
* @magentoAppArea adminhtml
+ * @return void
*/
- public function testReindexRowAfterDelete()
+ public function testReindexRowAfterDelete(): void
{
- $this->reindexAll();
- $this->productBanana->delete();
+ $productBanana = $this->productRepository->get('fulltext-2');
+ $this->productRepository->delete($productBanana);
foreach ($this->storeIds as $storeId) {
+ $products = $this->searchByName('Banana', $storeId);
+ $this->assertEmpty($products);
+
$products = $this->searchByName('Simple Product', $storeId);
$this->assertCount(4, $products);
}
}
/**
- * Search docs in Elasticsearch by name
+ * @magentoDbIsolation enabled
+ * @magentoAppArea adminhtml
+ * @magentoConfigFixture default/catalog/search/engine elasticsearch
+ * @magentoConfigFixture current_store catalog/search/elasticsearch_index_prefix indexerhandlertest
+ * @magentoDataFixture Magento/Elasticsearch/_files/configurable_products.php
+ * @return void
+ */
+ public function testReindexRowAfterUpdateStockStatus(): void
+ {
+ foreach ($this->storeIds as $storeId) {
+ $products = $this->searchByName('ProductOption1', $storeId);
+ $this->assertNotEmpty($products);
+ }
+ $product = $this->productRepository->get('simple_10');
+ /** @var StockRegistryInterface $stockRegistry */
+ $stockRegistry = Bootstrap::getObjectManager()->create(StockRegistryInterface::class);
+ $stockItem = $stockRegistry->getStockItem($product->getId());
+ $stockItem->setIsInStock(false);
+ /** @var StockItemRepositoryInterface $stockRepository */
+ $stockRepository = Bootstrap::getObjectManager()->create(StockItemRepositoryInterface::class);
+ $stockRepository->save($stockItem);
+
+ foreach ($this->storeIds as $storeId) {
+ $products = $this->searchByName('ProductOption1', $storeId);
+ $this->assertEmpty($products);
+
+ $products = $this->searchByName('Configurable', $storeId);
+ $this->assertNotEmpty($products);
+ }
+ }
+
+ /**
+ * Search docs in Elasticsearch by name.
*
* @param string $text
* @param int $storeId
* @return array
*/
- protected function searchByName($text, $storeId)
+ private function searchByName(string $text, int $storeId): array
{
+ $index = $this->searchIndexNameResolver->getIndexName($storeId, $this->indexer->getId());
$searchQuery = [
- 'index' => $this->searchIndexNameResolver->getIndexName($storeId, 'catalogsearch_fulltext'),
- 'type' => $this->clientConfig->getEntityType(),
+ 'index' => $index,
+ 'type' => $this->entityType,
'body' => [
'query' => [
'bool' => [
@@ -240,35 +251,7 @@ protected function searchByName($text, $storeId)
];
$queryResult = $this->client->query($searchQuery);
$products = isset($queryResult['hits']['hits']) ? $queryResult['hits']['hits'] : [];
- return $products;
- }
-
- /**
- * Return product by SKU
- *
- * @param string $sku
- * @return Product
- */
- protected function getProductBySku($sku)
- {
- /** @var Product $product */
- $product = Bootstrap::getObjectManager()->get(
- \Magento\Catalog\Model\Product::class
- );
- return $product->loadByAttribute('sku', $sku);
- }
- /**
- * Perform full reindex
- *
- * @return void
- */
- private function reindexAll()
- {
- $indexer = Bootstrap::getObjectManager()->create(
- \Magento\Indexer\Model\Indexer::class
- );
- $indexer->load('catalogsearch_fulltext');
- $indexer->reindexAll();
+ return $products;
}
}
diff --git a/dev/tests/integration/testsuite/Magento/Elasticsearch/_files/configurable_attribute.php b/dev/tests/integration/testsuite/Magento/Elasticsearch/_files/configurable_attribute.php
new file mode 100644
index 00000000000..7ec53d9099d
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Elasticsearch/_files/configurable_attribute.php
@@ -0,0 +1,62 @@
+get(\Magento\Eav\Model\Config::class);
+$attribute = $eavConfig->getAttribute('catalog_product', 'test_configurable');
+
+$eavConfig->clear();
+
+/** @var $installer \Magento\Catalog\Setup\CategorySetup */
+$installer = Bootstrap::getObjectManager()->create(\Magento\Catalog\Setup\CategorySetup::class);
+
+if (!$attribute->getId()) {
+ /** @var $attribute \Magento\Catalog\Model\ResourceModel\Eav\Attribute */
+ $attribute = Bootstrap::getObjectManager()->create(
+ \Magento\Catalog\Model\ResourceModel\Eav\Attribute::class
+ );
+
+ /** @var AttributeRepositoryInterface $attributeRepository */
+ $attributeRepository = Bootstrap::getObjectManager()->create(AttributeRepositoryInterface::class);
+
+ $attribute->setData(
+ [
+ 'attribute_code' => 'test_configurable',
+ 'entity_type_id' => $installer->getEntityTypeId('catalog_product'),
+ 'is_global' => 1,
+ 'is_user_defined' => 1,
+ 'frontend_input' => 'select',
+ 'is_unique' => 0,
+ 'is_required' => 0,
+ 'is_searchable' => 0,
+ 'is_visible_in_advanced_search' => 0,
+ 'is_comparable' => 0,
+ 'is_filterable' => 0,
+ 'is_filterable_in_search' => 0,
+ 'is_used_for_promo_rules' => 0,
+ 'is_html_allowed_on_front' => 1,
+ 'is_visible_on_front' => 0,
+ 'used_in_product_listing' => 0,
+ 'used_for_sort_by' => 0,
+ 'frontend_label' => ['Test Configurable'],
+ 'backend_type' => 'int',
+ 'option' => [
+ 'value' => ['option_0' => ['Option 1'], 'option_1' => ['Option 2']],
+ 'order' => ['option_0' => 1, 'option_1' => 2],
+ ],
+ ]
+ );
+
+ $attributeRepository->save($attribute);
+
+ /* Assign attribute to attribute set */
+ $installer->addAttributeToGroup('catalog_product', 'Default', 'General', $attribute->getId());
+}
+
+$eavConfig->clear();
diff --git a/dev/tests/integration/testsuite/Magento/Elasticsearch/_files/configurable_attribute_rollback.php b/dev/tests/integration/testsuite/Magento/Elasticsearch/_files/configurable_attribute_rollback.php
new file mode 100644
index 00000000000..7bdfbc6d7f9
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Elasticsearch/_files/configurable_attribute_rollback.php
@@ -0,0 +1,24 @@
+get(\Magento\Framework\Registry::class);
+
+$registry->unregister('isSecureArea');
+$registry->register('isSecureArea', true);
+
+$eavConfig = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(\Magento\Eav\Model\Config::class);
+$attribute = $eavConfig->getAttribute('catalog_product', 'test_configurable');
+if ($attribute instanceof \Magento\Eav\Model\Entity\Attribute\AbstractAttribute
+ && $attribute->getId()
+) {
+ $attribute->delete();
+}
+$eavConfig->clear();
+
+$registry->unregister('isSecureArea');
+$registry->register('isSecureArea', false);
diff --git a/dev/tests/integration/testsuite/Magento/Elasticsearch/_files/configurable_products.php b/dev/tests/integration/testsuite/Magento/Elasticsearch/_files/configurable_products.php
index c2dd3c2f879..f8872b02ba2 100644
--- a/dev/tests/integration/testsuite/Magento/Elasticsearch/_files/configurable_products.php
+++ b/dev/tests/integration/testsuite/Magento/Elasticsearch/_files/configurable_products.php
@@ -17,7 +17,7 @@
require __DIR__ . '/select_attribute.php';
require __DIR__ . '/multiselect_attribute.php';
-require __DIR__ . '/../../ConfigurableProduct/_files/configurable_attribute.php';
+require __DIR__ . '/configurable_attribute.php';
$objectManager = Bootstrap::getObjectManager();
@@ -45,7 +45,7 @@
->setId($productId)
->setAttributeSetId($attributeSetId)
->setWebsiteIds([1])
- ->setName('Configurable Option' . $option->getLabel())
+ ->setName('Configurable Option Product' . str_replace(' ', '', $option->getLabel()))
->setSku('simple_' . $productId)
->setPrice($productId)
->setTestConfigurable($option->getValue())
diff --git a/dev/tests/integration/testsuite/Magento/Elasticsearch/_files/configurable_products_rollback.php b/dev/tests/integration/testsuite/Magento/Elasticsearch/_files/configurable_products_rollback.php
index 0d062c9d3f4..e73d2ab1b59 100644
--- a/dev/tests/integration/testsuite/Magento/Elasticsearch/_files/configurable_products_rollback.php
+++ b/dev/tests/integration/testsuite/Magento/Elasticsearch/_files/configurable_products_rollback.php
@@ -25,7 +25,7 @@
}
}
-require __DIR__ . '/../../ConfigurableProduct/_files/configurable_attribute_rollback.php';
+require __DIR__ . '/configurable_attribute_rollback.php';
require __DIR__ . '/select_attribute_rollback.php';
require __DIR__ . '/multiselect_attribute_rollback.php';
diff --git a/dev/tests/integration/testsuite/Magento/Elasticsearch/_files/indexer.php b/dev/tests/integration/testsuite/Magento/Elasticsearch/_files/indexer.php
index 8ee3a409150..b5c86a63fa4 100644
--- a/dev/tests/integration/testsuite/Magento/Elasticsearch/_files/indexer.php
+++ b/dev/tests/integration/testsuite/Magento/Elasticsearch/_files/indexer.php
@@ -52,7 +52,7 @@
->setStockData(['use_config_manage_stock' => 0])
->save();
-/** @var $productFirst \Magento\Catalog\Model\Product */
+/** @var $productSecond \Magento\Catalog\Model\Product */
$productSecond = $objectManager->create(\Magento\Catalog\Model\Product::class);
$productSecond->setTypeId('simple')
->setAttributeSetId(4)
@@ -68,7 +68,7 @@
->setStockData(['use_config_manage_stock' => 0])
->save();
-/** @var $productFirst \Magento\Catalog\Model\Product */
+/** @var $productThird \Magento\Catalog\Model\Product */
$productThird = $objectManager->create(\Magento\Catalog\Model\Product::class);
$productThird->setTypeId('simple')
->setAttributeSetId(4)
@@ -84,7 +84,7 @@
->setStockData(['use_config_manage_stock' => 0])
->save();
-/** @var $productFirst \Magento\Catalog\Model\Product */
+/** @var $productFourth \Magento\Catalog\Model\Product */
$productFourth = $objectManager->create(\Magento\Catalog\Model\Product::class);
$productFourth->setTypeId('simple')
->setAttributeSetId(4)
@@ -100,7 +100,7 @@
->setStockData(['use_config_manage_stock' => 0])
->save();
-/** @var $productFirst \Magento\Catalog\Model\Product */
+/** @var $productFifth \Magento\Catalog\Model\Product */
$productFifth = $objectManager->create(\Magento\Catalog\Model\Product::class);
$productFifth->setTypeId('simple')
->setAttributeSetId(4)
diff --git a/dev/tests/integration/testsuite/Magento/Elasticsearch/_files/requests.xml b/dev/tests/integration/testsuite/Magento/Elasticsearch/_files/requests.xml
index c40ac9e8b9b..0aaaf9b8585 100644
--- a/dev/tests/integration/testsuite/Magento/Elasticsearch/_files/requests.xml
+++ b/dev/tests/integration/testsuite/Magento/Elasticsearch/_files/requests.xml
@@ -394,13 +394,18 @@
+
+
+
+
+
0
diff --git a/dev/tests/integration/testsuite/Magento/Framework/Search/Adapter/Mysql/AdapterTest.php b/dev/tests/integration/testsuite/Magento/Framework/Search/Adapter/Mysql/AdapterTest.php
index ec1538e950c..ecbce25cd33 100644
--- a/dev/tests/integration/testsuite/Magento/Framework/Search/Adapter/Mysql/AdapterTest.php
+++ b/dev/tests/integration/testsuite/Magento/Framework/Search/Adapter/Mysql/AdapterTest.php
@@ -63,6 +63,10 @@ protected function setUp()
);
$this->adapter = $this->createAdapter();
+
+ $indexer = $this->objectManager->create(\Magento\Indexer\Model\Indexer::class);
+ $indexer->load('catalogsearch_fulltext');
+ $indexer->reindexAll();
}
/**
@@ -206,7 +210,7 @@ public function testMatchQueryFilters()
public function testRangeFilterWithAllFields()
{
$this->requestBuilder->bind('range_filter_from', 11);
- $this->requestBuilder->bind('range_filter_to', 16);
+ $this->requestBuilder->bind('range_filter_to', 17);
$this->requestBuilder->setRequestName('range_filter');
$queryResponse = $this->executeQuery();
@@ -263,7 +267,7 @@ public function testTermFilter()
*/
public function testTermFilterArray()
{
- $this->requestBuilder->bind('request.price', [16, 18]);
+ $this->requestBuilder->bind('request.price', [17, 18]);
$this->requestBuilder->setRequestName('term_filter');
$queryResponse = $this->executeQuery();
@@ -310,13 +314,13 @@ public function testSearchLimit()
public function testBoolFilter()
{
$expectedIds = [2, 3];
- $this->requestBuilder->bind('must_range_filter1_from', 12);
+ $this->requestBuilder->bind('must_range_filter1_from', 13);
$this->requestBuilder->bind('must_range_filter1_to', 22);
- $this->requestBuilder->bind('should_term_filter1', 12);
- $this->requestBuilder->bind('should_term_filter2', 14);
- $this->requestBuilder->bind('should_term_filter3', 16);
+ $this->requestBuilder->bind('should_term_filter1', 13);
+ $this->requestBuilder->bind('should_term_filter2', 15);
+ $this->requestBuilder->bind('should_term_filter3', 17);
$this->requestBuilder->bind('should_term_filter4', 18);
- $this->requestBuilder->bind('not_term_filter1', 12);
+ $this->requestBuilder->bind('not_term_filter1', 13);
$this->requestBuilder->bind('not_term_filter2', 18);
$this->requestBuilder->setRequestName('bool_filter');
@@ -335,7 +339,7 @@ public function testBoolFilterWithNestedNegativeBoolFilter()
$expectedIds = [1];
$this->requestBuilder->bind('not_range_filter_from', 14);
$this->requestBuilder->bind('not_range_filter_to', 20);
- $this->requestBuilder->bind('nested_not_term_filter', 12);
+ $this->requestBuilder->bind('nested_not_term_filter', 13);
$this->requestBuilder->setRequestName('bool_filter_with_nested_bool_filter');
$queryResponse = $this->executeQuery();
@@ -531,9 +535,15 @@ public function testAdvancedSearchCompositeProductWithOutOfStockOption()
->create(Collection::class)
->setAttributeFilter($attribute->getId());
+ $visibility = [
+ \Magento\Catalog\Model\Product\Visibility::VISIBILITY_IN_SEARCH,
+ \Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH,
+ ];
+
$firstOption = $selectOptions->getFirstItem();
$firstOptionId = $firstOption->getId();
$this->requestBuilder->bind('test_configurable', $firstOptionId);
+ $this->requestBuilder->bind('visibility', $visibility);
$this->requestBuilder->setRequestName('filter_out_of_stock_child');
$queryResponse = $this->executeQuery();
@@ -542,6 +552,7 @@ public function testAdvancedSearchCompositeProductWithOutOfStockOption()
$secondOption = $selectOptions->getLastItem();
$secondOptionId = $secondOption->getId();
$this->requestBuilder->bind('test_configurable', $secondOptionId);
+ $this->requestBuilder->bind('visibility', $visibility);
$this->requestBuilder->setRequestName('filter_out_of_stock_child');
$queryResponse = $this->executeQuery();
diff --git a/dev/tests/integration/testsuite/Magento/Framework/Search/_files/product_configurable.php b/dev/tests/integration/testsuite/Magento/Framework/Search/_files/product_configurable.php
index 2f30cba3d8e..8a7c5246f37 100644
--- a/dev/tests/integration/testsuite/Magento/Framework/Search/_files/product_configurable.php
+++ b/dev/tests/integration/testsuite/Magento/Framework/Search/_files/product_configurable.php
@@ -15,8 +15,6 @@
use Magento\Eav\Api\Data\AttributeOptionInterface;
use Magento\TestFramework\Helper\Bootstrap;
-Bootstrap::getInstance()->reinitialize();
-
require __DIR__ . '/configurable_attribute.php';
/** @var ProductRepositoryInterface $productRepository */
diff --git a/dev/tests/integration/testsuite/Magento/Framework/Search/_files/requests.xml b/dev/tests/integration/testsuite/Magento/Framework/Search/_files/requests.xml
index 70f9ac75b07..dcf3cd58250 100644
--- a/dev/tests/integration/testsuite/Magento/Framework/Search/_files/requests.xml
+++ b/dev/tests/integration/testsuite/Magento/Framework/Search/_files/requests.xml
@@ -394,13 +394,18 @@
+
+
+
+
+
0
diff --git a/dev/tests/integration/testsuite/Magento/Framework/Search/_files/search_weight_products.php b/dev/tests/integration/testsuite/Magento/Framework/Search/_files/search_weight_products.php
index b672fbe9f8c..3902e78d1fb 100644
--- a/dev/tests/integration/testsuite/Magento/Framework/Search/_files/search_weight_products.php
+++ b/dev/tests/integration/testsuite/Magento/Framework/Search/_files/search_weight_products.php
@@ -7,18 +7,8 @@
*/
use Magento\Catalog\Api\ProductRepositoryInterface;
-use Magento\Catalog\Model\Product;
-use Magento\Catalog\Model\Product\Attribute\Source\Status;
-use Magento\Catalog\Model\Product\Type;
-use Magento\Catalog\Model\Product\Visibility;
-use Magento\Catalog\Setup\CategorySetup;
-use Magento\ConfigurableProduct\Helper\Product\Options\Factory;
-use Magento\ConfigurableProduct\Model\Product\Type\Configurable;
-use Magento\Eav\Api\Data\AttributeOptionInterface;
use Magento\TestFramework\Helper\Bootstrap;
-Bootstrap::getInstance()->reinitialize();
-
$objectManager = Bootstrap::getObjectManager();
/** @var ProductRepositoryInterface $productRepository */
diff --git a/dev/tests/integration/testsuite/Magento/SalesRule/Model/Rule/Condition/ProductTest.php b/dev/tests/integration/testsuite/Magento/SalesRule/Model/Rule/Condition/ProductTest.php
index 02a4ba4c282..98826adeb21 100644
--- a/dev/tests/integration/testsuite/Magento/SalesRule/Model/Rule/Condition/ProductTest.php
+++ b/dev/tests/integration/testsuite/Magento/SalesRule/Model/Rule/Condition/ProductTest.php
@@ -58,6 +58,28 @@ public function testValidateCategorySalesRuleIncludesChildren($categoryId, $expe
$this->assertEquals($expectedResult, $rule->validate($quote));
}
+ /**
+ * @magentoDbIsolation disabled
+ * @magentoDataFixture Magento/Bundle/_files/order_item_with_bundle_and_options.php
+ * @magentoDataFixture Magento/SalesRule/_files/rules_sku_exclude.php
+ *
+ * @return void
+ */
+ public function testValidateSalesRuleExcludesBundleChildren(): void
+ {
+ // Load the quote that contains a child of a bundle product
+ /** @var \Magento\Quote\Model\Quote $quote */
+ $quote = $this->objectManager->create(\Magento\Quote\Model\Quote::class)
+ ->load('test_cart_with_bundle_and_options', 'reserved_order_id');
+
+ // Load the SalesRule looking for excluding products with selected sku
+ /** @var $rule \Magento\SalesRule\Model\Rule */
+ $rule = $this->objectManager->get(\Magento\Framework\Registry::class)
+ ->registry('_fixture/Magento_SalesRule_Sku_Exclude');
+
+ $this->assertEquals(false, $rule->validate($quote));
+ }
+
/**
* @return array
*/
diff --git a/dev/tests/integration/testsuite/Magento/SalesRule/_files/rules_sku_exclude.php b/dev/tests/integration/testsuite/Magento/SalesRule/_files/rules_sku_exclude.php
new file mode 100644
index 00000000000..9d88fe48ae1
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/SalesRule/_files/rules_sku_exclude.php
@@ -0,0 +1,79 @@
+create(\Magento\Eav\Api\AttributeRepositoryInterface::class);
+
+/** @var \Magento\Eav\Api\Data\AttributeInterface $skuAttribute */
+$skuAttribute = $repository->get(
+ 'catalog_product',
+ 'sku'
+);
+$data = $skuAttribute->getData();
+$data['is_used_for_promo_rules'] = 1;
+$skuAttribute->setData($data);
+$skuAttribute->save();
+
+/** @var \Magento\SalesRule\Model\Rule $rule */
+$salesRule = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(\Magento\SalesRule\Model\Rule::class);
+$salesRule->setData(
+ [
+ 'name' => '20% Off',
+ 'is_active' => 1,
+ 'customer_group_ids' => [\Magento\Customer\Model\GroupManagement::NOT_LOGGED_IN_ID],
+ 'coupon_type' => \Magento\SalesRule\Model\Rule::COUPON_TYPE_NO_COUPON,
+ 'simple_action' => 'by_percent',
+ 'discount_amount' => 20,
+ 'discount_step' => 0,
+ 'stop_rules_processing' => 1,
+ 'website_ids' => [
+ \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
+ \Magento\Store\Model\StoreManagerInterface::class
+ )->getWebsite()->getId(),
+ ],
+ ]
+);
+
+$salesRule->getConditions()->loadArray([
+ 'type' => \Magento\SalesRule\Model\Rule\Condition\Combine::class,
+ 'attribute' => null,
+ 'operator' => null,
+ 'value' => '1',
+ 'is_value_processed' => null,
+ 'aggregator' => 'all',
+ 'conditions' =>
+ [
+ [
+ 'type' => \Magento\SalesRule\Model\Rule\Condition\Product\Found::class,
+ 'attribute' => null,
+ 'operator' => null,
+ 'value' => '1',
+ 'is_value_processed' => null,
+ 'aggregator' => 'all',
+ 'conditions' =>
+ [
+ [
+ 'type' => \Magento\SalesRule\Model\Rule\Condition\Product::class,
+ 'attribute' => 'sku',
+ 'operator' => '!=',
+ 'value' => 'product-bundle',
+ 'is_value_processed' => false,
+ ],
+ ],
+ ],
+ ],
+]);
+
+$salesRule->save();
+
+/** @var Magento\Framework\Registry $registry */
+$registry = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(\Magento\Framework\Registry::class);
+
+$registry->unregister('_fixture/Magento_SalesRule_Sku_Exclude');
+$registry->register('_fixture/Magento_SalesRule_Sku_Exclude', $salesRule);
diff --git a/dev/tests/integration/testsuite/Magento/SalesRule/_files/rules_sku_exclude_rollback.php b/dev/tests/integration/testsuite/Magento/SalesRule/_files/rules_sku_exclude_rollback.php
new file mode 100644
index 00000000000..79ec3259fd8
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/SalesRule/_files/rules_sku_exclude_rollback.php
@@ -0,0 +1,29 @@
+create(\Magento\Eav\Api\AttributeRepositoryInterface::class);
+
+/** @var \Magento\Eav\Api\Data\AttributeInterface $skuAttribute */
+$skuAttribute = $repository->get(
+ 'catalog_product',
+ 'sku'
+);
+$data = $skuAttribute->getData();
+$data['is_used_for_promo_rules'] = 0;
+$skuAttribute->setData($data);
+$skuAttribute->save();
+
+/** @var Magento\Framework\Registry $registry */
+$registry = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(\Magento\Framework\Registry::class);
+
+/** @var Magento\SalesRule\Model\Rule $rule */
+$rule = $registry->registry('_fixture/Magento_SalesRule_Sku_Exclude');
+
+$rule->delete();
diff --git a/dev/tests/integration/testsuite/Magento/Signifyd/Observer/PlaceOrderTest.php b/dev/tests/integration/testsuite/Magento/Signifyd/Observer/PlaceOrderTest.php
index d4204314453..e547187be5e 100644
--- a/dev/tests/integration/testsuite/Magento/Signifyd/Observer/PlaceOrderTest.php
+++ b/dev/tests/integration/testsuite/Magento/Signifyd/Observer/PlaceOrderTest.php
@@ -12,10 +12,17 @@
use Magento\Sales\Api\Data\OrderInterface;
use Magento\Sales\Api\OrderRepositoryInterface;
use Magento\Signifyd\Api\CaseCreationServiceInterface;
+use Magento\Store\Api\StoreRepositoryInterface;
+use Magento\Store\Model\StoreManagerInterface;
use Magento\TestFramework\Helper\Bootstrap;
use PHPUnit\Framework\MockObject_MockObject as MockObject;
use Psr\Log\LoggerInterface;
+/**
+ * Test for Magento\Signifyd\Observer\PlaceOrderTest class.
+ *
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
class PlaceOrderTest extends \PHPUnit\Framework\TestCase
{
/**
@@ -105,7 +112,46 @@ public function testExecute()
$event = $this->objectManager->create(
Event::class,
[
- 'data' => ['order' => $order]
+ 'data' => ['order' => $order],
+ ]
+ );
+
+ /** @var Observer $observer */
+ $observer = $this->objectManager->get(Observer::class);
+ $observer->setEvent($event);
+
+ $this->placeOrder->execute($observer);
+ }
+
+ /**
+ * Signifyd is enabled for default store.
+ * Checks a test case when order placed with website where signifyd is disabled.
+ *
+ * @return void
+ * @covers \Magento\Signifyd\Observer\PlaceOrder::execute
+ * @magentoDataFixture Magento/Signifyd/_files/order_with_customer_and_two_simple_products.php
+ * @magentoDataFixture Magento/Signifyd/_files/website_configuration.php
+ */
+ public function testExecuteWithWebsiteConfiguration(): void
+ {
+ /** @var StoreRepositoryInterface $storeRepository */
+ $storeRepository = $this->objectManager->get(StoreRepositoryInterface::class);
+ $store = $storeRepository->get('test_second_store');
+
+ /** @var StoreManagerInterface $storeManager */
+ $storeManager = $this->objectManager->get(StoreManagerInterface::class);
+ $storeManager->setCurrentStore($store->getId());
+
+ $order = $this->getOrder('100000001');
+ $order->setStoreId($store->getId());
+
+ $this->creationService->expects(self::never())
+ ->method('createForOrder');
+
+ $event = $this->objectManager->create(
+ Event::class,
+ [
+ 'data' => ['order' => $order],
]
);
diff --git a/dev/tests/integration/testsuite/Magento/Signifyd/_files/order_with_customer_and_two_simple_products.php b/dev/tests/integration/testsuite/Magento/Signifyd/_files/order_with_customer_and_two_simple_products.php
index 8991825c938..49a0a2d33e2 100644
--- a/dev/tests/integration/testsuite/Magento/Signifyd/_files/order_with_customer_and_two_simple_products.php
+++ b/dev/tests/integration/testsuite/Magento/Signifyd/_files/order_with_customer_and_two_simple_products.php
@@ -10,7 +10,7 @@
use Magento\Sales\Api\OrderRepositoryInterface;
use Magento\TestFramework\Helper\Bootstrap;
-require __DIR__ . '/../../../Magento/Catalog/_files/multiple_products.php';
+require __DIR__ . '/../../../Magento/Catalog/_files/product_simple.php';
require __DIR__ . '/../../../Magento/Customer/_files/customer.php';
require __DIR__ . '/store.php';
@@ -36,33 +36,28 @@
->setCcExpMonth('01')
->setCcExpYear('21');
-/** @var \Magento\Catalog\Api\ProductRepositoryInterface $productRepository */
-$productRepository = $objectManager->create(\Magento\Catalog\Api\ProductRepositoryInterface::class);
-
-$product1 = $productRepository->get('simple1');
/** @var Item $orderItem */
$orderItem1 = $objectManager->create(Item::class);
-$orderItem1->setProductId($product1->getId())
- ->setSku($product1->getSku())
- ->setName($product1->getName())
+$orderItem1->setProductId($product->getId())
+ ->setSku($product->getSku())
+ ->setName($product->getName())
->setQtyOrdered(1)
- ->setBasePrice($product1->getPrice())
- ->setPrice($product1->getPrice())
- ->setRowTotal($product1->getPrice())
- ->setProductType($product1->getTypeId());
+ ->setBasePrice($product->getPrice())
+ ->setPrice($product->getPrice())
+ ->setRowTotal($product->getPrice())
+ ->setProductType($product->getTypeId());
-$product2 = $productRepository->get('simple2');
/** @var Item $orderItem */
$orderItem2 = $objectManager->create(Item::class);
-$orderItem2->setProductId($product2->getId())
- ->setSku($product2->getSku())
- ->setName($product2->getName())
- ->setPrice($product2->getPrice())
+$orderItem2->setProductId($product->getId())
+ ->setSku('simple2')
+ ->setName('Simple product')
+ ->setPrice(100)
->setQtyOrdered(2)
- ->setBasePrice($product2->getPrice())
- ->setPrice($product2->getPrice())
- ->setRowTotal($product2->getPrice())
- ->setProductType($product2->getTypeId());
+ ->setBasePrice($product->getPrice())
+ ->setPrice($product->getPrice())
+ ->setRowTotal($product->getPrice())
+ ->setProductType($product->getTypeId());
$orderAmount = 100;
$customerEmail = $billingAddress->getEmail();
diff --git a/dev/tests/integration/testsuite/Magento/Signifyd/_files/website_configuration.php b/dev/tests/integration/testsuite/Magento/Signifyd/_files/website_configuration.php
new file mode 100644
index 00000000000..e53b0431503
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Signifyd/_files/website_configuration.php
@@ -0,0 +1,67 @@
+create(Website::class);
+$website->setData(['code' => 'test_website', 'name' => 'Test Website', 'default_group_id' => '1', 'is_default' => '0']);
+$websiteResourceModel = $objectManager->create(WebsiteResourceModel::class);
+$websiteResourceModel->save($website);
+
+$websiteId = $website->getId();
+$store = $objectManager->create(Store::class);
+$groupId = Bootstrap::getObjectManager()->get(StoreManagerInterface::class)
+ ->getWebsite()
+ ->getDefaultGroupId();
+$store->setCode('test_second_store')
+ ->setWebsiteId($websiteId)
+ ->setGroupId($groupId)
+ ->setName('Test Second Store')
+ ->setSortOrder(10)
+ ->setIsActive(1);
+$storeResourceModel = $objectManager->create(StoreResourceModel::class);
+$storeResourceModel->save($store);
+
+/* Refresh stores memory cache */
+$objectManager->get(StoreManagerInterface::class)->reinitStores();
+
+$processConfigData = function (Config $config, array $data) {
+ foreach ($data as $key => $value) {
+ $config->setDataByPath($key, $value);
+ $config->save();
+ }
+};
+
+// save signifyd configuration for the default scope
+$configData = [
+ 'fraud_protection/signifyd/active' => '1',
+];
+/** @var Config $defConfig */
+$defConfig = $objectManager->create(Config::class);
+$defConfig->setScope(ScopeConfigInterface::SCOPE_TYPE_DEFAULT);
+$processConfigData($defConfig, $configData);
+
+// save signifyd website config data
+$websiteConfigData = [
+ 'fraud_protection/signifyd/active' => '0',
+];
+/** @var Config $websiteConfig */
+$websiteConfig = $objectManager->create(Config::class);
+$websiteConfig->setScope(ScopeInterface::SCOPE_WEBSITES);
+$websiteConfig->setWebsite($websiteId);
+$processConfigData($websiteConfig, $websiteConfigData);
diff --git a/dev/tests/integration/testsuite/Magento/Signifyd/_files/website_configuration_rollback.php b/dev/tests/integration/testsuite/Magento/Signifyd/_files/website_configuration_rollback.php
new file mode 100644
index 00000000000..9b731813fea
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Signifyd/_files/website_configuration_rollback.php
@@ -0,0 +1,44 @@
+delete($path, $scope, $scopeId);
+ }
+};
+
+/** @var WriterInterface $configWriter */
+$configWriter = $objectManager->get(WriterInterface::class);
+$deleteConfigData($configWriter, ScopeConfigInterface::SCOPE_TYPE_DEFAULT, null);
+
+/** @var WebsiteRepositoryInterface $websiteRepository */
+$websiteRepository = $objectManager->get(WebsiteRepositoryInterface::class);
+$website = $websiteRepository->get('test_website');
+$deleteConfigData($configWriter, ScopeInterface::SCOPE_WEBSITES, $website->getId());
+
+$website = $objectManager->create(Website::class);
+/** @var $website Website */
+if ($website->load('test_website', 'code')->getId()) {
+ $website->delete();
+}
+$store = $objectManager->create(Store::class);
+if ($store->load('test_second_store', 'code')->getId()) {
+ $store->delete();
+}
diff --git a/dev/tests/integration/testsuite/Magento/Swatches/Controller/Adminhtml/Product/AttributeTest.php b/dev/tests/integration/testsuite/Magento/Swatches/Controller/Adminhtml/Product/AttributeTest.php
new file mode 100644
index 00000000000..969d9530ae5
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Swatches/Controller/Adminhtml/Product/AttributeTest.php
@@ -0,0 +1,213 @@
+getRandomColor()}";
+ $optionsData []= "optionvisual[value][option_{$i}][0]=value_{$i}_admin";
+ $optionsData []= "optionvisual[value][option_{$i}][1]={$expectedOptionLabelOnStoreView}";
+ $optionsData []= "optionvisual[delete][option_{$i}]=";
+ }
+ $optionsData []= "visual_swatch_validation=";
+ $optionsData []= "visual_swatch_validation_unique=";
+ return [
+ 'attribute_data' => array_merge_recursive(
+ [
+ 'serialized_swatch_values' => json_encode($optionsData),
+ ],
+ $this->getAttributePreset(),
+ [
+ 'frontend_input' => 'swatch_visual'
+ ]
+ ),
+ 'expected_options_count' => $optionsCount + 1,
+ 'expected_store_labels' => $expectedOptionsLabels
+ ];
+ }
+
+ /**
+ * Get text swatches data set.
+ *
+ * @param int $optionsCount
+ * @return array
+ */
+ private function getSwatchTextDataSet(int $optionsCount) : array
+ {
+ $optionsData = [];
+ $expectedOptionsLabels = [];
+ for ($i = 0; $i < $optionsCount; $i++) {
+ $order = $i + 1;
+ $expectedOptionLabelOnStoreView = "value_{$i}_store_1";
+ $expectedOptionsLabels[$i+1] = $expectedOptionLabelOnStoreView;
+ $optionsData []= "optiontext[order][option_{$i}]={$order}";
+ $optionsData []= "defaulttext[]=option_{$i}";
+ $optionsData []= "swatchtext[value][option_{$i}]=x{$i}";
+ $optionsData []= "optiontext[value][option_{$i}][0]=value_{$i}_admin";
+ $optionsData []= "optiontext[value][option_{$i}][1]={$expectedOptionLabelOnStoreView}";
+ $optionsData []= "optiontext[delete][option_{$i}]=";
+ }
+ $optionsData []= "text_swatch_validation=";
+ $optionsData []= "text_swatch_validation_unique=";
+ return [
+ 'attribute_data' => array_merge_recursive(
+ [
+ 'serialized_swatch_values' => json_encode($optionsData),
+ ],
+ $this->getAttributePreset(),
+ [
+ 'frontend_input' => 'swatch_text'
+ ]
+ ),
+ 'expected_options_count' => $optionsCount + 1,
+ 'expected_store_labels' => $expectedOptionsLabels
+ ];
+ }
+
+ /**
+ * Get data preset for new attribute.
+ *
+ * @return array
+ */
+ private function getAttributePreset() : array
+ {
+ return [
+ 'serialized_options' => '[]',
+ 'form_key' => 'XxtpPYjm2YPYUlAt',
+ 'frontend_label' => [
+ 0 => 'asdasd',
+ 1 => '',
+ 2 => '',
+ ],
+ 'is_required' => '0',
+ 'update_product_preview_image' => '0',
+ 'use_product_image_for_swatch' => '0',
+ 'is_global' => '0',
+ 'default_value_text' => '512',
+ 'default_value_yesno' => '1',
+ 'default_value_date' => '1/1/70',
+ 'default_value_textarea' => '512',
+ 'is_unique' => '0',
+ 'is_used_in_grid' => '1',
+ 'is_visible_in_grid' => '1',
+ 'is_filterable_in_grid' => '1',
+ 'is_searchable' => '0',
+ 'is_comparable' => '0',
+ 'is_filterable' => '0',
+ 'is_filterable_in_search' => '0',
+ 'position' => '0',
+ 'is_used_for_promo_rules' => '0',
+ 'is_html_allowed_on_front' => '1',
+ 'is_visible_on_front' => '0',
+ 'used_in_product_listing' => '0',
+ 'used_for_sort_by' => '0',
+ 'attribute_code' => 'test_many_swatches',
+ ];
+ }
+
+ /**
+ * Data provider for large swatches amount test.
+ *
+ * @return array
+ */
+ public function getLargeSwatchesAmountAttributeData() : array
+ {
+ $maxInputVars = ini_get('max_input_vars');
+ // Each option is at least 7 variables array for a visual swatch.
+ // Set options count to exceed max_input_vars by 20 options (140 variables).
+ $swatchVisualOptionsCount = (int)floor($maxInputVars / 7) + 20;
+ $swatchTextOptionsCount = (int)floor($maxInputVars / 4) + 80;
+ return [
+ 'visual swatches' => $this->getSwatchVisualDataSet($swatchVisualOptionsCount),
+ 'text swatches' => $this->getSwatchTextDataSet($swatchTextOptionsCount)
+ ];
+ }
+
+ /**
+ * Test attribute saving with large amount of options exceeding maximum allowed by max_input_vars limit.
+ * @dataProvider getLargeSwatchesAmountAttributeData()
+ * @param array $attributeData
+ * @param int $expectedOptionsCount
+ * @param array $expectedLabels
+ * @return void
+ */
+ public function testLargeOptionsDataSet(
+ array $attributeData,
+ int $expectedOptionsCount,
+ array $expectedLabels
+ ) : void {
+ $this->getRequest()->setPostValue($attributeData);
+ $this->dispatch('backend/catalog/product_attribute/save');
+ $entityTypeId = $this->_objectManager->create(
+ \Magento\Eav\Model\Entity::class
+ )->setType(
+ \Magento\Catalog\Model\Product::ENTITY
+ )->getTypeId();
+
+ /** @var $attribute \Magento\Catalog\Model\ResourceModel\Eav\Attribute */
+ $attribute = $this->_objectManager->create(
+ \Magento\Catalog\Model\ResourceModel\Eav\Attribute::class
+ )->setEntityTypeId(
+ $entityTypeId
+ );
+ try {
+ $attribute->loadByCode($entityTypeId, 'test_many_swatches');
+ $options = $attribute->getOptions();
+ // assert that all options are saved without truncation
+ $this->assertEquals(
+ $expectedOptionsCount,
+ count($options),
+ 'Expected options count does not match (regarding first empty option for non-required attribute)'
+ );
+
+ foreach ($expectedLabels as $optionOrderNum => $label) {
+ $this->assertEquals(
+ $label,
+ $options[$optionOrderNum]->getLabel(),
+ "Label for option #{$optionOrderNum} does not match expected."
+ );
+ }
+ } catch (LocalizedException $e) {
+ $this->fail('Test failed with exception on attribute model load: ' . $e);
+ }
+ }
+}
diff --git a/dev/tests/js/jasmine/tests/app/code/Magento/Catalog/frontend/js/product/remaining-characters.test.js b/dev/tests/js/jasmine/tests/app/code/Magento/Catalog/frontend/js/product/remaining-characters.test.js
new file mode 100644
index 00000000000..3b64385a889
--- /dev/null
+++ b/dev/tests/js/jasmine/tests/app/code/Magento/Catalog/frontend/js/product/remaining-characters.test.js
@@ -0,0 +1,84 @@
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+/* eslint-disable max-nested-callbacks */
+define([
+ 'Magento_Catalog/js/product/remaining-characters',
+ 'jquery'
+], function (remainingCharacters, $) {
+ 'use strict';
+
+ describe('Magento_Catalog/js/product/remaining-characters', function () {
+ var widget,
+ note;
+
+ beforeEach(function () {
+ widget = $('');
+ note = $('
');
+ $('body').append(widget).append(note);
+
+ widget.remainingCharacters({
+ maxLength: '10',
+ noteSelector: '.note_1',
+ counterSelector: '.note_1 .character-counter'
+ });
+ });
+
+ afterEach(function () {
+ widget.remove();
+ note.remove();
+ });
+
+ describe('Note text is updated on input change', function () {
+ it('check empty input', function () {
+ var testData = {
+ input: '',
+ action: 'change',
+ expectedText: '(10 remaining)'
+ };
+
+ widget.val(testData.input);
+ widget.trigger(testData.action);
+ expect(note.find('.character-counter').text()).toBe(testData.expectedText);
+ });
+
+ it('check input length less than character limit', function () {
+ var testData = {
+ input: 'abc',
+ action: 'change',
+ expectedText: '(7 remaining)'
+ };
+
+ widget.val(testData.input);
+ widget.trigger(testData.action);
+ expect(note.find('.character-counter').text()).toBe(testData.expectedText);
+ });
+
+ it('check input length equals character limit', function () {
+ var testData = {
+ input: 'abcdefghij',
+ action: 'paste',
+ expectedText: '(0 remaining)'
+ };
+
+ widget.val(testData.input);
+ widget.trigger(testData.action);
+ expect(note.find('.character-counter').text()).toBe(testData.expectedText);
+ });
+
+ it('check input length greater than character limit', function () {
+ var testData = {
+ input: 'abcdefghijkl',
+ action: 'change',
+ expectedText: '(2 too many)'
+ };
+
+ widget.val(testData.input);
+ widget.trigger(testData.action);
+ expect(note.find('.character-counter').text()).toBe(testData.expectedText);
+ });
+ });
+ });
+});
diff --git a/dev/tests/js/jasmine/tests/app/code/Magento/Rule/view/adminhtml/web/conditions-data-normalizer.test.js b/dev/tests/js/jasmine/tests/app/code/Magento/Rule/view/adminhtml/web/conditions-data-normalizer.test.js
index 21c04d098ae..ec820e53778 100644
--- a/dev/tests/js/jasmine/tests/app/code/Magento/Rule/view/adminhtml/web/conditions-data-normalizer.test.js
+++ b/dev/tests/js/jasmine/tests/app/code/Magento/Rule/view/adminhtml/web/conditions-data-normalizer.test.js
@@ -65,5 +65,17 @@ define([
expect(normal.foo['1'].value).toEqual(123);
expect(normal.foo['1--1']).toEqual(321);
});
+
+ it('Check keys containing a dot are normalized', function () {
+ var normal = normalizer.normalize({
+ 'foo[1][name.foo]': 'bar',
+ 'foo[1][value.foo]': 123,
+ 'foo[1--1]': 321
+ });
+
+ expect(normal.foo['1']['name.foo']).toEqual('bar');
+ expect(normal.foo['1']['value.foo']).toEqual(123);
+ expect(normal.foo['1--1']).toEqual(321);
+ });
});
});
diff --git a/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/form/client.test.js b/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/form/client.test.js
index d3b5072a767..24dc5356385 100644
--- a/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/form/client.test.js
+++ b/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/form/client.test.js
@@ -114,6 +114,7 @@ define([
$.ajax = jasmine.createSpy().and.callFake(function (req) {
request = req.success;
});
+ jQueryMethods.notification = $.fn.notification;
$.fn.notification = jasmine.createSpy();
obj.urls.beforeSave = 'requestPath';
obj.save();
diff --git a/dev/tests/js/jasmine/tests/lib/mage/backend/bootstrap.test.js b/dev/tests/js/jasmine/tests/lib/mage/backend/bootstrap.test.js
index 396b62df0df..60115c4ac2c 100644
--- a/dev/tests/js/jasmine/tests/lib/mage/backend/bootstrap.test.js
+++ b/dev/tests/js/jasmine/tests/lib/mage/backend/bootstrap.test.js
@@ -2,45 +2,35 @@
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
-/* global jQuery */
/* eslint-disable max-nested-callbacks */
define([
'jquery',
- 'squire',
- 'mage/backend/notification'
-], function ($, Squire) {
+ 'mage/backend/bootstrap'
+], function ($) {
'use strict';
- var injector = new Squire();
-
describe('mage/backend/bootstrap', function () {
- beforeEach(function (done) {
- injector.require(['mage/backend/bootstrap'], function () {
- done();
- });
+ var $pageMainActions;
+
+ beforeEach(function () {
+ $pageMainActions = $('');
});
afterEach(function () {
- try {
- injector.clean();
- injector.remove();
- } catch (e) {}
+ $pageMainActions.remove();
});
describe('"sendPostponeRequest" method', function () {
- it('should insert "Error" notification if request failed', function (done) {
- jQuery('').appendTo('body');
- jQuery('body').notification();
+ it('should insert "Error" notification if request failed', function () {
+ $pageMainActions.appendTo('body');
+ $('body').notification();
- jQuery.ajax().abort();
+ $.ajaxSettings.error();
- setTimeout(function () {
- expect(jQuery('.message-error').length).toBe(1);
- expect(
- jQuery('body:contains("A technical problem with the server created an error")').length
- ).toBe(1);
- done();
- }, 1);
+ expect($('.message-error').length).toBe(1);
+ expect(
+ $('body:contains("A technical problem with the server created an error")').length
+ ).toBe(1);
});
});
});
diff --git a/dev/tests/static/framework/Magento/TestFramework/Utility/ChangedFiles.php b/dev/tests/static/framework/Magento/TestFramework/Utility/ChangedFiles.php
index 6470bc0c220..3d7f5f2604d 100644
--- a/dev/tests/static/framework/Magento/TestFramework/Utility/ChangedFiles.php
+++ b/dev/tests/static/framework/Magento/TestFramework/Utility/ChangedFiles.php
@@ -32,7 +32,7 @@ public static function getPhpFiles($changedFilesList, $fileTypes = 0)
$fileUtilities = Files::init();
if (isset($_ENV['INCREMENTAL_BUILD'])) {
$phpFiles = [];
- foreach (glob($changedFilesList) as $listFile) {
+ foreach (glob($changedFilesList, GLOB_NOSORT) as $listFile) {
$phpFiles = array_merge($phpFiles, file($listFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES));
}
array_walk(
diff --git a/dev/tests/static/testsuite/Magento/Test/Integrity/HhvmCompatibilityTest.php b/dev/tests/static/testsuite/Magento/Test/Integrity/HhvmCompatibilityTest.php
index e33b771b3c6..c552e0daa97 100644
--- a/dev/tests/static/testsuite/Magento/Test/Integrity/HhvmCompatibilityTest.php
+++ b/dev/tests/static/testsuite/Magento/Test/Integrity/HhvmCompatibilityTest.php
@@ -47,6 +47,24 @@ class HhvmCompatibilityTest extends \PHPUnit\Framework\TestCase
'serialize_precision',
];
+ /**
+ * Whitelist of variables allowed in files.
+ *
+ * @var array
+ */
+ private $whitelistVarsInFiles = [
+ 'max_input_vars' => [
+ 'integration/testsuite/Magento/Swatches/Controller/Adminhtml/Product/AttributeTest.php',
+ 'integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/AttributeTest.php',
+ ]
+ ];
+
+ /**
+ * Test allowed directives.
+ *
+ * @SuppressWarnings(PHPMD.NPathComplexity)
+ * @SuppressWarnings(PHPMD.CyclomaticComplexity)
+ */
public function testAllowedIniGetSetDirectives()
{
$deniedDirectives = [];
@@ -55,7 +73,19 @@ public function testAllowedIniGetSetDirectives()
if ($fileDirectives) {
$fileDeniedDirectives = array_diff($fileDirectives, $this->allowedDirectives);
if ($fileDeniedDirectives) {
- $deniedDirectives[$file] = array_unique($fileDeniedDirectives);
+ $deniedDirectivesInFile = array_unique($fileDeniedDirectives);
+ foreach ($deniedDirectivesInFile as $key => $deniedDirective) {
+ if (isset($this->whitelistVarsInFiles[$deniedDirective])) {
+ foreach ($this->whitelistVarsInFiles[$deniedDirective] as $whitelistFile) {
+ if (strpos($file, $whitelistFile) !== false) {
+ unset($deniedDirectivesInFile[$key]);
+ }
+ }
+ }
+ }
+ if ($deniedDirectivesInFile) {
+ $deniedDirectives[$file] = $deniedDirectivesInFile;
+ }
}
}
}
diff --git a/dev/tests/static/testsuite/Magento/Test/Integrity/Xml/SchemaTest.php b/dev/tests/static/testsuite/Magento/Test/Integrity/Xml/SchemaTest.php
index 8048925a4e5..5877ee5cbcc 100644
--- a/dev/tests/static/testsuite/Magento/Test/Integrity/Xml/SchemaTest.php
+++ b/dev/tests/static/testsuite/Magento/Test/Integrity/Xml/SchemaTest.php
@@ -106,7 +106,9 @@ private function _filterSpecialCases(&$files)
'#etc/countries.xml$#',
'#conf/schema.xml$#',
'#layout/swagger_index_index.xml$#',
- '#Doc/etc/doc/vars.xml$#'
+ '#Doc/etc/doc/vars.xml$#',
+ '#phpunit.xml$#',
+ '#etc/db_schema.xml$#'
];
foreach ($list as $pattern) {
foreach ($files as $key => $value) {
diff --git a/dev/tests/static/testsuite/Magento/Test/Js/_files/blacklist/magento.txt b/dev/tests/static/testsuite/Magento/Test/Js/_files/blacklist/magento.txt
index 83b061c9f3b..181ecd43ce5 100644
--- a/dev/tests/static/testsuite/Magento/Test/Js/_files/blacklist/magento.txt
+++ b/dev/tests/static/testsuite/Magento/Test/Js/_files/blacklist/magento.txt
@@ -14,3 +14,6 @@ lib/web/mage/adminhtml/varienLoader.js
lib/web/magnifier/magnifier.js
lib/web/magnifier/magnify.js
lib/web/varien/js.js
+
+// MINIFIED FILES
+app/code/**/*.min.js
diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/copyright/blacklist.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/copyright/blacklist.php
index f7f2df95974..4ff5d001389 100644
--- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/copyright/blacklist.php
+++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/copyright/blacklist.php
@@ -7,5 +7,6 @@
'/\.(jpe?g|png|gif|ttf|swf|eot|woff|pdf|mp3|pdf|jar|jbf|php\.dist)$/',
'/pub\/opt\/magento\/var/',
'/COPYING\.txt/',
- '/setup\/src\/Zend\/Mvc\/Controller\/LazyControllerAbstractFactory\.php/'
+ '/setup\/src\/Zend\/Mvc\/Controller\/LazyControllerAbstractFactory\.php/',
+ '/app\/code\/(?!Magento)[^\/]*/'
];
diff --git a/dev/tools/UpgradeScripts/pre_composer_update_2.3.php b/dev/tools/UpgradeScripts/pre_composer_update_2.3.php
new file mode 100644
index 00000000000..6fe629e717b
--- /dev/null
+++ b/dev/tools/UpgradeScripts/pre_composer_update_2.3.php
@@ -0,0 +1,414 @@
+#!/usr/bin/php
+' [--composer='']
+ [--edition=''] [--repo=''] [--version='']
+ [--help]
+
+Required:
+ --root=''
+ Path to the Magento installation root directory
+
+Optional:
+ --composer=''
+ Path to the composer executable
+ - Default: The composer found in the system PATH
+
+ --edition=''
+ Target Magento edition for the update. Open Source = 'community', Commerce = 'enterprise'
+ - Default: The edition currently required in composer.json
+
+ --repo=''
+ The Magento repository url to use to pull the new packages
+ - Default: The Magento repository configured in composer.json
+
+ --version=''
+ A composer version constraint for allowable 2.3 packages. Versions other than 2.3 are not handled by this script
+ See https://getcomposer.org/doc/articles/versions.md#writing-version-constraints for more information.
+ - Default: The latest 2.3 version available in the Magento repository
+
+ --help
+ Display this message
+SYNOPSIS
+);
+
+$opts = getopt('', [
+ 'root:',
+ 'composer:',
+ 'edition:',
+ 'repo:',
+ 'version:',
+ 'help'
+]);
+
+// Log levels available for use with output() function
+define('INFO', 0);
+define('WARN', 1);
+define('ERROR', 2);
+
+if (isset($opts['help'])) {
+ output(SYNOPSIS);
+ exit(0);
+}
+
+try {
+ if (version_compare(PHP_VERSION, '7.1', '<') || version_compare(PHP_VERSION, '7.3', '>=')) {
+ preg_match('/^\d+\.\d+\.\d+/',PHP_VERSION, $matches);
+ $phpVersion = $matches[0];
+ throw new Exception("Invalid PHP version '$phpVersion'. Magento 2.3 requires PHP 7.1 or 7.2");
+ }
+
+ /**** Populate and Validate Settings ****/
+
+ if (empty($opts['root']) || !is_dir($opts['root'])) {
+ throw new BadMethodCallException('Existing Magento root directory must be supplied with --root');
+ }
+ $rootDir = $opts['root'];
+
+ $composerFile = "$rootDir/composer.json";
+ if (!file_exists($composerFile)) {
+ throw new InvalidArgumentException("Supplied Magento root directory '$rootDir' does not contain composer.json");
+ }
+
+ $composerData = json_decode(file_get_contents($composerFile), true);
+
+ $metapackageMatcher = '/^magento\/product\-(?community|enterprise)\-edition$/';
+ foreach (array_keys($composerData['require']) as $requiredPackage) {
+ if (preg_match($metapackageMatcher, $requiredPackage, $matches)) {
+ $edition = $matches['edition'];
+ break;
+ }
+ }
+ if (empty($edition)) {
+ throw new InvalidArgumentException("No Magento metapackage found in $composerFile");
+ }
+
+ // Override composer.json edition if one is passed to the script
+ if (!empty($opts['edition'])) {
+ $edition = $opts['edition'];
+ }
+ $edition = strtolower($edition);
+
+ if ($edition !== 'community' && $edition !== 'enterprise') {
+ throw new InvalidArgumentException("Only 'community' and 'enterprise' editions allowed; '$edition' given");
+ }
+
+ $composerExec = (!empty($opts['composer']) ? $opts['composer'] : 'composer');
+ if (basename($composerExec, '.phar') != 'composer') {
+ throw new InvalidArgumentException("'$composerExec' is not a composer executable");
+ }
+
+ // Use 'command -v' to check if composer is executable
+ exec("command -v $composerExec", $out, $composerFailed);
+ if ($composerFailed) {
+ if ($composerExec == 'composer') {
+ $message = 'Composer executable is not available in the system PATH';
+ }
+ else {
+ $message = "Invalid composer executable '$composerExec'";
+ }
+ throw new InvalidArgumentException($message);
+ }
+
+ // The composer command uses the Magento root as the working directory so this script can be run from anywhere
+ $composerExec = "$composerExec --working-dir='$rootDir'";
+
+ // Set the version constraint to any 2.3 package if not specified
+ $constraint = !empty($opts['version']) ? $opts['version'] : '2.3.*';
+
+ // Composer package names
+ $project = "magento/project-$edition-edition";
+ $metapackage = "magento/product-$edition-edition";
+
+ // Get the list of potential Magento repositories to search for the update package
+ $mageUrls = [];
+ $authFailed = [];
+ if (!empty($opts['repo'])) {
+ $mageUrls[] = $opts['repo'];
+ }
+ else {
+ foreach ($composerData['repositories'] as $label => $repo) {
+ if (strpos(strtolower($label), 'mage') !== false || strpos($repo['url'], '.mage') !== false) {
+ $mageUrls[] = $repo['url'];
+ }
+ }
+
+ if (count($mageUrls) == 0) {
+ throw new InvalidArgumentException('No Magento repository urls found in composer.json');
+ }
+ }
+
+ $tempDir = findUnusedFilename($rootDir, 'temp_project');
+ $projectConstraint = "$project='$constraint'";
+ $version = null;
+ $description = null;
+
+ output("**** Searching for a matching version of $project ****");
+
+ // Try to retrieve a 2.3 package from each Magento repository until one is found
+ foreach ($mageUrls as $repoUrl) {
+ try {
+ output("\\nChecking $repoUrl");
+ deleteFilepath($tempDir);
+ runComposer("create-project --repository=$repoUrl $projectConstraint $tempDir --no-install");
+
+ // Make sure the downloaded package is 2.3
+ $newComposer = json_decode(file_get_contents("$tempDir/composer.json"), true);
+ $version = $newComposer['version'];
+ $description = $newComposer['description'];
+
+ if (strpos($version, '2.3.') !== 0) {
+ throw new InvalidArgumentException("Bad 2.3 version constraint '$constraint'; version $version found");
+ }
+
+ // If no errors occurred, set this as the correct repo, forget errors from previous repos, and move forward
+ output("\\n**** Found compatible $project version: $version ****");
+ $repo = $repoUrl;
+ unset($exception);
+ break;
+ }
+ catch (Exception $e) {
+ // If this repository doesn't have a valid package, save the error but continue checking any others
+ output("Failed to find a valid 2.3 $project package on $repoUrl", WARN);
+ $exception = $e;
+ }
+ }
+
+ // If a valid project package hasn't been found, throw the last error
+ if (isset($exception)) {
+ throw $exception;
+ }
+
+ output("\\n**** Executing Updates ****");
+
+ $composerBackup = findUnusedFilename($rootDir, 'composer.json.bak');
+ output("\\nBacking up $composerFile to $composerBackup");
+ copy($composerFile, $composerBackup);
+
+ // Add the repository to composer.json if needed without overwriting any existing ones
+ $repoUrls = array_map(function ($r) { return $r['url']; }, $composerData['repositories']);
+ if (!in_array($repo, $repoUrls)) {
+ $repoLabels = array_map('strtolower',array_keys($composerData['repositories']));
+ $newLabel = 'magento';
+ if (in_array($newLabel, $repoLabels)) {
+ $count = count($repoLabels);
+ for ($i = 1; $i <= $count; $i++) {
+ if (!in_array("$newLabel-$i", $repoLabels)) {
+ $newLabel = "$newLabel-$i";
+ break;
+ }
+ }
+ }
+ output("\\nAdding $repo to composer repositories under label '$newLabel'");
+ runComposer("config repositories.$newLabel composer $repo");
+ }
+
+ output("\\nUpdating Magento metapackage requirement to $metapackage=$version");
+ if ($edition == 'enterprise') {
+ // Community -> Enterprise upgrades need to remove the community edition metapackage
+ runComposer('remove magento/product-community-edition --no-update');
+ output('');
+ }
+ runComposer("require $metapackage=$version --no-update");
+
+ output('\nUpdating "require-dev" section of composer.json');
+ runComposer('require --dev ' .
+ 'phpunit/phpunit:~6.2.0 ' .
+ 'friendsofphp/php-cs-fixer:~2.10.1 ' .
+ 'lusitanian/oauth:~0.8.10 ' .
+ 'pdepend/pdepend:2.5.2 ' .
+ 'sebastian/phpcpd:~3.0.0 ' .
+ 'squizlabs/php_codesniffer:3.2.2 --no-update');
+ output('');
+ runComposer('remove --dev sjparkinson/static-review fabpot/php-cs-fixer --no-update');
+
+ output('\nAdding "Zend\\\\Mvc\\\\Controller\\\\": "setup/src/Zend/Mvc/Controller/" to "autoload": "psr-4"');
+ $composerData['autoload']['psr-4']['Zend\\Mvc\\Controller\\'] = 'setup/src/Zend/Mvc/Controller/';
+
+ if (preg_match('/^magento\/project\-(community|enterprise)\-edition$/', $composerData['name'])) {
+ output('\nUpdating project name, version, and description');
+ $composerData['name'] = $project;
+ $composerData['version'] = $version;
+ $composerData['description'] = $description;
+ }
+
+ file_put_contents($composerFile, json_encode($composerData, JSON_UNESCAPED_SLASHES|JSON_PRETTY_PRINT));
+
+ // Update Magento/Updater if it's installed
+ $updateDir = "$rootDir/update";
+ if (file_exists($updateDir)) {
+ $updateBackup = findUnusedFilename($rootDir, 'update.bak');
+ output("\\nBacking up Magento/Updater directory $updateDir to $updateBackup");
+ rename($updateDir, $updateBackup);
+ output('\nUpdating Magento/Updater');
+ rename("$tempDir/update", $updateDir);
+ }
+
+ // Remove temp project directory that was used for repo/version validation and new source for Magento/Updater
+ deleteFilepath($tempDir);
+
+ output("\\n**** Script Complete! $composerFile updated to Magento version $version ****");
+ if (count($authFailed) > 0) {
+ output('Repository authentication failures occurred!', WARN);
+ output(' * Failed authentication could result in incorrect package versions', WARN);
+ output(' * To resolve, add credentials for the repositories to auth.json', WARN);
+ output(' * URL(s) failing authentication: ' . join(', ', array_keys($authFailed)), WARN);
+ }
+} catch (Exception $e) {
+ if ($e->getPrevious()) {
+ $e = $e->getPrevious();
+ }
+
+ try {
+ output($e->getMessage(), ERROR, get_class($e));
+ output('Script failed! See usage information with --help', ERROR);
+
+ if (isset($composerBackup) && file_exists($composerBackup)) {
+ output("Resetting $composerFile backup");
+ deleteFilepath($composerFile);
+ rename($composerBackup, $composerFile);
+ }
+ if (isset($updateBackup) && file_exists($updateBackup)) {
+ output("Resetting $updateDir backup");
+ deleteFilepath($updateDir);
+ rename($updateBackup, $updateDir);
+ }
+ if (isset($tempDir) && file_exists($tempDir)) {
+ output('Removing temporary project directory');
+ deleteFilepath($tempDir);
+ }
+ }
+ catch (Exception $e2) {
+ output($e2->getMessage(), ERROR, get_class($e2));
+ output('Backup restoration or directory cleanup failed', ERROR);
+ }
+
+ exit($e->getCode() == 0 ? 1 : $e->getCode());
+}
+
+/**
+ * Gets a variant of a filename that doesn't already exist so we don't overwrite anything
+ *
+ * @param string $dir
+ * @param string $filename
+ * @return string
+ */
+function findUnusedFilename($dir, $filename) {
+ $unique = "$dir/$filename";
+ if (file_exists($unique)) {
+ $unique = tempnam($dir, "$filename.");
+ unlink($unique);
+ }
+ return $unique;
+}
+
+/**
+ * Execute a composer command, reload $composerData afterwards, and check for repo authentication warnings
+ *
+ * @param string $command
+ * @return array Command output split by lines
+ * @throws RuntimeException
+ */
+function runComposer($command)
+{
+ global $composerExec, $composerData, $composerFile, $authFailed;
+ $command = "$composerExec $command --no-interaction";
+ output(" Running command:\\n $command");
+ exec("$command 2>&1", $lines, $exitCode);
+ $output = ' ' . join('\n ', $lines);
+
+ // Reload composer object from the updated composer.json
+ $composerData = json_decode(file_get_contents($composerFile), true);
+
+ if (0 !== $exitCode) {
+ $output = "Error encountered running command:\\n $command\\n$output";
+ throw new RuntimeException($output, $exitCode);
+ }
+ output($output);
+
+ if (strpos($output, 'URL required authentication.') !== false) {
+ preg_match("/'(https?:\/\/)?(?[^\/']+)(\/[^']*)?' URL required authentication/", $output, $matches);
+ $authUrl = $matches['url'];
+ $authFailed[$authUrl] = 1;
+ output("Repository authentication failed; make sure '$authUrl' exists in auth.json", WARN);
+ }
+
+ return $lines;
+}
+
+/**
+ * Deletes a file or a directory and all its contents
+ *
+ * @param string $path
+ * @throws Exception
+ */
+function deleteFilepath($path) {
+ if (!file_exists($path)) {
+ return;
+ }
+ if (is_dir($path)) {
+ $files = array_diff(scandir($path), array('..', '.'));
+ foreach ($files as $file) {
+ deleteFilepath("$path/$file");
+ }
+ rmdir($path);
+ }
+ else {
+ unlink($path);
+ }
+ if (file_exists($path)) {
+ throw new Exception("Failed to delete $path");
+ }
+}
+
+/**
+ * Logs the given text with \n newline replacement and log level formatting
+ *
+ * @param string $string Text to log
+ * @param int $level One of INFO, WARN, or ERROR
+ * @param string $label Optional message label; defaults to WARNING for $level = WARN and ERROR for $level = ERROR
+ */
+function output($string, $level = INFO, $label = '') {
+ $string = str_replace('\n', PHP_EOL, $string);
+
+ if (!empty($label)) {
+ $label = "$label: ";
+ }
+ else if ($level == WARN) {
+ $label = 'WARNING: ';
+ }
+ else if ($level == ERROR) {
+ $label = 'ERROR: ';
+ }
+ $string = "$label$string";
+
+ if ($level == WARN) {
+ error_log($string);
+ }
+ elseif ($level == ERROR) {
+ error_log(PHP_EOL . $string);
+ }
+ else {
+ echo $string . PHP_EOL;
+ }
+}
diff --git a/dev/tools/grunt/tools/collect-validation-files.js b/dev/tools/grunt/tools/collect-validation-files.js
index a7bf4a2c67a..15fb5e50be0 100644
--- a/dev/tools/grunt/tools/collect-validation-files.js
+++ b/dev/tools/grunt/tools/collect-validation-files.js
@@ -3,10 +3,6 @@
* See COPYING.txt for license details.
*/
-/**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
'use strict';
var glob = require('glob'),
@@ -29,8 +25,8 @@ module.exports = {
getFilesForValidate: function () {
var blackListFiles = glob.sync(pc.static.blacklist + '*.txt'),
whiteListFiles = glob.sync(pc.static.whitelist + '*.txt'),
- blackList = this.readFiles(blackListFiles),
- whiteList = this.readFiles(whiteListFiles),
+ blackList = this.readFiles(blackListFiles).filter(this.isListEntryValid),
+ whiteList = this.readFiles(whiteListFiles).filter(this.isListEntryValid),
files = [],
entireBlackList = [];
@@ -45,6 +41,11 @@ module.exports = {
return files;
},
+ isListEntryValid: function(line) {
+ line = line.trim();
+ return line.length > 0 && line.startsWith('// ') !== true;
+ },
+
getFiles: function (file) {
if (file) {
return file.split(',');
diff --git a/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessor/FilterProcessor.php b/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessor/FilterProcessor.php
index b663a3a2f73..c9f10c183b5 100644
--- a/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessor/FilterProcessor.php
+++ b/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessor/FilterProcessor.php
@@ -72,6 +72,15 @@ private function addFilterGroupToCollection(
if (!$isApplied) {
$condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq';
$fields[] = $this->getFieldMapping($filter->getField());
+
+ if ($condition === 'fulltext') {
+ // NOTE: This is not a fulltext search, but the best way to search something when
+ // a SearchCriteria with "fulltext" condition is provided over a MySQL table
+ // (see https://github.com/magento-engcom/msi/issues/1221)
+ $condition = 'like';
+ $filter->setValue('%' . $filter->getValue() . '%');
+ }
+
$conditions[] = [$condition => $filter->getValue()];
}
}
diff --git a/lib/internal/Magento/Framework/App/Utility/Files.php b/lib/internal/Magento/Framework/App/Utility/Files.php
index 7e8d79eead7..b0dfc50e9f9 100644
--- a/lib/internal/Magento/Framework/App/Utility/Files.php
+++ b/lib/internal/Magento/Framework/App/Utility/Files.php
@@ -392,7 +392,7 @@ public function getMainConfigFiles($asDataSet = true)
$configXmlPaths = array_merge($globPaths, $configXmlPaths);
$files = [];
foreach ($configXmlPaths as $xmlPath) {
- $files = array_merge($files, glob($xmlPath));
+ $files = array_merge($files, glob($xmlPath, GLOB_NOSORT));
}
self::$_cache[$cacheKey] = $files;
}
diff --git a/lib/internal/Magento/Framework/Archive/Tar.php b/lib/internal/Magento/Framework/Archive/Tar.php
index ccf9838d664..e2a070503f6 100644
--- a/lib/internal/Magento/Framework/Archive/Tar.php
+++ b/lib/internal/Magento/Framework/Archive/Tar.php
@@ -252,7 +252,7 @@ protected function _createTar($skipRoot = false, $finalize = false)
$file = $this->_getCurrentFile();
if (is_dir($file)) {
- $dirFiles = scandir($file);
+ $dirFiles = scandir($file, SCANDIR_SORT_NONE);
if (false === $dirFiles) {
throw new \Magento\Framework\Exception\LocalizedException(
diff --git a/lib/internal/Magento/Framework/Backup/Test/Unit/_files/app_dirs_rollback.php b/lib/internal/Magento/Framework/Backup/Test/Unit/_files/app_dirs_rollback.php
index 7a9814bcd69..5d4f18037d0 100644
--- a/lib/internal/Magento/Framework/Backup/Test/Unit/_files/app_dirs_rollback.php
+++ b/lib/internal/Magento/Framework/Backup/Test/Unit/_files/app_dirs_rollback.php
@@ -15,7 +15,7 @@
}
}
-$files = glob(TESTS_TEMP_DIR . '/Magento/Backup/data/*');
+$files = glob(TESTS_TEMP_DIR . '/Magento/Backup/data/*', GLOB_NOSORT);
foreach ($files as $file) {
unlink($file);
}
diff --git a/lib/internal/Magento/Framework/Data/Collection/Filesystem.php b/lib/internal/Magento/Framework/Data/Collection/Filesystem.php
index 67d2a020864..330ff4e975e 100644
--- a/lib/internal/Magento/Framework/Data/Collection/Filesystem.php
+++ b/lib/internal/Magento/Framework/Data/Collection/Filesystem.php
@@ -243,7 +243,7 @@ protected function _collectRecursive($dir)
$dir = [$dir];
}
foreach ($dir as $folder) {
- if ($nodes = glob($folder . '/*')) {
+ if ($nodes = glob($folder . '/*', GLOB_NOSORT)) {
foreach ($nodes as $node) {
$collectedResult[] = $node;
}
diff --git a/lib/internal/Magento/Framework/Data/SearchResultProcessor.php b/lib/internal/Magento/Framework/Data/SearchResultProcessor.php
index 9cbee9c0e67..561a3c66ebc 100644
--- a/lib/internal/Magento/Framework/Data/SearchResultProcessor.php
+++ b/lib/internal/Magento/Framework/Data/SearchResultProcessor.php
@@ -188,8 +188,8 @@ public function toArray($arrRequiredFields = [])
}
/**
- * @param null $valueField
- * @param null $labelField
+ * @param string|null $valueField
+ * @param string|null $labelField
* @param array $additional
* @return array
*/
diff --git a/lib/internal/Magento/Framework/Filesystem/Io/File.php b/lib/internal/Magento/Framework/Filesystem/Io/File.php
index 7849fdf3103..c1cfebc7a0a 100644
--- a/lib/internal/Magento/Framework/Filesystem/Io/File.php
+++ b/lib/internal/Magento/Framework/Filesystem/Io/File.php
@@ -366,7 +366,7 @@ protected static function _recursiveCallback($dir, array $fileCallback, array $d
$dirCallback = $fileCallback;
}
if (is_dir($dir)) {
- foreach (scandir($dir) as $item) {
+ foreach (scandir($dir, SCANDIR_SORT_NONE) as $item) {
if (!strcmp($item, '.') || !strcmp($item, '..')) {
continue;
}
diff --git a/lib/internal/Magento/Framework/Validator/Test/Unit/ConfigTest.php b/lib/internal/Magento/Framework/Validator/Test/Unit/ConfigTest.php
index 213a71c0087..67170953766 100644
--- a/lib/internal/Magento/Framework/Validator/Test/Unit/ConfigTest.php
+++ b/lib/internal/Magento/Framework/Validator/Test/Unit/ConfigTest.php
@@ -51,7 +51,7 @@ public function testConstructException()
protected function _initConfig(array $files = null)
{
if (null === $files) {
- $files = glob(__DIR__ . '/_files/validation/positive/*/validation.xml');
+ $files = glob(__DIR__ . '/_files/validation/positive/*/validation.xml', GLOB_NOSORT);
}
$configFiles = [];
foreach ($files as $path) {
diff --git a/lib/web/css/docs/source/docs.less b/lib/web/css/docs/source/docs.less
index 4039d0562da..952beb5c0f9 100644
--- a/lib/web/css/docs/source/docs.less
+++ b/lib/web/css/docs/source/docs.less
@@ -21,7 +21,6 @@
@import '_icons.less';
@import '_loaders.less';
@import '_messages.less';
-//@import 'navigation.less';
@import '_layout.less';
@import '_pages.less';
@import '_popups.less';
diff --git a/lib/web/css/source/lib/_buttons.less b/lib/web/css/source/lib/_buttons.less
index 679c4b11fba..a92093b7429 100644
--- a/lib/web/css/source/lib/_buttons.less
+++ b/lib/web/css/source/lib/_buttons.less
@@ -276,6 +276,9 @@
// ---------------------------------------------
.lib-button-primary(
+ @_button-font-family: @button-primary__font-family,
+ @_button-font-size: @button-primary__font-size,
+ @_button-font-weight: @button-primary__font-weight,
@_button-line-height: @button-primary__line-height,
@_button-width: @button-primary__width,
@_button-margin: @button-primary__margin,
@@ -299,6 +302,9 @@
@_button-gradient-direction: @button-primary__gradient-direction
) {
.lib-button(
+ @_button-font-family: @_button-font-family,
+ @_button-font-size: @_button-font-size,
+ @_button-font-weight: @_button-font-weight,
@_button-line-height: @_button-line-height,
@_button-width: @_button-width,
@_button-margin: @_button-margin,
diff --git a/lib/web/css/source/lib/variables/_buttons.less b/lib/web/css/source/lib/variables/_buttons.less
index 82f618faa1d..8c31c161438 100644
--- a/lib/web/css/source/lib/variables/_buttons.less
+++ b/lib/web/css/source/lib/variables/_buttons.less
@@ -47,6 +47,9 @@
@button__active__gradient-color-end: false;
// Primary button
+@button-primary__font-family: @button__font-family;
+@button-primary__font-size: @button__font-size;
+@button-primary__font-weight: @button__font-weight;
@button-primary__line-height: false;
@button-primary__width: false;
@button-primary__margin: false;
diff --git a/lib/web/mage/adminhtml/form.js b/lib/web/mage/adminhtml/form.js
index e136e8c0f73..487c71484e4 100644
--- a/lib/web/mage/adminhtml/form.js
+++ b/lib/web/mage/adminhtml/form.js
@@ -389,7 +389,7 @@ define([
var idTo, idFrom, values, fromId, radioFrom;
if (config) {
- this._config = config;
+ this._config = jQuery.extend(this._config, config);
}
for (idTo in elementsMap) { //eslint-disable-line guard-for-in
diff --git a/lib/web/mage/apply/scripts.js b/lib/web/mage/apply/scripts.js
index f35e9a2140e..bf211c38adb 100644
--- a/lib/web/mage/apply/scripts.js
+++ b/lib/web/mage/apply/scripts.js
@@ -14,7 +14,7 @@ define([
virtuals = [];
/**
- * Adds components to the virtula list.
+ * Adds components to the virtual list.
*
* @param {Object} components
*/
diff --git a/lib/web/mage/backend/suggest.js b/lib/web/mage/backend/suggest.js
index 412a80804ae..d34be104209 100644
--- a/lib/web/mage/backend/suggest.js
+++ b/lib/web/mage/backend/suggest.js
@@ -65,7 +65,8 @@
inputWrapper: '',
dropdownWrapper: '',
preventClickPropagation: true,
- currentlySelected: null
+ currentlySelected: null,
+ submitInputOnEnter: true
},
/**
@@ -79,7 +80,6 @@
label: ''
};
this.templates = {};
-
this._renderedContext = null;
this._selectedItem = this._nonSelectedItem;
this._control = this.options.controls || {};
@@ -312,11 +312,12 @@
click: this.search
}, this.options.events));
+ this._bindSubmit();
this._bindDropdown();
},
/**
- * @param {Object} event - event object
+ * @param {Object} event
* @private
*/
_toggleEnter: function (event) {
@@ -324,6 +325,10 @@
activeItems,
selectedItem;
+ if (!this.options.submitInputOnEnter) {
+ event.preventDefault();
+ }
+
suggestList = $(event.currentTarget.parentNode).find('ul').first();
activeItems = suggestList.find('._active');
@@ -333,12 +338,22 @@
if (selectedItem.find('a') && selectedItem.find('a').attr('href') !== undefined) {
window.location = selectedItem.find('a').attr('href');
event.preventDefault();
-
- return false;
}
}
},
+ /**
+ * Bind handlers for submit on enter
+ * @private
+ */
+ _bindSubmit: function () {
+ this.element.parents('form').on('submit', function (event) {
+ if (!this.submitInputOnEnter) {
+ event.preventDefault();
+ }
+ });
+ },
+
/**
* @param {Object} e - event object
* @private
@@ -465,8 +480,8 @@
}
if (this._trigger('beforeselect', e || null, {
- item: this._focused
- }) === false) {
+ item: this._focused
+ }) === false) {
return;
}
this._selectItem(e);
@@ -701,9 +716,6 @@
if ($.isArray(o.source)) {
response(this.filter(o.source, term));
} else if ($.type(o.source) === 'string') {
- if (this._xhr) {
- this._xhr.abort();
- }
ajaxData = {};
ajaxData[this.options.termAjaxArgument] = term;
@@ -729,10 +741,6 @@
_abortSearch: function () {
this.element.removeClass(this.options.loadingClass);
clearTimeout(this._searchTimeout);
-
- if (this._xhr) {
- this._xhr.abort();
- }
},
/**
@@ -905,8 +913,8 @@
'<' +
'label class="mage-suggest-search-label">',
choiceTemplate: '<%- text %>
' +
- '',
+ '',
selectedClass: 'mage-suggest-selected'
},
diff --git a/setup/performance-toolkit/benchmark.jmx b/setup/performance-toolkit/benchmark.jmx
index 2155f774b1e..0b46a4d5c94 100644
--- a/setup/performance-toolkit/benchmark.jmx
+++ b/setup/performance-toolkit/benchmark.jmx
@@ -39857,7 +39857,7 @@ adminUserList.add(vars.get("admin_user"));
false
- {"query":"{\n products(\n filter: {\n price: {gt: \"10\"}\n or: {\n sku:{like:\"%Product%\"}\n name:{like:\"%Configurable Product%\"}\n }\n }\n pageSize: 200\n currentPage: 1\n sort: {\n price: ASC\n name:DESC\n }\n ) {\n total_count\n items {\n attribute_set_id\n country_of_manufacture\n created_at\n description\n gift_message_available\n image\n image_label\n meta_description\n meta_keyword\n meta_title\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n short_description\n sku\n small_image\n small_image_label\n special_from_date\n special_price\n special_to_date\n swatch_image\n tax_class_id\n thumbnail\n thumbnail_label\n tier_price\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n \t... on PhysicalProductInterface {\n \tweight\n \t}\n }\n page_info {\n page_size\n current_page\n }\n }\n}\n","variables":null,"operationName":null}
+ {"query":"{\n products(\n filter: {\n price: {gt: \"10\"}\n or: {\n sku:{like:\"%Product%\"}\n name:{like:\"%Configurable Product%\"}\n }\n }\n pageSize: 200\n currentPage: 1\n sort: {\n price: ASC\n name:DESC\n }\n ) {\n total_count\n items {\n attribute_set_id\n country_of_manufacture\n created_at\n description\n gift_message_available\n image\n image_label\n meta_description\n meta_keyword\n meta_title\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n short_description\n sku\n small_image\n small_image_label\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n thumbnail_label\n tier_price\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n \t... on PhysicalProductInterface {\n \tweight\n \t}\n }\n page_info {\n page_size\n current_page\n }\n }\n}\n","variables":null,"operationName":null}
=
@@ -39914,7 +39914,7 @@ adminUserList.add(vars.get("admin_user"));
false
- {"query":"{\n products(filter: {sku: { eq: \"${simple_product_sku}\" } })\n {\n total_count\n items {\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description\n gift_message_available\n id\n image\n image_label\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description\n sku\n small_image\n small_image_label\n special_from_date\n special_price\n special_to_date\n swatch_image\n tax_class_id\n thumbnail\n thumbnail_label\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on PhysicalProductInterface {\n \t\t\tweight\n \t\t }\n }\n }\n}\n","variables":null,"operationName":null}
+ {"query":"{\n products(filter: {sku: { eq: \"${simple_product_sku}\" } })\n {\n total_count\n items {\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description\n gift_message_available\n id\n image\n image_label\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description\n sku\n small_image\n small_image_label\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n thumbnail_label\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on PhysicalProductInterface {\n \t\t\tweight\n \t\t }\n }\n }\n}\n","variables":null,"operationName":null}
=
@@ -39990,7 +39990,7 @@ if (totalCount == null) {
false
- {"query":"{\n products(filter: {sku: {eq:\"${configurable_product_sku}\"} }) {\n total_count\n items {\n ... on PhysicalProductInterface {\n weight\n }\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description\n gift_message_available\n id\n image\n image_label\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description\n sku\n small_image\n small_image_label\n special_from_date\n special_price\n special_to_date\n swatch_image\n tax_class_id\n thumbnail\n thumbnail_label\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on ConfigurableProduct {\n configurable_options {\n id\n attribute_id\n label\n position\n use_default\n attribute_code\n values {\n value_index\n label\n store_label\n default_label\n use_default_value\n }\n product_id\n }\n variants {\n product {\n ... on PhysicalProductInterface {\n weight\n }\n sku\n color\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description\n gift_message_available\n id\n image\n image_label\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description\n sku\n small_image\n small_image_label\n special_from_date\n special_price\n special_to_date\n swatch_image\n tax_class_id\n thumbnail\n thumbnail_label\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n\n\n }\n attributes {\n label\n code\n value_index\n }\n }\n }\n }\n }\n}\n","variables":null,"operationName":null}
+ {"query":"{\n products(filter: {sku: {eq:\"${configurable_product_sku}\"} }) {\n total_count\n items {\n ... on PhysicalProductInterface {\n weight\n }\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description\n gift_message_available\n id\n image\n image_label\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description\n sku\n small_image\n small_image_label\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n thumbnail_label\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on ConfigurableProduct {\n configurable_options {\n id\n attribute_id\n label\n position\n use_default\n attribute_code\n values {\n value_index\n label\n store_label\n default_label\n use_default_value\n }\n product_id\n }\n variants {\n product {\n ... on PhysicalProductInterface {\n weight\n }\n sku\n color\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description\n gift_message_available\n id\n image\n image_label\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description\n sku\n small_image\n small_image_label\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n thumbnail_label\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n\n\n }\n attributes {\n label\n code\n value_index\n }\n }\n }\n }\n }\n}\n","variables":null,"operationName":null}
=
@@ -40059,7 +40059,7 @@ if (totalCount == null) {
false
- {"query":"{\n products(\n search: \"configurable\"\n filter: {price: {gteq: \"1\"} }\n ) {\n total_count\n items {\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description\n gift_message_available\n id\n image\n image_label\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description\n sku\n small_image\n small_image_label\n special_from_date\n special_price\n special_to_date\n swatch_image\n tax_class_id\n thumbnail\n thumbnail_label\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on PhysicalProductInterface {\n \t\t\tweight\n \t\t\t}\n ... on ConfigurableProduct {\n configurable_options {\n id\n attribute_id\n label\n position\n use_default\n attribute_code\n values {\n value_index\n label\n store_label\n default_label\n use_default_value\n }\n product_id\n }\n variants {\n product {\n ... on PhysicalProductInterface {\n weight\n }\n sku\n color\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description\n gift_message_available\n id\n image\n image_label\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description\n sku\n small_image\n small_image_label\n special_from_date\n special_price\n special_to_date\n swatch_image\n tax_class_id\n thumbnail\n thumbnail_label\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n\n\n }\n attributes {\n label\n code\n value_index\n }\n }\n }\n }\n }\n}\n","variables":null,"operationName":null}
+ {"query":"{\n products(\n search: \"configurable\"\n filter: {price: {gteq: \"1\"} }\n ) {\n total_count\n items {\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description\n gift_message_available\n id\n image\n image_label\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description\n sku\n small_image\n small_image_label\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n thumbnail_label\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on PhysicalProductInterface {\n \t\t\tweight\n \t\t\t}\n ... on ConfigurableProduct {\n configurable_options {\n id\n attribute_id\n label\n position\n use_default\n attribute_code\n values {\n value_index\n label\n store_label\n default_label\n use_default_value\n }\n product_id\n }\n variants {\n product {\n ... on PhysicalProductInterface {\n weight\n }\n sku\n color\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description\n gift_message_available\n id\n image\n image_label\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description\n sku\n small_image\n small_image_label\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n thumbnail_label\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n\n\n }\n attributes {\n label\n code\n value_index\n }\n }\n }\n }\n }\n}\n","variables":null,"operationName":null}
=
@@ -40119,7 +40119,7 @@ if (totalCount == null) {
false
- {"query":"{\n products(search: \"configurable\") {\n total_count\n items {\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description\n gift_message_available\n id\n image\n image_label\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description\n sku\n small_image\n small_image_label\n special_from_date\n special_price\n special_to_date\n swatch_image\n tax_class_id\n thumbnail\n thumbnail_label\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on PhysicalProductInterface {\n \t\t\tweight\n \t\t\t}\n ... on ConfigurableProduct {\n configurable_options {\n id\n attribute_id\n label\n position\n use_default\n attribute_code\n values {\n value_index\n label\n store_label\n default_label\n use_default_value\n }\n product_id\n }\n variants {\n product {\n ... on PhysicalProductInterface {\n weight\n }\n sku\n color\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description\n gift_message_available\n id\n image\n image_label\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description\n sku\n small_image\n small_image_label\n special_from_date\n special_price\n special_to_date\n swatch_image\n tax_class_id\n thumbnail\n thumbnail_label\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n\n\n }\n attributes {\n label\n code\n value_index\n }\n }\n }\n }\n }\n}\n","variables":null,"operationName":null}
+ {"query":"{\n products(search: \"configurable\") {\n total_count\n items {\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description\n gift_message_available\n id\n image\n image_label\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description\n sku\n small_image\n small_image_label\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n thumbnail_label\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on PhysicalProductInterface {\n \t\t\tweight\n \t\t\t}\n ... on ConfigurableProduct {\n configurable_options {\n id\n attribute_id\n label\n position\n use_default\n attribute_code\n values {\n value_index\n label\n store_label\n default_label\n use_default_value\n }\n product_id\n }\n variants {\n product {\n ... on PhysicalProductInterface {\n weight\n }\n sku\n color\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description\n gift_message_available\n id\n image\n image_label\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description\n sku\n small_image\n small_image_label\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n thumbnail_label\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n\n\n }\n attributes {\n label\n code\n value_index\n }\n }\n }\n }\n }\n}\n","variables":null,"operationName":null}
=
@@ -40179,7 +40179,7 @@ if (totalCount == null) {
false
- {"query":"{\n products(search: \"color\") {\n filters {\n name\n filter_items_count\n request_var\n filter_items {\n label\n value_string\n items_count\n ... on SwatchLayerFilterItemInterface {\n swatch_data {\n type\n value\n }\n }\n }\n }\n total_count\n items {\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description\n gift_message_available\n id\n image\n image_label\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description\n sku\n small_image\n small_image_label\n special_from_date\n special_price\n special_to_date\n swatch_image\n tax_class_id\n thumbnail\n thumbnail_label\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on PhysicalProductInterface {\n weight\n }\n ... on ConfigurableProduct {\n configurable_options {\n id\n attribute_id\n label\n position\n use_default\n attribute_code\n values {\n value_index\n label\n store_label\n default_label\n use_default_value\n }\n product_id\n }\n variants {\n product {\n ... on PhysicalProductInterface {\n weight\n }\n sku\n color\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description\n gift_message_available\n id\n image\n image_label\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description\n sku\n small_image\n small_image_label\n special_from_date\n special_price\n special_to_date\n swatch_image\n tax_class_id\n thumbnail\n thumbnail_label\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n\n\n }\n attributes {\n label\n code\n value_index\n }\n }\n }\n }\n }\n}","variables":null,"operationName":null}
+ {"query":"{\n products(search: \"color\") {\n filters {\n name\n filter_items_count\n request_var\n filter_items {\n label\n value_string\n items_count\n ... on SwatchLayerFilterItemInterface {\n swatch_data {\n type\n value\n }\n }\n }\n }\n total_count\n items {\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description\n gift_message_available\n id\n image\n image_label\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description\n sku\n small_image\n small_image_label\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n thumbnail_label\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on PhysicalProductInterface {\n weight\n }\n ... on ConfigurableProduct {\n configurable_options {\n id\n attribute_id\n label\n position\n use_default\n attribute_code\n values {\n value_index\n label\n store_label\n default_label\n use_default_value\n }\n product_id\n }\n variants {\n product {\n ... on PhysicalProductInterface {\n weight\n }\n sku\n color\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description\n gift_message_available\n id\n image\n image_label\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description\n sku\n small_image\n small_image_label\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n thumbnail_label\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n\n\n }\n attributes {\n label\n code\n value_index\n }\n }\n }\n }\n }\n}","variables":null,"operationName":null}
=
@@ -40239,7 +40239,7 @@ if (totalCount == null) {
false
- {"query":"{\nproducts(filter: {sku: {eq:\"${bundle_product_sku}\"} }) {\n total_count\n items {\n ... on PhysicalProductInterface {\n weight\n }\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description\n gift_message_available\n id\n image\n image_label\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description\n sku\n small_image\n small_image_label\n special_from_date\n special_price\n special_to_date\n swatch_image\n tax_class_id\n thumbnail\n thumbnail_label\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on BundleProduct {\n weight\n price_view\n dynamic_price\n dynamic_sku\n ship_bundle_items\n dynamic_weight\n items {\n option_id\n title\n required\n type\n position\n sku\n options {\n id\n qty\n position\n is_default\n price\n price_type\n can_change_quantity\n product {\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description\n gift_message_available\n id\n image\n image_label\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description\n sku\n small_image\n small_image_label\n special_from_date\n special_price\n special_to_date\n swatch_image\n tax_class_id\n thumbnail\n thumbnail_label\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n }\n }\n }\n }\n }\n }\n}\n","variables":null,"operationName":null}
+ {"query":"{\nproducts(filter: {sku: {eq:\"${bundle_product_sku}\"} }) {\n total_count\n items {\n ... on PhysicalProductInterface {\n weight\n }\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description\n gift_message_available\n id\n image\n image_label\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description\n sku\n small_image\n small_image_label\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n thumbnail_label\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on BundleProduct {\n weight\n price_view\n dynamic_price\n dynamic_sku\n ship_bundle_items\n dynamic_weight\n items {\n option_id\n title\n required\n type\n position\n sku\n options {\n id\n qty\n position\n is_default\n price\n price_type\n can_change_quantity\n product {\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description\n gift_message_available\n id\n image\n image_label\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description\n sku\n small_image\n small_image_label\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n thumbnail_label\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n }\n }\n }\n }\n }\n }\n}\n","variables":null,"operationName":null}
=
@@ -40308,7 +40308,7 @@ if (totalCount == null) {
false
- {"query":"{\n products(filter: {sku: { eq: \"${downloadable_product_sku}\" } })\n {\n total_count\n items {\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description\n gift_message_available\n id\n image\n image_label\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description\n sku\n small_image\n small_image_label\n special_from_date\n special_price\n special_to_date\n swatch_image\n tax_class_id\n thumbnail\n thumbnail_label\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on PhysicalProductInterface {\n \t\t\tweight\n \t\t }\n ... on DownloadableProduct {\n links_purchased_separately\n links_title\n downloadable_product_samples {\n id\n title\n sort_order\n sample_type\n sample_file\n sample_url\n }\n downloadable_product_links {\n id\n title\n sort_order\n is_shareable\n price\n number_of_downloads\n link_type\n sample_type\n sample_file\n sample_url\n }\n }\n }\n }\n}\n","variables":null,"operationName":null}
+ {"query":"{\n products(filter: {sku: { eq: \"${downloadable_product_sku}\" } })\n {\n total_count\n items {\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description\n gift_message_available\n id\n image\n image_label\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description\n sku\n small_image\n small_image_label\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n thumbnail_label\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on PhysicalProductInterface {\n \t\t\tweight\n \t\t }\n ... on DownloadableProduct {\n links_purchased_separately\n links_title\n downloadable_product_samples {\n id\n title\n sort_order\n sample_type\n sample_file\n sample_url\n }\n downloadable_product_links {\n id\n title\n sort_order\n is_shareable\n price\n number_of_downloads\n link_type\n sample_type\n sample_file\n sample_url\n }\n }\n }\n }\n}\n","variables":null,"operationName":null}
=
@@ -40395,7 +40395,7 @@ if (totalCount == null) {
false
- {"query":"{\n products(filter: {sku: { eq: \"${virtual_product_sku}\" } })\n {\n total_count\n items {\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description\n gift_message_available\n id\n image\n image_label\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description\n sku\n small_image\n small_image_label\n special_from_date\n special_price\n special_to_date\n swatch_image\n tax_class_id\n thumbnail\n thumbnail_label\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on PhysicalProductInterface {\n \t\t\tweight\n \t\t }\n }\n }\n}\n","variables":null,"operationName":null}
+ {"query":"{\n products(filter: {sku: { eq: \"${virtual_product_sku}\" } })\n {\n total_count\n items {\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description\n gift_message_available\n id\n image\n image_label\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description\n sku\n small_image\n small_image_label\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n thumbnail_label\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on PhysicalProductInterface {\n \t\t\tweight\n \t\t }\n }\n }\n}\n","variables":null,"operationName":null}
=
@@ -40462,7 +40462,7 @@ if (totalCount == null) {
false
- {"query":"{\nproducts(filter: {sku: {eq:\"${grouped_product_sku}\"} }) {\n total_count\n items {\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description\n gift_message_available\n id\n image\n image_label\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description\n sku\n small_image\n small_image_label\n special_from_date\n special_price\n special_to_date\n swatch_image\n tax_class_id\n thumbnail\n thumbnail_label\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on GroupedProduct {\n weight\n items {\n qty\n position\n product {\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description\n gift_message_available\n id\n image\n image_label\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description\n sku\n small_image\n small_image_label\n special_from_date\n special_price\n special_to_date\n swatch_image\n tax_class_id\n thumbnail\n thumbnail_label\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n }\n }\n }\n }\n }\n}\n","variables":null,"operationName":null}
+ {"query":"{\nproducts(filter: {sku: {eq:\"${grouped_product_sku}\"} }) {\n total_count\n items {\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description\n gift_message_available\n id\n image\n image_label\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description\n sku\n small_image\n small_image_label\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n thumbnail_label\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on GroupedProduct {\n weight\n items {\n qty\n position\n product {\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description\n gift_message_available\n id\n image\n image_label\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description\n sku\n small_image\n small_image_label\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n thumbnail_label\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n }\n }\n }\n }\n }\n}\n","variables":null,"operationName":null}
=
diff --git a/setup/src/Magento/Setup/Fixtures/FixtureModel.php b/setup/src/Magento/Setup/Fixtures/FixtureModel.php
index 104c9cb3432..99237e48748 100644
--- a/setup/src/Magento/Setup/Fixtures/FixtureModel.php
+++ b/setup/src/Magento/Setup/Fixtures/FixtureModel.php
@@ -105,7 +105,7 @@ public function reindex(OutputInterface $output)
*/
public function loadFixtures()
{
- $files = glob(__DIR__ . DIRECTORY_SEPARATOR . self::FIXTURE_PATTERN);
+ $files = glob(__DIR__ . DIRECTORY_SEPARATOR . self::FIXTURE_PATTERN, GLOB_NOSORT);
foreach ($files as $file) {
$file = basename($file, '.php');