').text($.mage.__('Sending swatch values as package.')));
+ });
+ });
});
window.saveAttributeInNewSet = swatchProductAttributes.saveAttributeInNewSet;
diff --git a/app/code/Magento/Tax/Model/Sales/Total/Quote/Tax.php b/app/code/Magento/Tax/Model/Sales/Total/Quote/Tax.php
index de884be6bc839..4aea7ab4c5a7c 100755
--- a/app/code/Magento/Tax/Model/Sales/Total/Quote/Tax.php
+++ b/app/code/Magento/Tax/Model/Sales/Total/Quote/Tax.php
@@ -152,12 +152,23 @@ protected function clearValues(Address\Total $total)
$total->setBaseTotalAmount('subtotal', 0);
$total->setTotalAmount('tax', 0);
$total->setBaseTotalAmount('tax', 0);
+ $total->setTotalAmount('shipping', 0);
+ $total->setBaseTotalAmount('shipping', 0);
$total->setTotalAmount('discount_tax_compensation', 0);
$total->setBaseTotalAmount('discount_tax_compensation', 0);
$total->setTotalAmount('shipping_discount_tax_compensation', 0);
$total->setBaseTotalAmount('shipping_discount_tax_compensation', 0);
$total->setSubtotalInclTax(0);
$total->setBaseSubtotalInclTax(0);
+ $total->setShippingInclTax(0);
+ $total->setBaseShippingInclTax(0);
+ $total->setShippingTaxAmount(0);
+ $total->setBaseShippingTaxAmount(0);
+ $total->setShippingAmountForDiscount(0);
+ $total->setBaseShippingAmountForDiscount(0);
+ $total->setBaseShippingAmountForDiscount(0);
+ $total->setTotalAmount('extra_tax', 0);
+ $total->setBaseTotalAmount('extra_tax', 0);
}
/**
diff --git a/app/code/Magento/Theme/view/adminhtml/web/favicon.ico b/app/code/Magento/Theme/view/adminhtml/web/favicon.ico
index 1cb7c7713718b..d467f2bcbaed4 100644
Binary files a/app/code/Magento/Theme/view/adminhtml/web/favicon.ico and b/app/code/Magento/Theme/view/adminhtml/web/favicon.ico differ
diff --git a/app/code/Magento/Theme/view/frontend/web/favicon.ico b/app/code/Magento/Theme/view/frontend/web/favicon.ico
index 1cb7c7713718b..d467f2bcbaed4 100644
Binary files a/app/code/Magento/Theme/view/frontend/web/favicon.ico and b/app/code/Magento/Theme/view/frontend/web/favicon.ico differ
diff --git a/app/code/Magento/Theme/view/install/web/favicon.ico b/app/code/Magento/Theme/view/install/web/favicon.ico
index 1cb7c7713718b..d467f2bcbaed4 100644
Binary files a/app/code/Magento/Theme/view/install/web/favicon.ico and b/app/code/Magento/Theme/view/install/web/favicon.ico differ
diff --git a/app/code/Magento/Tinymce3/view/base/web/tiny_mce/classes/Formatter.js b/app/code/Magento/Tinymce3/view/base/web/tiny_mce/classes/Formatter.js
index 0cbca75ec504b..5f05d3f3015ad 100644
--- a/app/code/Magento/Tinymce3/view/base/web/tiny_mce/classes/Formatter.js
+++ b/app/code/Magento/Tinymce3/view/base/web/tiny_mce/classes/Formatter.js
@@ -445,7 +445,7 @@
childCount = getChildCount(node);
// Remove empty nodes but only if there is multiple wrappers and they are not block
- // elements so never remove single
since that would remove the currrent empty block element where the caret is at
+ // elements so never remove single
since that would remove the current empty block element where the caret is at
if ((newWrappers.length > 1 || !isBlock(node)) && childCount === 0) {
dom.remove(node, 1);
return;
diff --git a/app/code/Magento/Tinymce3/view/base/web/tiny_mce/classes/dom/DOMUtils.js b/app/code/Magento/Tinymce3/view/base/web/tiny_mce/classes/dom/DOMUtils.js
index 783dbea1cacb9..eb8b4b7ab5d78 100644
--- a/app/code/Magento/Tinymce3/view/base/web/tiny_mce/classes/dom/DOMUtils.js
+++ b/app/code/Magento/Tinymce3/view/base/web/tiny_mce/classes/dom/DOMUtils.js
@@ -1106,7 +1106,7 @@
/**
* Returns a unique id. This can be useful when generating elements on the fly.
- * This method will not check if the element allready exists.
+ * This method will not check if the element already exists.
*
* @method uniqueId
* @param {String} p Optional prefix to add infront of all ids defaults to "mce_".
diff --git a/app/code/Magento/Tinymce3/view/base/web/tiny_mce/tiny_mce_jquery_src.js b/app/code/Magento/Tinymce3/view/base/web/tiny_mce/tiny_mce_jquery_src.js
index b16d0e3ffdbb4..2daf1620a918e 100644
--- a/app/code/Magento/Tinymce3/view/base/web/tiny_mce/tiny_mce_jquery_src.js
+++ b/app/code/Magento/Tinymce3/view/base/web/tiny_mce/tiny_mce_jquery_src.js
@@ -14451,7 +14451,7 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', {
childCount = getChildCount(node);
// Remove empty nodes but only if there is multiple wrappers and they are not block
- // elements so never remove single
since that would remove the currrent empty block element where the caret is at
+ // elements so never remove single
since that would remove the current empty block element where the caret is at
if ((newWrappers.length > 1 || !isBlock(node)) && childCount === 0) {
dom.remove(node, 1);
return;
diff --git a/app/code/Magento/Tinymce3/view/base/web/tiny_mce/tiny_mce_prototype_src.js b/app/code/Magento/Tinymce3/view/base/web/tiny_mce/tiny_mce_prototype_src.js
index 1c7b76cf75c8b..44b3010b0adfd 100644
--- a/app/code/Magento/Tinymce3/view/base/web/tiny_mce/tiny_mce_prototype_src.js
+++ b/app/code/Magento/Tinymce3/view/base/web/tiny_mce/tiny_mce_prototype_src.js
@@ -15301,7 +15301,7 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', {
childCount = getChildCount(node);
// Remove empty nodes but only if there is multiple wrappers and they are not block
- // elements so never remove single
since that would remove the currrent empty block element where the caret is at
+ // elements so never remove single
since that would remove the current empty block element where the caret is at
if ((newWrappers.length > 1 || !isBlock(node)) && childCount === 0) {
dom.remove(node, 1);
return;
diff --git a/app/code/Magento/Tinymce3/view/base/web/tiny_mce/tiny_mce_src.js b/app/code/Magento/Tinymce3/view/base/web/tiny_mce/tiny_mce_src.js
index a1ce5c5d8c32f..46ba27e60f419 100644
--- a/app/code/Magento/Tinymce3/view/base/web/tiny_mce/tiny_mce_src.js
+++ b/app/code/Magento/Tinymce3/view/base/web/tiny_mce/tiny_mce_src.js
@@ -15275,7 +15275,7 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', {
childCount = getChildCount(node);
// Remove empty nodes but only if there is multiple wrappers and they are not block
- // elements so never remove single
since that would remove the currrent empty block element where the caret is at
+ // elements so never remove single
since that would remove the current empty block element where the caret is at
if ((newWrappers.length > 1 || !isBlock(node)) && childCount === 0) {
dom.remove(node, 1);
return;
diff --git a/app/code/Magento/Ui/DataProvider/AbstractDataProvider.php b/app/code/Magento/Ui/DataProvider/AbstractDataProvider.php
index 971da30d1009a..578ebe4d441d9 100644
--- a/app/code/Magento/Ui/DataProvider/AbstractDataProvider.php
+++ b/app/code/Magento/Ui/DataProvider/AbstractDataProvider.php
@@ -292,6 +292,6 @@ public function setConfigData($config)
*/
public function getAllIds()
{
- return $this->collection->getAllIds();
+ return $this->getCollection()->getAllIds();
}
}
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 af2b31f7eab43..6c9b4b89bec7a 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/Service/V1/Data/UrlRewrite.php b/app/code/Magento/UrlRewrite/Service/V1/Data/UrlRewrite.php
index 195c0fc10dc07..38025f21cdab1 100644
--- a/app/code/Magento/UrlRewrite/Service/V1/Data/UrlRewrite.php
+++ b/app/code/Magento/UrlRewrite/Service/V1/Data/UrlRewrite.php
@@ -79,7 +79,7 @@ public function getUrlRewriteId()
/**
* @param int $urlRewriteId
- * @return int
+ * @return $this
*/
public function setUrlRewriteId($urlRewriteId)
{
diff --git a/app/code/Magento/User/Model/Backend/Config/ObserverConfig.php b/app/code/Magento/User/Model/Backend/Config/ObserverConfig.php
index c1b7e6a1110f7..6d921dfdcdd65 100644
--- a/app/code/Magento/User/Model/Backend/Config/ObserverConfig.php
+++ b/app/code/Magento/User/Model/Backend/Config/ObserverConfig.php
@@ -72,7 +72,7 @@ public function getAdminPasswordLifetime()
}
/**
- * Get admin maxiumum security failures from config
+ * Get admin maximum security failures from config
*
* @return int
*/
diff --git a/app/code/Magento/Vault/etc/db_schema.xml b/app/code/Magento/Vault/etc/db_schema.xml
index 6975369145776..ed1f2adba2142 100644
--- a/app/code/Magento/Vault/etc/db_schema.xml
+++ b/app/code/Magento/Vault/etc/db_schema.xml
@@ -30,12 +30,12 @@
-
+
-
+
diff --git a/app/code/Magento/Vault/etc/db_schema_whitelist.json b/app/code/Magento/Vault/etc/db_schema_whitelist.json
index 256bfcb458c7e..9b5e740fd16e8 100644
--- a/app/code/Magento/Vault/etc/db_schema_whitelist.json
+++ b/app/code/Magento/Vault/etc/db_schema_whitelist.json
@@ -16,7 +16,9 @@
"constraint": {
"PRIMARY": true,
"VAULT_PAYMENT_TOKEN_CUSTOMER_ID_CUSTOMER_ENTITY_ENTITY_ID": true,
+ "VAULT_PAYMENT_TOKEN_PAYMENT_METHOD_CODE_CSTR_ID_GATEWAY_TOKEN": true,
"UNQ_54DCE14AEAEA03B587F9EF723EB10A10": true,
+ "VAULT_PAYMENT_TOKEN_PUBLIC_HASH": true,
"VAULT_PAYMENT_TOKEN_HASH_UNIQUE_INDEX_PUBLIC_HASH": true
}
},
@@ -31,4 +33,4 @@
"FK_4ED894655446D385894580BECA993862": true
}
}
-}
\ No newline at end of file
+}
diff --git a/app/code/Magento/Webapi/Controller/Soap.php b/app/code/Magento/Webapi/Controller/Soap.php
index 32e1cdb9c888d..215ae4752aa1d 100644
--- a/app/code/Magento/Webapi/Controller/Soap.php
+++ b/app/code/Magento/Webapi/Controller/Soap.php
@@ -51,6 +51,11 @@ class Soap implements \Magento\Framework\App\FrontControllerInterface
*/
protected $_errorProcessor;
+ /**
+ * @var \Magento\Framework\App\State
+ */
+ protected $_appState;
+
/**
* @var \Magento\Framework\Locale\ResolverInterface
*/
diff --git a/app/code/Magento/Webapi/Controller/Soap/Request/Handler.php b/app/code/Magento/Webapi/Controller/Soap/Request/Handler.php
index 72cbbe7481cfa..486275ac69dc5 100644
--- a/app/code/Magento/Webapi/Controller/Soap/Request/Handler.php
+++ b/app/code/Magento/Webapi/Controller/Soap/Request/Handler.php
@@ -107,7 +107,7 @@ public function __construct(
*
* @param string $operation
* @param array $arguments
- * @return \stdClass|null
+ * @return array
* @throws WebapiException
* @throws \LogicException
* @throws AuthorizationException
diff --git a/app/code/Magento/Webapi/Model/Authorization/TokenUserContext.php b/app/code/Magento/Webapi/Model/Authorization/TokenUserContext.php
index 94196c9b86534..d89513b50c9c5 100644
--- a/app/code/Magento/Webapi/Model/Authorization/TokenUserContext.php
+++ b/app/code/Magento/Webapi/Model/Authorization/TokenUserContext.php
@@ -132,6 +132,11 @@ private function isTokenExpired(Token $token): bool
// other user-type tokens are considered always valid
return false;
}
+
+ if (empty($tokenTtl)) {
+ return false;
+ }
+
if ($this->dateTime->strToTime($token->getCreatedAt()) < ($this->date->gmtTimestamp() - $tokenTtl * 3600)) {
return true;
}
diff --git a/app/code/Magento/Webapi/Model/Plugin/GuestAuthorization.php b/app/code/Magento/Webapi/Model/Plugin/GuestAuthorization.php
index 4eb8b131e0718..78082fab8bd9c 100644
--- a/app/code/Magento/Webapi/Model/Plugin/GuestAuthorization.php
+++ b/app/code/Magento/Webapi/Model/Plugin/GuestAuthorization.php
@@ -19,7 +19,7 @@ class GuestAuthorization
* Check if resource for which access is needed has anonymous permissions defined in webapi config.
*
* @param \Magento\Framework\Authorization $subject
- * @param callable $proceed
+ * @param \Closure $proceed
* @param string $resource
* @param string $privilege
* @return bool true If resource permission is anonymous,
diff --git a/app/code/Magento/Webapi/Model/Rest/Config.php b/app/code/Magento/Webapi/Model/Rest/Config.php
index 3fd8c640fb3b7..aa5dfdd7a7fd9 100644
--- a/app/code/Magento/Webapi/Model/Rest/Config.php
+++ b/app/code/Magento/Webapi/Model/Rest/Config.php
@@ -21,6 +21,7 @@ class Config
const HTTP_METHOD_DELETE = 'DELETE';
const HTTP_METHOD_PUT = 'PUT';
const HTTP_METHOD_POST = 'POST';
+ const HTTP_METHOD_PATCH = 'PATCH';
/**#@-*/
/**#@+
diff --git a/app/code/Magento/Webapi/Model/Soap/Server.php b/app/code/Magento/Webapi/Model/Soap/Server.php
index aa7a4041ae415..be2dec2860772 100644
--- a/app/code/Magento/Webapi/Model/Soap/Server.php
+++ b/app/code/Magento/Webapi/Model/Soap/Server.php
@@ -31,7 +31,7 @@ class Server
const REQUEST_PARAM_LIST_WSDL = 'wsdl_list';
/**
- * @var \Magento\Framework\App\AreaLIst
+ * @var \Magento\Framework\App\AreaList
*/
protected $_areaList;
diff --git a/app/code/Magento/Webapi/Test/Unit/Model/Soap/FaultTest.php b/app/code/Magento/Webapi/Test/Unit/Model/Soap/FaultTest.php
index 1ac7943fa6484..8d4cd8561520c 100644
--- a/app/code/Magento/Webapi/Test/Unit/Model/Soap/FaultTest.php
+++ b/app/code/Magento/Webapi/Test/Unit/Model/Soap/FaultTest.php
@@ -125,7 +125,7 @@ public function testToXmlDeveloperModeOff()
public function testToXmlDeveloperModeOn()
{
$this->_appStateMock->expects($this->any())->method('getMode')->will($this->returnValue('developer'));
- $actualXml = $this->_soapFault->toXml(true);
+ $actualXml = $this->_soapFault->toXml();
$this->assertContains('', $actualXml, 'Exception trace is not found in XML.');
}
diff --git a/app/code/Magento/WebapiAsync/Controller/Rest/AsynchronousRequestProcessor.php b/app/code/Magento/WebapiAsync/Controller/Rest/AsynchronousRequestProcessor.php
index 02cd70515eb9d..81235e335b8fa 100644
--- a/app/code/Magento/WebapiAsync/Controller/Rest/AsynchronousRequestProcessor.php
+++ b/app/code/Magento/WebapiAsync/Controller/Rest/AsynchronousRequestProcessor.php
@@ -63,7 +63,7 @@ class AsynchronousRequestProcessor implements RequestProcessorInterface
* @param RestResponse $response
* @param InputParamsResolver $inputParamsResolver
* @param MassSchedule $asyncBulkPublisher
- * @param WebapiAsyncConfig $webapiAsyncConfig
+ * @param WebApiAsyncConfig $webapiAsyncConfig
* @param DataObjectProcessor $dataObjectProcessor
* @param AsyncResponseInterfaceFactory $asyncResponse
* @param string $processorPath
diff --git a/app/code/Magento/WebapiAsync/Model/BulkServiceConfig.php b/app/code/Magento/WebapiAsync/Model/BulkServiceConfig.php
index 16f09ef9c5246..4abd8fa4d1439 100644
--- a/app/code/Magento/WebapiAsync/Model/BulkServiceConfig.php
+++ b/app/code/Magento/WebapiAsync/Model/BulkServiceConfig.php
@@ -10,7 +10,6 @@
use Magento\Framework\Serialize\SerializerInterface;
use Magento\Webapi\Model\Cache\Type\Webapi as WebapiCache;
-use Magento\WebapiAsync\Model\ServiceConfig\Converter;
use Magento\Webapi\Model\Config\Converter as WebapiConverter;
use Magento\Webapi\Model\Config;
@@ -42,7 +41,7 @@ class BulkServiceConfig implements \Magento\Webapi\Model\ConfigInterface
* Initialize dependencies.
*
* @param WebapiCache $cache
- * @param Config $configReader
+ * @param Config $webapiConfig
* @param SerializerInterface $serializer
*/
public function __construct(
diff --git a/app/code/Magento/WebapiAsync/Model/ServiceConfig.php b/app/code/Magento/WebapiAsync/Model/ServiceConfig.php
index aec8f905cd034..4c085935090bd 100644
--- a/app/code/Magento/WebapiAsync/Model/ServiceConfig.php
+++ b/app/code/Magento/WebapiAsync/Model/ServiceConfig.php
@@ -20,7 +20,7 @@
*/
class ServiceConfig
{
- const CACHE_ID = 'webapi_async_config';
+ const CACHE_ID = 'webapi_async_service_config';
/**
* @var WebapiCache
@@ -71,7 +71,7 @@ public function getServices()
if ($services && is_string($services)) {
$this->services = $this->serializer->unserialize($services);
} else {
- $this->services = $this->configReader->read()[Converter::KEY_SERVICES] ?? [];
+ $this->services = $this->configReader->read();
$this->cache->save($this->serializer->serialize($this->services), self::CACHE_ID);
}
}
diff --git a/app/code/Magento/WebapiAsync/Model/ServiceConfig/Converter.php b/app/code/Magento/WebapiAsync/Model/ServiceConfig/Converter.php
index 7b9e206aa6532..2c85796a3ab19 100644
--- a/app/code/Magento/WebapiAsync/Model/ServiceConfig/Converter.php
+++ b/app/code/Magento/WebapiAsync/Model/ServiceConfig/Converter.php
@@ -20,8 +20,17 @@ class Converter implements \Magento\Framework\Config\ConverterInterface
const KEY_METHOD = 'method';
const KEY_METHODS = 'methods';
const KEY_SYNCHRONOUS_INVOCATION_ONLY = 'synchronousInvocationOnly';
+ const KEY_ROUTES = 'routes';
/**#@-*/
+ private $allowedRouteMethods = [
+ \Magento\Webapi\Model\Rest\Config::HTTP_METHOD_GET,
+ \Magento\Webapi\Model\Rest\Config::HTTP_METHOD_POST,
+ \Magento\Webapi\Model\Rest\Config::HTTP_METHOD_PUT,
+ \Magento\Webapi\Model\Rest\Config::HTTP_METHOD_DELETE,
+ \Magento\Webapi\Model\Rest\Config::HTTP_METHOD_PATCH
+ ];
+
/**
* {@inheritdoc}
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
@@ -44,6 +53,7 @@ public function convert($source)
$this->initServiceMethodsKey($result, $serviceClass, $serviceMethod);
$this->mergeSynchronousInvocationMethodsData($service, $result, $serviceClass, $serviceMethod);
}
+ $result[self::KEY_ROUTES] = $this->convertRouteCustomizations($source);
return $result;
}
@@ -158,4 +168,68 @@ private function isSynchronousInvocationOnlyTrue(\DOMElement $synchronousInvocat
return filter_var($synchronousInvocationOnlyNode->nodeValue, FILTER_VALIDATE_BOOLEAN);
}
+
+ /**
+ * Convert and merge "route" nodes, which represent route customizations
+ * @param \DOMDocument $source
+ * @return array
+ */
+ private function convertRouteCustomizations($source)
+ {
+ $customRoutes = [];
+ $routes = $source->getElementsByTagName('route');
+ /** @var \DOMElement $route */
+ foreach ($routes as $route) {
+ $routeUrl = $this->getRouteUrl($route);
+ $routeMethod = $this->getRouteMethod($route);
+ $routeAlias = $this->getRouteAlias($route);
+ if ($routeUrl && $routeMethod && $routeAlias) {
+ if (!isset($customRoutes[$routeAlias])) {
+ $customRoutes[$routeAlias] = [];
+ }
+ $customRoutes[$routeAlias][$routeMethod] = $routeUrl;
+ }
+ }
+ return $customRoutes;
+ }
+
+ /**
+ * @param \DOMElement $route
+ * @return null|string
+ */
+ private function getRouteUrl($route)
+ {
+ $url = $route->attributes->getNamedItem('url')->nodeValue;
+ return mb_strlen((string) $url) === 0 ? null : $url;
+ }
+
+ /**
+ * @param \DOMElement $route
+ * @return null|string
+ */
+ private function getRouteAlias($route)
+ {
+ $alias = $route->attributes->getNamedItem('alias')->nodeValue;
+ return mb_strlen((string) $alias) === 0 ? null : ltrim($alias, '/');
+ }
+
+ /**
+ * @param \DOMElement $route
+ * @return null|string
+ */
+ private function getRouteMethod($route)
+ {
+ $method = $route->attributes->getNamedItem('method')->nodeValue;
+ $method = mb_strlen((string) $method) === 0 ? null : $method;
+ return ($this->validateRouteMethod($method)) ? $method : null;
+ }
+
+ /**
+ * @param string $method
+ * @return bool
+ */
+ private function validateRouteMethod($method)
+ {
+ return in_array($method, $this->allowedRouteMethods);
+ }
}
diff --git a/app/code/Magento/WebapiAsync/Model/ServiceConfig/Reader.php b/app/code/Magento/WebapiAsync/Model/ServiceConfig/Reader.php
index 95517463be4f5..b2d5c789286dc 100644
--- a/app/code/Magento/WebapiAsync/Model/ServiceConfig/Reader.php
+++ b/app/code/Magento/WebapiAsync/Model/ServiceConfig/Reader.php
@@ -20,6 +20,7 @@ class Reader extends \Magento\Framework\Config\Reader\Filesystem
*/
protected $_idAttributes = [
'/services/service' => ['class', 'method'],
+ '/services/route' => ['url', 'method']
];
/**
diff --git a/app/code/Magento/WebapiAsync/Plugin/ControllerRest.php b/app/code/Magento/WebapiAsync/Plugin/ControllerRest.php
new file mode 100644
index 0000000000000..b3ba6af8bab60
--- /dev/null
+++ b/app/code/Magento/WebapiAsync/Plugin/ControllerRest.php
@@ -0,0 +1,65 @@
+serviceConfig = $serviceConfig;
+ $this->pathProcessor = $pathProcessor;
+ }
+
+ /**
+ * Apply route customization.
+ * @param \Magento\Webapi\Controller\Rest $subject
+ * @param RequestInterface $request
+ * @return array
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+ */
+ public function beforeDispatch(\Magento\Webapi\Controller\Rest $subject, RequestInterface $request)
+ {
+ $routeCustomizations = $this->serviceConfig->getServices()[Converter::KEY_ROUTES] ?? [];
+ if ($routeCustomizations) {
+ $originPath = $request->getPathInfo();
+ $requestMethod = $request->getMethod();
+ $routePath = ltrim($this->pathProcessor->process($originPath), '/');
+ if (array_key_exists($routePath, $routeCustomizations)) {
+ if (isset($routeCustomizations[$routePath][$requestMethod])) {
+ $path = ltrim($routeCustomizations[$routePath][$requestMethod], '/');
+ $request->setPathInfo(str_replace($routePath, $path, $originPath));
+ }
+ }
+ }
+ return [$request];
+ }
+}
diff --git a/app/code/Magento/WebapiAsync/Plugin/ServiceMetadata.php b/app/code/Magento/WebapiAsync/Plugin/ServiceMetadata.php
index e91fe8b13aafd..c4e5b572b80f9 100644
--- a/app/code/Magento/WebapiAsync/Plugin/ServiceMetadata.php
+++ b/app/code/Magento/WebapiAsync/Plugin/ServiceMetadata.php
@@ -129,7 +129,8 @@ private function getServiceVersions(string $serviceName)
private function getSynchronousOnlyServiceMethods(\Magento\Webapi\Model\ServiceMetadata $serviceMetadata)
{
$synchronousOnlyServiceMethods = [];
- foreach ($this->serviceConfig->getServices() as $service => $serviceData) {
+ $services = $this->serviceConfig->getServices()[Converter::KEY_SERVICES] ?? [];
+ foreach ($services as $service => $serviceData) {
if (!isset($serviceData[Converter::KEY_METHODS])) {
continue;
}
diff --git a/app/code/Magento/WebapiAsync/Test/Unit/Model/ServiceConfig/_files/Converter/webapi_async.php b/app/code/Magento/WebapiAsync/Test/Unit/Model/ServiceConfig/_files/Converter/webapi_async.php
index cbe3b5522f196..43c6da9f6702b 100644
--- a/app/code/Magento/WebapiAsync/Test/Unit/Model/ServiceConfig/_files/Converter/webapi_async.php
+++ b/app/code/Magento/WebapiAsync/Test/Unit/Model/ServiceConfig/_files/Converter/webapi_async.php
@@ -22,4 +22,9 @@
],
],
],
+ 'routes' => [
+ 'asyncProducts' => ['POST' => 'async/V1/products'],
+ 'asyncBulkCmsBlocks' => ['POST' => 'async/bulk/V1/cmsBlock'],
+ 'asyncCustomers' => ['POST' => 'async/V1/customers']
+ ]
];
diff --git a/app/code/Magento/WebapiAsync/Test/Unit/Model/ServiceConfig/_files/Converter/webapi_async.xml b/app/code/Magento/WebapiAsync/Test/Unit/Model/ServiceConfig/_files/Converter/webapi_async.xml
index e4ba6da62339c..be119c7da707d 100644
--- a/app/code/Magento/WebapiAsync/Test/Unit/Model/ServiceConfig/_files/Converter/webapi_async.xml
+++ b/app/code/Magento/WebapiAsync/Test/Unit/Model/ServiceConfig/_files/Converter/webapi_async.xml
@@ -16,4 +16,8 @@
+
+
+
+
diff --git a/app/code/Magento/WebapiAsync/Test/Unit/Model/ServiceConfig/_files/Reader/webapi_async.php b/app/code/Magento/WebapiAsync/Test/Unit/Model/ServiceConfig/_files/Reader/webapi_async.php
index cbe3b5522f196..6938ec27c99b7 100644
--- a/app/code/Magento/WebapiAsync/Test/Unit/Model/ServiceConfig/_files/Reader/webapi_async.php
+++ b/app/code/Magento/WebapiAsync/Test/Unit/Model/ServiceConfig/_files/Reader/webapi_async.php
@@ -22,4 +22,9 @@
],
],
],
+ 'routes' => [
+ 'asyncProducts' => ['POST' => 'async/bulk/V1/products'],
+ 'asyncBulkCmsPages' => ['POST' => 'async/bulk/V1/cmsPage'],
+ 'asyncCustomers' => ['POST' => 'async/V1/customers']
+ ]
];
diff --git a/app/code/Magento/WebapiAsync/Test/Unit/Model/ServiceConfig/_files/Reader/webapi_async_1.xml b/app/code/Magento/WebapiAsync/Test/Unit/Model/ServiceConfig/_files/Reader/webapi_async_1.xml
index 7f816f510ddb6..bd9895c7eef1e 100644
--- a/app/code/Magento/WebapiAsync/Test/Unit/Model/ServiceConfig/_files/Reader/webapi_async_1.xml
+++ b/app/code/Magento/WebapiAsync/Test/Unit/Model/ServiceConfig/_files/Reader/webapi_async_1.xml
@@ -15,4 +15,7 @@
+
+
+
diff --git a/app/code/Magento/WebapiAsync/Test/Unit/Model/ServiceConfig/_files/Reader/webapi_async_2.xml b/app/code/Magento/WebapiAsync/Test/Unit/Model/ServiceConfig/_files/Reader/webapi_async_2.xml
index 7a5bebd8fe566..153e3344ca72b 100644
--- a/app/code/Magento/WebapiAsync/Test/Unit/Model/ServiceConfig/_files/Reader/webapi_async_2.xml
+++ b/app/code/Magento/WebapiAsync/Test/Unit/Model/ServiceConfig/_files/Reader/webapi_async_2.xml
@@ -8,5 +8,5 @@
-
+
diff --git a/app/code/Magento/WebapiAsync/etc/di.xml b/app/code/Magento/WebapiAsync/etc/di.xml
index b9cd7302b7350..83f1d6a78f227 100755
--- a/app/code/Magento/WebapiAsync/etc/di.xml
+++ b/app/code/Magento/WebapiAsync/etc/di.xml
@@ -42,4 +42,7 @@
Magento\WebapiAsync\Controller\Rest\AsynchronousSchemaRequestProcessor::BULK_PROCESSOR_PATH
+
+
+
diff --git a/app/code/Magento/WebapiAsync/etc/webapi_async.xml b/app/code/Magento/WebapiAsync/etc/webapi_async.xml
new file mode 100644
index 0000000000000..109835acadce0
--- /dev/null
+++ b/app/code/Magento/WebapiAsync/etc/webapi_async.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
diff --git a/app/code/Magento/WebapiAsync/etc/webapi_async.xsd b/app/code/Magento/WebapiAsync/etc/webapi_async.xsd
index 468ebd96553b6..c41d9811f2d63 100644
--- a/app/code/Magento/WebapiAsync/etc/webapi_async.xsd
+++ b/app/code/Magento/WebapiAsync/etc/webapi_async.xsd
@@ -8,7 +8,14 @@
*/
-->
-
+
+
+
+
+
+
+
+
@@ -18,10 +25,19 @@
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/code/Magento/Weee/Model/Attribute/Backend/Weee/Tax.php b/app/code/Magento/Weee/Model/Attribute/Backend/Weee/Tax.php
index 11b976a640b07..35835e6c5f63f 100644
--- a/app/code/Magento/Weee/Model/Attribute/Backend/Weee/Tax.php
+++ b/app/code/Magento/Weee/Model/Attribute/Backend/Weee/Tax.php
@@ -185,4 +185,12 @@ public function getTable()
{
return $this->_attributeTax->getTable('weee_tax');
}
+
+ /**
+ * @inheritdoc
+ */
+ public function getEntityIdField()
+ {
+ return $this->_attributeTax->getIdFieldName();
+ }
}
diff --git a/app/code/Magento/Weee/Test/Unit/Model/Attribute/Backend/Weee/TaxTest.php b/app/code/Magento/Weee/Test/Unit/Model/Attribute/Backend/Weee/TaxTest.php
index c264bbca83b78..7170969f5953e 100644
--- a/app/code/Magento/Weee/Test/Unit/Model/Attribute/Backend/Weee/TaxTest.php
+++ b/app/code/Magento/Weee/Test/Unit/Model/Attribute/Backend/Weee/TaxTest.php
@@ -269,4 +269,31 @@ public function testGetTable()
$model->getTable();
}
+
+ /**
+ * Test method GetEntityIdField.
+ *
+ * @return void
+ */
+ public function testGetEntityIdField() : void
+ {
+ $attributeTaxMock = $this->getMockBuilder(\Magento\Weee\Model\ResourceModel\Attribute\Backend\Weee\Tax::class)
+ ->setMethods(['getIdFieldName'])
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $attributeTaxMock
+ ->expects($this->once())
+ ->method('getIdFieldName')
+ ->willReturn(null);
+
+ $model = $this->objectManager->getObject(
+ \Magento\Weee\Model\Attribute\Backend\Weee\Tax::class,
+ [
+ 'attributeTax' => $attributeTaxMock,
+ ]
+ );
+
+ $model->getEntityIdField();
+ }
}
diff --git a/app/code/Magento/Wishlist/CustomerData/Wishlist.php b/app/code/Magento/Wishlist/CustomerData/Wishlist.php
index 85aff60ac6370..eeae07861e22d 100644
--- a/app/code/Magento/Wishlist/CustomerData/Wishlist.php
+++ b/app/code/Magento/Wishlist/CustomerData/Wishlist.php
@@ -149,6 +149,14 @@ protected function getItemData(\Magento\Wishlist\Model\Item $wishlistItem)
*/
protected function getImageData($product)
{
+ /*Set variant product if it is configurable product.
+ It will show variant product image in sidebar instead of configurable product image.*/
+ $simpleOption = $product->getCustomOption('simple_product');
+ if ($simpleOption !== null) {
+ $optionProduct = $simpleOption->getProduct();
+ $product = $optionProduct;
+ }
+
/** @var \Magento\Catalog\Helper\Image $helper */
$helper = $this->imageHelperFactory->create()
->init($product, 'wishlist_sidebar_block');
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 44b6a1568ef9b..82a6f7b2f19bd 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 2e8f06c091265..283054e015fc5 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;
@@ -115,7 +115,7 @@
&._tooltip {
background: transparent;
- margin: 0px 0px 8px 5px;
+ margin: 0 0 8px 5px;
a {
width: 21px;
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 959b37de5a5a1..79e3975a41bc6 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.less b/app/design/frontend/Magento/blank/Magento_Catalog/web/css/source/_module.less
index 2dd8463308a2c..08a9b61977922 100644
--- a/app/design/frontend/Magento/blank/Magento_Catalog/web/css/source/_module.less
+++ b/app/design/frontend/Magento/blank/Magento_Catalog/web/css/source/_module.less
@@ -507,6 +507,16 @@
}
}
+ //
+ // Category page 1 column layout
+ // ---------------------------------------------
+
+ .catalog-category-view.page-layout-1column {
+ .column.main {
+ min-height: inherit;
+ }
+ }
+
}
//
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 e1e23a9ffbb15..3fdd20e34e09a 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
@@ -25,6 +25,7 @@
padding: @block-auth__dropdown__padding;
}
}
+
.authentication-wrapper {
float: right;
margin-top: -1.5*@indent__xl;
@@ -94,7 +95,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 +213,7 @@
margin: 0;
padding: @indent__s 0 0 @indent__xl;
- &::before {
+ &:before {
left: 0;
top: 50%;
}
diff --git a/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/checkout/_estimated-total.less b/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/checkout/_estimated-total.less
index 86df8d870552b..85c65bd0ff2d7 100644
--- a/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/checkout/_estimated-total.less
+++ b/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/checkout/_estimated-total.less
@@ -35,7 +35,11 @@
.action {
&.showcart {
&:before {
- .lib-css(color, @primary__color);
+ .lib-css(color, @button__color);
+ }
+
+ &:hover:before {
+ .lib-css(color, @button__hover__color);
}
}
}
diff --git a/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/checkout/_payment-options.less b/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/checkout/_payment-options.less
index 4e1156949de3a..3ce46a73a11c4 100644
--- a/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/checkout/_payment-options.less
+++ b/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/checkout/_payment-options.less
@@ -198,6 +198,7 @@
.payment-option-title {
.lib-css(padding-left, @checkout-payment-option-content__padding__xl);
}
+
.payment-option-content {
.payment-option-inner {
+ .actions-toolbar {
diff --git a/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/checkout/_shipping.less b/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/checkout/_shipping.less
index e7f0259fc9ce3..0a463a95e3182 100644
--- a/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/checkout/_shipping.less
+++ b/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/checkout/_shipping.less
@@ -188,6 +188,7 @@
}
}
}
+
.row-error {
td {
border-top: none;
@@ -285,6 +286,7 @@
.lib-css(max-width, @checkout-shipping-address__max-width);
}
}
+
.table-checkout-shipping-method {
width: auto;
}
@@ -324,6 +326,7 @@
}
}
}
+
.table-checkout-shipping-method {
min-width: 500px;
}
diff --git a/app/design/frontend/Magento/blank/Magento_GiftRegistry/web/css/source/_module.less b/app/design/frontend/Magento/blank/Magento_GiftRegistry/web/css/source/_module.less
index d05bcec38cbed..03a474012cb0c 100644
--- a/app/design/frontend/Magento/blank/Magento_GiftRegistry/web/css/source/_module.less
+++ b/app/design/frontend/Magento/blank/Magento_GiftRegistry/web/css/source/_module.less
@@ -15,6 +15,7 @@
.actions-toolbar:not(:last-child) {
margin-bottom: @indent__xl;
}
+
.fieldset {
.nested {
.field:not(.choice) {
diff --git a/app/design/frontend/Magento/blank/Magento_Multishipping/web/css/source/_module.less b/app/design/frontend/Magento/blank/Magento_Multishipping/web/css/source/_module.less
index 1e5769f3d7396..66dbb30cb6712 100644
--- a/app/design/frontend/Magento/blank/Magento_Multishipping/web/css/source/_module.less
+++ b/app/design/frontend/Magento/blank/Magento_Multishipping/web/css/source/_module.less
@@ -9,7 +9,8 @@
& when (@media-common = true) {
.multicheckout {
- &.results, &.success {
+ &.results,
+ &.success {
h3 {
font-size: 1.6rem;
margin-bottom: @indent__base;
@@ -33,15 +34,18 @@
.shipping-list {
.shipping-item {
- margin-left:84px;
+ margin-left: 84px;
}
+
.shipping-label {
font-weight: @font-weight__bold;
margin-right: @indent__s;
}
+
.shipping-address {
font-weight: @font-weight__regular;
}
+
.error-block {
color: @color-red10;
@@ -49,6 +53,7 @@
font-weight: @font-weight__bold;
margin-right: @indent__s;
}
+
.error-description {
font-weight: @font-weight__regular;
}
@@ -62,10 +67,11 @@
.shipping-list {
.order-id {
- float:left;
+ float: left;
}
+
.shipping-item {
- margin-left:100px;
+ margin-left: 100px;
}
}
}
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 228c6947c938b..501a1d2918d6a 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
@@ -747,6 +747,16 @@
}
}
}
+
+ //
+ // Category page 1 column layout
+ // ---------------------------------------------
+
+ .catalog-category-view.page-layout-1column {
+ .column.main {
+ min-height: inherit;
+ }
+ }
}
//
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 a8778da50f70b..d0382d34d39fc 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;
}
}
}
diff --git a/app/design/frontend/Magento/luma/Magento_Checkout/web/css/source/module/checkout/_shipping.less b/app/design/frontend/Magento/luma/Magento_Checkout/web/css/source/module/checkout/_shipping.less
index 512751df1cb35..d0ce87beb6ad3 100644
--- a/app/design/frontend/Magento/luma/Magento_Checkout/web/css/source/module/checkout/_shipping.less
+++ b/app/design/frontend/Magento/luma/Magento_Checkout/web/css/source/module/checkout/_shipping.less
@@ -296,6 +296,7 @@
}
}
}
+
.opc-wrapper {
.form-login,
.form-shipping-address {
@@ -307,6 +308,7 @@
padding-bottom: @indent__base;
}
}
+
.table-checkout-shipping-method {
width: auto;
}
@@ -346,6 +348,7 @@
}
}
}
+
.table-checkout-shipping-method {
min-width: 500px;
}
diff --git a/app/design/frontend/Magento/luma/Magento_InstantPurchase/web/css/source/_module.less b/app/design/frontend/Magento/luma/Magento_InstantPurchase/web/css/source/_module.less
index 9877f6bbcea23..9ab5148a87264 100644
--- a/app/design/frontend/Magento/luma/Magento_InstantPurchase/web/css/source/_module.less
+++ b/app/design/frontend/Magento/luma/Magento_InstantPurchase/web/css/source/_module.less
@@ -1,16 +1,21 @@
+// /**
+// * Copyright © Magento, Inc. All rights reserved.
+// * See COPYING.txt for license details.
+// */
+
& when (@media-common = true) {
- .box-tocart {
- .action.instant-purchase {
- &:extend(.abs-button-l all);
- &:extend(.abs-button-responsive all);
+ .box-tocart {
+ .action.instant-purchase {
+ &:extend(.abs-button-l all);
+ &:extend(.abs-button-responsive all);
- &:not(:last-child) {
- margin-bottom: 15px;
- }
+ &:not(:last-child) {
+ margin-bottom: 15px;
+ }
- vertical-align: top;
+ vertical-align: top;
+ }
}
- }
}
//
@@ -18,11 +23,11 @@
// _____________________________________________
.media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) {
- .box-tocart {
- .action.instant-purchase {
- margin-bottom: 0;
- margin-right: 1%;
- width: 49%;
+ .box-tocart {
+ .action.instant-purchase {
+ margin-bottom: 0;
+ margin-right: 1%;
+ width: 49%;
+ }
}
- }
}
diff --git a/app/design/frontend/Magento/luma/Magento_Multishipping/web/css/source/_module.less b/app/design/frontend/Magento/luma/Magento_Multishipping/web/css/source/_module.less
index 03ff1fb09a3e4..7662c60734a1b 100644
--- a/app/design/frontend/Magento/luma/Magento_Multishipping/web/css/source/_module.less
+++ b/app/design/frontend/Magento/luma/Magento_Multishipping/web/css/source/_module.less
@@ -8,285 +8,291 @@
// _____________________________________________
& when (@media-common = true) {
- .multicheckout {
- &.results, &.success {
- h3 {
- font-size: 1.6rem;
- margin-bottom: @indent__base;
- margin-top: @indent__l;
- a {
- color: @text__color;
- &:hover {
- text-decoration: none;
- }
- }
- }
-
- ul.orders-list {
- list-style: none;
- padding-left: 0;
- }
-
- .orders-list {
- margin-top: @indent__m;
- padding-left: @indent__base - 4px;
-
- .shipping-list {
- .shipping-item {
- margin-left:84px;
- }
- .shipping-label {
- font-weight: @font-weight__bold;
- margin-right: @indent__s;
- }
- .shipping-address {
- font-weight: @font-weight__regular;
- }
- .error-block {
- color: @color-red10;
- .error-label {
- font-weight: @font-weight__bold;
- margin-right: @indent__s;
+ .multicheckout {
+ &.results,
+ &.success {
+ h3 {
+ font-size: 1.6rem;
+ margin-bottom: @indent__base;
+ margin-top: @indent__l;
+ a {
+ color: @text__color;
+ &:hover {
+ text-decoration: none;
+ }
}
- .error-description {
- font-weight: @font-weight__regular;
+ }
+
+ ul.orders-list {
+ list-style: none;
+ padding-left: 0;
+ }
+
+ .orders-list {
+ margin-top: @indent__m;
+ padding-left: @indent__base - 4px;
+
+ .shipping-list {
+ .shipping-item {
+ margin-left: 84px;
+ }
+
+ .shipping-label {
+ font-weight: @font-weight__bold;
+ margin-right: @indent__s;
+ }
+
+ .shipping-address {
+ font-weight: @font-weight__regular;
+ }
+
+ .error-block {
+ color: @color-red10;
+
+ .error-label {
+ font-weight: @font-weight__bold;
+ margin-right: @indent__s;
+ }
+
+ .error-description {
+ font-weight: @font-weight__regular;
+ }
+ }
}
- }
}
- }
- .orders-succeed {
- .orders-list {
- margin-top: 0;
+ .orders-succeed {
+ .orders-list {
+ margin-top: 0;
+
+ .shipping-list {
+ .order-id {
+ float: left;
+ }
+ .shipping-item {
+ margin-left: 100px;
+ }
+ }
+ }
+ }
+ }
- .shipping-list {
- .order-id {
- float:left;
- }
- .shipping-item {
- margin-left:100px;
- }
+ .title {
+ margin-bottom: @indent__l;
+
+ strong {
+ font-weight: @font-weight__regular;
}
- }
}
- }
- .title {
- margin-bottom: @indent__l;
+ .table-wrapper {
+ margin-bottom: 0;
- strong {
- font-weight: @font-weight__regular;
- }
- }
+ .action.delete {
+ display: inline-block;
+ }
+
+ .col {
+ .qty {
+ display: inline-block;
+
+ .input-text {
+ &:extend(.abs-input-qty all);
+ }
+ }
- .table-wrapper {
- margin-bottom: 0;
+ .label {
+ &:extend(.abs-visually-hidden all);
+ }
- .action.delete {
- display: inline-block;
- }
+ &.item {
+ .action.edit {
+ font-weight: @font-weight__regular;
+ margin-left: @indent__s;
+ }
+ }
+ }
- .col {
- .qty {
- display: inline-block;
+ .cart-price {
+ &:extend(.abs-checkout-cart-price all);
+ }
- .input-text {
- &:extend(.abs-input-qty all);
- }
+ .product-item-name {
+ &:extend(.abs-checkout-product-name all);
+ }
}
- .label {
- &:extend(.abs-visually-hidden all);
+ &:not(.address) {
+ .table-wrapper {
+ .product-item-name {
+ margin: 0;
+ }
+ }
}
- &.item {
- .action.edit {
- font-weight: @font-weight__regular;
- margin-left: @indent__s;
- }
+ > .actions-toolbar {
+ margin-top: @indent__xl;
}
- }
- .cart-price {
- &:extend(.abs-checkout-cart-price all);
- }
+ .actions-toolbar {
+ > .secondary {
+ display: block;
- .product-item-name {
- &:extend(.abs-checkout-product-name all);
- }
- }
+ .action {
+ margin-bottom: @indent__m;
- &:not(.address) {
- .table-wrapper {
- .product-item-name {
- margin: 0;
- }
- }
- }
+ &.back {
+ display: block;
+ margin-left: 0;
+ }
+ }
+ }
- > .actions-toolbar {
- margin-top: @indent__xl;
- }
+ > .primary {
+ margin-right: @indent__s;
+ }
+ }
- .actions-toolbar {
- > .secondary {
- display: block;
+ .action.primary {
+ &:extend(.abs-button-l all);
+ }
- .action {
- margin-bottom: @indent__m;
+ .item-options {
+ margin: @indent__s 0 0;
- &.back {
- display: block;
- margin-left: 0;
- }
+ &:extend(.abs-product-options-list all);
+ &:extend(.abs-add-clearfix all);
}
- }
- > .primary {
- margin-right: @indent__s;
- }
- }
+ &:extend(.abs-account-blocks all);
- .action.primary {
- &:extend(.abs-button-l all);
- }
+ .block {
+ &:extend(.abs-add-clearfix all);
- .item-options {
- margin: @indent__s 0 0;
-
- &:extend(.abs-product-options-list all);
- &:extend(.abs-add-clearfix all);
- }
+ .methods-shipping {
+ .item-content {
+ .fieldset {
+ > .legend {
+ &:extend(.abs-visually-hidden all);
+ }
- &:extend(.abs-account-blocks all);
+ > .legend + br {
+ &:extend(.abs-no-display all);
+ }
- .block {
- &:extend(.abs-add-clearfix all);
+ > .field {
+ &:before {
+ display: none;
+ }
- .methods-shipping {
- .item-content {
- .fieldset {
- > .legend {
- &:extend(.abs-visually-hidden all);
+ .control {
+ display: inline-block;
+ }
+ }
+ }
+ }
}
+ }
- > .legend + br {
- &:extend(.abs-no-display all);
- }
+ .block-title,
+ .block-content .title {
+ &:extend(.abs-account-title all);
+ border-bottom: @border-width__base solid @border-color__base;
+ padding-bottom: @indent__s;
- > .field {
- &:before {
- display: none;
- }
+ strong {
+ font-weight: @font-weight__regular;
- .control {
- display: inline-block;
- }
+ span {
+ .lib-css(color, @primary__color__light);
+ }
}
- }
}
- }
- }
-
- .block-title,
- .block-content .title {
- &:extend(.abs-account-title all);
- border-bottom: @border-width__base solid @border-color__base;
- padding-bottom: @indent__s;
-
- strong {
- font-weight: @font-weight__regular;
- span {
- .lib-css(color, @primary__color__light);
+ .block-content {
+ &:extend(.abs-add-clearfix all);
+ .title {
+ border-bottom: none;
+ padding-bottom: 0;
+ }
}
- }
- }
- .block-content {
- &:extend(.abs-add-clearfix all);
- .title {
- border-bottom: none;
- padding-bottom: 0;
- }
- }
+ &.order-review {
+ .block-title > strong {
+ .lib-font-size(24);
+ }
- &.order-review {
- .block-title > strong {
- .lib-font-size(24);
- }
+ .block-shipping {
+ .block-content:not(:last-child) {
+ margin-bottom: @indent__xl;
+ }
+ }
- .block-shipping {
- .block-content:not(:last-child) {
- margin-bottom: @indent__xl;
+ .error-description {
+ color: @color-red10;
+ font-weight: @font-weight__regular;
+ margin-bottom: @indent__s;
+ margin-top: -@indent__s;
+ }
}
- }
- .error-description {
- color: @color-red10;
- font-weight: @font-weight__regular;
- margin-bottom: @indent__s;
- margin-top: -@indent__s;
- }
- }
-
- .box-title {
- span {
- margin-right: @indent__s;
- }
+ .box-title {
+ span {
+ margin-right: @indent__s;
+ }
- > .action {
- margin: 0;
- }
- }
+ > .action {
+ margin: 0;
+ }
+ }
- .box-shipping-method {
- .price {
- font-weight: @font-weight__bold;
- }
- }
+ .box-shipping-method {
+ .price {
+ font-weight: @font-weight__bold;
+ }
+ }
- .box-billing-method {
- .fieldset {
- margin: 0;
+ .box-billing-method {
+ .fieldset {
+ margin: 0;
- .legend.box-title {
- margin: 0 0 @indent__xs;
+ .legend.box-title {
+ margin: 0 0 @indent__xs;
+ }
+ }
}
- }
- }
- .hidden {
- &:extend(.abs-no-display all);
- }
+ .hidden {
+ &:extend(.abs-no-display all);
+ }
- .checkout-review .grand.totals {
- .lib-font-size(@font-size__xl);
- margin-bottom: @indent__xl;
+ .checkout-review .grand.totals {
+ .lib-font-size(@font-size__xl);
+ margin-bottom: @indent__xl;
- .mark {
- font-weight: @font-weight__regular;
- }
+ .mark {
+ font-weight: @font-weight__regular;
+ }
+ }
}
- }
- [class^='multishipping-'] {
- .nav-sections,
- .nav-toggle {
- &:extend(.abs-no-display all);
- }
+ [class^='multishipping-'] {
+ .nav-sections,
+ .nav-toggle {
+ &:extend(.abs-no-display all);
+ }
- .logo {
- margin-left: 0;
+ .logo {
+ margin-left: 0;
+ }
}
- }
- .multishipping-checkout-success {
- .nav-sections {
- display: block;
+ .multishipping-checkout-success {
+ .nav-sections {
+ display: block;
+ }
}
- }
}
//
@@ -294,200 +300,200 @@
// _____________________________________________
.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__s) {
- .multicheckout {
- .data.table {
- .address {
- &:before {
- margin-bottom: @indent__xs;
+ .multicheckout {
+ .data.table {
+ .address {
+ &:before {
+ margin-bottom: @indent__xs;
+ }
+ }
}
- }
- }
-
- .product-item-name,
- .price-including-tax,
- .price-excluding-tax {
- display: inline-block;
- }
- .block-content .box {
- &:not(:last-child) {
- margin-bottom: @indent__xl;
- }
+ .product-item-name,
+ .price-including-tax,
+ .price-excluding-tax {
+ display: inline-block;
+ }
- &:last-child {
- margin-bottom: 0;
- }
- }
+ .block-content .box {
+ &:not(:last-child) {
+ margin-bottom: @indent__xl;
+ }
- &.order-review {
- .box-items {
- .data.table {
- thead {
- display: block;
+ &:last-child {
+ margin-bottom: 0;
+ }
+ }
- tr {
- display: block;
+ &.order-review {
+ .box-items {
+ .data.table {
+ thead {
+ display: block;
+
+ tr {
+ display: block;
+ }
+
+ .col.item {
+ display: block;
+ padding: 0;
+ }
+ }
+ }
}
- .col.item {
- display: block;
- padding: 0;
+ .data.table {
+ &:extend(.abs-checkout-order-review all);
}
- }
}
- }
-
- .data.table {
- &:extend(.abs-checkout-order-review all);
- }
- }
- .actions-toolbar {
- .action {
- margin-bottom: @indent__m;
- }
+ .actions-toolbar {
+ .action {
+ margin-bottom: @indent__m;
+ }
- > .primary {
- margin-bottom: @indent__m;
- margin-right: 0;
- }
+ > .primary {
+ margin-bottom: @indent__m;
+ margin-right: 0;
+ }
+ }
}
- }
}
.media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__s) {
- .multicheckout {
- .actions-toolbar {
- .column:not(.sidebar-main) & {
- &:extend(.abs-reset-left-margin-desktop-s all);
- }
+ .multicheckout {
+ .actions-toolbar {
+ .column:not(.sidebar-main) & {
+ &:extend(.abs-reset-left-margin-desktop-s all);
+ }
- .secondary {
- float: none;
- margin-top: 11px;
- text-align: right;
+ .secondary {
+ float: none;
+ margin-top: 11px;
+ text-align: right;
- .action {
- margin-left: @indent__s;
+ .action {
+ margin-left: @indent__s;
- &.back {
- display: block;
- float: left;
- }
+ &.back {
+ display: block;
+ float: left;
+ }
+ }
+ }
}
- }
- }
-
- .item-options {
- margin: @indent__base 0 0;
- }
-
- .block-content .box {
- margin-bottom: 0;
- }
- .block-shipping {
- .box {
- &:extend(.abs-add-box-sizing-desktop-s all);
- float: left;
- width: 25%;
- }
+ .item-options {
+ margin: @indent__base 0 0;
+ }
- .box-shipping-method {
- padding-left: @indent__m;
- padding-right: @indent__m;
- width: 50%;
+ .block-content .box {
+ margin-bottom: 0;
+ }
- .fieldset {
- .legend {
- &:extend(.abs-reset-left-margin-desktop-s all);
- }
+ .block-shipping {
+ .box {
+ &:extend(.abs-add-box-sizing-desktop-s all);
+ float: left;
+ width: 25%;
+ }
- .field {
- &:before {
- display: none;
+ .box-shipping-method {
+ padding-left: @indent__m;
+ padding-right: @indent__m;
+ width: 50%;
+
+ .fieldset {
+ .legend {
+ &:extend(.abs-reset-left-margin-desktop-s all);
+ }
+
+ .field {
+ &:before {
+ display: none;
+ }
+ }
+ }
}
- }
}
- }
- }
- .block-billing {
- &:extend(.abs-add-clearfix-desktop-s all);
- .box-billing-address {
- &:extend(.abs-add-box-sizing-desktop-s all);
- float: left;
- width: 25%;
- }
-
- .box-billing-method {
- &:extend(.abs-add-box-sizing-desktop-s all);
- float: left;
- padding-left: @indent__m;
- width: 50%;
- }
- }
+ .block-billing {
+ &:extend(.abs-add-clearfix-desktop-s all);
+ .box-billing-address {
+ &:extend(.abs-add-box-sizing-desktop-s all);
+ float: left;
+ width: 25%;
+ }
- &.form.address {
- .table-wrapper {
- .applicable {
- margin: 7px 0 0;
+ .box-billing-method {
+ &:extend(.abs-add-box-sizing-desktop-s all);
+ float: left;
+ padding-left: @indent__m;
+ width: 50%;
+ }
}
- }
- }
- &.order-review {
- .box-items {
- clear: left;
- float: none;
- padding-top: @indent__xl;
- width: auto;
- }
-
- .col.item {
- width: 75%;
- }
- }
+ &.form.address {
+ .table-wrapper {
+ .applicable {
+ margin: 7px 0 0;
+ }
+ }
+ }
- // Payment methods
- .methods-payment {
- .item-content > .fieldset {
- width: auto;
+ &.order-review {
+ .box-items {
+ clear: left;
+ float: none;
+ padding-top: @indent__xl;
+ width: auto;
+ }
- .field {
- &.cvv {
- display: inline-block;
- width: auto;
- }
+ .col.item {
+ width: 75%;
+ }
}
- }
- .fieldset > .field:not(.choice) {
- > .label {
- float: none;
- margin-bottom: 8px;
- text-align: left;
- width: auto;
- }
+ // Payment methods
+ .methods-payment {
+ .item-content > .fieldset {
+ width: auto;
+
+ .field {
+ &.cvv {
+ display: inline-block;
+ width: auto;
+ }
+ }
+ }
+
+ .fieldset > .field:not(.choice) {
+ > .label {
+ float: none;
+ margin-bottom: 8px;
+ text-align: left;
+ width: auto;
+ }
- &:not(.cvv) {
- .control {
- width: 100%;
- }
+ &:not(.cvv) {
+ .control {
+ width: 100%;
+ }
+ }
+ }
}
- }
}
- }
}
.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__m) {
- .multishipping-checkout-success {
- .nav-toggle {
- display: block;
- }
+ .multishipping-checkout-success {
+ .nav-toggle {
+ display: block;
+ }
- .logo {
- margin-left: @indent__xl;
+ .logo {
+ margin-left: @indent__xl;
+ }
}
- }
}
diff --git a/app/design/frontend/Magento/luma/web/css/source/_actions-toolbar.less b/app/design/frontend/Magento/luma/web/css/source/_actions-toolbar.less
index 096b93675a92c..d81d0a8388a78 100644
--- a/app/design/frontend/Magento/luma/web/css/source/_actions-toolbar.less
+++ b/app/design/frontend/Magento/luma/web/css/source/_actions-toolbar.less
@@ -22,10 +22,6 @@
&:last-child {
margin-bottom: 0;
}
-
- &.primary {
- // &:extend(.abs-button-l all);
- }
}
&:last-child {
diff --git a/app/etc/di.xml b/app/etc/di.xml
index 6e3dabaa0751f..76f9e8f590f1c 100755
--- a/app/etc/di.xml
+++ b/app/etc/di.xml
@@ -249,9 +249,15 @@
- Magento\Framework\Logger\Handler\System
- Magento\Framework\Logger\Handler\Debug
+ - Magento\Framework\Logger\Handler\Syslog
+
+
+ Magento
+
+
Magento\Framework\Model\ActionValidator\RemoveAction\Proxy
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 1658c8a4e6681..0000000000000
--- 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/_data/LargerThan2MB.jpg b/dev/tests/acceptance/tests/_data/LargerThan2MB.jpg
new file mode 100644
index 0000000000000..eb049be8baf1a
Binary files /dev/null and b/dev/tests/acceptance/tests/_data/LargerThan2MB.jpg differ
diff --git a/dev/tests/acceptance/tests/_data/adobe-base.jpg b/dev/tests/acceptance/tests/_data/adobe-base.jpg
new file mode 100644
index 0000000000000..0b8fdef3cf50e
Binary files /dev/null and b/dev/tests/acceptance/tests/_data/adobe-base.jpg differ
diff --git a/dev/tests/acceptance/tests/_data/adobe-small.jpg b/dev/tests/acceptance/tests/_data/adobe-small.jpg
new file mode 100644
index 0000000000000..6b9f44a16d91f
Binary files /dev/null and b/dev/tests/acceptance/tests/_data/adobe-small.jpg differ
diff --git a/dev/tests/acceptance/tests/_data/adobe-thumb.jpg b/dev/tests/acceptance/tests/_data/adobe-thumb.jpg
new file mode 100644
index 0000000000000..31710b8e17ec6
Binary files /dev/null and b/dev/tests/acceptance/tests/_data/adobe-thumb.jpg differ
diff --git a/dev/tests/acceptance/tests/_data/bmp.bmp b/dev/tests/acceptance/tests/_data/bmp.bmp
new file mode 100755
index 0000000000000..285137a9e53a6
Binary files /dev/null and b/dev/tests/acceptance/tests/_data/bmp.bmp differ
diff --git a/dev/tests/acceptance/tests/_data/empty.jpg b/dev/tests/acceptance/tests/_data/empty.jpg
new file mode 100755
index 0000000000000..e69de29bb2d1d
diff --git a/dev/tests/acceptance/tests/_data/gif.gif b/dev/tests/acceptance/tests/_data/gif.gif
new file mode 100755
index 0000000000000..0b082504ab982
Binary files /dev/null and b/dev/tests/acceptance/tests/_data/gif.gif differ
diff --git a/dev/tests/acceptance/tests/_data/ico.ico b/dev/tests/acceptance/tests/_data/ico.ico
new file mode 100755
index 0000000000000..9ed7740904012
Binary files /dev/null and b/dev/tests/acceptance/tests/_data/ico.ico differ
diff --git a/dev/tests/acceptance/tests/_data/jpg.jpg b/dev/tests/acceptance/tests/_data/jpg.jpg
new file mode 100755
index 0000000000000..609bbb4827ab0
Binary files /dev/null and b/dev/tests/acceptance/tests/_data/jpg.jpg differ
diff --git a/dev/tests/acceptance/tests/_data/large.jpg b/dev/tests/acceptance/tests/_data/large.jpg
new file mode 100755
index 0000000000000..bb0bf4079e5eb
Binary files /dev/null and b/dev/tests/acceptance/tests/_data/large.jpg differ
diff --git a/dev/tests/acceptance/tests/_data/medium.jpg b/dev/tests/acceptance/tests/_data/medium.jpg
new file mode 100755
index 0000000000000..90fe0aa0fb798
Binary files /dev/null and b/dev/tests/acceptance/tests/_data/medium.jpg differ
diff --git a/dev/tests/acceptance/tests/_data/png.png b/dev/tests/acceptance/tests/_data/png.png
new file mode 100755
index 0000000000000..c83255dcf558d
Binary files /dev/null and b/dev/tests/acceptance/tests/_data/png.png differ
diff --git a/dev/tests/acceptance/tests/_data/small.jpg b/dev/tests/acceptance/tests/_data/small.jpg
new file mode 100755
index 0000000000000..0f69f526b5f11
Binary files /dev/null and b/dev/tests/acceptance/tests/_data/small.jpg differ
diff --git a/dev/tests/acceptance/tests/_data/svg.svg b/dev/tests/acceptance/tests/_data/svg.svg
new file mode 100755
index 0000000000000..a0f85579e39a5
--- /dev/null
+++ b/dev/tests/acceptance/tests/_data/svg.svg
@@ -0,0 +1,20 @@
+
+
+
+
diff --git a/dev/tests/acceptance/tests/_data/test-IMAGE_123,456.789.jpg b/dev/tests/acceptance/tests/_data/test-IMAGE_123,456.789.jpg
new file mode 100644
index 0000000000000..c377daf8fb0b3
Binary files /dev/null and b/dev/tests/acceptance/tests/_data/test-IMAGE_123,456.789.jpg differ
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/ActionGroup/SecondaryGridActionGroup.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/ActionGroup/SecondaryGridActionGroup.xml
new file mode 100644
index 0000000000000..7c2c1c3c5702b
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/ActionGroup/SecondaryGridActionGroup.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminGridTableSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminGridTableSection.xml
new file mode 100644
index 0000000000000..3d96a48ac79b5
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminGridTableSection.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminMainActionsSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminMainActionsSection.xml
index 3097a6962a064..26c37fee8c12a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminMainActionsSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminMainActionsSection.xml
@@ -9,5 +9,7 @@
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminSecondaryGridSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminSecondaryGridSection.xml
new file mode 100644
index 0000000000000..a3268630567ad
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Section/AdminSecondaryGridSection.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Test/AdminLoginTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Test/AdminLoginTest.xml
index 9387b8da659ef..3d0f6d5dfcea9 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Test/AdminLoginTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Backend/Test/AdminLoginTest.xml
@@ -10,10 +10,10 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
-
-
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/ActionGroup/AdminClearFiltersActionGroup.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/ActionGroup/AdminClearFiltersActionGroup.xml
new file mode 100644
index 0000000000000..cac724588937a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/ActionGroup/AdminClearFiltersActionGroup.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/ActionGroup/BundleProductFilterActionGroup.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/ActionGroup/BundleProductFilterActionGroup.xml
new file mode 100644
index 0000000000000..cb0e9558976f5
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/ActionGroup/BundleProductFilterActionGroup.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/ActionGroup/CreateBundleProductActionGroup.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/ActionGroup/CreateBundleProductActionGroup.xml
new file mode 100644
index 0000000000000..fa44b7df150e4
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/ActionGroup/CreateBundleProductActionGroup.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/ActionGroup/EnableDisableProductActionGroup.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/ActionGroup/EnableDisableProductActionGroup.xml
new file mode 100644
index 0000000000000..cdd13185cd0e3
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/ActionGroup/EnableDisableProductActionGroup.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 0000000000000..65add76a12af3
--- /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 0000000000000..02f70ec15cab8
--- /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 0000000000000..c7f150e7ad6fb
--- /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 a8598ded6ec17..3683721909ab2 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
@@ -7,10 +7,13 @@
-->
+ xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd">
BundleProduct
+ BundleProduct
+ BundleProduct2
bundleproduct
+ bundleproduct2
bundle
4
BundleOption
@@ -18,5 +21,27 @@
10
1
bundleproduct
+ bundleproduct2
+ 10
+ 20
+ 4
+ bundle
+ 10
+ $10.00
+ Default
+
+
+ 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 0000000000000..be881a7e98d65
--- /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 0000000000000..991c01ec4c6f0
--- /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 0000000000000..a81d5dda6a40b
--- /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/Bundle/Page/AdminCatalogProductPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Page/AdminCatalogProductPage.xml
new file mode 100644
index 0000000000000..f3e9366bb2bf6
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Page/AdminCatalogProductPage.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Page/AdminProductCreatePage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Page/AdminProductCreatePage.xml
index 95b68cb6e4367..5a17304ab28b8 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Page/AdminProductCreatePage.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Page/AdminProductCreatePage.xml
@@ -1,13 +1,13 @@
+ /**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+ -->
+ xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/PageObject.xsd">
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Section/AdminProductFormBundleSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Section/AdminProductFormBundleSection.xml
index 551d0e44b58ae..6bc65d2d18491 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Section/AdminProductFormBundleSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Section/AdminProductFormBundleSection.xml
@@ -7,7 +7,7 @@
-->
+ xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
@@ -21,5 +21,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Section/BundleStorefrontSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Section/BundleStorefrontSection.xml
new file mode 100644
index 0000000000000..b7ca65b28c9bb
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Section/BundleStorefrontSection.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Section/StorefrontBundledSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Section/StorefrontBundledSection.xml
new file mode 100644
index 0000000000000..2b9a1ca624f79
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Section/StorefrontBundledSection.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/AdminAddBundleItemsTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/AdminAddBundleItemsTest.xml
new file mode 100644
index 0000000000000..c46f052db59ac
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/AdminAddBundleItemsTest.xml
@@ -0,0 +1,135 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/AdminAddDefaultImageBundleProductTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/AdminAddDefaultImageBundleProductTest.xml
index 064c57958f37b..6a145b98a1816 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/AdminAddDefaultImageBundleProductTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/AdminAddDefaultImageBundleProductTest.xml
@@ -42,6 +42,8 @@
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/AdminAttributeSetSelectionTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/AdminAttributeSetSelectionTest.xml
new file mode 100644
index 0000000000000..abf8ed3a8bc87
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/AdminAttributeSetSelectionTest.xml
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/AdminDeleteABundleProduct.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/AdminDeleteABundleProduct.xml
new file mode 100644
index 0000000000000..5c2244e85a061
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/AdminDeleteABundleProduct.xml
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/AdminFilterProductListByBundleProduct.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/AdminFilterProductListByBundleProduct.xml
new file mode 100644
index 0000000000000..ad4e90a050a40
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/AdminFilterProductListByBundleProduct.xml
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/AdminMassDeleteBundleProducts.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/AdminMassDeleteBundleProducts.xml
new file mode 100644
index 0000000000000..ca692e5d9374d
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/AdminMassDeleteBundleProducts.xml
@@ -0,0 +1,143 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/AdminProductBundleCreationTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/AdminProductBundleCreationTest.xml
new file mode 100644
index 0000000000000..2641919e204fa
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/AdminProductBundleCreationTest.xml
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/AdminRemoveDefaultImageBundleProductTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/AdminRemoveDefaultImageBundleProductTest.xml
index 3dec79cf1b054..6c3be47a1cb7a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/AdminRemoveDefaultImageBundleProductTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/AdminRemoveDefaultImageBundleProductTest.xml
@@ -42,6 +42,8 @@
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/BundleProductFixedPricingTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/BundleProductFixedPricingTest.xml
new file mode 100644
index 0000000000000..0df2619ab6db2
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/BundleProductFixedPricingTest.xml
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/EnableDisableBundleProductStatusTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/EnableDisableBundleProductStatusTest.xml
new file mode 100644
index 0000000000000..5588d30619c48
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/EnableDisableBundleProductStatusTest.xml
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/MassEnableDisableBundleProductsTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/MassEnableDisableBundleProductsTest.xml
new file mode 100644
index 0000000000000..2754cbcccab7c
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/MassEnableDisableBundleProductsTest.xml
@@ -0,0 +1,159 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/NewBundleProductSelectionTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/NewBundleProductSelectionTest.xml
new file mode 100644
index 0000000000000..cb19b9f996d56
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/NewBundleProductSelectionTest.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/StorefrontAdminEditDataTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/StorefrontAdminEditDataTest.xml
new file mode 100644
index 0000000000000..2bdb2c3e5ab17
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/StorefrontAdminEditDataTest.xml
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/StorefrontEditBundleProductTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/StorefrontEditBundleProductTest.xml
new file mode 100644
index 0000000000000..1944f82cf3181
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Bundle/Test/StorefrontEditBundleProductTest.xml
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 6caa4fef770b1..9380c3052a5f5 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 96e40e348a6f2..1125a776bbdbd 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
@@ -37,6 +37,16 @@
+
+
+
+
+
+
+
+
+
+
@@ -57,7 +67,7 @@
-
+
@@ -81,7 +91,7 @@
-
+
@@ -89,6 +99,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
@@ -118,6 +140,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -128,6 +212,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 22835c7fa2e54..3ef8b961a81af 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 @@
-
+
-
-
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/ActionGroup/AdminProductAttributeSetActionGroup.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/ActionGroup/AdminProductAttributeSetActionGroup.xml
new file mode 100644
index 0000000000000..19e5bed0913a3
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/ActionGroup/AdminProductAttributeSetActionGroup.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/ActionGroup/AdminProductGridActionGroup.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/ActionGroup/AdminProductGridActionGroup.xml
index 6398010f06687..5f2c45b829780 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/ActionGroup/AdminProductGridActionGroup.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/ActionGroup/AdminProductGridActionGroup.xml
@@ -153,6 +153,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 0000000000000..0409c3f195013
--- /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/SearchAndMultiselectActionGroup.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/ActionGroup/SearchAndMultiselectActionGroup.xml
index a0546ec8bca0e..784c40808f63b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/ActionGroup/SearchAndMultiselectActionGroup.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/ActionGroup/SearchAndMultiselectActionGroup.xml
@@ -10,13 +10,13 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/actionGroupSchema.xsd">
-
-
+
+
-
+
[{{options}}]
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 4923b1d969b3b..f763b0c3d2768 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
@@ -38,4 +38,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductAttributeOptionData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductAttributeOptionData.xml
index b197fba1d281b..22d0e83d7b338 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductAttributeOptionData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Data/ProductAttributeOptionData.xml
@@ -27,4 +27,10 @@
+
+
+ customOption
+ false
+ 0
+
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 34110d0417661..3c6e7d3ddc319 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 f2f6e1a6f552f..2abc557d44d96 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 edbf1133d4fae..b04b4bb98c854 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 a6d418dc675e7..899dc3a7f4a8c 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 0000000000000..34e8d0fca6833
--- /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/Page/AdminCategoryEditPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminCategoryEditPage.xml
new file mode 100644
index 0000000000000..95e80238d4af6
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminCategoryEditPage.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminProductAttributeSetEditPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminProductAttributeSetEditPage.xml
new file mode 100644
index 0000000000000..42a5be5e31334
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/AdminProductAttributeSetEditPage.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/ProductCatalogPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/ProductCatalogPage.xml
new file mode 100644
index 0000000000000..e56cc122c44cb
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Page/ProductCatalogPage.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
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 26f56f6176f98..7de2390e5348a 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 3c806fbbea63f..e726e5bfb7c63 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 679cd2d7bee0d..0e01660d5fce9 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 e914c80c3e6ac..5e080bbb7fdba 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/AdminProductAttributeSetActionSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductAttributeSetActionSection.xml
new file mode 100644
index 0000000000000..280c41ae4206e
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductAttributeSetActionSection.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductAttributeSetEditSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductAttributeSetEditSection.xml
new file mode 100644
index 0000000000000..9a69761ee1550
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductAttributeSetEditSection.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductAttributeSetGridSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductAttributeSetGridSection.xml
index 30fbf870fa478..0df7cbc65d6c5 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductAttributeSetGridSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductAttributeSetGridSection.xml
@@ -9,6 +9,10 @@
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 19e59d1cd22e6..2c99945b0989e 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
@@ -8,6 +8,16 @@
+
@@ -17,4 +27,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 0000000000000..a4566115099ef
--- /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 0000000000000..12a00ae8b3777
--- /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 702de0a8e1803..cb80dade856a7 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
@@ -29,5 +29,14 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFiltersSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFiltersSection.xml
index a2d9970e9a758..2ad371f7c51bc 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFiltersSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFiltersSection.xml
@@ -13,5 +13,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFormSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFormSection.xml
index fd0d9bcd3ce34..7c1c578d96997 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFormSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductFormSection.xml
@@ -8,12 +8,17 @@
+
+
+
+
+
@@ -33,6 +38,8 @@
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductGridSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductGridSection.xml
index e4f571f7f0d83..36cbd2ddde6ab 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductGridSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/AdminProductGridSection.xml
@@ -16,6 +16,7 @@
+
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 a9749ac677964..2133781df0575 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,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ 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 e736378ca8ca0..aaec0600f8bf7 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
@@ -17,7 +17,9 @@
+
+
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 5abc388a7d65d..a981f125c5e90 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/StorefrontProductMoreInformationSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductMoreInformationSection.xml
new file mode 100644
index 0000000000000..e6269631274eb
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Section/StorefrontProductMoreInformationSection.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
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 ba90296d12380..04e34871c8b73 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/AdminAddImageToWYSIWYGCatalogTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminAddImageToWYSIWYGCatalogTest.xml
index ed20d4026896d..43ce7e59ba621 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminAddImageToWYSIWYGCatalogTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminAddImageToWYSIWYGCatalogTest.xml
@@ -14,7 +14,7 @@
-
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminAddImageToWYSIWYGProductTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminAddImageToWYSIWYGProductTest.xml
index 1fc24f096b14a..e0582fff6c3c7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminAddImageToWYSIWYGProductTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminAddImageToWYSIWYGProductTest.xml
@@ -9,7 +9,7 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminAssignProductAttributeToAttributeSetTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminAssignProductAttributeToAttributeSetTest.xml
new file mode 100644
index 0000000000000..3615f4132ffb0
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminAssignProductAttributeToAttributeSetTest.xml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 0000000000000..7c81f4472e92a
--- /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/AdminCreateCategoryTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminCreateCategoryTest.xml
index bf867ad3016f0..2c39be3317545 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminCreateCategoryTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminCreateCategoryTest.xml
@@ -10,10 +10,10 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
-
-
+
+
@@ -39,10 +39,10 @@
-
+
-
-
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminCreateProductCustomAttributeSet.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminCreateProductCustomAttributeSet.xml
new file mode 100644
index 0000000000000..65e987461b982
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminCreateProductCustomAttributeSet.xml
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminCreateProductDuplicateUrlkeyTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminCreateProductDuplicateUrlkeyTest.xml
index bb5583f0c3d1a..4e3f9da79b643 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminCreateProductDuplicateUrlkeyTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminCreateProductDuplicateUrlkeyTest.xml
@@ -10,10 +10,10 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
-
-
-
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminCreateRootCategoryAndSubcategoriesTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminCreateRootCategoryAndSubcategoriesTest.xml
index 8495736b52e18..791ed1fdf83ac 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminCreateRootCategoryAndSubcategoriesTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminCreateRootCategoryAndSubcategoriesTest.xml
@@ -10,9 +10,9 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
-
-
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminCreateSimpleProductTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminCreateSimpleProductTest.xml
index 250e1c88fd0f1..f5fb0e87bdc01 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminCreateSimpleProductTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminCreateSimpleProductTest.xml
@@ -10,10 +10,10 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
-
-
+
+
@@ -42,10 +42,10 @@
-
+
-
-
+
+
@@ -72,10 +72,10 @@
-
+
-
-
+
+
@@ -93,10 +93,10 @@
-
+
-
-
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminCreateSimpleProductWithUnicodeTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminCreateSimpleProductWithUnicodeTest.xml
index ace6cf7198fc4..db127799c97e9 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminCreateSimpleProductWithUnicodeTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminCreateSimpleProductWithUnicodeTest.xml
@@ -10,10 +10,10 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
-
-
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminEditTextEditorProductAttributeTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminEditTextEditorProductAttributeTest.xml
index 7b0135973e211..d406b6c920dc0 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminEditTextEditorProductAttributeTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminEditTextEditorProductAttributeTest.xml
@@ -9,11 +9,11 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
-
-
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminMoveAnchoredCategoryTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminMoveAnchoredCategoryTest.xml
index ecdcd7fcfebeb..024af2a77a5ef 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminMoveAnchoredCategoryTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminMoveAnchoredCategoryTest.xml
@@ -9,9 +9,9 @@
-
-
-
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminMultipleWebsitesUseDefaultValuesTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminMultipleWebsitesUseDefaultValuesTest.xml
new file mode 100644
index 0000000000000..1b4d9372cb509
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminMultipleWebsitesUseDefaultValuesTest.xml
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminSimpleProductImagesTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminSimpleProductImagesTest.xml
new file mode 100644
index 0000000000000..d0d5ba4a6f7ba
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminSimpleProductImagesTest.xml
@@ -0,0 +1,304 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminUnassignProductAttributeFromAttributeSetTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminUnassignProductAttributeFromAttributeSetTest.xml
new file mode 100644
index 0000000000000..7be5e5d281933
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/AdminUnassignProductAttributeFromAttributeSetTest.xml
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 0000000000000..e29890befd860
--- /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 0000000000000..a302fa58ec241
--- /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/DeleteCategoriesTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/DeleteCategoriesTest.xml
index 899dc18a6c744..84035adaa90e6 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/DeleteCategoriesTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/DeleteCategoriesTest.xml
@@ -10,9 +10,9 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
-
-
+
+
+
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 7ce754e8f009b..0f466ccc3d994 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 cc33059dd10b6..e938bee27eb47 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
@@ -18,32 +18,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
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 0000000000000..2710002d625d7
--- /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 0000000000000..a848515aee873
--- /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/Catalog/Test/StorefrontPurchaseProductCustomOptionsDifferentStoreViews.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/StorefrontPurchaseProductCustomOptionsDifferentStoreViews.xml
index 36fd985da8cb2..93585f8c14985 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/StorefrontPurchaseProductCustomOptionsDifferentStoreViews.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/StorefrontPurchaseProductCustomOptionsDifferentStoreViews.xml
@@ -10,9 +10,9 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
-
-
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/StorefrontPurchaseProductWithCustomOptions.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/StorefrontPurchaseProductWithCustomOptions.xml
index 4e338c3178703..fa81e15833b81 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/StorefrontPurchaseProductWithCustomOptions.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/StorefrontPurchaseProductWithCustomOptions.xml
@@ -10,10 +10,10 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
-
-
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/VerifyChildCategoriesShouldNotIncludeInMenuTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/VerifyChildCategoriesShouldNotIncludeInMenuTest.xml
index 3010da58b27aa..53c0ba041c77f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/VerifyChildCategoriesShouldNotIncludeInMenuTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/VerifyChildCategoriesShouldNotIncludeInMenuTest.xml
@@ -10,9 +10,9 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
-
-
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/VerifyDefaultWYSIWYGToolbarOnProductTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/VerifyDefaultWYSIWYGToolbarOnProductTest.xml
index 7657306744615..b0146f1c8deef 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/VerifyDefaultWYSIWYGToolbarOnProductTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/VerifyDefaultWYSIWYGToolbarOnProductTest.xml
@@ -10,11 +10,11 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
-
-
+
+
@@ -49,11 +49,11 @@
-
+
-
-
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/VerifyTinyMCEv4IsNativeWYSIWYGOnCatalogTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/VerifyTinyMCEv4IsNativeWYSIWYGOnCatalogTest.xml
index f7dbc78454a4e..f7ff2f047ea5f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/VerifyTinyMCEv4IsNativeWYSIWYGOnCatalogTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/VerifyTinyMCEv4IsNativeWYSIWYGOnCatalogTest.xml
@@ -10,11 +10,11 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
-
-
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/VerifyTinyMCEv4IsNativeWYSIWYGOnProductTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/VerifyTinyMCEv4IsNativeWYSIWYGOnProductTest.xml
index 7492d78cccff7..7e78b476ae7dc 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/VerifyTinyMCEv4IsNativeWYSIWYGOnProductTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Catalog/Test/VerifyTinyMCEv4IsNativeWYSIWYGOnProductTest.xml
@@ -9,11 +9,11 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
-
-
+
+
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 0000000000000..11bc308902ca0
--- /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 f52a86810842e..0000000000000
--- 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 80b1b294fecd5..0000000000000
--- 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/ActionGroup/GuestCheckoutFillNewBillingAddressActionGroup.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/ActionGroup/GuestCheckoutFillNewBillingAddressActionGroup.xml
index e24b59e1cf115..98b3e439382b7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/ActionGroup/GuestCheckoutFillNewBillingAddressActionGroup.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/ActionGroup/GuestCheckoutFillNewBillingAddressActionGroup.xml
@@ -25,4 +25,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/ActionGroup/StorefrontProductCartActionGroup.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/ActionGroup/StorefrontProductCartActionGroup.xml
index d7ecdc31586b4..b98e1046c4a5b 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/ActionGroup/StorefrontProductCartActionGroup.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/ActionGroup/StorefrontProductCartActionGroup.xml
@@ -77,4 +77,15 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
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 0000000000000..3fb6e99ed6730
--- /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/CheckoutCartProductSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutCartProductSection.xml
index 92c10ca83a76d..fa0776c1f60c9 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutCartProductSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutCartProductSection.xml
@@ -26,5 +26,8 @@
parameterized="true"/>
+
+
+
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 32a57a14cd9da..248070940542c 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/CheckoutPaymentSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutPaymentSection.xml
index 2af5986cc092f..3d1e9f24b8d9a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutPaymentSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutPaymentSection.xml
@@ -41,5 +41,10 @@
+
+
+
+
+
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 f20ae4dac07d5..f2cca89be6c18 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/Checkout/Section/CheckoutShippingSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingSection.xml
index 54fa168a1a4eb..247c9664caf0a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Checkout/Section/CheckoutShippingSection.xml
@@ -10,17 +10,26 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
+
-
+
+
+
+
+
+
-
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/ActionGroup/DeleteImageFromStorageActionGroup.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/ActionGroup/DeleteImageFromStorageActionGroup.xml
index c4af2bc850635..c4853d9f824c0 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/ActionGroup/DeleteImageFromStorageActionGroup.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/ActionGroup/DeleteImageFromStorageActionGroup.xml
@@ -9,14 +9,22 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/actionGroupSchema.xsd">
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+ initialImages
+ newImages
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/ActionGroup/NavigateToMediaFolderActionGroup.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/ActionGroup/NavigateToMediaFolderActionGroup.xml
index c886ab306cf92..4d5373eea3fb8 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/ActionGroup/NavigateToMediaFolderActionGroup.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/ActionGroup/NavigateToMediaFolderActionGroup.xml
@@ -9,11 +9,11 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/actionGroupSchema.xsd">
-
+
-
-
-
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/ActionGroup/SelectImageFromMediaStorageActionGroup.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/ActionGroup/SelectImageFromMediaStorageActionGroup.xml
index 151ec7672d6c6..8f9b7595665f3 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/ActionGroup/SelectImageFromMediaStorageActionGroup.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/ActionGroup/SelectImageFromMediaStorageActionGroup.xml
@@ -37,12 +37,12 @@
-
+
-
-
-
-
+
+
+
+
@@ -53,8 +53,9 @@
-
-
+
+
+
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 857ac2a2f1b1f..25e55ea756afb 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/Cms/Section/TinyMCESection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/TinyMCESection.xml
index a158d1ed8580b..f840840587738 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/TinyMCESection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Section/TinyMCESection.xml
@@ -36,6 +36,7 @@
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddImageToWYSIWYGBlockTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddImageToWYSIWYGBlockTest.xml
index 5625dceeea051..d08e67999a62e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddImageToWYSIWYGBlockTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddImageToWYSIWYGBlockTest.xml
@@ -9,7 +9,7 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddImageToWYSIWYGCMSTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddImageToWYSIWYGCMSTest.xml
index c2ce1b1a53412..06265ecba60d4 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddImageToWYSIWYGCMSTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddImageToWYSIWYGCMSTest.xml
@@ -9,7 +9,7 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddVariableToWYSIWYGBlockTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddVariableToWYSIWYGBlockTest.xml
index 4de72b6f2462a..a57e0a1daafb7 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddVariableToWYSIWYGBlockTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddVariableToWYSIWYGBlockTest.xml
@@ -9,7 +9,7 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddVariableToWYSIWYGCMSTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddVariableToWYSIWYGCMSTest.xml
index 5bd82bfe43780..501eaae76c7ac 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddVariableToWYSIWYGCMSTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddVariableToWYSIWYGCMSTest.xml
@@ -9,10 +9,10 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
-
-
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddWidgetToWYSIWYGBlockTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddWidgetToWYSIWYGBlockTest.xml
index 818395b8376be..19b7dac734af2 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddWidgetToWYSIWYGBlockTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddWidgetToWYSIWYGBlockTest.xml
@@ -9,7 +9,7 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddWidgetToWYSIWYGWithCMSPageLinkTypeTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddWidgetToWYSIWYGWithCMSPageLinkTypeTest.xml
index ab1d60fb6a894..94a13c282d89a 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddWidgetToWYSIWYGWithCMSPageLinkTypeTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddWidgetToWYSIWYGWithCMSPageLinkTypeTest.xml
@@ -10,11 +10,11 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
-
-
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddWidgetToWYSIWYGWithCMSStaticBlockTypeTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddWidgetToWYSIWYGWithCMSStaticBlockTypeTest.xml
index a984c360c6314..442fac5fd73f4 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddWidgetToWYSIWYGWithCMSStaticBlockTypeTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddWidgetToWYSIWYGWithCMSStaticBlockTypeTest.xml
@@ -10,11 +10,11 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
-
-
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddWidgetToWYSIWYGWithCatalogCategoryLinkTypeTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddWidgetToWYSIWYGWithCatalogCategoryLinkTypeTest.xml
index 7e56daecb5669..d86bcf36d1b93 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddWidgetToWYSIWYGWithCatalogCategoryLinkTypeTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddWidgetToWYSIWYGWithCatalogCategoryLinkTypeTest.xml
@@ -9,11 +9,11 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
-
-
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddWidgetToWYSIWYGWithCatalogProductLinkTypeTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddWidgetToWYSIWYGWithCatalogProductLinkTypeTest.xml
index d736350e186b4..7f07bdfde24a3 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddWidgetToWYSIWYGWithCatalogProductLinkTypeTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddWidgetToWYSIWYGWithCatalogProductLinkTypeTest.xml
@@ -10,11 +10,11 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
-
-
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddWidgetToWYSIWYGWithCatalogProductListTypeTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddWidgetToWYSIWYGWithCatalogProductListTypeTest.xml
index af1262a0113d0..2e225bfd55de6 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddWidgetToWYSIWYGWithCatalogProductListTypeTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddWidgetToWYSIWYGWithCatalogProductListTypeTest.xml
@@ -9,11 +9,11 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
-
-
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddWidgetToWYSIWYGWithRecentlyComparedProductsTypeTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddWidgetToWYSIWYGWithRecentlyComparedProductsTypeTest.xml
index 40311c809b2ce..3313ad3e639fb 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddWidgetToWYSIWYGWithRecentlyComparedProductsTypeTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddWidgetToWYSIWYGWithRecentlyComparedProductsTypeTest.xml
@@ -10,11 +10,11 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
-
-
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddWidgetToWYSIWYGWithRecentlyViewedProductsTypeTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddWidgetToWYSIWYGWithRecentlyViewedProductsTypeTest.xml
index 5ae0ddcfb4efe..177f5c6d77bc2 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddWidgetToWYSIWYGWithRecentlyViewedProductsTypeTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminAddWidgetToWYSIWYGWithRecentlyViewedProductsTypeTest.xml
@@ -10,11 +10,11 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
-
-
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminCreateCmsBlockTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminCreateCmsBlockTest.xml
index 77965cfedfd4d..a5013384c4142 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminCreateCmsBlockTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminCreateCmsBlockTest.xml
@@ -10,10 +10,10 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
-
-
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminCreateCmsPageTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminCreateCmsPageTest.xml
index 3bdd57ef2b9c8..717605d74788f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminCreateCmsPageTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/AdminCreateCmsPageTest.xml
@@ -10,10 +10,10 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
-
-
+
+
@@ -47,10 +47,10 @@
-
+
-
-
+
+
@@ -80,10 +80,10 @@
-
+
-
-
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/VerifyTinyMCEv4IsNativeWYSIWYGOnBlockTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/VerifyTinyMCEv4IsNativeWYSIWYGOnBlockTest.xml
index 8bd39c5d1e7aa..f45329f64926e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/VerifyTinyMCEv4IsNativeWYSIWYGOnBlockTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/VerifyTinyMCEv4IsNativeWYSIWYGOnBlockTest.xml
@@ -10,11 +10,11 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
-
-
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/VerifyTinyMCEv4IsNativeWYSIWYGOnCMSPageTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/VerifyTinyMCEv4IsNativeWYSIWYGOnCMSPageTest.xml
index 718728e737a5a..6e02ab67e61d5 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/VerifyTinyMCEv4IsNativeWYSIWYGOnCMSPageTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Cms/Test/VerifyTinyMCEv4IsNativeWYSIWYGOnCMSPageTest.xml
@@ -10,11 +10,11 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
-
-
+
+
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 0a2429fa8f9e5..70e758a51409d 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 cebb76e68a6cc..45bf866551319 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 0000000000000..96651e303c5f2
--- /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 0000000000000..a8eabb3b56a39
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Test/AdminConfigurableProductUpdateAttributeTest.xml
@@ -0,0 +1,271 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Test/AdminRelatedProductsTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Test/AdminRelatedProductsTest.xml
index 0d773cb6df666..50fb6bdf866d8 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Test/AdminRelatedProductsTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Test/AdminRelatedProductsTest.xml
@@ -10,7 +10,7 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Test/ConfigurableProductPriceAdditionalStoreViewTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Test/ConfigurableProductPriceAdditionalStoreViewTest.xml
index 306a20124c5ca..609ccbb4c27a2 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Test/ConfigurableProductPriceAdditionalStoreViewTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProduct/Test/ConfigurableProductPriceAdditionalStoreViewTest.xml
@@ -73,13 +73,22 @@
-
+
+
+
-
-
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/ActionGroup/SignUpNewUserFromStorefrontActionGroup.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/ActionGroup/SignUpNewUserFromStorefrontActionGroup.xml
index ef00e2d72f100..04c50378c6607 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/ActionGroup/SignUpNewUserFromStorefrontActionGroup.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/ActionGroup/SignUpNewUserFromStorefrontActionGroup.xml
@@ -24,4 +24,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/AddressData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/AddressData.xml
index 5f89a3ce9aaa7..efa7a1cdb5e69 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/AddressData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/AddressData.xml
@@ -49,4 +49,38 @@
Yes
RegionTX
+
+ John
+ Doe
+ 368
+
+ - 368 Broadway St.
+ - 113
+
+ New York
+ New York
+ US
+ 10001
+ 512-345-6789
+ Yes
+ Yes
+ RegionNY
+
+
+ John
+ Doe
+ Magento
+
+ - 7700 West Parmer Lane
+ - 113
+
+ Los Angeles
+ California
+ US
+ 90001
+ 512-345-6789
+ Yes
+ Yes
+ RegionCA
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomerData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomerData.xml
index 9dee9a1c245f5..4d65f2aa56b65 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomerData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomerData.xml
@@ -45,6 +45,32 @@
0
US_Address_TX
+
+ 0
+ true
+ true
+ John.Doe@example.com
+ John
+ Doe
+ John Doe
+ pwdTest123!
+ 0
+ 0
+ US_Address_NY
+
+
+ 0
+ true
+ true
+ John.Doe@example.com
+ John
+ Doe
+ John Doe
+ pwdTest123!
+ 0
+ 0
+ US_Address_CA
+
Jane
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomerGroupData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomerGroupData.xml
index 61e0c05ea82a6..5279f4216898e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomerGroupData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/CustomerGroupData.xml
@@ -13,4 +13,9 @@
3
Retail Customer
+
+
+ - General
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/RegionData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/RegionData.xml
index b69235531dc3c..95e0362e84d71 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/RegionData.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Data/RegionData.xml
@@ -17,4 +17,14 @@
TX
1
+
+ California
+ CA
+ 2
+
+
+ New York
+ NY
+ 3
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerAccountInformationSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerAccountInformationSection.xml
index 362254f8a28dc..4c72be870f161 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerAccountInformationSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/AdminCustomerAccountInformationSection.xml
@@ -13,5 +13,6 @@
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerDashboardAccountInformationSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerDashboardAccountInformationSection.xml
index 4e8ce1ffaf202..001dde0b98afd 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerDashboardAccountInformationSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Section/StorefrontCustomerDashboardAccountInformationSection.xml
@@ -11,4 +11,17 @@
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Test/AdminCreateCustomerTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Test/AdminCreateCustomerTest.xml
index 32f882ce72bdb..17c7b8410b705 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Test/AdminCreateCustomerTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Test/AdminCreateCustomerTest.xml
@@ -10,15 +10,14 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
-
-
+
+
-
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Test/StorefrontCreateCustomerTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Test/StorefrontCreateCustomerTest.xml
index 6c155f8c1dbfe..92893e76d42c2 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Test/StorefrontCreateCustomerTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Test/StorefrontCreateCustomerTest.xml
@@ -10,10 +10,10 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
-
-
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Test/StorefrontPersistedCustomerLoginTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Test/StorefrontPersistedCustomerLoginTest.xml
index 9e23ffa653630..27e4db958cbfe 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Test/StorefrontPersistedCustomerLoginTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Customer/Test/StorefrontPersistedCustomerLoginTest.xml
@@ -10,11 +10,10 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
-
-
-
-
+
+
+
+
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 6276f340f85a6..1498f4b96b3ab 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 427f2577a8ab9..f71ebd481a97d 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 0000000000000..dc86c4e8d7957
--- /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 0000000000000..72f643e06800d
--- /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 0000000000000..144ce67bb25bb
--- /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 019b0d24dec52..9960d698a7861 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 0000000000000..9a5df1e379a86
--- /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 0000000000000..5f5dcb3a0ef4f
--- /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 0000000000000..523517aa70080
--- /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/Newsletter/Test/AdminAddImageToWYSIWYGNewsletterTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/Test/AdminAddImageToWYSIWYGNewsletterTest.xml
index bb27cfa5bb809..118d774ec6afc 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/Test/AdminAddImageToWYSIWYGNewsletterTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/Test/AdminAddImageToWYSIWYGNewsletterTest.xml
@@ -9,7 +9,7 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/Test/AdminAddVariableToWYSIWYGNewsletterTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/Test/AdminAddVariableToWYSIWYGNewsletterTest.xml
index 312aef30c43bd..2ad2709c8fb8e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/Test/AdminAddVariableToWYSIWYGNewsletterTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/Test/AdminAddVariableToWYSIWYGNewsletterTest.xml
@@ -9,7 +9,7 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/Test/AdminAddWidgetToWYSIWYGNewsletterTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/Test/AdminAddWidgetToWYSIWYGNewsletterTest.xml
index 5395b0563740a..bfa8fc40eeb20 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/Test/AdminAddWidgetToWYSIWYGNewsletterTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/Test/AdminAddWidgetToWYSIWYGNewsletterTest.xml
@@ -9,11 +9,11 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
-
-
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/Test/VerifyTinyMCEv4IsNativeWYSIWYGOnNewsletterTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/Test/VerifyTinyMCEv4IsNativeWYSIWYGOnNewsletterTest.xml
index 1fe7db5e3f052..b7b9e21adde7f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/Test/VerifyTinyMCEv4IsNativeWYSIWYGOnNewsletterTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Newsletter/Test/VerifyTinyMCEv4IsNativeWYSIWYGOnNewsletterTest.xml
@@ -9,11 +9,11 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
-
-
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/ActionGroup/ClearPageCacheActionGroup.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/ActionGroup/ClearPageCacheActionGroup.xml
new file mode 100644
index 0000000000000..f09ca7f1fe025
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/ActionGroup/ClearPageCacheActionGroup.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/Section/AdminCacheManagementSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/Section/AdminCacheManagementSection.xml
index cb33e25c9ce6a..d5d1e7bf65cb8 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/Section/AdminCacheManagementSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/PageCache/Section/AdminCacheManagementSection.xml
@@ -10,6 +10,9 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
-
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 0000000000000..4ba2e1ae73824
--- /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 0000000000000..69a835aa703eb
--- /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 0000000000000..f7f76da7d3895
--- /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/Sales/ActionGroup/AdminOrderActionGroup.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/ActionGroup/AdminOrderActionGroup.xml
index 7461d9010a024..a4d9f99799e86 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/ActionGroup/AdminOrderActionGroup.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/ActionGroup/AdminOrderActionGroup.xml
@@ -134,4 +134,14 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/ActionGroup/AdminOrderGridActionGroup.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/ActionGroup/AdminOrderGridActionGroup.xml
index 75cc560f72734..696cc898a2bc8 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/ActionGroup/AdminOrderGridActionGroup.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/ActionGroup/AdminOrderGridActionGroup.xml
@@ -10,11 +10,14 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/actionGroupSchema.xsd">
+
+
+
-
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/AdminOrderTotalSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/AdminOrderTotalSection.xml
index 5bdcd6a62a897..2434bfaea2638 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/AdminOrderTotalSection.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Section/AdminOrderTotalSection.xml
@@ -12,5 +12,6 @@
+
\ No newline at end of file
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Test/AdminCreateInvoiceTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Test/AdminCreateInvoiceTest.xml
index 2e7af33aa25c4..70bf457b11567 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Test/AdminCreateInvoiceTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Sales/Test/AdminCreateInvoiceTest.xml
@@ -10,10 +10,10 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
-
-
+
+
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 0000000000000..24d881ee6081d
--- /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 39c6dd6b31968..93ed408ce7a0e 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 0000000000000..a6a0d669f3435
--- /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 0000000000000..97936382e60e0
--- /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 0000000000000..f4342b5d480b4
--- /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 0000000000000..e2de2117d78e7
--- /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 0000000000000..6c49534ee43c1
--- /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/SampleTests/Test/AdvancedSampleTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/AdvancedSampleTest.xml
index 8632c6b600f35..d7a03d4f0198f 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/AdvancedSampleTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/AdvancedSampleTest.xml
@@ -11,6 +11,7 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/AssertsTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/AssertsTest.xml
index 359e2e94d8b76..e1e0602d6103d 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/AssertsTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/AssertsTest.xml
@@ -10,7 +10,7 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/CreateConfigurableProductByApiTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/CreateConfigurableProductByApiTest.xml
index a96f456655049..cf0ea0225a4b1 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/CreateConfigurableProductByApiTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/CreateConfigurableProductByApiTest.xml
@@ -10,7 +10,7 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/CreateSalesRuleByApiTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/CreateSalesRuleByApiTest.xml
index 6106cd7441195..8e9336dd6f149 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/CreateSalesRuleByApiTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/CreateSalesRuleByApiTest.xml
@@ -10,7 +10,7 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/MinimumTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/MinimumTest.xml
index 8edb5a9f11c92..f8702eeaf5e0c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/MinimumTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/MinimumTest.xml
@@ -10,6 +10,7 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/PersistMultipleEntitiesTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/PersistMultipleEntitiesTest.xml
index 0d2c1d24c5c04..b809ab89cba52 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/PersistMultipleEntitiesTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/PersistMultipleEntitiesTest.xml
@@ -10,6 +10,7 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/SampleTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/SampleTest.xml
index 9e4a470b88950..c107debc1aa62 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/SampleTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/SampleTest.xml
@@ -22,6 +22,7 @@
+
@@ -202,6 +203,7 @@
+
@@ -255,6 +257,7 @@
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/SetPaymentConfigurationTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/SetPaymentConfigurationTest.xml
index 1dcc8d2a128cd..1bc6bd1865f7c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/SetPaymentConfigurationTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/SetPaymentConfigurationTest.xml
@@ -10,6 +10,7 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
+
@@ -17,6 +18,7 @@
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/UpdateSimpleProductByApiTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/UpdateSimpleProductByApiTest.xml
index 3dc313f526e90..fbf203834b45e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/UpdateSimpleProductByApiTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/SampleTests/Test/UpdateSimpleProductByApiTest.xml
@@ -9,7 +9,7 @@
-
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/ActionGroup/AdminCreateNewStoreGroupActionGroup.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/ActionGroup/AdminCreateNewStoreGroupActionGroup.xml
index 83aa1a4735935..980e540b6b9b4 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/ActionGroup/AdminCreateNewStoreGroupActionGroup.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/ActionGroup/AdminCreateNewStoreGroupActionGroup.xml
@@ -9,12 +9,17 @@
+
+
+
+
+
-
-
-
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/ActionGroup/AdminCreateWebsiteActionGroup.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/ActionGroup/AdminCreateWebsiteActionGroup.xml
index c34e6c0814bb8..01d14f60bd011 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/ActionGroup/AdminCreateWebsiteActionGroup.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/ActionGroup/AdminCreateWebsiteActionGroup.xml
@@ -9,11 +9,15 @@
+
+
+
+
-
-
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/ActionGroup/AdminDeleteWebsiteActionGroup.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/ActionGroup/AdminDeleteWebsiteActionGroup.xml
index 9b61315f0d5b8..8182a5d6dd1e3 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/ActionGroup/AdminDeleteWebsiteActionGroup.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/ActionGroup/AdminDeleteWebsiteActionGroup.xml
@@ -8,11 +8,14 @@
+
+
+
-
+
-
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Test/AdminCreateStoreGroupTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Test/AdminCreateStoreGroupTest.xml
index 58867227d08da..1d3cad0cd4f27 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Test/AdminCreateStoreGroupTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Test/AdminCreateStoreGroupTest.xml
@@ -9,10 +9,10 @@
-
+
-
-
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Test/AdminCreateStoreViewTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Test/AdminCreateStoreViewTest.xml
index 6fcaf45a0acbc..9d6a71f009beb 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Test/AdminCreateStoreViewTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Store/Test/AdminCreateStoreViewTest.xml
@@ -9,8 +9,10 @@
-
-
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/ActionGroup/AdminTaxActionGroup.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/ActionGroup/AdminTaxActionGroup.xml
new file mode 100644
index 0000000000000..946402d080e99
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/ActionGroup/AdminTaxActionGroup.xml
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/Data/TaxCodeData.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/Data/TaxCodeData.xml
new file mode 100644
index 0000000000000..ac603751ddc78
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/Data/TaxCodeData.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+ New York
+ United States
+ *
+ 8.375
+
+
+ California
+ United States
+ *
+ 8.25
+
+
+ Aargau
+ Switzerland
+ *
+ 0
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/Page/AdminNewTaxRulePage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/Page/AdminNewTaxRulePage.xml
new file mode 100644
index 0000000000000..74a0347b33c7c
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/Page/AdminNewTaxRulePage.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/Page/AdminTaxConfigurationPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/Page/AdminTaxConfigurationPage.xml
new file mode 100644
index 0000000000000..b91344000ff50
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/Page/AdminTaxConfigurationPage.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/Page/AdminTaxRateGridPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/Page/AdminTaxRateGridPage.xml
new file mode 100644
index 0000000000000..a6624f6588d97
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/Page/AdminTaxRateGridPage.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/Page/AdminTaxRuleGridPage.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/Page/AdminTaxRuleGridPage.xml
new file mode 100644
index 0000000000000..e673da4a761f0
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/Page/AdminTaxRuleGridPage.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/Section/AdminConfigureTaxSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/Section/AdminConfigureTaxSection.xml
new file mode 100644
index 0000000000000..8ae17928d3bbd
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/Section/AdminConfigureTaxSection.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/Section/AdminTaxRulesSection.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/Section/AdminTaxRulesSection.xml
new file mode 100644
index 0000000000000..df3a56a36bc4a
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/Section/AdminTaxRulesSection.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/Test/StorefrontTaxQuoteCartTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/Test/StorefrontTaxQuoteCartTest.xml
new file mode 100644
index 0000000000000..2607775ce7f36
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/Test/StorefrontTaxQuoteCartTest.xml
@@ -0,0 +1,458 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/Test/StorefrontTaxQuoteCheckoutTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/Test/StorefrontTaxQuoteCheckoutTest.xml
new file mode 100644
index 0000000000000..6b60201a00709
--- /dev/null
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/Test/StorefrontTaxQuoteCheckoutTest.xml
@@ -0,0 +1,458 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/composer.json b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/composer.json
index fb47e3fbeba58..9a39b2518fe43 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/composer.json
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tax/composer.json
@@ -12,18 +12,18 @@
},
"require": {
"magento/magento2-functional-testing-framework": "1.0.0",
- "php": "~7.1.3||~7.2.0"
- },
- "suggest": {
"magento/magento2-functional-test-module-backend": "100.0.0-dev",
"magento/magento2-functional-test-module-catalog": "100.0.0-dev",
"magento/magento2-functional-test-module-checkout": "100.0.0-dev",
"magento/magento2-functional-test-module-config": "100.0.0-dev",
"magento/magento2-functional-test-module-customer": "100.0.0-dev",
+ "magento/magento2-functional-test-module-quote": "100.0.0-dev",
+ "php": "~7.1.3||~7.2.0"
+ },
+ "suggest": {
"magento/magento2-functional-test-module-directory": "100.0.0-dev",
"magento/magento2-functional-test-module-eav": "100.0.0-dev",
"magento/magento2-functional-test-module-page-cache": "100.0.0-dev",
- "magento/magento2-functional-test-module-quote": "100.0.0-dev",
"magento/magento2-functional-test-module-reports": "100.0.0-dev",
"magento/magento2-functional-test-module-sales": "100.0.0-dev",
"magento/magento2-functional-test-module-shipping": "100.0.0-dev",
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tinymce3/Test/AdminSwitchWYSIWYGOptionsTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tinymce3/Test/AdminSwitchWYSIWYGOptionsTest.xml
index b6e4cdc61258d..350f3a77cbe5c 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tinymce3/Test/AdminSwitchWYSIWYGOptionsTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Tinymce3/Test/AdminSwitchWYSIWYGOptionsTest.xml
@@ -10,11 +10,11 @@
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
-
+
-
-
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Test/StorefrontAddMultipleStoreProductsToWishlistTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Test/StorefrontAddMultipleStoreProductsToWishlistTest.xml
index 06b45227e61cb..da2239a0da85e 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Test/StorefrontAddMultipleStoreProductsToWishlistTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Test/StorefrontAddMultipleStoreProductsToWishlistTest.xml
@@ -9,7 +9,8 @@
-
+
+
diff --git a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Test/StorefrontDeletePersistedWishlistTest.xml b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Test/StorefrontDeletePersistedWishlistTest.xml
index 45fd0bb1a2038..7b9c40d7f3d31 100644
--- a/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Test/StorefrontDeletePersistedWishlistTest.xml
+++ b/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/Wishlist/Test/StorefrontDeletePersistedWishlistTest.xml
@@ -9,10 +9,10 @@
-
+
-
-
+
+
diff --git a/dev/tests/api-functional/testsuite/Magento/AsynchronousOperations/Api/OperationRepositoryInterfaceTest.php b/dev/tests/api-functional/testsuite/Magento/AsynchronousOperations/Api/OperationRepositoryInterfaceTest.php
new file mode 100644
index 0000000000000..8eab6c9fd8676
--- /dev/null
+++ b/dev/tests/api-functional/testsuite/Magento/AsynchronousOperations/Api/OperationRepositoryInterfaceTest.php
@@ -0,0 +1,124 @@
+ [
+ 'filter_groups' => [
+ [
+ 'filters' => [
+ [
+ 'field' => 'start_time',
+ 'value' => '2010-10-10 00:00:00',
+ 'condition_type' => 'lteq',
+ ],
+ ],
+ ],
+ ],
+ 'current_page' => 1,
+ ],
+ ];
+
+ $serviceInfo = [
+ 'rest' => [
+ 'resourcePath' => self::RESOURCE_PATH . '?' . http_build_query($searchCriteria),
+ 'httpMethod' => Request::HTTP_METHOD_GET,
+ ],
+ 'soap' => [
+ 'service' => self::SERVICE_NAME,
+ 'operation' => self::SERVICE_NAME . 'GetList',
+ ],
+ ];
+
+ $response = $this->_webApiCall($serviceInfo, $searchCriteria);
+
+ $this->assertArrayHasKey('search_criteria', $response);
+ $this->assertArrayHasKey('total_count', $response);
+ $this->assertArrayHasKey('items', $response);
+
+ $this->assertEquals($searchCriteria['searchCriteria'], $response['search_criteria']);
+ $this->assertEquals(3, $response['total_count']);
+ $this->assertEquals(3, count($response['items']));
+
+ foreach ($response['items'] as $item) {
+ $this->assertEquals('bulk-uuid-searchable-6', $item['bulk_uuid']);
+ }
+ }
+
+ /**
+ * @magentoApiDataFixture Magento/AsynchronousOperations/_files/operation_searchable.php
+ */
+ public function testGetList()
+ {
+ $searchCriteria = [
+ 'searchCriteria' => [
+ 'filter_groups' => [
+ [
+ 'filters' => [
+ [
+ 'field' => 'bulk_uuid',
+ 'value' => 'bulk-uuid-searchable-6',
+ 'condition_type' => 'eq',
+ ],
+ ],
+ ],
+ [
+ 'filters' => [
+ [
+ 'field' => 'status',
+ 'value' => OperationInterface::STATUS_TYPE_NOT_RETRIABLY_FAILED,
+ 'condition_type' => 'eq',
+ ],
+ ],
+ ],
+ ],
+ 'current_page' => 1,
+ ],
+ ];
+
+ $serviceInfo = [
+ 'rest' => [
+ 'resourcePath' => self::RESOURCE_PATH . '?' . http_build_query($searchCriteria),
+ 'httpMethod' => Request::HTTP_METHOD_GET,
+ ],
+ 'soap' => [
+ 'service' => self::SERVICE_NAME,
+ 'operation' => self::SERVICE_NAME . 'GetList',
+ ],
+ ];
+
+ $response = $this->_webApiCall($serviceInfo, $searchCriteria);
+
+ $this->assertArrayHasKey('search_criteria', $response);
+ $this->assertArrayHasKey('total_count', $response);
+ $this->assertArrayHasKey('items', $response);
+
+ $this->assertEquals($searchCriteria['searchCriteria'], $response['search_criteria']);
+ $this->assertEquals(1, $response['total_count']);
+ $this->assertEquals(1, count($response['items']));
+
+ foreach ($response['items'] as $item) {
+ $this->assertEquals('bulk-uuid-searchable-6', $item['bulk_uuid']);
+ }
+ }
+}
diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php
index e1e6ff79e75ce..e140305db4dcd 100644
--- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php
@@ -10,6 +10,7 @@
use Magento\Store\Model\Store;
use Magento\CatalogInventory\Api\Data\StockItemInterface;
use Magento\Store\Model\Website;
+use Magento\Store\Model\WebsiteRepository;
use Magento\TestFramework\Helper\Bootstrap;
use Magento\TestFramework\TestCase\WebapiAbstract;
use Magento\Framework\Api\FilterBuilder;
@@ -17,6 +18,7 @@
use Magento\Framework\Api\SortOrder;
use Magento\Framework\Api\SortOrderBuilder;
use Magento\Framework\Webapi\Exception as HTTPExceptionCodes;
+use Magento\Framework\Exception\NoSuchEntityException;
/**
* @magentoAppIsolation enabled
@@ -136,6 +138,24 @@ public function productCreationProvider()
];
}
+ /**
+ * Load website by website code
+ *
+ * @param $websiteCode
+ * @return Website
+ */
+ private function loadWebsiteByCode($websiteCode)
+ {
+ $websiteRepository = Bootstrap::getObjectManager()->get(WebsiteRepository::class);
+ try {
+ $website = $websiteRepository->get($websiteCode);
+ } catch (NoSuchEntityException $e) {
+ $this->fail("Couldn`t load website: {$websiteCode}");
+ }
+
+ return $website;
+ }
+
/**
* Test removing association between product and website 1
* @magentoApiDataFixture Magento/Catalog/_files/product_with_two_websites.php
@@ -144,12 +164,7 @@ public function testUpdateWithDeleteWebsites()
{
$productBuilder[ProductInterface::SKU] = 'unique-simple-azaza';
/** @var Website $website */
- $website = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(Website::class);
- $website->load('second_website', 'code');
-
- if (!$website->getId()) {
- $this->fail("Couldn`t load website");
- }
+ $website = $this->loadWebsiteByCode('second_website');
$websitesData = [
'website_ids' => [
@@ -171,13 +186,6 @@ public function testUpdateWithDeleteWebsites()
public function testDeleteAllWebsiteAssociations()
{
$productBuilder[ProductInterface::SKU] = 'unique-simple-azaza';
- /** @var Website $website */
- $website = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(Website::class);
- $website->load('second_website', 'code');
-
- if (!$website->getId()) {
- $this->fail("Couldn`t load website");
- }
$websitesData = [
'website_ids' => []
@@ -198,14 +206,9 @@ public function testCreateWithMultipleWebsites()
$productBuilder = $this->getSimpleProductData();
$productBuilder[ProductInterface::SKU] = 'test-test-sku';
$productBuilder[ProductInterface::TYPE_ID] = 'simple';
-
/** @var Website $website */
- $website = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(Website::class);
- $website->load('test_website', 'code');
+ $website = $this->loadWebsiteByCode('test_website');
- if (!$website->getId()) {
- $this->fail("Couldn`t load website");
- }
$websitesData = [
'website_ids' => [
1,
@@ -218,6 +221,84 @@ public function testCreateWithMultipleWebsites()
$response[ProductInterface::EXTENSION_ATTRIBUTES_KEY]["website_ids"],
$websitesData["website_ids"]
);
+ $this->deleteProduct($productBuilder[ProductInterface::SKU]);
+ }
+
+ /**
+ * Add product associated with website that is not associated with default store
+ *
+ * @magentoApiDataFixture Magento/Store/_files/second_website_with_two_stores.php
+ */
+ public function testCreateWithNonDefaultStoreWebsite()
+ {
+ $productBuilder = $this->getSimpleProductData();
+ $productBuilder[ProductInterface::SKU] = 'test-sku-second-site-123';
+ $productBuilder[ProductInterface::TYPE_ID] = 'simple';
+ /** @var Website $website */
+ $website = $this->loadWebsiteByCode('test');
+
+ $websitesData = [
+ 'website_ids' => [
+ $website->getId(),
+ ]
+ ];
+ $productBuilder[ProductInterface::EXTENSION_ATTRIBUTES_KEY] = $websitesData;
+ $response = $this->saveProduct($productBuilder);
+ $this->assertEquals(
+ $websitesData["website_ids"],
+ $response[ProductInterface::EXTENSION_ATTRIBUTES_KEY]["website_ids"]
+ );
+ $this->deleteProduct($productBuilder[ProductInterface::SKU]);
+ }
+
+ /**
+ * Update product to be associated with website that is not associated with default store
+ *
+ * @magentoApiDataFixture Magento/Catalog/_files/product_with_two_websites.php
+ * @magentoApiDataFixture Magento/Store/_files/second_website_with_two_stores.php
+ */
+ public function testUpdateWithNonDefaultStoreWebsite()
+ {
+ $productBuilder[ProductInterface::SKU] = 'unique-simple-azaza';
+ /** @var Website $website */
+ $website = $this->loadWebsiteByCode('test');
+
+ $this->assertNotContains(Store::SCOPE_DEFAULT, $website->getStoreCodes());
+
+ $websitesData = [
+ 'website_ids' => [
+ $website->getId(),
+ ]
+ ];
+ $productBuilder[ProductInterface::EXTENSION_ATTRIBUTES_KEY] = $websitesData;
+ $response = $this->updateProduct($productBuilder);
+ $this->assertEquals(
+ $websitesData["website_ids"],
+ $response[ProductInterface::EXTENSION_ATTRIBUTES_KEY]["website_ids"]
+ );
+ }
+
+ /**
+ * Update product without specifying websites
+ *
+ * @magentoApiDataFixture Magento/Catalog/_files/product_with_two_websites.php
+ */
+ public function testUpdateWithoutWebsiteIds()
+ {
+ $productBuilder[ProductInterface::SKU] = 'unique-simple-azaza';
+ $originalProduct = $this->getProduct($productBuilder[ProductInterface::SKU]);
+ $newName = 'Updated Product';
+
+ $productBuilder[ProductInterface::NAME] = $newName;
+ $response = $this->updateProduct($productBuilder);
+ $this->assertEquals(
+ $newName,
+ $response[ProductInterface::NAME]
+ );
+ $this->assertEquals(
+ $originalProduct[ProductInterface::EXTENSION_ATTRIBUTES_KEY]["website_ids"],
+ $response[ProductInterface::EXTENSION_ATTRIBUTES_KEY]["website_ids"]
+ );
}
/**
@@ -727,8 +808,7 @@ public function testGetList()
*/
public function testGetListWithFilteringByWebsite()
{
- $website = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(Website::class);
- $website->load('test', 'code');
+ $website = $this->loadWebsiteByCode('test');
$searchCriteria = [
'searchCriteria' => [
'filter_groups' => [
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 dca3bf9abd182..0133b87e757bd 100644
--- a/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/CategoryTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/CategoryTest.php
@@ -7,6 +7,7 @@
namespace Magento\GraphQl\Catalog;
+use Magento\Catalog\Api\Data\CategoryInterface;
use Magento\Framework\DataObject;
use Magento\TestFramework\TestCase\GraphQlAbstract;
use Magento\Catalog\Api\Data\ProductInterface;
@@ -254,7 +255,6 @@ public function testCategoryProducts()
default_group_id
is_default
}
-
}
}
}
@@ -281,6 +281,54 @@ public function testCategoryProducts()
$this->assertWebsites($firstProduct, $response['category']['products']['items'][0]['websites']);
}
+ /**
+ * @magentoApiDataFixture Magento/Catalog/_files/categories.php
+ */
+ public function testAnchorCategory()
+ {
+ /** @var \Magento\Catalog\Model\ResourceModel\Category\Collection $categoryCollection */
+ $categoryCollection = $this->objectManager->create(
+ \Magento\Catalog\Model\ResourceModel\Category\Collection::class
+ );
+ $categoryCollection->addFieldToFilter('name', 'Category 1');
+ $category = $categoryCollection->getFirstItem();
+ /** @var \Magento\Framework\EntityManager\MetadataPool $entityManagerMetadataPool */
+ $entityManagerMetadataPool = $this->objectManager->create(\Magento\Framework\EntityManager\MetadataPool::class);
+ $categoryLinkField = $entityManagerMetadataPool->getMetadata(CategoryInterface::class)->getLinkField();
+ $categoryId = $category->getData($categoryLinkField);
+ $this->assertNotEmpty($categoryId, "Preconditions failed: category is not available.");
+
+ $query = <<graphQlQuery($query);
+ $expectedResponse = [
+ 'category' => [
+ 'name' => 'Category 1',
+ 'products' => [
+ 'total_count' => 3,
+ 'items' => [
+ ['sku' => '12345'],
+ ['sku' => 'simple'],
+ ['sku' => 'simple-4']
+ ]
+ ]
+ ]
+ ];
+ $this->assertEquals($expectedResponse, $response);
+ }
+
/**
* @param ProductInterface $product
* @param array $actualResponse
diff --git a/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/ProductSearchTest.php b/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/ProductSearchTest.php
index 65e044a5f005b..dc5a66fbb34ab 100644
--- a/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/ProductSearchTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/ProductSearchTest.php
@@ -679,7 +679,7 @@ public function testFilterProductsByCategoryIds()
products(
filter:
{
- category_ids:{eq:"{$queryCategoryId}"}
+ category_id:{eq:"{$queryCategoryId}"}
}
pageSize:2
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 8c8130d2b3949..d8b3c5cac52aa 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 aaa7a5a6d4436..2b7e76aee0751 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/api-functional/testsuite/Magento/WebapiAsync/Model/AsyncScheduleCustomRouteTest.php b/dev/tests/api-functional/testsuite/Magento/WebapiAsync/Model/AsyncScheduleCustomRouteTest.php
new file mode 100644
index 0000000000000..4a56c4e0e6f77
--- /dev/null
+++ b/dev/tests/api-functional/testsuite/Magento/WebapiAsync/Model/AsyncScheduleCustomRouteTest.php
@@ -0,0 +1,257 @@
+objectManager = Bootstrap::getObjectManager();
+ $this->logFilePath = TESTS_TEMP_DIR . "/MessageQueueTestLog.txt";
+ $this->registry = $this->objectManager->get(Registry::class);
+
+ $params = array_merge_recursive(
+ \Magento\TestFramework\Helper\Bootstrap::getInstance()->getAppInitParams(),
+ ['MAGE_DIRS' => ['cache' => ['path' => TESTS_TEMP_DIR . '/cache']]]
+ );
+
+ /** @var PublisherConsumerController publisherConsumerController */
+ $this->publisherConsumerController = $this->objectManager->create(PublisherConsumerController::class, [
+ 'consumers' => $this->consumers,
+ 'logFilePath' => $this->logFilePath,
+ 'appInitParams' => $params,
+ ]);
+ $this->productRepository = $this->objectManager->create(ProductRepositoryInterface::class);
+
+ try {
+ $this->publisherConsumerController->initialize();
+ } catch (EnvironmentPreconditionException $e) {
+ $this->markTestSkipped($e->getMessage());
+ } catch (PreconditionFailedException $e) {
+ $this->fail(
+ $e->getMessage()
+ );
+ }
+
+ parent::setUp();
+ }
+
+ /**
+ * @dataProvider productCreationProvider
+ */
+ public function testAsyncScheduleBulkByCustomRoute($product)
+ {
+ $this->_markTestAsRestOnly();
+ $this->skus[] = $product['product'][ProductInterface::SKU];
+ $this->clearProducts();
+
+ $response = $this->saveProductByCustomRoute($product);
+ $this->assertArrayHasKey(self::BULK_UUID_KEY, $response);
+ $this->assertNotNull($response[self::BULK_UUID_KEY]);
+
+ $this->assertCount(1, $response['request_items']);
+ $this->assertEquals('accepted', $response['request_items'][0]['status']);
+ $this->assertFalse($response['errors']);
+
+ //assert one products is created
+ try {
+ $this->publisherConsumerController->waitForAsynchronousResult(
+ [$this, 'assertProductCreation'],
+ [$product]
+ );
+ } catch (PreconditionFailedException $e) {
+ $this->fail("Not all products were created");
+ }
+ }
+
+ public function tearDown()
+ {
+ $this->clearProducts();
+ $this->publisherConsumerController->stopConsumers();
+ parent::tearDown();
+ }
+
+ private function clearProducts()
+ {
+ $size = $this->objectManager->create(Collection::class)
+ ->addAttributeToFilter('sku', ['in' => $this->skus])
+ ->load()
+ ->getSize();
+
+ if ($size == 0) {
+ return;
+ }
+
+ $this->registry->unregister('isSecureArea');
+ $this->registry->register('isSecureArea', true);
+ try {
+ foreach ($this->skus as $sku) {
+ $this->productRepository->deleteById($sku);
+ }
+ } catch (\Exception $e) {
+ throw $e;
+ //nothing to delete
+ }
+ $this->registry->unregister('isSecureArea');
+
+ $size = $this->objectManager->create(Collection::class)
+ ->addAttributeToFilter('sku', ['in' => $this->skus])
+ ->load()
+ ->getSize();
+
+ if ($size > 0) {
+ throw new Exception(new Phrase("Collection size after clearing the products: %size", ['size' => $size]));
+ }
+ }
+
+ /**
+ * @return array
+ */
+ public function productCreationProvider()
+ {
+ $productBuilder = function ($data) {
+ return array_replace_recursive(
+ $this->getSimpleProductData(),
+ $data
+ );
+ };
+
+ return [
+ [
+ [
+ 'product' =>
+ $productBuilder([
+ ProductInterface::TYPE_ID => 'simple',
+ ProductInterface::SKU => 'psku-test-1',
+ ]),
+ ],
+ ],
+ [
+ [
+ 'product' => $productBuilder([
+ ProductInterface::TYPE_ID => 'virtual',
+ ProductInterface::SKU => 'psku-test-2',
+ ]),
+ ],
+ ],
+ ];
+ }
+
+ /**
+ * Get Simple Product Data
+ *
+ * @param array $productData
+ * @return array
+ */
+ private function getSimpleProductData($productData = [])
+ {
+ return [
+ ProductInterface::SKU => isset($productData[ProductInterface::SKU])
+ ? $productData[ProductInterface::SKU] : uniqid('sku-', true),
+ ProductInterface::NAME => isset($productData[ProductInterface::NAME])
+ ? $productData[ProductInterface::NAME] : uniqid('sku-', true),
+ ProductInterface::VISIBILITY => 4,
+ ProductInterface::TYPE_ID => 'simple',
+ ProductInterface::PRICE => 3.62,
+ ProductInterface::STATUS => 1,
+ ProductInterface::TYPE_ID => 'simple',
+ ProductInterface::ATTRIBUTE_SET_ID => 4,
+ 'custom_attributes' => [
+ ['attribute_code' => 'cost', 'value' => ''],
+ ['attribute_code' => 'description', 'value' => 'Description'],
+ ],
+ ];
+ }
+
+ /**
+ * @param $requestData
+ * @param string|null $storeCode
+ * @return mixed
+ */
+ private function saveProductByCustomRoute($requestData, $storeCode = null)
+ {
+ $serviceInfo = [
+ 'rest' => [
+ 'resourcePath' => self::ASYNC_RESOURCE_CUSTOM_PATH,
+ 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
+ ],
+ ];
+
+ return $this->_webApiCall($serviceInfo, $requestData, null, $storeCode);
+ }
+
+ public function assertProductCreation()
+ {
+ $collection = $this->objectManager->create(Collection::class)
+ ->addAttributeToFilter('sku', ['in' => $this->skus])
+ ->load();
+ $size = $collection->getSize();
+
+ return $size == count($this->skus);
+ }
+}
diff --git a/dev/tests/functional/composer.json b/dev/tests/functional/composer.json
index da431fcf8a252..e49824d17df80 100644
--- a/dev/tests/functional/composer.json
+++ b/dev/tests/functional/composer.json
@@ -4,7 +4,7 @@
},
"require": {
"php": "~7.1.3||~7.2.0",
- "magento/mtf": "1.0.0-rc60",
+ "magento/mtf": "1.0.0-rc61",
"allure-framework/allure-phpunit": "~1.2.0",
"doctrine/annotations": "1.4.*",
"phpunit/phpunit": "~6.5.0",
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 8ffcab68cdc62..acf15c0e28252 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/CatalogRule/Test/Page/Adminhtml/CatalogRuleNew.xml b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Page/Adminhtml/CatalogRuleNew.xml
index 1823dd1e1bbe2..ba4ff8d42d951 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/Checkout/Test/Constraint/AssertMinicartEmpty.php b/dev/tests/functional/tests/app/Magento/Checkout/Test/Constraint/AssertMinicartEmpty.php
index 65a2b7879af8a..bb1f68c2d1278 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/Constraint/AssertMinicartEmpty.php
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/Constraint/AssertMinicartEmpty.php
@@ -27,6 +27,7 @@ class AssertMinicartEmpty extends AbstractConstraint
public function processAssert(
CmsIndex $cmsIndex
) {
+ $cmsIndex->open();
\PHPUnit\Framework\Assert::assertEquals(
self::TEXT_EMPTY_MINICART,
$cmsIndex->getCartSidebarBlock()->getEmptyMessage(),
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/OnePageCheckoutOfflinePaymentMethodsTest.xml b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/OnePageCheckoutOfflinePaymentMethodsTest.xml
index 5e08ad3097ed3..b999900042c37 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/OnePageCheckoutOfflinePaymentMethodsTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/OnePageCheckoutOfflinePaymentMethodsTest.xml
@@ -19,7 +19,7 @@
Fixed
checkmo
checkmo, disable_guest_checkout, disable_customer_redirect_after_logging
-
+
MAGETWO-59816: Redirect works improperly in a browser incognito mode
@@ -35,7 +35,7 @@
US_address_1_without_email
checkmo
checkmo, disable_guest_checkout, disable_customer_redirect_after_logging, enable_https_frontend_only
-
+
severity:S0
@@ -51,7 +51,6 @@
Pending
Back, Send Email, Cancel, Hold, Invoice, Edit
checkmo_specificcountry_gb
-
@@ -70,10 +69,10 @@
- 285.00
banktransfer
- Pending
- Back, Send Email, Cancel, Hold, Ship, Invoice, Edit
+ Processing
+ Back, Send Email, Cancel, Hold, Invoice, Edit
banktransfer
-
+
@@ -93,10 +92,10 @@
- 375.00
banktransfer
- Pending
- Back, Send Email, Cancel, Hold, Ship, Invoice, Edit
+ Precessing
+ Back, Send Email, Cancel, Hold, Invoice, Edit
banktransfer_specificcountry_gb, can_subtract_and_can_back_in_stock
-
+
@@ -123,7 +122,7 @@
Yes
checkmo
checkmo
-
+
@@ -149,7 +148,7 @@
true
checkmo
checkmo, freeshipping_minimum_order_amount_100
-
+
@@ -168,7 +167,6 @@
Pending
Back, Cancel, Send Email, Hold, Invoice, Edit
zero_subtotal_checkout
-
@@ -185,9 +183,9 @@
- 375
checkmo
- Pending
+ Processing
Back, Send Email, Cancel, Hold, Invoice, Edit
-
+
@@ -208,7 +206,7 @@
- 565.00
checkmo
-
+
@@ -225,7 +223,7 @@
banktransfer
banktransfer_specificcountry_gb
-
+
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestStep/PlaceOrderStep.php b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestStep/PlaceOrderStep.php
index 13b8b9a1405fa..964f8f366f223 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestStep/PlaceOrderStep.php
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestStep/PlaceOrderStep.php
@@ -7,9 +7,11 @@
namespace Magento\Checkout\Test\TestStep;
use Magento\Checkout\Test\Constraint\AssertGrandTotalOrderReview;
+use Magento\Checkout\Test\Constraint\AssertOrderSuccessPlacedMessage;
use Magento\Checkout\Test\Page\CheckoutOnepage;
use Magento\Checkout\Test\Page\CheckoutOnepageSuccess;
use Magento\Mtf\Fixture\FixtureFactory;
+use Magento\Mtf\ObjectManager;
use Magento\Mtf\TestStep\TestStepInterface;
use Magento\Sales\Test\Fixture\OrderInjectable;
@@ -32,6 +34,13 @@ class PlaceOrderStep implements TestStepInterface
*/
private $assertGrandTotalOrderReview;
+ /**
+ * Assert that order success message is correct.
+ *
+ * @var AssertOrderSuccessPlacedMessage
+ */
+ private $assertOrderSuccessPlacedMessage;
+
/**
* One page checkout success page.
*
@@ -75,6 +84,7 @@ class PlaceOrderStep implements TestStepInterface
* @param array $products
* @param array $prices
* @param OrderInjectable|null $order
+ * @param AssertOrderSuccessPlacedMessage $assertOrderSuccessPlacedMessage
*/
public function __construct(
CheckoutOnepage $checkoutOnepage,
@@ -83,7 +93,8 @@ public function __construct(
FixtureFactory $fixtureFactory,
array $products = [],
array $prices = [],
- OrderInjectable $order = null
+ OrderInjectable $order = null,
+ AssertOrderSuccessPlacedMessage $assertOrderSuccessPlacedMessage = null
) {
$this->checkoutOnepage = $checkoutOnepage;
$this->assertGrandTotalOrderReview = $assertGrandTotalOrderReview;
@@ -92,6 +103,8 @@ public function __construct(
$this->products = $products;
$this->prices = $prices;
$this->order = $order;
+ $this->assertOrderSuccessPlacedMessage = $assertOrderSuccessPlacedMessage
+ ?: ObjectManager::getInstance()->create(AssertOrderSuccessPlacedMessage::class);
}
/**
@@ -106,6 +119,7 @@ public function run()
}
$this->checkoutOnepage->getPaymentBlock()->getSelectedPaymentMethodBlock()->clickPlaceOrder();
$orderId = $this->checkoutOnepageSuccess->getSuccessBlock()->getGuestOrderId();
+ $this->assertOrderSuccessPlacedMessage->processAssert($this->checkoutOnepageSuccess);
$data = [
'id' => $orderId,
'entity_id' => ['products' => $this->products]
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/etc/testcase.xml b/dev/tests/functional/tests/app/Magento/Checkout/Test/etc/testcase.xml
index 0c8fbd5f03f9e..f0b0194039a34 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/etc/testcase.xml
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/etc/testcase.xml
@@ -38,7 +38,8 @@
-
+
+
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Block/Account/AuthenticationPopup.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Block/Account/AuthenticationPopup.php
index e25a5c1f719d0..1ef9267e73785 100644
--- a/dev/tests/functional/tests/app/Magento/Customer/Test/Block/Account/AuthenticationPopup.php
+++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Block/Account/AuthenticationPopup.php
@@ -69,6 +69,7 @@ public function createAccount()
*/
public function loginCustomer(Customer $customer)
{
+ sleep(10);
$this->fill($customer);
$this->_rootElement->find($this->login)->click();
$this->waitForElementNotVisible($this->loadingMask);
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 573f28f09b78c..7a6903ef47aac 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/CreateOrderBackendPartOneTest.xml b/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/CreateOrderBackendPartOneTest.xml
index f5646ac543213..0a5958b506a43 100644
--- a/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/CreateOrderBackendPartOneTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/CreateOrderBackendPartOneTest.xml
@@ -19,10 +19,10 @@
- 425.00
cashondelivery
- Pending
- Back, Reorder, Cancel, Send Email, Hold, Invoice, Ship, Edit
+ Processing
+ Back, Reorder, Cancel, Send Email, Invoice, Edit
cashondelivery
-
+
@@ -42,7 +42,6 @@
Pending
Back, Cancel, Send Email, Hold, Invoice, Edit
checkmo_specificcountry_gb
-
@@ -59,10 +58,10 @@
- 565.00
banktransfer
- Pending
- Back, Cancel, Send Email, Hold, Reorder, Invoice, Edit
+ Processing
+ Back, Cancel, Send Email, Reorder, Invoice, Edit
banktransfer
-
+
@@ -84,7 +83,6 @@
Pending
Back, Cancel, Send Email, Hold, Invoice, Edit
freeshipping_specificcountry_gb, banktransfer
-
@@ -103,10 +101,10 @@
purchaseorder
123456
- Pending
- Back, Cancel, Send Email, Hold, Invoice, Reorder, Edit
+ Processing
+ Back, Cancel, Send Email, Invoice, Reorder, Edit
purchaseorder
-
+
@@ -127,7 +125,7 @@
- 21.91
checkmo
-
+
@@ -145,7 +143,7 @@
- 21.91
checkmo
-
+
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 439b8a4492a1a..c4e03b94d2ada 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 79abd438a1f2e..dcee66b44646e 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 c7c4a2276e4b7..1420255b9c86d 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 @@
-
+
+
@@ -54,7 +55,8 @@
-
+
+
@@ -145,7 +147,8 @@
-
+
+
diff --git a/dev/tests/integration/testsuite/Magento/AsynchronousOperations/Model/BulkManagementTest.php b/dev/tests/integration/testsuite/Magento/AsynchronousOperations/Model/BulkManagementTest.php
index 940eb769298b9..5ecc274c5bbb8 100644
--- a/dev/tests/integration/testsuite/Magento/AsynchronousOperations/Model/BulkManagementTest.php
+++ b/dev/tests/integration/testsuite/Magento/AsynchronousOperations/Model/BulkManagementTest.php
@@ -6,7 +6,6 @@
namespace Magento\AsynchronousOperations\Model;
use Magento\AsynchronousOperations\Api\Data\BulkSummaryInterface;
-use Magento\AsynchronousOperations\Api\Data\DetailedOperationStatusInterface;
use Magento\TestFramework\Helper\Bootstrap;
use Magento\Framework\ObjectManagerInterface;
use Magento\AsynchronousOperations\Api\Data\OperationInterface;
@@ -136,7 +135,7 @@ private function getStoredOperationData()
{
/** @var MetadataPool $metadataPool */
$metadataPool = $this->objectManager->get(MetadataPool::class);
- $operationMetadata = $metadataPool->getMetadata(DetailedOperationStatusInterface::class);
+ $operationMetadata = $metadataPool->getMetadata(OperationInterface::class);
/** @var ResourceConnection $resourceConnection */
$resourceConnection = $this->objectManager->get(ResourceConnection::class);
$connection = $resourceConnection->getConnectionByName($operationMetadata->getEntityConnectionName());
diff --git a/dev/tests/integration/testsuite/Magento/AsynchronousOperations/_files/bulk.php b/dev/tests/integration/testsuite/Magento/AsynchronousOperations/_files/bulk.php
index 787d2c10a44c4..c6c58d47e5af4 100644
--- a/dev/tests/integration/testsuite/Magento/AsynchronousOperations/_files/bulk.php
+++ b/dev/tests/integration/testsuite/Magento/AsynchronousOperations/_files/bulk.php
@@ -44,7 +44,7 @@
'user_id' => 1,
'description' => 'Bulk Description',
'operation_count' => 2,
- ]
+ ],
];
// Only processed operations are saved into database (i.e. operations that are not in 'open' state)
$operations = [
@@ -88,7 +88,6 @@
'error_code' => 2222,
'result_message' => 'Entity with ID=4 does not exist',
],
-
];
$bulkQuery = "INSERT INTO {$bulkTable} (`uuid`, `user_id`, `description`, `operation_count`)"
diff --git a/dev/tests/integration/testsuite/Magento/AsynchronousOperations/_files/operation_searchable.php b/dev/tests/integration/testsuite/Magento/AsynchronousOperations/_files/operation_searchable.php
new file mode 100644
index 0000000000000..e74f995f8b57b
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/AsynchronousOperations/_files/operation_searchable.php
@@ -0,0 +1,69 @@
+get(\Magento\Framework\App\ResourceConnection::class);
+$connection = $resource->getConnection();
+$bulkTable = $resource->getTableName('magento_bulk');
+$operationTable = $resource->getTableName('magento_operation');
+
+$bulks = [
+ 'started_searchable' => [
+ 'uuid' => 'bulk-uuid-searchable-6',
+ 'user_id' => 1,
+ 'description' => 'Bulk Description',
+ 'operation_count' => 3,
+ 'start_time' => '2009-10-10 00:00:00',
+ ],
+];
+// Only processed operations are saved into database (i.e. operations that are not in 'open' state)
+$operations = [
+ [
+ 'bulk_uuid' => 'bulk-uuid-searchable-6',
+ 'topic_name' => 'topic-5',
+ 'serialized_data' => json_encode(['entity_id' => 5]),
+ 'status' => OperationInterface::STATUS_TYPE_COMPLETE,
+ 'error_code' => null,
+ 'result_message' => null,
+ ],
+ [
+ 'bulk_uuid' => 'bulk-uuid-searchable-6',
+ 'topic_name' => 'topic-5',
+ 'serialized_data' => json_encode(['entity_id' => 5, 'meta_information' => 'Test']),
+ 'status' => OperationInterface::STATUS_TYPE_NOT_RETRIABLY_FAILED,
+ 'error_code' => 1111,
+ 'result_message' => 'Something went wrong during your request',
+ ],
+ [
+ 'bulk_uuid' => 'bulk-uuid-searchable-6',
+ 'topic_name' => 'topic-5',
+ 'serialized_data' => json_encode(['entity_id' => 5]),
+ 'status' => OperationInterface::STATUS_TYPE_RETRIABLY_FAILED,
+ 'error_code' => 2222,
+ 'result_message' => 'Entity with ID=4 does not exist',
+ ],
+
+];
+
+$bulkQuery = "INSERT INTO {$bulkTable} (`uuid`, `user_id`, `description`, `operation_count`, `start_time`)"
+ . " VALUES (:uuid, :user_id, :description, :operation_count, :start_time);";
+foreach ($bulks as $bulk) {
+ $connection->query($bulkQuery, $bulk);
+}
+
+$operationQuery = "INSERT INTO {$operationTable}"
+ . " (`bulk_uuid`, `topic_name`, `serialized_data`, `status`, `error_code`, `result_message`)"
+ . " VALUES (:bulk_uuid, :topic_name, :serialized_data, :status, :error_code, :result_message);";
+foreach ($operations as $operation) {
+ $connection->query($operationQuery, $operation);
+}
diff --git a/dev/tests/integration/testsuite/Magento/AsynchronousOperations/_files/operation_searchable_rollback.php b/dev/tests/integration/testsuite/Magento/AsynchronousOperations/_files/operation_searchable_rollback.php
new file mode 100644
index 0000000000000..268f159c125f2
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/AsynchronousOperations/_files/operation_searchable_rollback.php
@@ -0,0 +1,10 @@
+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 0000000000000..d32d6fab33319
--- /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/Captcha/Observer/ResetAttemptForBackendObserverTest.php b/dev/tests/integration/testsuite/Magento/Captcha/Observer/ResetAttemptForBackendObserverTest.php
new file mode 100644
index 0000000000000..c0a720229a00d
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Captcha/Observer/ResetAttemptForBackendObserverTest.php
@@ -0,0 +1,60 @@
+objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+ }
+
+ /**
+ * @magentoDataFixture Magento/Captcha/_files/failed_logins_backend.php
+ */
+ public function testLoginAttemptsRemovedAfterSuccessfulLogin()
+ {
+ $login = 'mageadmin';
+ $userFactory = $this->objectManager->get(UserFactory::class);
+ $captchaLogFactory = $this->objectManager->get(LogFactory::class);
+ $eventManager = $this->objectManager->get(ManagerInterface::class);
+
+ /** @var User $user */
+ $user = $userFactory->create();
+ $user->setUserName($login);
+
+ $eventManager->dispatch(
+ 'backend_auth_user_login_success',
+ ['user' => $user]
+ );
+
+ /**
+ * @var CaptchaLog $captchaLog
+ */
+ $captchaLog = $captchaLogFactory->create();
+
+ self::assertEquals(0, $captchaLog->countAttemptsByUserLogin($login));
+ }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Captcha/_files/failed_logins_backend.php b/dev/tests/integration/testsuite/Magento/Captcha/_files/failed_logins_backend.php
new file mode 100644
index 0000000000000..7130cdfca57d7
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Captcha/_files/failed_logins_backend.php
@@ -0,0 +1,17 @@
+get(LogFactory::class);
+
+/** @var Log $captchaLog */
+$captchaLog = $logFactory->create();
+$captchaLog->logAttempt('mageadmin');
diff --git a/dev/tests/integration/testsuite/Magento/Captcha/_files/failed_logins_backend_rollback.php b/dev/tests/integration/testsuite/Magento/Captcha/_files/failed_logins_backend_rollback.php
new file mode 100644
index 0000000000000..12a16027e1e5c
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Captcha/_files/failed_logins_backend_rollback.php
@@ -0,0 +1,17 @@
+get(LogFactory::class);
+
+/** @var Log $captchaLog */
+$captchaLog = $logFactory->create();
+$captchaLog->deleteUserAttempts('mageadmin');
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Console/Command/ProductAttributesCleanUpTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Console/Command/ProductAttributesCleanUpTest.php
index 88b59570457d3..4b6a2a40aa129 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Console/Command/ProductAttributesCleanUpTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Console/Command/ProductAttributesCleanUpTest.php
@@ -107,8 +107,6 @@ private function prepareAdditionalStore()
->setGroupId($storeGroup->getId())
->save();
- /* Refresh stores memory cache */
- $this->objectManager->get(\Magento\Store\Model\StoreManagerInterface::class)->reinitStores();
return $store;
}
}
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 fdc85941b32e9..4261873cc8e6e 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/ResourceModel/_files/category_multiple_stores.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/ResourceModel/_files/category_multiple_stores.php
index 84b57f8706620..5ccace9086316 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Model/ResourceModel/_files/category_multiple_stores.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/ResourceModel/_files/category_multiple_stores.php
@@ -44,11 +44,6 @@
$store->save();
}
-/* Refresh stores memory cache */
-\Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
- \Magento\Store\Model\StoreManagerInterface::class
-)->reinitStores();
-
/** @var \Magento\Catalog\Model\Category $newCategory */
$newCategory = $factory->create();
$newCategory
diff --git a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/_files/custom_category_store_media_disabled.php b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/_files/custom_category_store_media_disabled.php
index c2b8dc98e4a16..e1a359fbdaa8f 100644
--- a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/_files/custom_category_store_media_disabled.php
+++ b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/_files/custom_category_store_media_disabled.php
@@ -47,8 +47,3 @@
$objectManager->create(\Magento\Eav\Model\AttributeSetManagement::class)
->create($entityTypeCode, $attributeSet, $defaultSetId);
-
-/* Refresh stores memory cache */
-\Magento\TestFramework\Helper\Bootstrap::getObjectManager()
- ->get(\Magento\Store\Model\StoreManagerInterface::class)
- ->reinitStores();
diff --git a/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/_files/two_categories_per_two_store_groups.php b/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/_files/two_categories_per_two_store_groups.php
index 90a74351d8200..f77413e18f472 100644
--- a/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/_files/two_categories_per_two_store_groups.php
+++ b/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/_files/two_categories_per_two_store_groups.php
@@ -65,6 +65,3 @@
->save();
$store->setGroupId($storeGroup->getId())->save();
-
-/* Refresh stores memory cache */
-$objectManager->get(\Magento\Store\Model\StoreManagerInterface::class)->reinitStores();
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 0731871b4bd40..61add5f7d0ea7 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 4cdff533af737..014aaf7679bc9 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 0000000000000..7ec53d9099d35
--- /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 0000000000000..7bdfbc6d7f9b3
--- /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 c2dd3c2f879e1..f8872b02ba246 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 0d062c9d3f4e4..e73d2ab1b5906 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 8ee3a40915028..cf87be7e8d710 100644
--- a/dev/tests/integration/testsuite/Magento/Elasticsearch/_files/indexer.php
+++ b/dev/tests/integration/testsuite/Magento/Elasticsearch/_files/indexer.php
@@ -31,9 +31,6 @@
\Magento\Store\Model\ScopeInterface::SCOPE_STORES,
$store->getId()
);
-
- /* Refresh stores memory cache */
- $storeManager->reinitStores();
}
/** @var $productFirst \Magento\Catalog\Model\Product */
@@ -52,7 +49,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 +65,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 +81,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 +97,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/indexer_rollback.php b/dev/tests/integration/testsuite/Magento/Elasticsearch/_files/indexer_rollback.php
index 1d5f1161f3d58..9ca4f78660b3a 100644
--- a/dev/tests/integration/testsuite/Magento/Elasticsearch/_files/indexer_rollback.php
+++ b/dev/tests/integration/testsuite/Magento/Elasticsearch/_files/indexer_rollback.php
@@ -29,6 +29,3 @@
$registry->unregister('isSecureArea');
$registry->register('isSecureArea', false);
-
-/* Refresh stores memory cache */
-$objectManager->get(\Magento\Store\Model\StoreManagerInterface::class)->reinitStores();
diff --git a/dev/tests/integration/testsuite/Magento/Elasticsearch/_files/requests.xml b/dev/tests/integration/testsuite/Magento/Elasticsearch/_files/requests.xml
index c40ac9e8b9b1c..0aaaf9b85857f 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 581630e9626fa..ecbce25cd3377 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();
}
/**
@@ -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 2f30cba3d8ee6..8a7c5246f373a 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 70f9ac75b07f3..dcf3cd582507c 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 b672fbe9f8cec..3902e78d1fb55 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/Framework/View/_files/static/expected/styles.magento.min.css b/dev/tests/integration/testsuite/Magento/Framework/View/_files/static/expected/styles.magento.min.css
index 99c21441f9dbc..7bb283e0b3514 100644
--- a/dev/tests/integration/testsuite/Magento/Framework/View/_files/static/expected/styles.magento.min.css
+++ b/dev/tests/integration/testsuite/Magento/Framework/View/_files/static/expected/styles.magento.min.css
@@ -1 +1 @@
-table>caption{margin-bottom:5px}table thead{background:#676056;color:#f7f3eb}table thead .headings{background:#807a6e}table thead a{color:#f7f3eb;display:block}table thead a label{color:#f7f3eb;cursor:pointer;display:block}table thead a:hover,table thead a:focus{color:#dac7a2;text-decoration:none}table tfoot{background:#f2ebde;color:#676056}table tfoot tr th,table tfoot tr td{text-align:left}table th{background:0 0;border:solid #cac3b4;border-width:0 1px;font-size:14px;padding:6px 10px;text-align:center}table td{border:solid #cac3b4;border-width:0 1px;padding:6px 10px 7px;vertical-align:top}table tbody tr td{background:#fff;color:#676056;padding-top:12px}table tbody tr td:first-child{border-left:0}table tbody tr td:first-child input[type=checkbox]{margin:0}table tbody tr td:last-child{border-right:0}table tbody tr:last-child th,table tbody tr:last-child td{border-bottom-width:1px}table tbody tr:nth-child(odd) td,table tbody tr:nth-child(odd) th{background-color:#f7f3eb}table tbody.even tr td{background:#fff}table tbody.odd tr td{background:#f7f3eb}table .dropdown-menu li{padding:7px 15px;line-height:14px;cursor:pointer}table .col-draggable .draggable-handle{float:left;position:relative;top:0}.not-sort{padding-right:10px}.sort-arrow-asc,.sort-arrow-desc{padding-right:10px;position:relative}.sort-arrow-asc:after,.sort-arrow-desc:after{right:-11px;top:-1px;position:absolute;width:23px}.sort-arrow-asc:hover:after,.sort-arrow-desc:hover:after{color:#dac7a2}.sort-arrow-asc{display:inline-block;text-decoration:none}.sort-arrow-asc:after{font-family:'icons-blank-theme';content:'\e626';font-size:13px;line-height:inherit;color:#f7f3eb;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.sort-arrow-asc:hover:after{color:#dac7a2}.sort-arrow-desc{display:inline-block;text-decoration:none}.sort-arrow-desc:after{font-family:'icons-blank-theme';content:'\e623';font-size:13px;line-height:inherit;color:#f7f3eb;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.sort-arrow-desc:hover:after{color:#dac7a2}.grid-actions .input-text,.pager .input-text,.massaction .input-text,.filter .input-text,.grid-actions select,.pager select,.massaction select,.filter select,.grid-actions .select,.pager .select,.massaction .select,.filter .select{border-color:#989287;box-shadow:none;border-radius:1px;height:28px;margin:0 10px 0 0}.filter th{border:0 solid #676056;padding:6px 3px;vertical-align:top}.filter .ui-datepicker-trigger{cursor:pointer;margin-top:2px}.filter .input-text{padding:0 5px}.filter .range-line:not(:last-child){margin-bottom:5px}.filter .date{padding-right:28px;position:relative;display:inline-block;text-decoration:none}.filter .date .hasDatepicker{vertical-align:top;width:99%}.filter .date img{cursor:pointer;height:25px;width:25px;right:0;position:absolute;vertical-align:middle;z-index:2;opacity:0}.filter .date:before{font-family:'icons-blank-theme';content:'\e612';font-size:42px;line-height:30px;color:#f7f3eb;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.filter .date:hover:before{color:#dac7a2}.filter .date:before{height:29px;margin-left:5px;position:absolute;right:-3px;top:-3px;width:35px}.filter select{border-color:#cac3b4;margin:0;padding:0;width:99%}.filter input.input-text{border-color:#cac3b4;margin:0;width:99%}.filter input.input-text::-webkit-input-placeholder{color:#989287 !important;text-transform:lowercase}.filter input.input-text::-moz-placeholder{color:#989287 !important;text-transform:lowercase}.filter input.input-text:-moz-placeholder{color:#989287 !important;text-transform:lowercase}.filter input.input-text:-ms-input-placeholder{color:#989287 !important;text-transform:lowercase}.grid{background:#fff;color:#676056;font-size:13px;font-weight:400;padding:15px}.grid table{width:100%}.grid tbody tr.selected th,.grid tbody tr.selected td,.grid tbody tr:hover th,.grid tbody tr:hover td,.grid tbody tr:nth-child(odd):hover th,.grid tbody tr:nth-child(odd):hover td{background-color:#f2ebde;cursor:pointer}.grid tbody tr.selected th.empty-text,.grid tbody tr.selected td.empty-text,.grid tbody tr:hover th.empty-text,.grid tbody tr:hover td.empty-text,.grid tbody tr:nth-child(odd):hover th.empty-text,.grid tbody tr:nth-child(odd):hover td.empty-text{background-color:#f7f3eb;cursor:default}.grid .empty-text{font:400 20px/1.2 'Open Sans',sans-serif;text-align:center;white-space:nowrap}.grid .col-sku{max-width:100px;width:100px}.grid .col-select,.grid .col-massaction{text-align:center}.grid .editable .input-text{width:65px}.grid .col-actions .action-select{background:#fff;border-color:#989287;height:28px;margin:0;padding:4px 4px 5px;width:80px}.grid .col-position.editable{white-space:nowrap}.grid .col-position.editable .input-text{margin:-7px 5px 0;width:70%}.eq-ie9 .hor-scroll{display:inline-block;min-height:0;overflow-y:hidden;overflow-x:auto;width:100%}.data-table{border-collapse:separate;width:100%}.data-table thead,.data-table tfoot,.data-table th,.accordion .config .data-table thead th,.accordion .config .data-table tfoot td,.accordion .config .accordion .config .data-table tfoot td th{background:#fff;color:#676056;font-size:13px;font-weight:600}.data-table th{text-align:left}.data-table thead th,.accordion .config .data-table thead th th,.accordion .config .data-table tfoot td th,.accordion .config .accordion .config .data-table tfoot td th th{border:solid #c9c2b8;border-width:0 0 1px;padding:7px}.data-table td,.data-table tbody tr th,.data-table tbody tr td,.accordion .config .data-table td{background:#fff;border-width:0;padding:5px 7px;vertical-align:middle}.data-table tbody tr:nth-child(odd) th,.data-table tbody tr:nth-child(odd) td,.accordion .config .data-table tbody tr:nth-child(odd) td{background:#fbfaf6}.data-table tbody.odd tr th,.data-table tbody.odd tr td{background:#fbfaf6}.data-table tbody.even tr th,.data-table tbody.even tr td{background:#fff}.data-table tfoot tr:last-child th,.data-table tfoot tr:last-child td,.data-table .accordion .config .data-table tfoot tr:last-child td{border:0}.data-table.order-tables tbody td{vertical-align:top}.data-table.order-tables tbody:hover tr th,.data-table.order-tables tbody:hover tr td{background:#f7f3eb}.data-table.order-tables tfoot td{background:#f2ebde;color:#676056;font-size:13px;font-weight:600}.data-table input[type=text]{width:98%;padding-left:1%;padding-right:1%}.data-table select{margin:0;box-sizing:border-box}.data-table .col-actions .actions-split{margin-top:4px}.data-table .col-actions .actions-split [class^=action-]{background:0 0;border:1px solid #c8c3b5;padding:3px 5px;color:#bbb3a6;font-size:12px}.data-table .col-actions .actions-split [class^=action-]:first-child{border-right:0}.data-table .col-actions .actions-split .dropdown-menu{margin-top:-1px}.data-table .col-actions .actions-split .dropdown-menu a{display:block;color:#333;text-decoration:none}.data-table .col-actions .actions-split.active .action-toggle{position:relative;border-bottom-right-radius:0;box-shadow:none;background:#fff}.data-table .col-actions .actions-split.active .action-toggle:after{position:absolute;top:100%;left:0;right:0;height:2px;margin-top:-1px;background:#fff;content:'';z-index:2}.data-table .col-actions .actions-split.active .action-toggle .dropdown-menu{border-top-right-radius:0}.data-table .col-default{white-space:nowrap;text-align:center;vertical-align:middle}.data-table .col-delete{text-align:center;width:32px}.data-table .col-file{white-space:nowrap}.data-table .col-file input,.data-table .col-file .input-text{margin:0 5px;width:40%}.data-table .col-file input:first-child,.data-table .col-file .input-text:first-child{margin-left:0}.data-table .col-actions-add{padding:10px 0}.grid-actions{background:#fff;font-size:13px;line-height:28px;padding:10px 15px;position:relative}.grid-actions+.grid{padding-top:5px}.grid-actions .export,.grid-actions .filter-actions{float:right;margin-left:10px;vertical-align:top}.grid-actions .import{display:block;vertical-align:top}.grid-actions .action-reset{background:0 0;border:0;display:inline;line-height:1.42857143;margin:0;padding:0;color:#1979c3;text-decoration:none;margin:6px 10px 0 0;vertical-align:top}.grid-actions .action-reset:visited{color:purple;text-decoration:none}.grid-actions .action-reset:hover{color:#006bb4;text-decoration:underline}.grid-actions .action-reset:active{color:#ff5501;text-decoration:underline}.grid-actions .action-reset:hover{color:#006bb4}.grid-actions .action-reset:hover,.grid-actions .action-reset:active,.grid-actions .action-reset:focus{background:0 0;border:0}.grid-actions .action-reset.disabled,.grid-actions .action-reset[disabled],fieldset[disabled] .grid-actions .action-reset{color:#1979c3;text-decoration:underline;cursor:default;pointer-events:none;opacity:.5}.grid-actions .import .label,.grid-actions .export .label,.massaction>.entry-edit .label{margin:0 14px 0 0;vertical-align:inherit}.grid-actions .import .action-,.grid-actions .export .action-,.grid-actions .filter-actions .action-,.massaction>.entry-edit .action-{vertical-align:inherit}.grid-actions .filter .date{float:left;margin:0 15px 0 0;position:relative}.grid-actions .filter .date:before{color:#676056;top:1px}.grid-actions .filter .date:hover:before{color:#31302b}.grid-actions .filter .label{margin:0}.grid-actions .filter .hasDatepicker{margin:0 5px;width:80px}.grid-actions .filter .show-by .select{margin-left:5px;padding:4px 4px 5px;vertical-align:top;width:auto}.grid-actions .filter.required:after{content:''}.grid-actions img{vertical-align:middle;height:22px;width:22px}.grid-actions .validation-advice{background:#f9d4d4;border:1px solid #e22626;border-radius:3px;color:#e22626;margin:5px 0 0;padding:3px 7px;position:absolute;white-space:nowrap;z-index:5}.grid-actions .validation-advice:before{width:0;height:0;border:5px solid transparent;border-bottom-color:#e22626;content:'';left:50%;margin-left:-5px;position:absolute;top:-11px}.grid-actions input[type=text].validation-failed{border-color:#e22626;box-shadow:0 0 8px rgba(226,38,38,.6)}.grid-actions .link-feed{white-space:nowrap}.pager{font-size:13px}.grid .pager{margin:15px 0 0;position:relative;text-align:center}.pager .pages-total-found{margin-right:25px}.pager .view-pages .select{margin:0 5px}.pager .link-feed{font-size:12px;margin:7px 15px 0 0;position:absolute;right:0;top:0}.pager .action-previous,.pager .action-next{background:0 0;border:0;display:inline;line-height:1.42857143;margin:0;padding:0;color:#1979c3;text-decoration:none;line-height:.6;overflow:hidden;width:20px}.pager .action-previous:visited,.pager .action-next:visited{color:purple;text-decoration:none}.pager .action-previous:hover,.pager .action-next:hover{color:#006bb4;text-decoration:underline}.pager .action-previous:active,.pager .action-next:active{color:#ff5501;text-decoration:underline}.pager .action-previous:hover,.pager .action-next:hover{color:#006bb4}.pager .action-previous:hover,.pager .action-next:hover,.pager .action-previous:active,.pager .action-next:active,.pager .action-previous:focus,.pager .action-next:focus{background:0 0;border:0}.pager .action-previous.disabled,.pager .action-next.disabled,.pager .action-previous[disabled],.pager .action-next[disabled],fieldset[disabled] .pager .action-previous,fieldset[disabled] .pager .action-next{color:#1979c3;text-decoration:underline;cursor:default;pointer-events:none;opacity:.5}.pager .action-previous:before,.pager .action-next:before{margin-left:-10px}.pager .action-previous.disabled,.pager .action-next.disabled{opacity:.3}.pager .action-previous{display:inline-block;text-decoration:none}.pager .action-previous>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pager .action-previous>span.focusable:active,.pager .action-previous>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.pager .action-previous>span.focusable:active,.pager .action-previous>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.pager .action-previous:before{font-family:'icons-blank-theme';content:'\e617';font-size:40px;line-height:inherit;color:#026294;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.pager .action-previous:hover:before{color:#007dbd}.pager .action-next{display:inline-block;text-decoration:none}.pager .action-next>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pager .action-next>span.focusable:active,.pager .action-next>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.pager .action-next>span.focusable:active,.pager .action-next>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.pager .action-next:before{font-family:'icons-blank-theme';content:'\e608';font-size:40px;line-height:inherit;color:#026294;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.pager .action-next:hover:before{color:#007dbd}.pager .input-text{height:25px;line-height:16px;margin-right:5px;text-align:center;width:25px;vertical-align:top}.pager .pages-total{line-height:25px;vertical-align:top}.massaction{background:#fff;border-top:1px solid #f2ebde;font-size:13px;line-height:28px;padding:15px 15px 0}.massaction>.entry-edit{float:right}.massaction>.entry-edit .field-row{display:inline-block;vertical-align:top}.massaction>.entry-edit .validation-advice{display:none !important}.massaction>.entry-edit .form-inline{display:inline-block}.massaction>.entry-edit .label{padding:0;width:auto}.massaction>.entry-edit .action-{vertical-align:top}.massaction .select.validation-failed{border:1px dashed #e22626;background:#f9d4d4}.grid-severity-critical,.grid-severity-major,.grid-severity-notice,.grid-severity-minor{background:#feeee1;border:1px solid #ed4f2e;color:#ed4f2e;display:block;padding:0 3px;font-weight:700;line-height:17px;text-transform:uppercase;text-align:center}.grid-severity-critical,.grid-severity-major{border-color:#e22626;background:#f9d4d4;color:#e22626}.grid-severity-notice{border-color:#5b8116;background:#d0e5a9;color:#185b00}.grid tbody td input[type=text],.data-table tbody td input[type=text],.grid tbody th input[type=text],.data-table tbody th input[type=text],.grid tbody td .input-text,.data-table tbody td .input-text,.grid tbody th .input-text,.data-table tbody th .input-text,.grid tbody td select,.data-table tbody td select,.grid tbody th select,.data-table tbody th select,.grid tbody td .select,.data-table tbody td .select,.grid tbody th .select,.data-table tbody th .select{width:99%}.ui-tabs-panel .grid .col-sku{max-width:150px;width:150px}.col-indexer_status,.col-indexer_mode{width:160px}.fieldset-wrapper .grid-actions+.grid{padding-top:15px}.fieldset-wrapper .grid-actions{padding:10px 0 0}.fieldset-wrapper .grid{padding:0}.fieldset-wrapper .massaction{padding:0;border-top:none;margin-bottom:15px}.accordion .grid{padding:0}.ui-dialog-content .grid-actions,.ui-dialog-content .grid{padding-left:0;padding-right:0}.qty-table td{border:0;padding:0 5px 3px}.sales-order-create-index .sales-order-create-index .grid table .action-configure{float:right}.sales-order-create-index .data-table .border td{padding-bottom:15px}.sales-order-create-index .actions.update{margin:10px 0}.adminhtml-order-shipment-new .grid .col-product{max-width:770px;width:770px}.customer-index-index .grid .col-name{max-width:90px;width:90px}.customer-index-index .grid .col-billing_region{width:70px}.adminhtml-cms-hierarchy-index .col-title,.adminhtml-cms-hierarchy-index .col-identifier{max-width:410px;width:410px}.adminhtml-widget-instance-edit .grid-chooser .control{margin-top:-19px;width:80%}.eq-ie9 .adminhtml-widget-instance-edit .grid-chooser .control{margin-top:-18px}.adminhtml-widget-instance-edit .grid-chooser .control .grid-actions{padding:0 0 15px}.adminhtml-widget-instance-edit .grid-chooser .control .grid{padding:0}.adminhtml-widget-instance-edit .grid-chooser .control .addon input:last-child,.adminhtml-widget-instance-edit .grid-chooser .control .addon select:last-child{border-radius:0}.reports-report-product-sold .grid .col-name{max-width:720px;width:720px}.adminhtml-system-store-index .grid td{max-width:310px}.adminhtml-system-currency-index .grid{padding-top:0}.adminhtml-system-currency-index .col-currency-edit-rate{min-width:40px}.adminhtml-system-currency-index .col-base-currency{font-weight:700}.adminhtml-system-currency-index .old-rate{display:block;margin-top:3px;text-align:center}.adminhtml-system-currency-index .hor-scroll{overflow-x:auto;min-width:970px}.adminhtml-system-currencysymbol-index .col-currency{width:35%}.adminhtml-system-currencysymbol-index .grid .input-text{margin:0 10px 0 0;width:50%}.catalog-product-set-index .col-set_name{max-width:930px;width:930px}.adminhtml-export-index .grid td{vertical-align:middle}.adminhtml-export-index .grid .input-text-range{margin:0 10px 0 5px;width:37%}.adminhtml-export-index .grid .input-text-range-date{margin:0 5px;width:32%}.adminhtml-export-index .ui-datepicker-trigger{display:inline-block;margin:-3px 10px 0 0;vertical-align:middle}.adminhtml-notification-index .grid .col-select,.adminhtml-cache-index .grid .col-select,.adminhtml-process-list .grid .col-select,.indexer-indexer-list .grid .col-select{width:10px}@font-face{font-family:'icons-blank-theme';src:url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.eot');src:url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.eot?#iefix') format('embedded-opentype'),url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff2') format('woff2'),url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff') format('woff'),url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.ttf') format('truetype'),url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.svg#icons-blank-theme') format('svg');font-weight:400;font-style:normal}@font-face{font-family:'icons-blank-theme';src:url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.eot');src:url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.eot?#iefix') format('embedded-opentype'),url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff2') format('woff2'),url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff') format('woff'),url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.ttf') format('truetype');font-weight:400;font-style:normal}.navigation{background-color:#676056;position:relative;z-index:5}.navigation .level-0.reverse>.submenu{right:1px}.navigation>ul{position:relative;text-align:right}.navigation .level-0>.submenu{display:none;position:absolute;top:100%;padding:19px 13px}.navigation .level-0>.submenu a{display:block;color:#676056;font-size:13px;font-weight:400;line-height:1.385;padding:3px 12px 3px;text-decoration:none}.navigation .level-0>.submenu a:focus,.navigation .level-0>.submenu a:hover{text-decoration:underline}.navigation .level-0>.submenu a:hover{color:#fff;background:#989287;text-decoration:none}.navigation .level-0>.submenu li{margin-bottom:1px}.navigation .level-0>.submenu a[href="#"]{cursor:default;display:block;color:#676056;font-size:14px;font-weight:700;line-height:1;margin:7px 0 6px;padding:0 12px}.navigation .level-0>.submenu a[href="#"]:focus,.navigation .level-0>.submenu a[href="#"]:hover{color:#676056;font-size:14px;font-weight:700;background:0 0;text-decoration:none}.navigation .level-0{display:inline-block;float:left;text-align:left;transition:display .15s ease-out}.navigation .level-0>a{background:0 0;display:block;padding:12px 13px 0;color:#f2ebde;font-size:13px;font-weight:600;text-transform:uppercase;text-decoration:none;transition:background .15s ease-out}.navigation .level-0>a:after{content:"";display:block;margin-top:10px;height:3px;font-size:0}.navigation .level-0.active>a{font-weight:700}.navigation .level-0.active>a:after{background:#ef672f}.navigation .level-0.hover.recent>a{background:#fff;color:#676056;font-size:13px;font-weight:600}.navigation .level-0.hover.recent>a:after{background:0 0}.navigation .level-0.hover.recent.active>a{font-weight:700}.navigation .level-0>.submenu{opacity:0;visibility:hidden}.navigation .level-0.recent.hover>.submenu{opacity:1;visibility:visible}.no-js .navigation .level-0:hover>.submenu,.no-js .navigation .level-0.hover>.submenu,.no-js .navigation .level-0>a:focus+.submenu{display:block}.navigation .level-0>.submenu{background:#fff;box-shadow:0 3px 3px rgba(50,50,50,.15)}.navigation .level-0>.submenu li{max-width:200px}.navigation .level-0>.submenu>ul{white-space:nowrap}.navigation .level-0>.submenu .column{display:inline-block;margin-left:40px;vertical-align:top}.navigation .level-0>.submenu .column:first-child{margin-left:0}.navigation .level-0 .submenu .level-1{white-space:normal}.navigation .level-0.parent .submenu .level-1.parent{margin:17px 0 25px}.navigation .level-0.parent .level-1.parent:first-child{margin-top:0}.navigation .level-2 .submenu{margin-left:7px}.navigation .level-0>.submenu .level-2>a[href="#"]{font-size:13px;margin-top:10px;margin-left:7px}.navigation .level-2>.submenu a{font-size:12px;line-height:1.231}.navigation .level-0>.submenu .level-3>a[href="#"],.navigation .level-3 .submenu{margin-left:15px}.navigation .level-0.item-system,.navigation .level-0.item-stores{float:none}.navigation .level-0.item-system>.submenu,.navigation .level-0.item-stores>.submenu{left:auto;right:1px}.adminhtml-dashboard-index .col-1-layout{max-width:1300px;border:none;border-radius:0;padding:0;background:#f7f3eb}.dashboard-inner{padding-top:35px}.dashboard-inner:before,.dashboard-inner:after{content:"";display:table}.dashboard-inner:after{clear:both}.dashboard-inner:before,.dashboard-inner:after{content:"";display:table}.dashboard-inner:after{clear:both}.dashboard-secondary{float:left;width:32%;margin:0 1.5%}.dashboard-main{float:right;width:65%}.dashboard-diagram-chart{max-width:100%;height:auto}.dashboard-diagram-nodata,.dashboard-diagram-switcher{padding:20px 0}.dashboard-diagram-image{background:#fff url(../mui/images/ajax-loader-small.gif) no-repeat 50% 50%}.dashboard-container .ui-tabs-panel{background-color:#fff;min-height:40px;padding:15px}.dashboard-store-stats{margin-top:35px}.dashboard-store-stats .ui-tabs-panel{background:#fff url(../mui/images/ajax-loader-small.gif) no-repeat 50% 50%}.dashboard-item{margin-bottom:30px}.dashboard-item-header{margin-left:5px}.dashboard-item.dashboard-item-primary{margin-bottom:35px}.dashboard-item.dashboard-item-primary .title{font-size:22px;margin-bottom:5px}.dashboard-item.dashboard-item-primary .dashboard-sales-value{display:block;text-align:right;font-weight:600;font-size:30px;margin-right:12px;padding-bottom:5px}.dashboard-item.dashboard-item-primary:first-child{color:#ef672f}.dashboard-item.dashboard-item-primary:first-child .title{color:#ef672f}.dashboard-totals{background:#fff;padding:50px 15px 25px}.dashboard-totals-list{margin:0;padding:0;list-style:none none}.dashboard-totals-list:before,.dashboard-totals-list:after{content:"";display:table}.dashboard-totals-list:after{clear:both}.dashboard-totals-list:before,.dashboard-totals-list:after{content:"";display:table}.dashboard-totals-list:after{clear:both}.dashboard-totals-item{float:left;width:18%;margin-left:7%;padding-top:15px;border-top:2px solid #cac3b4}.dashboard-totals-item:first-child{margin-left:0}.dashboard-totals-label{display:block;font-size:16px;font-weight:600;padding-bottom:2px}.dashboard-totals-value{color:#ef672f;font-size:20px}.dashboard-data{width:100%}.dashboard-data thead{background:0 0}.dashboard-data thead tr{background:0 0}.dashboard-data th,.dashboard-data td{border:none;padding:10px 12px;text-align:right}.dashboard-data th:first-child,.dashboard-data td:first-child{text-align:left}.dashboard-data th{color:#676056;font-weight:600}.dashboard-data td{background-color:transparent}.dashboard-data tbody tr:hover td{background-color:transparent}.dashboard-data tbody tr:nth-child(odd) td,.dashboard-data tbody tr:nth-child(odd):hover td,.dashboard-data tbody tr:nth-child(odd) th,.dashboard-data tbody tr:nth-child(odd):hover th{background-color:#e1dbcf}.ui-tabs-panel .dashboard-data tbody tr:nth-child(odd) td,.ui-tabs-panel .dashboard-data tbody tr:nth-child(odd):hover td,.ui-tabs-panel .dashboard-data tbody tr:nth-child(odd) th,.ui-tabs-panel .dashboard-data tbody tr:nth-child(odd):hover th{background-color:#f7f3eb}.dashboard-data td.empty-text{text-align:center}.ui-tabs-panel .dashboard-data{background-color:#fff}.mage-dropdown-dialog.ui-dialog .ui-dialog-content{overflow:visible}.mage-dropdown-dialog.ui-dialog .ui-dialog-buttonpane{padding:0}.message-system-inner{background:#f7f3eb;border:1px solid #c0bbaf;border-top:0;border-radius:0 0 5px 5px;float:right;overflow:hidden}.message-system-unread .message-system-inner{float:none}.message-system-list{margin:0;padding:0;list-style:none;float:left}.message-system .message-system-list{width:75%}.message-system-list li{padding:5px 13px 7px 36px;position:relative}.message-system-short{padding:5px 13px 7px;float:right}.message-system-short span{display:inline-block;margin-left:7px;border-left:1px #d1ccc3 solid}.message-system-short span:first-child{border:0;margin-left:0}.message-system-short a{padding-left:27px;position:relative;height:16px}.message-system .message-system-short a:before,.message-system-list li:before{font-family:'MUI-Icons';font-style:normal;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;height:16px;width:16px;font-size:16px;line-height:16px;text-align:center;position:absolute;left:7px;top:2px}.message-system-list li:before{top:5px;left:13px}.message-system .message-system-short .warning a:before,.message-system-list li.warning:before{content:"\e006";color:#f2a825}.message-system .message-system-short .error a:before,.message-system-list li.error:before{content:"\e086";font-family:'MUI-Icons';color:#c00815}.ui-dialog .message-system-list{margin-bottom:25px}.sales-order-create-index .order-errors .notice{color:#ed4f2e;font-size:11px;margin:5px 0 0}.order-errors .fieldset-wrapper-title .title{box-sizing:border-box;background:#fffbf0;border:1px solid #d87e34;border-radius:5px;color:#676056;font-size:14px;margin:20px 0;padding:10px 26px 10px 35px;position:relative}.order-errors .fieldset-wrapper-title .title:before{position:absolute;left:11px;top:50%;margin-top:-11px;width:auto;height:auto;font-family:'MUI-Icons';font-style:normal;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;font-size:16px;line-height:inherit;content:'\e046';color:#d87e34}.search-global.miniform{position:relative;z-index:1000;display:inline-block;vertical-align:top;margin:6px 10px 0}.search-global.miniform .mage-suggest{border:0;border-radius:0}.search-global-actions{display:none}.search-global-field{margin:0}.search-global-field .label{position:absolute;right:4px;z-index:2;cursor:pointer;display:inline-block;text-decoration:none}.search-global-field .label>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.search-global-field .label>span.focusable:active,.search-global-field .label>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.search-global-field .label>span.focusable:active,.search-global-field .label>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.search-global-field .label:before{font-family:'MUI-Icons';content:"\e01f";font-size:18px;line-height:29px;color:#cac3b4;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.search-global-field .control{width:48px;overflow:hidden;opacity:0;transition:all .3s ease}.search-global-field .control input[type=text]{background:0 0;border:none;width:100%}.search-global-field.active{z-index:2}.search-global-field.active .label:before{display:none}.search-global-field.active .control{overflow:visible;opacity:1;transition:all .3s ease;width:300px}.search-global-menu{box-sizing:border-box;display:block;width:100%}.notifications-summary{display:inline-block;text-align:left;position:relative;z-index:1}.notifications-summary.active{z-index:999}.notifications-action{color:#f2ebde;padding:12px 22px 11px;text-transform:capitalize;display:inline-block;text-decoration:none}.notifications-action:before{font-family:"MUI-Icons";content:"\e06e";font-size:18px;line-height:18px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.notifications-action:visited,.notifications-action:focus,.notifications-action:active,.notifications-action:hover{color:#f2ebde;text-decoration:none}.notifications-action.active{background-color:#fff;color:#676056}.notifications-action .text{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.notifications-action .text.focusable:active,.notifications-action .text.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.notifications-action .text.focusable:active,.notifications-action .text.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.notifications-action .qty.counter{display:inline-block;background:#ed4f2e;color:#f2ebde;font-size:12px;line-height:12px;font-weight:700;padding:1px 3px;position:absolute;top:6px;left:50%;border-radius:4px}.notifications-list{width:300px;padding:0;margin:0}.notifications-list .last{padding:10px;text-align:center;font-size:12px}.notifications-summary .notifications-entry{padding:15px;color:#676056;font-size:11px;font-weight:400}.notifications-entry{position:relative;z-index:1}.notifications-entry:hover .action{display:block}.notifications-entry-title{padding-right:15px;color:#ed4f2e;font-size:12px;font-weight:600;display:block;margin-bottom:10px}.notifications-entry-description{line-height:1.3;display:block;max-height:3.9em;overflow:hidden;margin-bottom:10px;text-overflow:ellipsis}.notifications-close.action{position:absolute;z-index:1;top:12px;right:12px;display:inline-block;background-image:none;background:0 0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;display:none}.notifications-close.action>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.notifications-close.action>span.focusable:active,.notifications-close.action>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.notifications-close.action>span.focusable:active,.notifications-close.action>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.notifications-close.action:before{font-family:'MUI-Icons';content:"\e07f";font-size:16px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.notifications-close.action:focus,.notifications-close.action:active{background:0 0;border:none}.notifications-close.action:hover{background:0 0;border:none}.notifications-close.action.disabled,.notifications-close.action[disabled],fieldset[disabled] .notifications-close.action{cursor:not-allowed;pointer-events:none;opacity:.5}.notifications-dialog-content{display:none}.notifications-critical .notifications-entry-title{padding-left:25px;display:inline-block;text-decoration:none}.notifications-critical .notifications-entry-title:before{font-family:'MUI-Icons';content:"\e086";font-size:18px;line-height:18px;color:#c00815;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.notifications-critical .notifications-entry-title:before{position:absolute;margin-left:-25px}.notifications-dialog-content .notifications-entry-time{color:#8c867e;font-size:13px;font-family:Helvetica,Arial,sans-serif;position:absolute;right:17px;bottom:27px;text-align:right}.notifications-url{display:inline-block;text-decoration:none}.notifications-url>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.notifications-url>span.focusable:active,.notifications-url>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.notifications-url>span.focusable:active,.notifications-url>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.notifications-url:after{font-family:'MUI-Icons';content:"\e084";font-size:16px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center;margin:-2px 0 0 10px}.notifications-dialog-content .notifications-entry-title{font-size:15px}.locale-switcher-field{white-space:nowrap;float:left}.locale-switcher-field .control,.locale-switcher-field .label{vertical-align:middle;margin:0 10px 0 0;display:inline-block}.locale-switcher-select{-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;border:1px solid #ada89e;max-width:200px;height:31px;background:url("../images/select-bg.svg") no-repeat 100% 50%;background-size:30px 60px;padding-right:29px;text-indent:.01px;text-overflow:''}.locale-switcher-select::-ms-expand{display:none}.lt-ie10 .locale-switcher-select{background-image:none;padding-right:4px}@-moz-document url-prefix(){.locale-switcher-select{background-image:none}}@-moz-document url-prefix(){.locale-switcher-select{background-image:none}}.mage-suggest{text-align:left;box-sizing:border-box;position:relative;display:inline-block;vertical-align:top;width:100%;background-color:#fff;border:1px solid #ada89e;border-radius:2px}.mage-suggest:after{position:absolute;top:3px;right:3px;bottom:0;width:22px;text-align:center;font-family:'MUI-Icons';font-style:normal;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;content:'\e01f';font-size:18px;color:#b2b2b2}.mage-suggest input[type=search],.mage-suggest input.search{width:100%;border:none;background:0 0;padding-right:30px}.mage-suggest.category-select input[type=search],.mage-suggest.category-select input.search{height:26px}.mage-suggest-dropdown{position:absolute;left:0;right:0;top:100%;margin:1px -1px 0;border:1px solid #cac2b5;background:#fff;box-shadow:0 2px 4px rgba(0,0,0,.2);z-index:990}.mage-suggest-dropdown ul{margin:0;padding:0;list-style:none}.mage-suggest-dropdown li{border-bottom:1px solid #e5e5e5;padding:0}.mage-suggest-dropdown li a{display:block}.mage-suggest-dropdown li a.ui-state-focus{background:#f5f5f5}.mage-suggest-dropdown li a,.mage-suggest-dropdown .jstree li a:hover,.mage-suggest-dropdown .jstree .jstree-hovered,.mage-suggest-dropdown .jstree .jstree-clicked{padding:6px 12px 5px;text-decoration:none;color:#333}.mage-suggest-dropdown .jstree li a:hover,.mage-suggest-dropdown .jstree .jstree-hovered,.mage-suggest-dropdown .jstree .jstree-clicked{border:none}.mage-suggest-dropdown .jstree li{border-bottom:0}.mage-suggest-dropdown .jstree li a{display:inline-block}.mage-suggest-dropdown .jstree .mage-suggest-selected>a{color:#000;background:#f1ffeb}.field-category_ids .mage-suggest-dropdown,.field-new_category_parent .mage-suggest-dropdown{max-height:200px;overflow:auto}.mage-suggest-dropdown .jstree .mage-suggest-selected>a:hover,.mage-suggest-dropdown .jstree .mage-suggest-selected>.jstree-hovered,.mage-suggest-dropdown .jstree .mage-suggest-selected>.jstree-clicked,.mage-suggest-dropdown .jstree .mage-suggest-selected.mage-suggest-not-active>.jstree-hovered,.mage-suggest-dropdown .jstree .mage-suggest-selected.mage-suggest-not-active>.jstree-clicked{background:#e5ffd9}.mage-suggest-dropdown .jstree .mage-suggest-not-active>a{color:#d4d4d4}.mage-suggest-dropdown .jstree .mage-suggest-not-active>a:hover,.mage-suggest-dropdown .jstree .mage-suggest-not-active>.jstree-hovered,.mage-suggest-dropdown .jstree .mage-suggest-not-active>.jstree-clicked{background:#f5f5f5}.mage-suggest-dropdown .category-path{font-size:11px;margin-left:10px;color:#9ba8b5}.suggest-expandable .action-dropdown .action-toggle{display:inline-block;max-width:500px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;background:0 0;border:none;box-shadow:none;color:#676056;font-size:12px;padding:5px 4px;filter:none}.suggest-expandable .action-dropdown .action-toggle span{display:inline}.suggest-expandable .action-dropdown .action-toggle:before{display:inline-block;float:right;margin-left:4px;font-size:13px;color:#b2b0ad}.suggest-expandable .action-dropdown .action-toggle:hover:before{color:#7e7e7e}.suggest-expandable .dropdown-menu{margin:1px 0 0;left:0;right:auto;width:245px;z-index:4}.suggest-expandable .mage-suggest{border:none;border-radius:3px 3px 0 0}.suggest-expandable .mage-suggest:after{top:10px;right:8px}.suggest-expandable .mage-suggest-inner .title{margin:0;padding:0 10px 4px;text-transform:uppercase;color:#a6a098;font-size:12px;border-bottom:1px solid #e5e5e5}.suggest-expandable .mage-suggest-inner>input[type=search],.suggest-expandable .mage-suggest-inner>input.search{position:relative;margin:6px 5px 5px;padding-right:20px;border:1px solid #ada89e;width:236px;z-index:1}.suggest-expandable .mage-suggest-inner>input.ui-autocomplete-loading,.suggest-expandable .mage-suggest-inner>input.mage-suggest-state-loading{background:#fff url("../mui/images/ajax-loader-small.gif") no-repeat 190px 50%}.suggest-expandable .mage-suggest-dropdown{margin-top:0;border-top:0;border-radius:0 0 3px 3px;max-height:300px;overflow:auto;width:100%;float:left}.suggest-expandable .mage-suggest-dropdown ul{margin:0;padding:0;list-style:none}.suggest-expandable .action-show-all:hover,.suggest-expandable .action-show-all:active,.suggest-expandable .action-show-all:focus,.suggest-expandable .action-show-all[disabled]{border-top:1px solid #e5e5e5;display:block;width:100%;padding:8px 10px 10px;text-align:left;font:12px/1.333 Arial,Verdana,sans-serif;color:#676056}.product-actions .suggest-expandable{max-width:500px;float:left;margin-top:1px}.page-actions.fixed #product-template-suggest-container{display:none}.catalog-category-edit .col-2-left-layout:before{display:none}.category-content .ui-tabs-panel .fieldset{padding-top:40px}.category-content .ui-tabs-panel .fieldset .legend{display:none}.attributes-edit-form .field:not(.field-weight) .addon{display:block;position:relative}.attributes-edit-form .field:not(.field-weight) .addon input[type=text]{border-width:1px}.attributes-edit-form .field:not(.field-weight) .addon .addafter{display:block;border:0;height:auto;width:auto}.attributes-edit-form .field:not(.field-weight) .addon input:focus~.addafter{box-shadow:none}.attributes-edit-form .with-addon .textarea{margin:0}.attributes-edit-form .attribute-change-checkbox{display:block;margin-top:5px}.attributes-edit-form .attribute-change-checkbox .label{float:none;padding:0;width:auto}.attributes-edit-form .attribute-change-checkbox .checkbox{margin-right:5px;width:auto}.attributes-edit-form .field-price .addon>input,.attributes-edit-form .field-special_price .addon>input,.attributes-edit-form .field-gift_wrapping_price .addon>input,.attributes-edit-form .field-msrp .addon>input,.attributes-edit-form .field-gift_wrapping_price .addon>input{padding-left:23px}.attributes-edit-form .field-price .addafter>strong,.attributes-edit-form .field-special_price .addafter>strong,.attributes-edit-form .field-gift_wrapping_price .addafter>strong,.attributes-edit-form .field-msrp .addafter>strong,.attributes-edit-form .field-gift_wrapping_price .addafter>strong{left:5px;position:absolute;top:3px}.attributes-edit-form .field.type-price input:focus+label,.attributes-edit-form .field-price input:focus+label,.attributes-edit-form .field-special_price input:focus+label,.attributes-edit-form .field-msrp input:focus+label,.attributes-edit-form .field-weight input:focus+label{box-shadow:none}.attributes-edit-form .field-special_from_date>.control .input-text,.attributes-edit-form .field-special_to_date>.control .input-text,.attributes-edit-form .field-news_from_date>.control .input-text,.attributes-edit-form .field-news_to_date>.control .input-text,.attributes-edit-form .field-custom_design_from>.control .input-text,.attributes-edit-form .field-custom_design_to>.control .input-text{border-width:1px;width:130px}.attributes-edit-form .field-weight .fields-group-2 .control{padding-right:27px}.attributes-edit-form .field-weight .fields-group-2 .control .addafter+.addafter{border-width:1px 1px 1px 0;border-style:solid;height:28px;right:0;position:absolute;top:0}.attributes-edit-form .field-weight .fields-group-2 .control .addafter strong{line-height:28px}.attributes-edit-form .field-weight .fields-group-2 .control>input:focus+.addafter+.addafter{box-shadow:0 0 8px rgba(82,168,236,.6)}.attributes-edit-form .field-gift_message_available .addon>input[type=checkbox],.attributes-edit-form .field-gift_wrapping_available .addon>input[type=checkbox]{width:auto;margin-right:5px}.attributes-edit-form .fieldset>.addafter{display:none}.advanced-inventory-edit .field.choice{display:block;margin:3px 0 0}.advanced-inventory-edit .field.choice .label{padding-top:1px}.product-actions:before,.product-actions:after{content:"";display:table}.product-actions:after{clear:both}.product-actions:before,.product-actions:after{content:"";display:table}.product-actions:after{clear:both}.product-actions .switcher{float:right}#configurable-attributes-container .actions-select{display:inline-block;position:relative}#configurable-attributes-container .actions-select:before,#configurable-attributes-container .actions-select:after{content:"";display:table}#configurable-attributes-container .actions-select:after{clear:both}#configurable-attributes-container .actions-select:before,#configurable-attributes-container .actions-select:after{content:"";display:table}#configurable-attributes-container .actions-select:after{clear:both}#configurable-attributes-container .actions-select .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}#configurable-attributes-container .actions-select .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}#configurable-attributes-container .actions-select .action.toggle:hover:after{color:inherit}#configurable-attributes-container .actions-select .action.toggle:active:after{color:inherit}#configurable-attributes-container .actions-select .action.toggle.active{display:inline-block;text-decoration:none}#configurable-attributes-container .actions-select .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}#configurable-attributes-container .actions-select .action.toggle.active:hover:after{color:inherit}#configurable-attributes-container .actions-select .action.toggle.active:active:after{color:inherit}#configurable-attributes-container .actions-select ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}#configurable-attributes-container .actions-select ul.dropdown li{margin:0;padding:3px 5px}#configurable-attributes-container .actions-select ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}#configurable-attributes-container .actions-select.active{overflow:visible}#configurable-attributes-container .actions-select.active ul.dropdown{display:block}#configurable-attributes-container .actions-select .action.toggle{padding:1px 8px;border:1px solid #ada89e;background:#fff;border-radius:0 2px 2px 0}#configurable-attributes-container .actions-select .action.toggle:after{width:14px;text-indent:-2px}#configurable-attributes-container .actions-select ul.dropdown li:hover{background:#eef8fc}#configurable-attributes-container .actions-select ul.dropdown a{color:#333;text-decoration:none}#product-variations-matrix .actions-image-uploader{display:inline-block;position:relative;display:block;width:50px}#product-variations-matrix .actions-image-uploader:before,#product-variations-matrix .actions-image-uploader:after{content:"";display:table}#product-variations-matrix .actions-image-uploader:after{clear:both}#product-variations-matrix .actions-image-uploader:before,#product-variations-matrix .actions-image-uploader:after{content:"";display:table}#product-variations-matrix .actions-image-uploader:after{clear:both}#product-variations-matrix .actions-image-uploader .action.split{float:left;margin:0}#product-variations-matrix .actions-image-uploader .action.toggle{float:right;margin:0}#product-variations-matrix .actions-image-uploader .action.toggle{padding:6px 5px;display:inline-block;text-decoration:none}#product-variations-matrix .actions-image-uploader .action.toggle>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}#product-variations-matrix .actions-image-uploader .action.toggle>span.focusable:active,#product-variations-matrix .actions-image-uploader .action.toggle>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}#product-variations-matrix .actions-image-uploader .action.toggle>span.focusable:active,#product-variations-matrix .actions-image-uploader .action.toggle>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}#product-variations-matrix .actions-image-uploader .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:14px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}#product-variations-matrix .actions-image-uploader .action.toggle:hover:after{color:inherit}#product-variations-matrix .actions-image-uploader .action.toggle:active:after{color:inherit}#product-variations-matrix .actions-image-uploader .action.toggle.active{display:inline-block;text-decoration:none}#product-variations-matrix .actions-image-uploader .action.toggle.active>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}#product-variations-matrix .actions-image-uploader .action.toggle.active>span.focusable:active,#product-variations-matrix .actions-image-uploader .action.toggle.active>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}#product-variations-matrix .actions-image-uploader .action.toggle.active>span.focusable:active,#product-variations-matrix .actions-image-uploader .action.toggle.active>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}#product-variations-matrix .actions-image-uploader .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:14px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}#product-variations-matrix .actions-image-uploader .action.toggle.active:hover:after{color:inherit}#product-variations-matrix .actions-image-uploader .action.toggle.active:active:after{color:inherit}#product-variations-matrix .actions-image-uploader ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}#product-variations-matrix .actions-image-uploader ul.dropdown li{margin:0;padding:3px 5px}#product-variations-matrix .actions-image-uploader ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}#product-variations-matrix .actions-image-uploader.active{overflow:visible}#product-variations-matrix .actions-image-uploader.active ul.dropdown{display:block}#product-variations-matrix .actions-image-uploader .action.toggle{padding:0 2px;border:1px solid #b7b2a7;background:#fff;border-radius:0 4px 4px 0;border-left:none;height:33px}#product-variations-matrix .actions-image-uploader .action.toggle.no-display{display:none}#product-variations-matrix .actions-image-uploader .action.toggle:after{width:12px;text-indent:-5px}#product-variations-matrix .actions-image-uploader ul.dropdown{left:0;margin-left:0;width:100px}#product-variations-matrix .actions-image-uploader ul.dropdown li:hover{background:#eef8fc}#product-variations-matrix .actions-image-uploader ul.dropdown a{color:#333;text-decoration:none}.debugging-hints .page-actions{position:relative;z-index:1}.debugging-hints .page-actions .debugging-hint-template-file{left:auto !important;right:0 !important}.filter-segments{list-style:none;padding:0}.adminhtml-report-customer-test-detail .col-id{width:35px}.adminhtml-report-customer-test-detail .col-period{white-space:nowrap;width:70px}.adminhtml-report-customer-test-detail .col-zip{width:50px}.adminhtml-report-customer-test-segment .col-id{width:35px}.adminhtml-report-customer-test-segment .col-status{width:65px}.adminhtml-report-customer-test-segment .col-qty{width:145px}.adminhtml-report-customer-test-segment .col-segment,.adminhtml-report-customer-test-segment .col-website{width:35%}.adminhtml-report-customer-test-segment .col-select{width:45px}.test-custom-attributes{margin-bottom:20px}.adminhtml-test-index th.col-id{text-align:left}.adminhtml-test-index .col-price{text-align:right;width:50px}.adminhtml-test-index .col-actions{width:50px}.adminhtml-test-index .col-select{width:60px}.adminhtml-test-edit .field-image .control{line-height:28px}.adminhtml-test-edit .field-image a{display:inline-block;margin:0 5px 0 0}.adminhtml-test-edit .field-image img{vertical-align:middle}.adminhtml-test-new .field-image .input-file,.adminhtml-test-edit .field-image .input-file{display:inline-block;margin:0 15px 0 0;width:auto}.adminhtml-test-new .field-image .addafter,.adminhtml-test-edit .field-image .addafter{border:0;box-shadow:none;display:inline-block;margin:0 15px 0 0;height:auto;width:auto}.adminhtml-test-new .field-image .delete-image,.adminhtml-test-edit .field-image .delete-image{display:inline-block;white-space:nowrap}.adminhtml-test-edit .field-image .delete-image input{margin:-3px 5px 0 0;width:auto;display:inline-block}.adminhtml-test-edit .field-image .addon .delete-image input:focus+label{border:0;box-shadow:none}.adminhtml-test-index .col-id{width:35px}.adminhtml-test-index .col-status{white-space:normal;width:75px}.adminhtml-test-index .col-websites{white-space:nowrap;width:200px}.adminhtml-test-index .col-price .label{display:inline-block;min-width:60px;white-space:nowrap}.adminhtml-test-index .col-price .price-excl-tax .price,.adminhtml-test-index .col-price .price-incl-tax .price{font-weight:700}.invitee_information,.inviter_information{width:48.9362%}.invitee_information{float:left}.inviter_information{float:right}.test_information .data-table th,.invitee_information .data-table th,.inviter_information .data-table th{width:20%;white-space:nowrap}.test_information .data-table textarea,.test_information .data-table input{width:100%}.tests-history ul{margin:0;padding-left:25px}.tests-history ul .status:before{display:inline-block;content:"|";margin:0 10px}.adminhtml-report-test-order .col-period{white-space:nowrap;width:70px}.adminhtml-report-test-order .col-inv-sent,.adminhtml-report-test-order .col-inv-acc,.adminhtml-report-test-order .col-acc,.adminhtml-report-test-order .col-rate{text-align:right;width:23%}.adminhtml-report-test-customer .col-id{width:35px}.adminhtml-report-test-customer .col-period{white-space:nowrap;width:70px}.adminhtml-report-test-customer .col-inv-sent,.adminhtml-report-test-customer .col-inv-acc{text-align:right;width:120px}.adminhtml-report-test-index .col-period{white-space:nowrap}.adminhtml-report-test-index .col-inv-sent,.adminhtml-report-test-index .col-inv-acc,.adminhtml-report-test-index .col-inv-disc,.adminhtml-report-test-index .col-inv-acc-rate,.adminhtml-report-test-index .col-inv-disc-rate{text-align:right;width:19%}.test_information .data-table,.invitee_information .data-table,.inviter_information .data-table{width:100%}.test_information .data-table tbody tr th,.invitee_information .data-table tbody tr th,.inviter_information .data-table tbody tr th{font-weight:700}.test_information .data-table tbody tr td,.test_information .data-table tbody tr th,.invitee_information .data-table tbody tr td,.invitee_information .data-table tbody tr th,.inviter_information .data-table tbody tr td,.inviter_information .data-table tbody tr th{background-color:#fff;border:0;padding:9px 10px 10px;color:#666;vertical-align:top}.test_information .data-table tbody tr:nth-child(2n+1) td,.test_information .data-table tbody tr:nth-child(2n+1) th,.invitee_information .data-table tbody tr:nth-child(2n+1) td,.invitee_information .data-table tbody tr:nth-child(2n+1) th,.inviter_information .data-table tbody tr:nth-child(2n+1) td,.inviter_information .data-table tbody tr:nth-child(2n+1) th{background-color:#fbfaf6}[class^=" adminhtml-test-"] .fieldset-wrapper-content .data-table .col-sort-order{width:80px}[class^=" adminhtml-test-"] .fieldset-wrapper-content .data-table td,[class^=" adminhtml-test-"] .fieldset-wrapper-content .accordion .config .data-table td{vertical-align:top}[class^=" adminhtml-test-"] .fieldset-wrapper-content .data-table td select,[class^=" adminhtml-test-"] .fieldset-wrapper-content .accordion .config .data-table td select{display:block;width:100%}[class^=" adminhtml-test-"] .fieldset-wrapper-content .data-table td .input-radio.global-scope,[class^=" adminhtml-test-"] .fieldset-wrapper-content .accordion .config .data-table td .input-radio.global-scope{margin-top:9px}.sales-order-create-index .ui-dialog .content>.test .field.text .input-text{width:100%}.sales-order-create-index .ui-dialog .content>.test .note .price{font-weight:600}.sales-order-create-index .ui-dialog .content>.test .note .price:before{content:": "}.sales-order-create-index .ui-dialog .content>.test .fixed.amount .label:after{content:": "}.sales-order-create-index .ui-dialog .content>.test .fixed.amount .control{display:inline-block;font-weight:600}.sales-order-create-index .ui-dialog .content>.test .fixed.amount .control .control-value{margin:-2px 0 0;padding:0}.eq-ie9 [class^=" adminhtml-test-"] .custom-options .data-table{word-wrap:normal;table-layout:auto}.rma-items .col-actions a.disabled,.newRma .col-actions a.disabled{cursor:default;opacity:.5}.rma-items .col-actions a.disabled:hover,.newRma .col-actions a.disabled:hover{text-decoration:none}.block.mselect-list .mselect-input{width:100%}.block.mselect-list .mselect-input-container .mselect-save{top:4px}.block.mselect-list .mselect-input-container .mselect-cancel{top:4px}html{font-size:62.5%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;font-size-adjust:100%}body,html{height:100%;min-height:100%}body{color:#676056;font-family:'Open Sans',sans-serif;line-height:1.33;font-weight:400;font-size:1.4rem;background:#f2ebde;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}body>*{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-shrink:0;flex-shrink:0;-webkit-flex-basis:auto;flex-basis:auto}.page-wrapper{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;min-height:100%;width:100%;max-width:100%;min-width:990px}.page-wrapper>*{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-shrink:0;flex-shrink:0;-webkit-flex-basis:auto;flex-basis:auto}.page-header{text-align:right}.page-header-wrapper{background-color:#31302b}.page-header:after{content:"";display:table;clear:both}.page-header .logo{margin-top:5px;float:left;text-decoration:none;display:inline-block}.page-header .logo:before{content:"";display:inline-block;vertical-align:middle;width:109px;height:35px;background-image:url("../images/logo.svg");background-size:109px 70px;background-repeat:no-repeat}.page-header .logo:after{display:inline-block;vertical-align:middle;margin-left:10px;content:attr(data-edition);font-weight:600;font-size:16px;color:#ef672f;margin-top:-2px}.page-header .logo span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.page-header .logo span.focusable:active,.page-header .logo span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.page-header .logo span.focusable:active,.page-header .logo span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.page-header .dropdown-menu{border:0}.admin-user{display:inline-block;vertical-align:top;position:relative;text-align:left}.admin-user-account{text-decoration:none;display:inline-block;padding:12px 14px;color:#f2ebde}.admin-user-account:after{font-family:"MUI-Icons";content:"\e02c";font-size:13px;line-height:13px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center;margin:-3px 0 0}.admin-user-account:link,.admin-user-account:visited{color:#f2ebde}.admin-user-account:focus,.admin-user-account:active,.admin-user-account:hover{color:#f2ebde;text-decoration:none}.active .admin-user-account{background-color:#fff;color:#676056}.admin-user-menu{padding:15px;white-space:nowrap;margin-top:0}.admin-user-menu li{border:0;padding:0}.admin-user-menu li:hover{background:0 0}.admin-user-menu a{display:block;color:#676056;font-size:13px;font-weight:400;line-height:1.385;padding:3px 12px 3px;text-decoration:none}.admin-user-menu a:focus,.admin-user-menu a:hover{text-decoration:underline}.admin-user-menu a:hover{color:#fff;background:#989287;text-decoration:none}.admin-user-menu a span:before{content:"("}.admin-user-menu a span:after{content:")"}.page-actions.fixed .page-actions-buttons{padding-right:15px}.page-main-actions{background:#e0dace;color:#645d53;padding:15px;margin-left:auto;margin-right:auto;box-sizing:border-box}.page-main-actions:before,.page-main-actions:after{content:"";display:table}.page-main-actions:after{clear:both}.page-main-actions:before,.page-main-actions:after{content:"";display:table}.page-main-actions:after{clear:both}.page-main-actions .page-actions{float:right}.page-main-actions .page-actions .page-actions-buttons{float:right;display:-webkit-flex;display:-ms-flexbox;display:flex;justify-content:flex-end}.page-main-actions .page-actions button,.page-main-actions .page-actions .action-add.mselect-button-add{margin-left:13px}.page-main-actions .page-actions button.primary,.page-main-actions .page-actions .action-add.mselect-button-add.primary{float:right;-ms-flex-order:2;-webkit-order:2;order:2}.page-main-actions .page-actions button.save:not(.primary),.page-main-actions .page-actions .action-add.mselect-button-add.save:not(.primary){float:right;-ms-flex-order:1;-webkit-order:1;order:1}.page-main-actions .page-actions button.back,.page-main-actions .page-actions button.action-back,.page-main-actions .page-actions button.delete,.page-main-actions .page-actions .action-add.mselect-button-add.back,.page-main-actions .page-actions .action-add.mselect-button-add.action-back,.page-main-actions .page-actions .action-add.mselect-button-add.delete{background-image:none;background:0 0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;margin:0 13px}.page-main-actions .page-actions button.back:focus,.page-main-actions .page-actions button.action-back:focus,.page-main-actions .page-actions button.delete:focus,.page-main-actions .page-actions button.back:active,.page-main-actions .page-actions button.action-back:active,.page-main-actions .page-actions button.delete:active,.page-main-actions .page-actions .action-add.mselect-button-add.back:focus,.page-main-actions .page-actions .action-add.mselect-button-add.action-back:focus,.page-main-actions .page-actions .action-add.mselect-button-add.delete:focus,.page-main-actions .page-actions .action-add.mselect-button-add.back:active,.page-main-actions .page-actions .action-add.mselect-button-add.action-back:active,.page-main-actions .page-actions .action-add.mselect-button-add.delete:active{background:0 0;border:none}.page-main-actions .page-actions button.back:hover,.page-main-actions .page-actions button.action-back:hover,.page-main-actions .page-actions button.delete:hover,.page-main-actions .page-actions .action-add.mselect-button-add.back:hover,.page-main-actions .page-actions .action-add.mselect-button-add.action-back:hover,.page-main-actions .page-actions .action-add.mselect-button-add.delete:hover{background:0 0;border:none}.page-main-actions .page-actions button.back.disabled,.page-main-actions .page-actions button.action-back.disabled,.page-main-actions .page-actions button.delete.disabled,.page-main-actions .page-actions button.back[disabled],.page-main-actions .page-actions button.action-back[disabled],.page-main-actions .page-actions button.delete[disabled],fieldset[disabled] .page-main-actions .page-actions button.back,fieldset[disabled] .page-main-actions .page-actions button.action-back,fieldset[disabled] .page-main-actions .page-actions button.delete,.page-main-actions .page-actions .action-add.mselect-button-add.back.disabled,.page-main-actions .page-actions .action-add.mselect-button-add.action-back.disabled,.page-main-actions .page-actions .action-add.mselect-button-add.delete.disabled,.page-main-actions .page-actions .action-add.mselect-button-add.back[disabled],.page-main-actions .page-actions .action-add.mselect-button-add.action-back[disabled],.page-main-actions .page-actions .action-add.mselect-button-add.delete[disabled],fieldset[disabled] .page-main-actions .page-actions .action-add.mselect-button-add.back,fieldset[disabled] .page-main-actions .page-actions .action-add.mselect-button-add.action-back,fieldset[disabled] .page-main-actions .page-actions .action-add.mselect-button-add.delete{cursor:not-allowed;pointer-events:none;opacity:.5}.ie .page-main-actions .page-actions button.back,.ie .page-main-actions .page-actions button.action-back,.ie .page-main-actions .page-actions button.delete,.ie .page-main-actions .page-actions .action-add.mselect-button-add.back,.ie .page-main-actions .page-actions .action-add.mselect-button-add.action-back,.ie .page-main-actions .page-actions .action-add.mselect-button-add.delete{margin-top:6px}.page-main-actions .page-actions button.delete,.page-main-actions .page-actions .action-add.mselect-button-add.delete{color:#e22626;float:left;-ms-flex-order:-1;-webkit-order:-1;order:-1}.page-main-actions .page-actions button.back,.page-main-actions .page-actions button.action-back,.page-main-actions .page-actions .action-add.mselect-button-add.back,.page-main-actions .page-actions .action-add.mselect-button-add.action-back{float:left;-ms-flex-order:-1;-webkit-order:-1;order:-1;display:inline-block;text-decoration:none}.page-main-actions .page-actions button.back:before,.page-main-actions .page-actions button.action-back:before,.page-main-actions .page-actions .action-add.mselect-button-add.back:before,.page-main-actions .page-actions .action-add.mselect-button-add.action-back:before{font-family:'icons-blank-theme';content:'\e625';font-size:inherit;line-height:normal;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center;margin:0 2px 0 0}.page-main-actions .page-actions .actions-split{margin-left:13px;float:right;-ms-flex-order:2;-webkit-order:2;order:2}.page-main-actions .page-actions .actions-split button.primary,.page-main-actions .page-actions .actions-split .action-add.mselect-button-add.primary{float:left}.page-main-actions .page-actions .actions-split .dropdown-menu{text-align:left}.page-main-actions .page-actions .actions-split .dropdown-menu .item{display:block}.page-main-actions .page-actions.fixed{position:fixed;top:0;left:0;right:0;z-index:10;padding:0;background:-webkit-linear-gradient(top,#f5f2ed 0%,#f5f2ed 56%,rgba(245,242,237,0) 100%);background:-ms-linear-gradient(top,#f5f2ed 0%,#f5f2ed 56%,rgba(245,242,237,0) 100%);background:linear-gradient(to bottom,#f5f2ed 0%,#f5f2ed 56%,rgba(245,242,237,0) 100%);background:#e0dace}.page-main-actions .page-actions.fixed .page-actions-inner{position:relative;padding-top:15px;padding-bottom:15px;min-height:36px;text-align:right;box-sizing:border-box}.page-main-actions .page-actions.fixed .page-actions-inner:before,.page-main-actions .page-actions.fixed .page-actions-inner:after{content:"";display:table}.page-main-actions .page-actions.fixed .page-actions-inner:after{clear:both}.page-main-actions .page-actions.fixed .page-actions-inner:before,.page-main-actions .page-actions.fixed .page-actions-inner:after{content:"";display:table}.page-main-actions .page-actions.fixed .page-actions-inner:after{clear:both}.page-main-actions .page-actions.fixed .page-actions-inner:before{text-align:left;content:attr(data-title);float:left;font-size:20px;max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.lt-ie10 .page-main-actions .page-actions.fixed .page-actions-inner{background:#f5f2ed}.page-main-actions .store-switcher{margin-top:5px}.store-switcher{display:inline-block;font-size:13px}.store-switcher .label{margin-right:5px}.store-switcher .actions.dropdown{display:inline-block;position:relative}.store-switcher .actions.dropdown:before,.store-switcher .actions.dropdown:after{content:"";display:table}.store-switcher .actions.dropdown:after{clear:both}.store-switcher .actions.dropdown:before,.store-switcher .actions.dropdown:after{content:"";display:table}.store-switcher .actions.dropdown:after{clear:both}.store-switcher .actions.dropdown .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.store-switcher .actions.dropdown .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:20px;color:#645d53;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.store-switcher .actions.dropdown .action.toggle:hover:after{color:#645d53}.store-switcher .actions.dropdown .action.toggle:active:after{color:#645d53}.store-switcher .actions.dropdown .action.toggle.active{display:inline-block;text-decoration:none}.store-switcher .actions.dropdown .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:20px;color:#645d53;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.store-switcher .actions.dropdown .action.toggle.active:hover:after{color:#645d53}.store-switcher .actions.dropdown .action.toggle.active:active:after{color:#645d53}.store-switcher .actions.dropdown .dropdown-menu{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px #ada89e solid;position:absolute;z-index:100;top:100%;min-width:195px;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.store-switcher .actions.dropdown .dropdown-menu li{margin:0;padding:0}.store-switcher .actions.dropdown .dropdown-menu li:hover{background:0 0;cursor:pointer}.store-switcher .actions.dropdown.active{overflow:visible}.store-switcher .actions.dropdown.active .dropdown-menu{display:block}.store-switcher .actions.dropdown .action.toggle{background-image:none;background:0 0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;color:#026294;line-height:normal;margin-top:2px;vertical-align:middle}.store-switcher .actions.dropdown .action.toggle:focus,.store-switcher .actions.dropdown .action.toggle:active{background:0 0;border:none}.store-switcher .actions.dropdown .action.toggle:hover{background:0 0;border:none}.store-switcher .actions.dropdown .action.toggle.disabled,.store-switcher .actions.dropdown .action.toggle[disabled],fieldset[disabled] .store-switcher .actions.dropdown .action.toggle{cursor:not-allowed;pointer-events:none;opacity:.5}.store-switcher .actions.dropdown ul.dropdown-menu{margin-top:4px;padding-top:5px;left:0}.store-switcher .actions.dropdown ul.dropdown-menu li{border:0;cursor:default}.store-switcher .actions.dropdown ul.dropdown-menu li:hover{cursor:default}.store-switcher .actions.dropdown ul.dropdown-menu li a,.store-switcher .actions.dropdown ul.dropdown-menu li span{padding:5px 13px;display:block;color:#645d53}.store-switcher .actions.dropdown ul.dropdown-menu li a{text-decoration:none}.store-switcher .actions.dropdown ul.dropdown-menu li a:hover{background:#edf9fb}.store-switcher .actions.dropdown ul.dropdown-menu li span{color:#ababab;cursor:default}.store-switcher .actions.dropdown ul.dropdown-menu li.current span{color:#645d53;background:#eee}.store-switcher .actions.dropdown ul.dropdown-menu .store-switcher-store a,.store-switcher .actions.dropdown ul.dropdown-menu .store-switcher-store span{padding-left:26px}.store-switcher .actions.dropdown ul.dropdown-menu .store-switcher-store-view a,.store-switcher .actions.dropdown ul.dropdown-menu .store-switcher-store-view span{padding-left:39px}.store-switcher .actions.dropdown ul.dropdown-menu .dropdown-toolbar{border-top:1px #ededed solid;margin-top:10px}.store-switcher .actions.dropdown ul.dropdown-menu .dropdown-toolbar a{display:inline-block;text-decoration:none;display:block}.store-switcher .actions.dropdown ul.dropdown-menu .dropdown-toolbar a:before{font-family:'icons-blank-theme';content:'\e606';font-size:20px;line-height:normal;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:text-top;text-align:center;margin:0 3px 0 -4px}.tooltip{display:inline-block;margin-left:5px}.tooltip .help span,.tooltip .help a{width:16px;height:16px;text-align:center;background:rgba(194,186,169,.5);cursor:pointer;border-radius:10px;vertical-align:middle;display:inline-block;text-decoration:none}.tooltip .help span:hover,.tooltip .help a:hover{background:#c2baa9}.tooltip .help span>span,.tooltip .help a>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.tooltip .help span>span.focusable:active,.tooltip .help a>span.focusable:active,.tooltip .help span>span.focusable:focus,.tooltip .help a>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.tooltip .help span>span.focusable:active,.tooltip .help a>span.focusable:active,.tooltip .help span>span.focusable:focus,.tooltip .help a>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.tooltip .help span:before,.tooltip .help a:before{font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;content:'?';font-size:13px;line-height:16px;color:#5a534a;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center}.tooltip .help span:before,.tooltip .help a:before{font-weight:700}.tooltip .tooltip-content{display:none;position:absolute;max-width:200px;margin-top:10px;margin-left:-19px;padding:4px 8px;border-radius:3px;background:#000;background:rgba(49,48,43,.8);color:#fff;text-shadow:none;z-index:20}.tooltip .tooltip-content:before{content:'';position:absolute;width:0;height:0;top:-5px;left:20px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000;opacity:.8}.tooltip .tooltip-content.loading{position:absolute}.tooltip .tooltip-content.loading:before{border-bottom-color:rgba(0,0,0,.3)}.tooltip:hover>.tooltip-content{display:block}button,.action-add.mselect-button-add{border-radius:2px;background-image:none;background:#f2ebde;padding:6px 13px;color:#645d53;border:1px solid #ada89e;cursor:pointer;display:inline-block;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.3rem;font-weight:500;line-height:1.4rem;box-sizing:border-box;margin:0;vertical-align:middle}button:focus,button:active,.action-add.mselect-button-add:focus,.action-add.mselect-button-add:active{background:#cac3b4;border:1px solid #989287}button:hover,.action-add.mselect-button-add:hover{background:#cac3b4}button.disabled,button[disabled],fieldset[disabled] button,.action-add.mselect-button-add.disabled,.action-add.mselect-button-add[disabled],fieldset[disabled] .action-add.mselect-button-add{cursor:default;pointer-events:none;opacity:.5}button.primary,.action-add.mselect-button-add.primary{background-image:none;background:#007dbd;padding:6px 13px;color:#fff;border:1px solid #0a6c9f;cursor:pointer;display:inline-block;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.3rem;font-weight:500;box-sizing:border-box;vertical-align:middle}button.primary:focus,button.primary:active,.action-add.mselect-button-add.primary:focus,.action-add.mselect-button-add.primary:active{background:#026294;border:1px solid #004c74;color:#fff}button.primary:hover,.action-add.mselect-button-add.primary:hover{background:#026294;border:1px solid #026294}button.primary.disabled,button.primary[disabled],fieldset[disabled] button.primary,.action-add.mselect-button-add.primary.disabled,.action-add.mselect-button-add.primary[disabled],fieldset[disabled] .action-add.mselect-button-add.primary{cursor:default;pointer-events:none;opacity:.5}.actions-split{display:inline-block;position:relative;vertical-align:middle}.actions-split button,.actions-split .action-add.mselect-button-add{margin-left:0!important}.actions-split:before,.actions-split:after{content:"";display:table}.actions-split:after{clear:both}.actions-split:before,.actions-split:after{content:"";display:table}.actions-split:after{clear:both}.actions-split .action-default{float:left;margin:0}.actions-split .action-toggle{float:right;margin:0}.actions-split button.action-default,.actions-split .action-add.mselect-button-add.action-default{border-top-right-radius:0;border-bottom-right-radius:0}.actions-split button+.action-toggle,.actions-split .action-add.mselect-button-add+.action-toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.actions-split .action-toggle{padding:6px 5px;display:inline-block;text-decoration:none}.actions-split .action-toggle>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.actions-split .action-toggle>span.focusable:active,.actions-split .action-toggle>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.actions-split .action-toggle>span.focusable:active,.actions-split .action-toggle>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.actions-split .action-toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:14px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.actions-split .action-toggle:hover:after{color:inherit}.actions-split .action-toggle:active:after{color:inherit}.actions-split .action-toggle.active{display:inline-block;text-decoration:none}.actions-split .action-toggle.active>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.actions-split .action-toggle.active>span.focusable:active,.actions-split .action-toggle.active>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.actions-split .action-toggle.active>span.focusable:active,.actions-split .action-toggle.active>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.actions-split .action-toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:14px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.actions-split .action-toggle.active:hover:after{color:inherit}.actions-split .action-toggle.active:active:after{color:inherit}.actions-split .dropdown-menu{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:175px;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.actions-split .dropdown-menu li{margin:0;padding:3px 5px}.actions-split .dropdown-menu li:hover{background:#e8e8e8;cursor:pointer}.actions-split .dropdown-menu:before,.actions-split .dropdown-menu:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.actions-split .dropdown-menu:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff}.actions-split .dropdown-menu:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb}.actions-split .dropdown-menu:before{top:-12px;right:10px}.actions-split .dropdown-menu:after{top:-14px;right:9px}.actions-split.active{overflow:visible}.actions-split.active .dropdown-menu{display:block}.actions-split .action-toggle:after{height:13px}.page-content:after{content:"";display:table;clear:both}.page-wrapper>.page-content{margin-bottom:20px}.page-footer{padding:15px 0}.page-footer-wrapper{background-color:#e0dacf;margin-top:auto}.page-footer:after{content:"";display:table;clear:both}.footer-legal{float:right;width:550px}.footer-legal .link-report,.footer-legal .magento-version,.footer-legal .copyright{font-size:13px}.footer-legal:before{content:"";display:inline-block;vertical-align:middle;position:absolute;z-index:1;margin-top:2px;margin-left:-35px;width:30px;height:35px;background-size:109px 70px;background:url("../images/logo.svg") no-repeat 0 -21px}.icon-error{margin-left:15px;color:#c00815;font-size:11px}.icon-error:before{font-family:'MUI-Icons';content:"\e086";font-size:13px;line-height:13px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center;margin:-1px 5px 0 0}.ui-widget-overlay{position:fixed}.control .nested{padding:0}.control *:first-child{margin-bottom:0}.field-tooltip{display:inline-block;vertical-align:top;margin-top:5px;position:relative;z-index:1;width:0;overflow:visible}.field-choice .field-tooltip{margin-top:10px}.field-tooltip:hover{z-index:99}.field-tooltip-action{position:relative;z-index:2;margin-left:18px;width:22px;height:22px;display:inline-block;cursor:pointer}.field-tooltip-action:before{content:"?";font-weight:500;font-size:18px;display:inline-block;overflow:hidden;height:22px;border-radius:11px;line-height:22px;width:22px;text-align:center;color:#fff;background-color:#514943}.field-tooltip-action span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.field-tooltip-action span.focusable:active,.field-tooltip-action span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.field-tooltip-action span.focusable:active,.field-tooltip-action span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.control-text:focus+.field-tooltip-content,.field-tooltip:hover .field-tooltip-content{display:block}.field-tooltip-content{display:none;position:absolute;z-index:1;width:320px;background:#fff8d7;padding:15px 25px;right:-66px;border:1px solid #adadad;border-radius:1px;bottom:42px;box-shadow:0 2px 8px 0 rgba(0,0,0,.3)}.field-tooltip-content:after,.field-tooltip-content:before{content:"";display:block;width:0;height:0;border:16px solid transparent;border-top-color:#adadad;position:absolute;right:20px;top:100%;z-index:3}.field-tooltip-content:after{border-top-color:#fff8d7;margin-top:-1px;z-index:4}.form__field.field-error .control [class*=control-]{border-color:#e22626}.form__field.field-error .control [class*=control-]:before{border-color:#e22626}.form__field .mage-error{border:1px solid #e22626;display:block;margin:2px 0 0;padding:6px 10px 10px;background:#fff8d6;color:#555;font-size:12px;font-weight:500;box-sizing:border-box;max-width:380px}.no-flexbox.no-flexboxlegacy .form__field .control-addon+.mage-error{display:inline-block;width:100%}.form__field{position:relative;z-index:1}.form__field:hover{z-index:2}.control .form__field{position:static}.form__field[data-config-scope]:before{content:attr(data-config-scope);display:inline-block;position:absolute;color:gray;right:0;top:6px}.control .form__field[data-config-scope]:nth-child(n+2):before{content:""}.form__field.field-disabled>.label{color:#999}.form__field.field-disabled.field .control [class*=control-][disabled]{background-color:#e9e9e9;opacity:.5;color:#303030;border-color:#adadad}.control-fields .label~.control{width:100%}.form__field{border:0;padding:0}.form__field .note{color:#303030;padding:0;margin:10px 0 0;max-width:380px}.form__field .note:before{display:none}.form__field.form__field{margin-bottom:0}.form__field.form__field+.form__field.form__field{margin-top:15px}.form__field.form__field:not(.choice)~.choice{margin-left:20px;margin-top:5px}.form__field.form__field.choice~.choice{margin-top:9px}.form__field.form__field~.choice:last-child{margin-bottom:8px}.fieldset>.form__field{margin-bottom:30px}.form__field .label{color:#303030}.form__field:not(.choice)>.label{font-size:14px;font-weight:600;width:30%;padding-right:30px;padding-top:0;line-height:33px;white-space:nowrap}.form__field:not(.choice)>.label:before{content:".";visibility:hidden;width:0;margin-left:-7px;overflow:hidden}.form__field:not(.choice)>.label span{white-space:normal;display:inline-block;vertical-align:middle;line-height:1.2}.form__field.required>.label:after{content:"";margin-left:0}.form__field.required>.label span:after{content:"*";color:#eb5202;display:inline;font-weight:500;font-size:16px;margin-top:2px;position:absolute;z-index:1;margin-left:10px}.form__field .control-file{margin-top:6px}.form__field .control-select{line-height:33px}.form__field .control-select:not([multiple]),.form__field .control-text{height:33px;max-width:380px}.form__field .control-addon{max-width:380px}.form__field .control-textarea,.form__field .control-select,.form__field .control-text{border:1px solid #adadad;border-radius:1px;padding:0 10px;color:#303030;background-color:#fff;font-weight:500;font-size:15px;min-width:11em}.form__field .control-textarea:focus,.form__field .control-select:focus,.form__field .control-text:focus{outline:0;border-color:#007bdb;box-shadow:none}.form__field .control-text{line-height:auto}.form__field .control-textarea{padding-top:6px;padding-bottom:6px;line-height:1.18em}.form__field .control-select[multiple],.form__field .control-textarea{width:100%;height:calc(6*1.2em + 14px)}.form__field .control-value{display:inline-block;padding:6px 10px}.form__field .control-fields .form__field:nth-child(n+2):not(.choice)>.label{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.form__field .control-fields .form__field:nth-child(n+2):not(.choice)>.label.focusable:active,.form__field .control-fields .form__field:nth-child(n+2):not(.choice)>.label.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.form__field .control-fields .form__field:nth-child(n+2):not(.choice)>.label.focusable:active,.form__field .control-fields .form__field:nth-child(n+2):not(.choice)>.label.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.form__field .control-select{padding:0}.form__field .control-select option{box-sizing:border-box;padding:4px 10px;display:block}.form__field .control-select optgroup{font-weight:600;display:block;padding:4px 10px;line-height:33px;list-style:inside;font-style:normal}.form__field .control-range>.form__field:nth-child(2):before{content:"\2014";content:":";display:inline-block;margin-left:-25px;float:left;width:20px;line-height:33px;text-align:center}.form__field.choice{position:relative;z-index:1;padding-top:8px;padding-left:26px;padding-right:0}.form__field.choice .label{font-weight:500;padding:0;display:inline;float:none;line-height:18px}.form__field.choice input{position:absolute;top:8px;margin-top:3px!important}.form__field.choice input[disabled]+.label{opacity:.5;cursor:not-allowed}.control>.form__field.choice{max-width:380px}.control>.form__field.choice:nth-child(1):nth-last-child(2),.control>.form__field.choice:nth-child(2):nth-last-child(1){display:inline-block}.control>.form__field.choice:nth-child(1):nth-last-child(2)+.choice,.control>.form__field.choice:nth-child(2):nth-last-child(1)+.choice{margin-left:41px;margin-top:0}.control>.form__field.choice:nth-child(1):nth-last-child(2)+.choice:before,.control>.form__field.choice:nth-child(2):nth-last-child(1)+.choice:before{content:"";position:absolute;display:inline-block;height:20px;top:8px;left:-20px;width:1px;background:#ccc}.form__field.choice .label{cursor:pointer}.form__field.choice .label:before{content:"";position:absolute;z-index:1;border:1px solid #adadad;width:14px;height:14px;top:10px;left:0;border-radius:2px;background:url("../Magento_Ui/images/choice_bkg.png") no-repeat -100% -100%}.form__field.choice input:focus+.label:before{outline:0;border-color:#007bdb}.form__field.choice .control-radio+.label:before{border-radius:8px}.form__field.choice .control-radio:checked+.label:before{background-position:-26px -1px}.form__field.choice .control-checkbox:checked+.label:before{background-position:-1px -1px}.form__field.choice input{opacity:0}.fieldset>.form__field.choice{margin-left:30%}.form__field .control-after,.form__field .control-before{border:0;color:#858585;font-weight:300;font-size:15px;line-height:33px;display:inline-block;height:33px;box-sizing:border-box;padding:0 3px}.no-flexbox.no-flexboxlegacy .form__field .control-before,.no-flexbox.no-flexboxlegacy .form__field .control-addon{float:left;white-space:nowrap}.form__field .control-addon{display:inline-flex;max-width:380px;width:100%;flex-flow:row nowrap;position:relative;z-index:1}.form__field .control-addon>*{position:relative;z-index:1}.form__field .control-addon .control-text[disabled][type],.form__field .control-addon .control-select[disabled][type],.form__field .control-addon .control-select,.form__field .control-addon .control-text{background:transparent!important;border:0;width:auto;vertical-align:top;order:1;flex:1}.form__field .control-addon .control-text[disabled][type]:focus,.form__field .control-addon .control-select[disabled][type]:focus,.form__field .control-addon .control-select:focus,.form__field .control-addon .control-text:focus{box-shadow:none}.form__field .control-addon .control-text[disabled][type]:focus+label:before,.form__field .control-addon .control-select[disabled][type]:focus+label:before,.form__field .control-addon .control-select:focus+label:before,.form__field .control-addon .control-text:focus+label:before{outline:0;border-color:#007bdb}.form__field .control-addon .control-text[disabled][type]+label,.form__field .control-addon .control-select[disabled][type]+label,.form__field .control-addon .control-select+label,.form__field .control-addon .control-text+label{padding-left:10px;position:static!important;z-index:0}.form__field .control-addon .control-text[disabled][type]+label>*,.form__field .control-addon .control-select[disabled][type]+label>*,.form__field .control-addon .control-select+label>*,.form__field .control-addon .control-text+label>*{vertical-align:top;position:relative;z-index:2}.form__field .control-addon .control-text[disabled][type]+label:before,.form__field .control-addon .control-select[disabled][type]+label:before,.form__field .control-addon .control-select+label:before,.form__field .control-addon .control-text+label:before{box-sizing:border-box;border-radius:1px;border:1px solid #adadad;content:"";display:block;position:absolute;top:0;left:0;width:100%;height:100%;z-index:0;background:#fff}.form__field .control-addon .control-text[disabled][type][disabled]+label:before,.form__field .control-addon .control-select[disabled][type][disabled]+label:before,.form__field .control-addon .control-select[disabled]+label:before,.form__field .control-addon .control-text[disabled]+label:before{opacity:.5;background:#e9e9e9}.form__field .control-after{order:3}.form__field .control-after:last-child{padding-right:10px}.form__field .control-before{order:0}.form__field .control-some{display:flex}.form__field [class*=control-grouped]{display:table;width:100%;table-layout:fixed;box-sizing:border-box}.form__field [class*=control-grouped]>.form__field{display:table-cell;width:50%;vertical-align:top}.form__field [class*=control-grouped]>.form__field>.control{width:100%;float:none}.form__field [class*=control-grouped]>.form__field:nth-child(n+2){padding-left:20px}.form__field [class*=control-grouped]>.form__field:nth-child(n+2):not(.choice) .label{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.form__field [class*=control-grouped]>.form__field:nth-child(n+2):not(.choice) .label.focusable:active,.form__field [class*=control-grouped]>.form__field:nth-child(n+2):not(.choice) .label.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.form__field [class*=control-grouped]>.form__field:nth-child(n+2):not(.choice) .label.focusable:active,.form__field [class*=control-grouped]>.form__field:nth-child(n+2):not(.choice) .label.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.form__field [required]{box-shadow:none}fieldset.form__field{position:relative}fieldset.form__field [class*=control-grouped]>.form__field:first-child>.label,fieldset.form__field .control-fields>.form__field:first-child>.label{position:absolute;left:0;top:0;opacity:0;cursor:pointer;width:30%}.control-text+.ui-datepicker-trigger{background-image:none;background:0 0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;line-height:inherit;font-weight:400;text-decoration:none;margin-left:-40px;display:inline-block}.control-text+.ui-datepicker-trigger img{display:none}.control-text+.ui-datepicker-trigger:focus,.control-text+.ui-datepicker-trigger:active{background:0 0;border:none}.control-text+.ui-datepicker-trigger:hover{background:0 0;border:none}.control-text+.ui-datepicker-trigger.disabled,.control-text+.ui-datepicker-trigger[disabled],fieldset[disabled] .control-text+.ui-datepicker-trigger{cursor:not-allowed;pointer-events:none;opacity:.5}.control-text+.ui-datepicker-trigger>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.control-text+.ui-datepicker-trigger>span.focusable:active,.control-text+.ui-datepicker-trigger>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.control-text+.ui-datepicker-trigger>span.focusable:active,.control-text+.ui-datepicker-trigger>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.control-text+.ui-datepicker-trigger:after{font-family:'icons-blank-theme';content:'\e612';font-size:38px;line-height:33px;color:#514943;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}[class*=tab-nav-item]:not(ul):active,[class*=tab-nav-item]:not(ul):focus{box-shadow:none;outline:none}.customer-index-edit .col-2-left-layout,.customer-index-edit .col-1-layout{background:#fff}.customer-index-edit{background:#fff}.customer-index-edit .col-2-left-layout{background:#fff}.customer-index-edit .main-col{padding-left:40px}.customer-index-edit .page-main-actions{background:0 0}.tab-nav.block{margin-bottom:40px}.tab-nav.block:first-child{margin-top:16px}.tab-nav.block .block-title{padding:7px 20px}.tab-nav-items{padding:0;border:1px solid #d3d3d3;box-shadow:0 0 4px rgba(50,50,50,.35);margin:0 0 40px;background:#f7f7f7}.tab-nav-item{padding:0;list-style-type:none;border-bottom:1px solid #e0e0e0;position:relative;margin:0 15px;z-index:1}.tab-nav-item:last-child{border-bottom:0}.tab-nav-item.ui-state-active{z-index:2;background:#fff;padding:1px 14px;border:2px solid #eb5202;margin:-1px}.tab-nav-item.ui-state-active .tab-nav-item-link{padding:13px 15px 13px;color:#eb5202}.tab-nav-item.ui-tabs-loading{position:relative;z-index:1}.tab-nav-item.ui-tabs-loading:before{content:"";display:block;position:absolute;z-index:2;background:url("../images/loader-2.gif") no-repeat 50% 50%;background-size:120px;width:20px;height:20px;top:13px;left:-10px}.tab-nav-item.ui-tabs-loading.ui-state-active:before{top:12px;left:4px}.tab-nav-item-link{display:block;padding:15px;color:#666;line-height:1}.tab-nav-item-link:focus,.tab-nav-item-link:active,.tab-nav-item-link:hover{outline:0;color:#eb5202;text-decoration:none}.ui-state-active .tab-nav-item-link{color:#666;font-weight:600}.tab-nav-item-link.changed{font-style:italic}.listing-tiles{overflow:hidden;margin-top:-10px;margin-left:-10px}.listing-tiles .listing-tile{background-color:#f2ebde;display:block;width:238px;height:200px;float:left;border:1px solid #676056;margin-top:10px;margin-left:10px;border-radius:4px;text-align:center}.listing-tiles .listing-tile.disabled{border-color:red}.listing-tiles .listing-tile.enabled{border-color:green}.listing .disabled{color:red}.listing .enabled{color:green}.pager{text-align:left;padding-bottom:10px}.pager:before,.pager:after{content:"";display:table}.pager:after{clear:both}.pager:before,.pager:after{content:"";display:table}.pager:after{clear:both}.pager [data-part=left]{display:inline-block;width:45%;float:left;text-align:left}.pager [data-part=right]{display:inline-block;width:45%;text-align:right;float:right;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.pager .action-next{cursor:pointer}.pager .action-previous{cursor:pointer}.pager{text-align:left}.pager [data-part=left]{display:inline-block;width:45%;text-align:left}.pager [data-part=right]{display:inline-block;width:45%;text-align:right;float:right}.grid .col-title{min-width:90px;text-align:center}.grid-actions [data-part=search]{display:inline-block;margin:0 30px}.grid-actions [data-part=search] input[type=text]{vertical-align:bottom;width:460px}.grid .actions-split .dropdown-menu{right:auto;left:auto;text-align:left;color:#676056;font-weight:400}.grid .actions-split .dropdown-menu:after{right:auto;left:9px}.grid .actions-split .dropdown-menu:before{right:auto;left:10px}.grid .grid-actions{padding:10px 0}.grid .hor-scroll{padding-top:10px}.grid .select-box{display:inline-block;vertical-align:top;margin:-12px -10px -7px;padding:12px 10px 7px;width:100%}.filters-toggle{background:#f2ebde;padding:6px 13px;color:#645d53;border:1px solid #ada89e;cursor:pointer;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.3rem;font-weight:500;line-height:1.4rem;box-sizing:border-box;margin:3px;vertical-align:middle;display:inline-block;background-image:none;background:0 0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400}.filters-toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:30px;line-height:15px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.filters-toggle:hover:after{color:inherit}.filters-toggle:active:after{color:inherit}.filters-toggle:focus,.filters-toggle:active{background:#cac3b4;border:1px solid #989287}.filters-toggle:hover{background:#cac3b4}.filters-toggle.disabled,.filters-toggle[disabled],fieldset[disabled] .filters-toggle{cursor:default;pointer-events:none;opacity:.5}.filters-toggle:focus,.filters-toggle:active{background:0 0;border:none}.filters-toggle:hover{background:0 0;border:none}.filters-toggle.disabled,.filters-toggle[disabled],fieldset[disabled] .filters-toggle{cursor:not-allowed;pointer-events:none;opacity:.5}.filters-toggle:after{margin-top:2px;margin-left:-3px}.filters-toggle.active:after{content:'\e618'}.filters-current{padding:10px 0;display:none}.filters-current.active{display:block}.filters-items{margin:0;padding:0;list-style:none none;display:inline}.filters-item{display:inline-block;margin:0 5px 5px 0;padding:2px 2px 2px 4px;border-radius:3px;background:#f7f3eb}.filters-item .item-label{font-weight:600}.filters-item .item-label:after{content:": "}.filters-item .action-remove{background-image:none;background:#f2ebde;padding:6px 13px;color:#645d53;border:1px solid #ada89e;cursor:pointer;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.3rem;font-weight:500;line-height:1.4rem;box-sizing:border-box;margin:3px;vertical-align:middle;display:inline-block;text-decoration:none;padding:0}.filters-item .action-remove>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.filters-item .action-remove>span.focusable:active,.filters-item .action-remove>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.filters-item .action-remove>span.focusable:active,.filters-item .action-remove>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.filters-item .action-remove:before{font-family:'icons-blank-theme';content:'\e616';font-size:16px;line-height:16px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.filters-item .action-remove:hover:before{color:inherit}.filters-item .action-remove:active:before{color:inherit}.filters-item .action-remove:focus,.filters-item .action-remove:active{background:#cac3b4;border:1px solid #989287}.filters-item .action-remove:hover{background:#cac3b4}.filters-item .action-remove.disabled,.filters-item .action-remove[disabled],fieldset[disabled] .filters-item .action-remove{cursor:default;pointer-events:none;opacity:.5}.filters-form{position:relative;z-index:1;margin:14px 0;background:#fff;border:1px solid #bbb;box-shadow:0 3px 3px rgba(0,0,0,.15)}.filters-form .action-close{position:absolute;top:3px;right:7px;background:#f2ebde;padding:6px 13px;color:#645d53;border:1px solid #ada89e;cursor:pointer;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.3rem;font-weight:500;line-height:1.4rem;box-sizing:border-box;margin:3px;vertical-align:middle;display:inline-block;background-image:none;background:0 0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400}.filters-form .action-close>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.filters-form .action-close>span.focusable:active,.filters-form .action-close>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.filters-form .action-close>span.focusable:active,.filters-form .action-close>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.filters-form .action-close:before{font-family:'icons-blank-theme';content:'\e616';font-size:42px;line-height:42px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.filters-form .action-close:hover:before{color:inherit}.filters-form .action-close:active:before{color:inherit}.filters-form .action-close:focus,.filters-form .action-close:active{background:#cac3b4;border:1px solid #989287}.filters-form .action-close:hover{background:#cac3b4}.filters-form .action-close.disabled,.filters-form .action-close[disabled],fieldset[disabled] .filters-form .action-close{cursor:default;pointer-events:none;opacity:.5}.filters-form .action-close:focus,.filters-form .action-close:active{background:0 0;border:none}.filters-form .action-close:hover{background:0 0;border:none}.filters-form .action-close.disabled,.filters-form .action-close[disabled],fieldset[disabled] .filters-form .action-close{cursor:not-allowed;pointer-events:none;opacity:.5}.filters-actions{margin:18px;text-align:right}.filters-fieldset{padding-bottom:0}.filters-fieldset .field{border:0;margin:0 0 20px;box-sizing:border-box;display:inline-block;padding:0 12px 0 0;width:33.33333333%;vertical-align:top}.filters-fieldset .field:before,.filters-fieldset .field:after{content:"";display:table}.filters-fieldset .field:after{clear:both}.filters-fieldset .field:before,.filters-fieldset .field:after{content:"";display:table}.filters-fieldset .field:after{clear:both}.filters-fieldset .field.choice:before,.filters-fieldset .field.no-label:before{box-sizing:border-box;content:" ";height:1px;float:left;padding:6px 15px 0 0;width:35%}.filters-fieldset .field .description{box-sizing:border-box;float:left;padding:6px 15px 0 0;text-align:right;width:35%}.filters-fieldset .field:not(.choice)>.label{box-sizing:border-box;float:left;padding:6px 15px 0 0;text-align:right;width:35%}.filters-fieldset .field:not(.choice)>.control{float:left;width:65%}.filters-fieldset .field:last-child{margin-bottom:0}.filters-fieldset .field+.fieldset{clear:both}.filters-fieldset .field>.label{font-weight:700}.filters-fieldset .field>.label+br{display:none}.filters-fieldset .field .choice input{vertical-align:top}.filters-fieldset .field .fields.group:before,.filters-fieldset .field .fields.group:after{content:"";display:table}.filters-fieldset .field .fields.group:after{clear:both}.filters-fieldset .field .fields.group:before,.filters-fieldset .field .fields.group:after{content:"";display:table}.filters-fieldset .field .fields.group:after{clear:both}.filters-fieldset .field .fields.group .field{box-sizing:border-box;float:left}.filters-fieldset .field .fields.group.group-2 .field{width:50% !important}.filters-fieldset .field .fields.group.group-3 .field{width:33.3% !important}.filters-fieldset .field .fields.group.group-4 .field{width:25% !important}.filters-fieldset .field .fields.group.group-5 .field{width:20% !important}.filters-fieldset .field .addon{display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;padding:0;width:100%}.filters-fieldset .field .addon textarea,.filters-fieldset .field .addon select,.filters-fieldset .field .addon input{-ms-flex-order:2;-webkit-order:2;order:2;-webkit-flex-basis:100%;flex-basis:100%;box-shadow:none;display:inline-block;margin:0;width:auto}.filters-fieldset .field .addon .addbefore,.filters-fieldset .field .addon .addafter{-ms-flex-order:3;-webkit-order:3;order:3;display:inline-block;box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:32px;width:100%;padding:0 9px;font-size:14px;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;width:auto;white-space:nowrap;vertical-align:middle}.filters-fieldset .field .addon .addbefore:disabled,.filters-fieldset .field .addon .addafter:disabled{opacity:.5}.filters-fieldset .field .addon .addbefore::-moz-placeholder,.filters-fieldset .field .addon .addafter::-moz-placeholder{color:#c2c2c2}.filters-fieldset .field .addon .addbefore::-webkit-input-placeholder,.filters-fieldset .field .addon .addafter::-webkit-input-placeholder{color:#c2c2c2}.filters-fieldset .field .addon .addbefore:-ms-input-placeholder,.filters-fieldset .field .addon .addafter:-ms-input-placeholder{color:#c2c2c2}.filters-fieldset .field .addon .addbefore{float:left;-ms-flex-order:1;-webkit-order:1;order:1}.filters-fieldset .field .additional{margin-top:10px}.filters-fieldset .field.required>.label:after{content:'*';font-size:1.2rem;color:#e02b27;margin:0 0 0 5px}.filters-fieldset .field .note{font-size:1.2rem;margin:3px 0 0;padding:0;display:inline-block;text-decoration:none}.filters-fieldset .field .note:before{font-family:'icons-blank-theme';content:'\e618';font-size:24px;line-height:12px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.filters-fieldset .field .label{color:#676056;font-size:13px;font-weight:600;margin:0}.filters .field-date .group .hasDatepicker{width:100%;padding-right:30px}.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger{background-image:none;background:0 0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;line-height:inherit;font-weight:400;text-decoration:none;margin-left:-33px;display:inline-block;width:30px}.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger img{display:none}.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger:focus,.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger:active{background:0 0;border:none}.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger:hover{background:0 0;border:none}.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger.disabled,.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger[disabled],fieldset[disabled] .filters .field-date .group .hasDatepicker+.ui-datepicker-trigger{cursor:not-allowed;pointer-events:none;opacity:.5}.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger>span.focusable:active,.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger>span.focusable:active,.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger:after{font-family:'icons-blank-theme';content:'\e612';font-size:35px;line-height:30px;color:#514943;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.filters .field-range .group .field{margin-bottom:0}.filters .field-range .group .control{width:100%;box-sizing:border-box;padding-right:0;position:relative;z-index:1}.mass-select{position:relative;margin:-6px -10px;padding:6px 2px 6px 10px;z-index:1;white-space:nowrap}.mass-select.active{background:rgba(0,0,0,.2)}.mass-select-toggle{background:#f2ebde;padding:6px 13px;color:#645d53;border:1px solid #ada89e;cursor:pointer;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.3rem;font-weight:500;line-height:1.4rem;box-sizing:border-box;margin:3px;vertical-align:middle;display:inline-block;background-image:none;background:0 0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400}.mass-select-toggle>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.mass-select-toggle>span.focusable:active,.mass-select-toggle>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.mass-select-toggle>span.focusable:active,.mass-select-toggle>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.mass-select-toggle:before{font-family:'icons-blank-theme';content:'\e607';font-size:30px;line-height:15px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.mass-select-toggle:hover:before{color:inherit}.mass-select-toggle:active:before{color:inherit}.mass-select-toggle:focus,.mass-select-toggle:active{background:#cac3b4;border:1px solid #989287}.mass-select-toggle:hover{background:#cac3b4}.mass-select-toggle.disabled,.mass-select-toggle[disabled],fieldset[disabled] .mass-select-toggle{cursor:default;pointer-events:none;opacity:.5}.mass-select-toggle:focus,.mass-select-toggle:active{background:0 0;border:none}.mass-select-toggle:hover{background:0 0;border:none}.mass-select-toggle.disabled,.mass-select-toggle[disabled],fieldset[disabled] .mass-select-toggle{cursor:not-allowed;pointer-events:none;opacity:.5}.mass-select-toggle:before{margin-top:-2px;text-indent:-5px;color:#fff}.mass-select-toggle:hover:before{color:#fff}.mass-select-toggle:active:before,.mass-select-toggle.active:before{content:'\e618'}.mass-select-field{display:inline}.mass-select-menu{display:none;position:absolute;top:100%;left:0;text-align:left;margin:0;padding:0;list-style:none none;background:#fff;border:1px solid #bbb;min-width:175px;box-shadow:0 3px 3px rgba(0,0,0,.15)}.mass-select-menu li{margin:0;padding:4px 15px;border-bottom:1px solid #e5e5e5}.mass-select-menu li:hover{background:#e8e8e8;cursor:pointer}.mass-select-menu span{font-weight:400;font-size:13px;color:#645d53}.mass-select-menu.active{display:block}.grid-loading-mask{position:absolute;left:0;top:0;right:0;bottom:0;background:rgba(255,255,255,.5);z-index:100}.grid-loading-mask .grid-loader{position:absolute;margin:auto;left:0;top:0;right:0;bottom:0;width:218px;height:149px;background:url('../images/loader-2.gif') 50% 50% no-repeat}.addon input{border-width:1px 0 1px 1px}.addon input~.addafter strong{display:inline-block;background:#fff;line-height:24px;margin:0 3px 0 -2px;padding-left:4px;padding-right:4px;position:relative;font-size:12px;top:0}.addon input:focus~.addafter{border-color:#75b9f0;box-shadow:0 0 8px rgba(82,168,236,.6)}.addon input:focus~.addafter strong{margin-top:0}.addon .addafter{background:0 0;color:#a6a6a6;border-width:1px 1px 1px 0;border-radius:2px 2px 0 0;padding:0;border-color:#ada89e}.addon .pager input{border-width:1px}.field .control input[type=text][disabled],.field .control input[type=text][disabled]~.addafter,.field .control select[disabled],.field .control select[disabled]~.addafter{background-color:#fff;border-color:#eee;box-shadow:none;color:#999}.field .control input[type=text][disabled]~.addafter strong,.field .control select[disabled]~.addafter strong{background-color:#fff}.field-price.addon{direction:rtl}.field-price.addon>*{direction:ltr}.field-price.addon .addafter{border-width:1px 0 1px 1px;border-radius:2px 0 0 2px}.field-price.addon input:first-child{border-radius:0 2px 2px 0}.field-price input{border-width:1px 1px 1px 0}.field-price input:focus{box-shadow:0 0 8px rgba(82,168,236,.6)}.field-price input:focus~label.addafter{box-shadow:0 0 8px rgba(82,168,236,.6)}.field-price input~label.addafter strong{margin-left:2px;margin-right:-2px}.field-price.addon>input{width:99px;float:left}.field-price .control{position:relative}.field-price label.mage-error{position:absolute;left:0;top:30px}.version-fieldset .grid-actions{border-bottom:1px solid #f2ebde;margin:0 0 15px;padding:0 0 15px}.navigation>ul,.message-system,.page-header,.page-actions.fixed .page-actions-inner,.page-content,.page-footer{width:auto;min-width:960px;max-width:1300px;margin:0 auto;padding-left:15px;padding-right:15px;box-sizing:border-box;width:100%}.pager label.page,.filters .field-range .group .label,.mass-select-field .label{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visually-hidden.focusable:active,.visually-hidden.focusable:focus,.pager label.page.focusable:active,.pager label.page.focusable:focus,.filters .field-range .group .label.focusable:active,.filters .field-range .group .label.focusable:focus,.mass-select-field .label.focusable:active,.mass-select-field .label.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}table th.required:after,.data-table th.required-entry:after,.data-table td.required-entry:after,.grid-actions .filter.required .label span:after,.grid-actions .required:after,.accordion .config .data-table td.required-entry:after{content:'*';color:#e22626;font-weight:400;margin-left:3px}.grid th.required:after,.grid th .required:after{content:'*';color:#f9d4d4;font-weight:400;margin-left:3px}.grid td.col-period,.grid td.col-date,.grid td.col-date_to,.grid td.col-date_from,.grid td.col-ended_at,.grid td.col-created_at,.grid td.col-updated_at,.grid td.col-customer_since,.grid td.col-session_start_time,.grid td.col-last_activity,.grid td.col-email,.grid td.col-name,.grid td.col-sku,.grid td.col-firstname,.grid td.col-lastname,.grid td.col-title,.grid td.col-label,.grid td.col-product,.grid td.col-set_name,.grid td.col-websites,.grid td.col-time,.grid td.col-billing_name,.grid td.col-shipping_name,.grid td.col-phone,.grid td.col-type,.product-options .grouped-items-table .col-name,.product-options .grouped-items-table .col-sku,.sales-order-create-index .data-table .col-product,[class^=' adminhtml-rma-'] .fieldset-wrapper .data-table td,[class^=' adminhtml-rma-'] .grid .col-product_sku,[class^=' adminhtml-rma-'] .grid .col-product_name,.col-grid_segment_name,.adminhtml-catalog-event-index .col-category,[class^=' catalog-search'] .col-search_query,[class^=' catalog-search'] .col-synonym_for,[class^=' catalog-search'] .col-redirect,.adminhtml-urlrewrite-index .col-request_path,.adminhtml-cms-page-index .col-title,.adminhtml-cms-page-index .col-identifier,.adminhtml-cms-hierarchy-index .col-title,.adminhtml-cms-hierarchy-index .col-identifier,.col-banner_name,.adminhtml-widget-instance-index .col-title,.reports-index-search .col-query_text,.adminhtml-rma-item-attribute-index .grid .col-attr-code,.adminhtml-system-store-index .grid td,.catalog-product-attribute-index .col-attr-code,.catalog-product-attribute-index .col-label,.adminhtml-export-index .col-code,.adminhtml-logging-index .grid .col-fullaction,.adminhtml-system-variable-index .grid .col-code,.adminhtml-logging-index .grid .col-info,.dashboard-secondary .dashboard-item tr>td:first-child,.ui-tabs-panel .dashboard-data .col-name,.data-table-td-max .data-table td,[class^=' adminhtml-rma-'] .fieldset-wrapper .accordion .config .data-table td,.data-table-td-max .accordion .config .data-table td,.order-account-information .data-table td,[class^=' adminhtml-rma-'] .rma-request-details .data-table td{overflow:hidden;text-overflow:ellipsis}td.col-period,td.col-date,td.col-date_to,td.col-date_from,td.col-ended_at,td.col-created_at,td.col-updated_at,td.col-customer_since,td.col-session_start_time,td.col-time,td.col-sku,td.col-type,[class^=' adminhtml-rma-'] #rma_items_grid_table .headings th,.adminhtml-process-list .col-action a,.adminhtml-process-list .col-mode{white-space:nowrap}table thead tr th:first-child,table tfoot tr th:first-child,table tfoot tr td:first-child{border-left:0}table thead tr th:last-child,table tfoot tr th:last-child,table tfoot tr td:last-child{border-right:0}.form-inline .grid-actions .label,.form-inline .massaction .label{padding:0;width:auto}.grid .col-action,.grid .col-actions,.grid .col-qty,.grid .col-purchases,.catalog-product-edit .ui-tabs-panel .grid .col-price,.catalog-product-edit .ui-tabs-panel .grid .col-position{width:50px}.grid .col-order-number,.grid .col-real_order_id,.grid .col-invoice-number,.grid .col-increment_id,.grid .col-transaction-id,.grid .col-parent-transaction-id,.grid .col-reference_id,.grid .col-status,.grid .col-price,.grid .col-position,.grid .col-base_grand_total,.grid .col-grand_total,.grid .col-sort_order,.grid .col-carts,.grid .col-priority,.grid .col-severity,.sales-order-create-index .col-in_products,[class^=' reports-'] [class^=col-total],[class^=' reports-'] [class^=col-average],[class^=' reports-'] [class^=col-ref-],[class^=' reports-'] [class^=col-rate],[class^=' reports-'] [class^=col-tax-amount],[class^=' adminhtml-customer-'] .col-required,.adminhtml-rma-item-attribute-index .col-required,[class^=' adminhtml-customer-'] .col-system,.adminhtml-rma-item-attribute-index .col-system,[class^=' adminhtml-customer-'] .col-is_visible,.adminhtml-rma-item-attribute-index .col-is_visible,[class^=' adminhtml-customer-'] .col-sort_order,.adminhtml-rma-item-attribute-index .col-sort_order,.catalog-product-attribute-index [class^=' col-is_'],.catalog-product-attribute-index .col-required,.catalog-product-attribute-index .col-system,.adminhtml-test-index .col-is_listed,[class^=' tests-report-test'] [class^=col-inv-]{width:70px}.grid .col-phone,.sales-order-view .grid .col-period,.sales-order-create-index .col-phone,[class^=' adminhtml-rma-'] .grid .col-product_sku,.adminhtml-rma-edit .col-product,.adminhtml-rma-edit .col-sku,.catalog-product-edit .ui-tabs-panel .grid .col-name,.catalog-product-edit .ui-tabs-panel .grid .col-type,.catalog-product-edit .ui-tabs-panel .grid .col-sku,.customer-index-index .grid .col-customer_since,.customer-index-index .grid .col-billing_country_id,[class^=' customer-index-'] .fieldset-wrapper .grid .col-created_at,[class^=' customer-index-'] .accordion .grid .col-created_at{max-width:70px;width:70px}.sales-order-view .grid .col-name,.sales-order-create-index .data-table .col-product,[class^=' adminhtml-rma-'] .grid .col-name,[class^=' adminhtml-rma-'] .grid .col-product,[class^=' catalog-search'] .col-search_query,[class^=' catalog-search'] .col-synonym_for,[class^=' catalog-search'] .col-redirect,.adminhtml-urlrewrite-index .col-request_path,.reports-report-shopcart-abandoned .grid .col-name,.tax-rule-index .grid .col-title,.adminhtml-rma-item-attribute-index .grid .col-attr-code,.dashboard-secondary .dashboard-item tr>td:first-child{max-width:150px;width:150px}[class^=' sales-order-'] .grid .col-name,.catalog-category-edit .grid .col-name,.adminhtml-catalog-event-index .col-category,.adminhtml-banner-edit .grid .col-name,.reports-report-product-lowstock .grid .col-sku,.newsletter-problem-index .grid .col-name,.newsletter-problem-index .grid .col-subject,.newsletter-problem-index .grid .col-product,.adminhtml-rma-item-attribute-index .grid .col-label,.adminhtml-export-index .col-label,.adminhtml-export-index .col-code,.adminhtml-scheduled-operation-index .grid .col-name,.adminhtml-logging-index .grid .col-fullaction,.test-report-customer-wishlist-wishlist .grid .col-name,.test-report-customer-wishlist-wishlist .grid .col-subject,.test-report-customer-wishlist-wishlist .grid .col-product{max-width:220px;width:220px}.grid .col-period,.grid .col-date,.grid .col-date_to,.grid .col-date_from,.grid .col-ended_at,.grid .col-created_at,.grid .col-updated_at,.grid .col-customer_since,.grid .col-session_start_time,.grid .col-last_activity,.grid .col-email,.grid .col-items_total,.grid .col-firstname,.grid .col-lastname,.grid .col-status-default,.grid .col-websites,.grid .col-time,.grid .col-billing_name,.grid .col-shipping_name,.sales-order-index .grid .col-name,.product-options .grouped-items-table .col-name,.product-options .grouped-items-table .col-sku,[class^=' sales-order-view'] .grid .col-customer_name,[class^=' adminhtml-rma-'] .grid .col-product_name,.catalog-product-index .grid .col-name,.catalog-product-review-index .grid .col-name,.catalog-product-review-index .grid .col-title,.customer-index-edit .ui-tabs-panel .grid .col-name,.review-product-index .grid .col-name,.adminhtml-cms-page-index .col-title,.adminhtml-cms-page-index .col-identifier,.catalog-product-attribute-index .col-attr-code,.catalog-product-attribute-index .col-label,.adminhtml-logging-index .grid .col-info{max-width:110px;width:110px}.grid .col-name,.grid .col-product,.col-banner_name,.adminhtml-widget-instance-index .col-title,[class^=' adminhtml-customer-'] .col-label,.adminhtml-rma-item-attribute-index .col-label,.adminhtml-system-variable-index .grid .col-code,.ui-tabs-panel .dashboard-data .col-name,.adminhtml-test-index .col-label{max-width:370px;width:370px}.col-grid_segment_name,.reports-index-search .col-query_text{max-width:570px;width:570px}[class^=' adminhtml-rma-'] .fieldset-wrapper .data-table td,.reports-report-product-lowstock .grid .col-name,.reports-report-shopcart-product .grid .col-name,.reports-report-review-customer .grid .col-name,[class^=' adminhtml-rma-'] .fieldset-wrapper .accordion .config .data-table td{max-width:670px;width:670px}.reports-report-sales-invoiced .grid .col-period,.reports-report-sales-refunde .grid .col-period,[class^=' tests-report-test'] .grid .col-period{width:auto}.grid .col-select,.grid .col-id,.grid .col-number{width:40px}.sales-order-create-index .grid,.sales-order-create-index .grid-actions,.adminhtml-export-index .grid-actions,.adminhtml-export-index .grid{padding-left:0;padding-right:0}[class^=' adminhtml-rma-'] .col-actions a,[class^=' customer-index-'] .col-action a,.adminhtml-notification-index .col-actions a{display:block;margin:0 0 3px;white-space:nowrap}.data-table-td-max .accordion .config .data-table td,.order-account-information .data-table td,[class^=' adminhtml-rma-'] .rma-request-details .data-table td{max-width:250px;width:250px}.catalog-product-edit .ui-tabs-panel .grid .hor-scroll,.catalog-product-index .grid .hor-scroll,.review-product-index .grid .hor-scroll,.adminhtml-rma-edit .hor-scroll{overflow-x:auto}.add-clearer:after,.massaction:after,.navigation>ul:after{content:"";display:table;clear:both}.test-content{width:calc(20px + 100*0.2)}.test-content:before{content:'.test {\A ' attr(data-attribute) ': 0.2em;' '\A content:\'';white-space:pre}.test-content:after{content:' Test\';\A}' "\A" '\A.test + .test._other ~ ul > li' " {\A height: @var;\A content: ' + ';\A}";white-space:pre}.test-content-calc{width:calc((100%/12*2) - 10px)}.test-svg-xml-image{background:url('data:image/svg+xml;utf8,') no-repeat left center}
\ No newline at end of file
+table>caption{margin-bottom:5px}table thead{background:#676056;color:#f7f3eb}table thead .headings{background:#807a6e}table thead a{color:#f7f3eb;display:block}table thead a label{color:#f7f3eb;cursor:pointer;display:block}table thead a:hover,table thead a:focus{color:#dac7a2;text-decoration:none}table tfoot{background:#f2ebde;color:#676056}table tfoot tr th,table tfoot tr td{text-align:left}table th{background:0 0;border:solid #cac3b4;border-width:0 1px;font-size:14px;padding:6px 10px;text-align:center}table td{border:solid #cac3b4;border-width:0 1px;padding:6px 10px 7px;vertical-align:top}table tbody tr td{background:#fff;color:#676056;padding-top:12px}table tbody tr td:first-child{border-left:0}table tbody tr td:first-child input[type=checkbox]{margin:0}table tbody tr td:last-child{border-right:0}table tbody tr:last-child th,table tbody tr:last-child td{border-bottom-width:1px}table tbody tr:nth-child(odd) td,table tbody tr:nth-child(odd) th{background-color:#f7f3eb}table tbody.even tr td{background:#fff}table tbody.odd tr td{background:#f7f3eb}table .dropdown-menu li{padding:7px 15px;line-height:14px;cursor:pointer}table .col-draggable .draggable-handle{float:left;position:relative;top:0}.not-sort{padding-right:10px}.sort-arrow-asc,.sort-arrow-desc{padding-right:10px;position:relative}.sort-arrow-asc:after,.sort-arrow-desc:after{right:-11px;top:-1px;position:absolute;width:23px}.sort-arrow-asc:hover:after,.sort-arrow-desc:hover:after{color:#dac7a2}.sort-arrow-asc{display:inline-block;text-decoration:none}.sort-arrow-asc:after{font-family:'icons-blank-theme';content:'\e626';font-size:13px;line-height:inherit;color:#f7f3eb;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.sort-arrow-asc:hover:after{color:#dac7a2}.sort-arrow-desc{display:inline-block;text-decoration:none}.sort-arrow-desc:after{font-family:'icons-blank-theme';content:'\e623';font-size:13px;line-height:inherit;color:#f7f3eb;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.sort-arrow-desc:hover:after{color:#dac7a2}.grid-actions .input-text,.pager .input-text,.massaction .input-text,.filter .input-text,.grid-actions select,.pager select,.massaction select,.filter select,.grid-actions .select,.pager .select,.massaction .select,.filter .select{border-color:#989287;box-shadow:none;border-radius:1px;height:28px;margin:0 10px 0 0}.filter th{border:0 solid #676056;padding:6px 3px;vertical-align:top}.filter .ui-datepicker-trigger{cursor:pointer;margin-top:2px}.filter .input-text{padding:0 5px}.filter .range-line:not(:last-child){margin-bottom:5px}.filter .date{padding-right:28px;position:relative;display:inline-block;text-decoration:none}.filter .date .hasDatepicker{vertical-align:top;width:99%}.filter .date img{cursor:pointer;height:25px;width:25px;right:0;position:absolute;vertical-align:middle;z-index:2;opacity:0}.filter .date:before{font-family:'icons-blank-theme';content:'\e612';font-size:42px;line-height:30px;color:#f7f3eb;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.filter .date:hover:before{color:#dac7a2}.filter .date:before{height:29px;margin-left:5px;position:absolute;right:-3px;top:-3px;width:35px}.filter select{border-color:#cac3b4;margin:0;padding:0;width:99%}.filter input.input-text{border-color:#cac3b4;margin:0;width:99%}.filter input.input-text::-webkit-input-placeholder{color:#989287 !important;text-transform:lowercase}.filter input.input-text::-moz-placeholder{color:#989287 !important;text-transform:lowercase}.filter input.input-text:-moz-placeholder{color:#989287 !important;text-transform:lowercase}.filter input.input-text:-ms-input-placeholder{color:#989287 !important;text-transform:lowercase}.grid{background:#fff;color:#676056;font-size:13px;font-weight:400;padding:15px}.grid table{width:100%}.grid tbody tr.selected th,.grid tbody tr.selected td,.grid tbody tr:hover th,.grid tbody tr:hover td,.grid tbody tr:nth-child(odd):hover th,.grid tbody tr:nth-child(odd):hover td{background-color:#f2ebde;cursor:pointer}.grid tbody tr.selected th.empty-text,.grid tbody tr.selected td.empty-text,.grid tbody tr:hover th.empty-text,.grid tbody tr:hover td.empty-text,.grid tbody tr:nth-child(odd):hover th.empty-text,.grid tbody tr:nth-child(odd):hover td.empty-text{background-color:#f7f3eb;cursor:default}.grid .empty-text{font:400 20px/1.2 'Open Sans',sans-serif;text-align:center;white-space:nowrap}.grid .col-sku{max-width:100px;width:100px}.grid .col-select,.grid .col-massaction{text-align:center}.grid .editable .input-text{width:65px}.grid .col-actions .action-select{background:#fff;border-color:#989287;height:28px;margin:0;padding:4px 4px 5px;width:80px}.grid .col-position.editable{white-space:nowrap}.grid .col-position.editable .input-text{margin:-7px 5px 0;width:70%}.eq-ie9 .hor-scroll{display:inline-block;min-height:0;overflow-y:hidden;overflow-x:auto;width:100%}.data-table{border-collapse:separate;width:100%}.data-table thead,.data-table tfoot,.data-table th,.accordion .config .data-table thead th,.accordion .config .data-table tfoot td,.accordion .config .accordion .config .data-table tfoot td th{background:#fff;color:#676056;font-size:13px;font-weight:600}.data-table th{text-align:left}.data-table thead th,.accordion .config .data-table thead th th,.accordion .config .data-table tfoot td th,.accordion .config .accordion .config .data-table tfoot td th th{border:solid #c9c2b8;border-width:0 0 1px;padding:7px}.data-table td,.data-table tbody tr th,.data-table tbody tr td,.accordion .config .data-table td{background:#fff;border-width:0;padding:5px 7px;vertical-align:middle}.data-table tbody tr:nth-child(odd) th,.data-table tbody tr:nth-child(odd) td,.accordion .config .data-table tbody tr:nth-child(odd) td{background:#fbfaf6}.data-table tbody.odd tr th,.data-table tbody.odd tr td{background:#fbfaf6}.data-table tbody.even tr th,.data-table tbody.even tr td{background:#fff}.data-table tfoot tr:last-child th,.data-table tfoot tr:last-child td,.data-table .accordion .config .data-table tfoot tr:last-child td{border:0}.data-table.order-tables tbody td{vertical-align:top}.data-table.order-tables tbody:hover tr th,.data-table.order-tables tbody:hover tr td{background:#f7f3eb}.data-table.order-tables tfoot td{background:#f2ebde;color:#676056;font-size:13px;font-weight:600}.data-table input[type=text]{width:98%;padding-left:1%;padding-right:1%}.data-table select{margin:0;box-sizing:border-box}.data-table .col-actions .actions-split{margin-top:4px}.data-table .col-actions .actions-split [class^=action-]{background:0 0;border:1px solid #c8c3b5;padding:3px 5px;color:#bbb3a6;font-size:12px}.data-table .col-actions .actions-split [class^=action-]:first-child{border-right:0}.data-table .col-actions .actions-split .dropdown-menu{margin-top:-1px}.data-table .col-actions .actions-split .dropdown-menu a{display:block;color:#333;text-decoration:none}.data-table .col-actions .actions-split.active .action-toggle{position:relative;border-bottom-right-radius:0;box-shadow:none;background:#fff}.data-table .col-actions .actions-split.active .action-toggle:after{position:absolute;top:100%;left:0;right:0;height:2px;margin-top:-1px;background:#fff;content:'';z-index:2}.data-table .col-actions .actions-split.active .action-toggle .dropdown-menu{border-top-right-radius:0}.data-table .col-default{white-space:nowrap;text-align:center;vertical-align:middle}.data-table .col-delete{text-align:center;width:32px}.data-table .col-file{white-space:nowrap}.data-table .col-file input,.data-table .col-file .input-text{margin:0 5px;width:40%}.data-table .col-file input:first-child,.data-table .col-file .input-text:first-child{margin-left:0}.data-table .col-actions-add{padding:10px 0}.grid-actions{background:#fff;font-size:13px;line-height:28px;padding:10px 15px;position:relative}.grid-actions+.grid{padding-top:5px}.grid-actions .export,.grid-actions .filter-actions{float:right;margin-left:10px;vertical-align:top}.grid-actions .import{display:block;vertical-align:top}.grid-actions .action-reset{background:0 0;border:0;display:inline;line-height:1.42857143;margin:0;padding:0;color:#1979c3;text-decoration:none;margin:6px 10px 0 0;vertical-align:top}.grid-actions .action-reset:visited{color:purple;text-decoration:none}.grid-actions .action-reset:hover{color:#006bb4;text-decoration:underline}.grid-actions .action-reset:active{color:#ff5501;text-decoration:underline}.grid-actions .action-reset:hover{color:#006bb4}.grid-actions .action-reset:hover,.grid-actions .action-reset:active,.grid-actions .action-reset:focus{background:0 0;border:0}.grid-actions .action-reset.disabled,.grid-actions .action-reset[disabled],fieldset[disabled] .grid-actions .action-reset{color:#1979c3;text-decoration:underline;cursor:default;pointer-events:none;opacity:.5}.grid-actions .import .label,.grid-actions .export .label,.massaction>.entry-edit .label{margin:0 14px 0 0;vertical-align:inherit}.grid-actions .import .action-,.grid-actions .export .action-,.grid-actions .filter-actions .action-,.massaction>.entry-edit .action-{vertical-align:inherit}.grid-actions .filter .date{float:left;margin:0 15px 0 0;position:relative}.grid-actions .filter .date:before{color:#676056;top:1px}.grid-actions .filter .date:hover:before{color:#31302b}.grid-actions .filter .label{margin:0}.grid-actions .filter .hasDatepicker{margin:0 5px;width:80px}.grid-actions .filter .show-by .select{margin-left:5px;padding:4px 4px 5px;vertical-align:top;width:auto}.grid-actions .filter.required:after{content:''}.grid-actions img{vertical-align:middle;height:22px;width:22px}.grid-actions .validation-advice{background:#f9d4d4;border:1px solid #e22626;border-radius:3px;color:#e22626;margin:5px 0 0;padding:3px 7px;position:absolute;white-space:nowrap;z-index:5}.grid-actions .validation-advice:before{width:0;height:0;border:5px solid transparent;border-bottom-color:#e22626;content:'';left:50%;margin-left:-5px;position:absolute;top:-11px}.grid-actions input[type=text].validation-failed{border-color:#e22626;box-shadow:0 0 8px rgba(226,38,38,.6)}.grid-actions .link-feed{white-space:nowrap}.pager{font-size:13px}.grid .pager{margin:15px 0 0;position:relative;text-align:center}.pager .pages-total-found{margin-right:25px}.pager .view-pages .select{margin:0 5px}.pager .link-feed{font-size:12px;margin:7px 15px 0 0;position:absolute;right:0;top:0}.pager .action-previous,.pager .action-next{background:0 0;border:0;display:inline;line-height:1.42857143;margin:0;padding:0;color:#1979c3;text-decoration:none;line-height:.6;overflow:hidden;width:20px}.pager .action-previous:visited,.pager .action-next:visited{color:purple;text-decoration:none}.pager .action-previous:hover,.pager .action-next:hover{color:#006bb4;text-decoration:underline}.pager .action-previous:active,.pager .action-next:active{color:#ff5501;text-decoration:underline}.pager .action-previous:hover,.pager .action-next:hover{color:#006bb4}.pager .action-previous:hover,.pager .action-next:hover,.pager .action-previous:active,.pager .action-next:active,.pager .action-previous:focus,.pager .action-next:focus{background:0 0;border:0}.pager .action-previous.disabled,.pager .action-next.disabled,.pager .action-previous[disabled],.pager .action-next[disabled],fieldset[disabled] .pager .action-previous,fieldset[disabled] .pager .action-next{color:#1979c3;text-decoration:underline;cursor:default;pointer-events:none;opacity:.5}.pager .action-previous:before,.pager .action-next:before{margin-left:-10px}.pager .action-previous.disabled,.pager .action-next.disabled{opacity:.3}.pager .action-previous{display:inline-block;text-decoration:none}.pager .action-previous>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pager .action-previous>span.focusable:active,.pager .action-previous>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.pager .action-previous>span.focusable:active,.pager .action-previous>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.pager .action-previous:before{font-family:'icons-blank-theme';content:'\e617';font-size:40px;line-height:inherit;color:#026294;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.pager .action-previous:hover:before{color:#007dbd}.pager .action-next{display:inline-block;text-decoration:none}.pager .action-next>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pager .action-next>span.focusable:active,.pager .action-next>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.pager .action-next>span.focusable:active,.pager .action-next>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.pager .action-next:before{font-family:'icons-blank-theme';content:'\e608';font-size:40px;line-height:inherit;color:#026294;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.pager .action-next:hover:before{color:#007dbd}.pager .input-text{height:25px;line-height:16px;margin-right:5px;text-align:center;width:25px;vertical-align:top}.pager .pages-total{line-height:25px;vertical-align:top}.massaction{background:#fff;border-top:1px solid #f2ebde;font-size:13px;line-height:28px;padding:15px 15px 0}.massaction>.entry-edit{float:right}.massaction>.entry-edit .field-row{display:inline-block;vertical-align:top}.massaction>.entry-edit .validation-advice{display:none !important}.massaction>.entry-edit .form-inline{display:inline-block}.massaction>.entry-edit .label{padding:0;width:auto}.massaction>.entry-edit .action-{vertical-align:top}.massaction .select.validation-failed{border:1px dashed #e22626;background:#f9d4d4}.grid-severity-critical,.grid-severity-major,.grid-severity-notice,.grid-severity-minor{background:#feeee1;border:1px solid #ed4f2e;color:#ed4f2e;display:block;padding:0 3px;font-weight:700;line-height:17px;text-transform:uppercase;text-align:center}.grid-severity-critical,.grid-severity-major{border-color:#e22626;background:#f9d4d4;color:#e22626}.grid-severity-notice{border-color:#5b8116;background:#d0e5a9;color:#185b00}.grid tbody td input[type=text],.data-table tbody td input[type=text],.grid tbody th input[type=text],.data-table tbody th input[type=text],.grid tbody td .input-text,.data-table tbody td .input-text,.grid tbody th .input-text,.data-table tbody th .input-text,.grid tbody td select,.data-table tbody td select,.grid tbody th select,.data-table tbody th select,.grid tbody td .select,.data-table tbody td .select,.grid tbody th .select,.data-table tbody th .select{width:99%}.ui-tabs-panel .grid .col-sku{max-width:150px;width:150px}.col-indexer_status,.col-indexer_mode{width:160px}.fieldset-wrapper .grid-actions+.grid{padding-top:15px}.fieldset-wrapper .grid-actions{padding:10px 0 0}.fieldset-wrapper .grid{padding:0}.fieldset-wrapper .massaction{padding:0;border-top:none;margin-bottom:15px}.accordion .grid{padding:0}.ui-dialog-content .grid-actions,.ui-dialog-content .grid{padding-left:0;padding-right:0}.qty-table td{border:0;padding:0 5px 3px}.sales-order-create-index .sales-order-create-index .grid table .action-configure{float:right}.sales-order-create-index .data-table .border td{padding-bottom:15px}.sales-order-create-index .actions.update{margin:10px 0}.adminhtml-order-shipment-new .grid .col-product{max-width:770px;width:770px}.customer-index-index .grid .col-name{max-width:90px;width:90px}.customer-index-index .grid .col-billing_region{width:70px}.adminhtml-cms-hierarchy-index .col-title,.adminhtml-cms-hierarchy-index .col-identifier{max-width:410px;width:410px}.adminhtml-widget-instance-edit .grid-chooser .control{margin-top:-19px;width:80%}.eq-ie9 .adminhtml-widget-instance-edit .grid-chooser .control{margin-top:-18px}.adminhtml-widget-instance-edit .grid-chooser .control .grid-actions{padding:0 0 15px}.adminhtml-widget-instance-edit .grid-chooser .control .grid{padding:0}.adminhtml-widget-instance-edit .grid-chooser .control .addon input:last-child,.adminhtml-widget-instance-edit .grid-chooser .control .addon select:last-child{border-radius:0}.reports-report-product-sold .grid .col-name{max-width:720px;width:720px}.adminhtml-system-store-index .grid td{max-width:310px}.adminhtml-system-currency-index .grid{padding-top:0}.adminhtml-system-currency-index .col-currency-edit-rate{min-width:40px}.adminhtml-system-currency-index .col-base-currency{font-weight:700}.adminhtml-system-currency-index .old-rate{display:block;margin-top:3px;text-align:center}.adminhtml-system-currency-index .hor-scroll{overflow-x:auto;min-width:970px}.adminhtml-system-currencysymbol-index .col-currency{width:35%}.adminhtml-system-currencysymbol-index .grid .input-text{margin:0 10px 0 0;width:50%}.catalog-product-set-index .col-set_name{max-width:930px;width:930px}.adminhtml-export-index .grid td{vertical-align:middle}.adminhtml-export-index .grid .input-text-range{margin:0 10px 0 5px;width:37%}.adminhtml-export-index .grid .input-text-range-date{margin:0 5px;width:32%}.adminhtml-export-index .ui-datepicker-trigger{display:inline-block;margin:-3px 10px 0 0;vertical-align:middle}.adminhtml-notification-index .grid .col-select,.adminhtml-cache-index .grid .col-select,.adminhtml-process-list .grid .col-select,.indexer-indexer-list .grid .col-select{width:10px}@font-face{font-family:'icons-blank-theme';src:url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff2') format('woff2'),url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff') format('woff');font-weight:400;font-style:normal}@font-face{font-family:'icons-blank-theme';src:url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff2') format('woff2'),url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff') format('woff');font-weight:400;font-style:normal}.navigation{background-color:#676056;position:relative;z-index:5}.navigation .level-0.reverse>.submenu{right:1px}.navigation>ul{position:relative;text-align:right}.navigation .level-0>.submenu{display:none;position:absolute;top:100%;padding:19px 13px}.navigation .level-0>.submenu a{display:block;color:#676056;font-size:13px;font-weight:400;line-height:1.385;padding:3px 12px 3px;text-decoration:none}.navigation .level-0>.submenu a:focus,.navigation .level-0>.submenu a:hover{text-decoration:underline}.navigation .level-0>.submenu a:hover{color:#fff;background:#989287;text-decoration:none}.navigation .level-0>.submenu li{margin-bottom:1px}.navigation .level-0>.submenu a[href="#"]{cursor:default;display:block;color:#676056;font-size:14px;font-weight:700;line-height:1;margin:7px 0 6px;padding:0 12px}.navigation .level-0>.submenu a[href="#"]:focus,.navigation .level-0>.submenu a[href="#"]:hover{color:#676056;font-size:14px;font-weight:700;background:0 0;text-decoration:none}.navigation .level-0{display:inline-block;float:left;text-align:left;transition:display .15s ease-out}.navigation .level-0>a{background:0 0;display:block;padding:12px 13px 0;color:#f2ebde;font-size:13px;font-weight:600;text-transform:uppercase;text-decoration:none;transition:background .15s ease-out}.navigation .level-0>a:after{content:"";display:block;margin-top:10px;height:3px;font-size:0}.navigation .level-0.active>a{font-weight:700}.navigation .level-0.active>a:after{background:#ef672f}.navigation .level-0.hover.recent>a{background:#fff;color:#676056;font-size:13px;font-weight:600}.navigation .level-0.hover.recent>a:after{background:0 0}.navigation .level-0.hover.recent.active>a{font-weight:700}.navigation .level-0>.submenu{opacity:0;visibility:hidden}.navigation .level-0.recent.hover>.submenu{opacity:1;visibility:visible}.no-js .navigation .level-0:hover>.submenu,.no-js .navigation .level-0.hover>.submenu,.no-js .navigation .level-0>a:focus+.submenu{display:block}.navigation .level-0>.submenu{background:#fff;box-shadow:0 3px 3px rgba(50,50,50,.15)}.navigation .level-0>.submenu li{max-width:200px}.navigation .level-0>.submenu>ul{white-space:nowrap}.navigation .level-0>.submenu .column{display:inline-block;margin-left:40px;vertical-align:top}.navigation .level-0>.submenu .column:first-child{margin-left:0}.navigation .level-0 .submenu .level-1{white-space:normal}.navigation .level-0.parent .submenu .level-1.parent{margin:17px 0 25px}.navigation .level-0.parent .level-1.parent:first-child{margin-top:0}.navigation .level-2 .submenu{margin-left:7px}.navigation .level-0>.submenu .level-2>a[href="#"]{font-size:13px;margin-top:10px;margin-left:7px}.navigation .level-2>.submenu a{font-size:12px;line-height:1.231}.navigation .level-0>.submenu .level-3>a[href="#"],.navigation .level-3 .submenu{margin-left:15px}.navigation .level-0.item-system,.navigation .level-0.item-stores{float:none}.navigation .level-0.item-system>.submenu,.navigation .level-0.item-stores>.submenu{left:auto;right:1px}.adminhtml-dashboard-index .col-1-layout{max-width:1300px;border:none;border-radius:0;padding:0;background:#f7f3eb}.dashboard-inner{padding-top:35px}.dashboard-inner:before,.dashboard-inner:after{content:"";display:table}.dashboard-inner:after{clear:both}.dashboard-inner:before,.dashboard-inner:after{content:"";display:table}.dashboard-inner:after{clear:both}.dashboard-secondary{float:left;width:32%;margin:0 1.5%}.dashboard-main{float:right;width:65%}.dashboard-diagram-chart{max-width:100%;height:auto}.dashboard-diagram-nodata,.dashboard-diagram-switcher{padding:20px 0}.dashboard-diagram-image{background:#fff url(../mui/images/ajax-loader-small.gif) no-repeat 50% 50%}.dashboard-container .ui-tabs-panel{background-color:#fff;min-height:40px;padding:15px}.dashboard-store-stats{margin-top:35px}.dashboard-store-stats .ui-tabs-panel{background:#fff url(../mui/images/ajax-loader-small.gif) no-repeat 50% 50%}.dashboard-item{margin-bottom:30px}.dashboard-item-header{margin-left:5px}.dashboard-item.dashboard-item-primary{margin-bottom:35px}.dashboard-item.dashboard-item-primary .title{font-size:22px;margin-bottom:5px}.dashboard-item.dashboard-item-primary .dashboard-sales-value{display:block;text-align:right;font-weight:600;font-size:30px;margin-right:12px;padding-bottom:5px}.dashboard-item.dashboard-item-primary:first-child{color:#ef672f}.dashboard-item.dashboard-item-primary:first-child .title{color:#ef672f}.dashboard-totals{background:#fff;padding:50px 15px 25px}.dashboard-totals-list{margin:0;padding:0;list-style:none none}.dashboard-totals-list:before,.dashboard-totals-list:after{content:"";display:table}.dashboard-totals-list:after{clear:both}.dashboard-totals-list:before,.dashboard-totals-list:after{content:"";display:table}.dashboard-totals-list:after{clear:both}.dashboard-totals-item{float:left;width:18%;margin-left:7%;padding-top:15px;border-top:2px solid #cac3b4}.dashboard-totals-item:first-child{margin-left:0}.dashboard-totals-label{display:block;font-size:16px;font-weight:600;padding-bottom:2px}.dashboard-totals-value{color:#ef672f;font-size:20px}.dashboard-data{width:100%}.dashboard-data thead{background:0 0}.dashboard-data thead tr{background:0 0}.dashboard-data th,.dashboard-data td{border:none;padding:10px 12px;text-align:right}.dashboard-data th:first-child,.dashboard-data td:first-child{text-align:left}.dashboard-data th{color:#676056;font-weight:600}.dashboard-data td{background-color:transparent}.dashboard-data tbody tr:hover td{background-color:transparent}.dashboard-data tbody tr:nth-child(odd) td,.dashboard-data tbody tr:nth-child(odd):hover td,.dashboard-data tbody tr:nth-child(odd) th,.dashboard-data tbody tr:nth-child(odd):hover th{background-color:#e1dbcf}.ui-tabs-panel .dashboard-data tbody tr:nth-child(odd) td,.ui-tabs-panel .dashboard-data tbody tr:nth-child(odd):hover td,.ui-tabs-panel .dashboard-data tbody tr:nth-child(odd) th,.ui-tabs-panel .dashboard-data tbody tr:nth-child(odd):hover th{background-color:#f7f3eb}.dashboard-data td.empty-text{text-align:center}.ui-tabs-panel .dashboard-data{background-color:#fff}.mage-dropdown-dialog.ui-dialog .ui-dialog-content{overflow:visible}.mage-dropdown-dialog.ui-dialog .ui-dialog-buttonpane{padding:0}.message-system-inner{background:#f7f3eb;border:1px solid #c0bbaf;border-top:0;border-radius:0 0 5px 5px;float:right;overflow:hidden}.message-system-unread .message-system-inner{float:none}.message-system-list{margin:0;padding:0;list-style:none;float:left}.message-system .message-system-list{width:75%}.message-system-list li{padding:5px 13px 7px 36px;position:relative}.message-system-short{padding:5px 13px 7px;float:right}.message-system-short span{display:inline-block;margin-left:7px;border-left:1px #d1ccc3 solid}.message-system-short span:first-child{border:0;margin-left:0}.message-system-short a{padding-left:27px;position:relative;height:16px}.message-system .message-system-short a:before,.message-system-list li:before{font-family:'MUI-Icons';font-style:normal;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;height:16px;width:16px;font-size:16px;line-height:16px;text-align:center;position:absolute;left:7px;top:2px}.message-system-list li:before{top:5px;left:13px}.message-system .message-system-short .warning a:before,.message-system-list li.warning:before{content:"\e006";color:#f2a825}.message-system .message-system-short .error a:before,.message-system-list li.error:before{content:"\e086";font-family:'MUI-Icons';color:#c00815}.ui-dialog .message-system-list{margin-bottom:25px}.sales-order-create-index .order-errors .notice{color:#ed4f2e;font-size:11px;margin:5px 0 0}.order-errors .fieldset-wrapper-title .title{box-sizing:border-box;background:#fffbf0;border:1px solid #d87e34;border-radius:5px;color:#676056;font-size:14px;margin:20px 0;padding:10px 26px 10px 35px;position:relative}.order-errors .fieldset-wrapper-title .title:before{position:absolute;left:11px;top:50%;margin-top:-11px;width:auto;height:auto;font-family:'MUI-Icons';font-style:normal;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;font-size:16px;line-height:inherit;content:'\e046';color:#d87e34}.search-global.miniform{position:relative;z-index:1000;display:inline-block;vertical-align:top;margin:6px 10px 0}.search-global.miniform .mage-suggest{border:0;border-radius:0}.search-global-actions{display:none}.search-global-field{margin:0}.search-global-field .label{position:absolute;right:4px;z-index:2;cursor:pointer;display:inline-block;text-decoration:none}.search-global-field .label>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.search-global-field .label>span.focusable:active,.search-global-field .label>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.search-global-field .label>span.focusable:active,.search-global-field .label>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.search-global-field .label:before{font-family:'MUI-Icons';content:"\e01f";font-size:18px;line-height:29px;color:#cac3b4;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.search-global-field .control{width:48px;overflow:hidden;opacity:0;transition:all .3s ease}.search-global-field .control input[type=text]{background:0 0;border:none;width:100%}.search-global-field.active{z-index:2}.search-global-field.active .label:before{display:none}.search-global-field.active .control{overflow:visible;opacity:1;transition:all .3s ease;width:300px}.search-global-menu{box-sizing:border-box;display:block;width:100%}.notifications-summary{display:inline-block;text-align:left;position:relative;z-index:1}.notifications-summary.active{z-index:999}.notifications-action{color:#f2ebde;padding:12px 22px 11px;text-transform:capitalize;display:inline-block;text-decoration:none}.notifications-action:before{font-family:"MUI-Icons";content:"\e06e";font-size:18px;line-height:18px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.notifications-action:visited,.notifications-action:focus,.notifications-action:active,.notifications-action:hover{color:#f2ebde;text-decoration:none}.notifications-action.active{background-color:#fff;color:#676056}.notifications-action .text{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.notifications-action .text.focusable:active,.notifications-action .text.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.notifications-action .text.focusable:active,.notifications-action .text.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.notifications-action .qty.counter{display:inline-block;background:#ed4f2e;color:#f2ebde;font-size:12px;line-height:12px;font-weight:700;padding:1px 3px;position:absolute;top:6px;left:50%;border-radius:4px}.notifications-list{width:300px;padding:0;margin:0}.notifications-list .last{padding:10px;text-align:center;font-size:12px}.notifications-summary .notifications-entry{padding:15px;color:#676056;font-size:11px;font-weight:400}.notifications-entry{position:relative;z-index:1}.notifications-entry:hover .action{display:block}.notifications-entry-title{padding-right:15px;color:#ed4f2e;font-size:12px;font-weight:600;display:block;margin-bottom:10px}.notifications-entry-description{line-height:1.3;display:block;max-height:3.9em;overflow:hidden;margin-bottom:10px;text-overflow:ellipsis}.notifications-close.action{position:absolute;z-index:1;top:12px;right:12px;display:inline-block;background-image:none;background:0 0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;display:none}.notifications-close.action>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.notifications-close.action>span.focusable:active,.notifications-close.action>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.notifications-close.action>span.focusable:active,.notifications-close.action>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.notifications-close.action:before{font-family:'MUI-Icons';content:"\e07f";font-size:16px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.notifications-close.action:focus,.notifications-close.action:active{background:0 0;border:none}.notifications-close.action:hover{background:0 0;border:none}.notifications-close.action.disabled,.notifications-close.action[disabled],fieldset[disabled] .notifications-close.action{cursor:not-allowed;pointer-events:none;opacity:.5}.notifications-dialog-content{display:none}.notifications-critical .notifications-entry-title{padding-left:25px;display:inline-block;text-decoration:none}.notifications-critical .notifications-entry-title:before{font-family:'MUI-Icons';content:"\e086";font-size:18px;line-height:18px;color:#c00815;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.notifications-critical .notifications-entry-title:before{position:absolute;margin-left:-25px}.notifications-dialog-content .notifications-entry-time{color:#8c867e;font-size:13px;font-family:Helvetica,Arial,sans-serif;position:absolute;right:17px;bottom:27px;text-align:right}.notifications-url{display:inline-block;text-decoration:none}.notifications-url>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.notifications-url>span.focusable:active,.notifications-url>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.notifications-url>span.focusable:active,.notifications-url>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.notifications-url:after{font-family:'MUI-Icons';content:"\e084";font-size:16px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center;margin:-2px 0 0 10px}.notifications-dialog-content .notifications-entry-title{font-size:15px}.locale-switcher-field{white-space:nowrap;float:left}.locale-switcher-field .control,.locale-switcher-field .label{vertical-align:middle;margin:0 10px 0 0;display:inline-block}.locale-switcher-select{-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;border:1px solid #ada89e;max-width:200px;height:31px;background:url("../images/select-bg.svg") no-repeat 100% 50%;background-size:30px 60px;padding-right:29px;text-indent:.01px;text-overflow:''}.locale-switcher-select::-ms-expand{display:none}.lt-ie10 .locale-switcher-select{background-image:none;padding-right:4px}@-moz-document url-prefix(){.locale-switcher-select{background-image:none}}@-moz-document url-prefix(){.locale-switcher-select{background-image:none}}.mage-suggest{text-align:left;box-sizing:border-box;position:relative;display:inline-block;vertical-align:top;width:100%;background-color:#fff;border:1px solid #ada89e;border-radius:2px}.mage-suggest:after{position:absolute;top:3px;right:3px;bottom:0;width:22px;text-align:center;font-family:'MUI-Icons';font-style:normal;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;content:'\e01f';font-size:18px;color:#b2b2b2}.mage-suggest input[type=search],.mage-suggest input.search{width:100%;border:none;background:0 0;padding-right:30px}.mage-suggest.category-select input[type=search],.mage-suggest.category-select input.search{height:26px}.mage-suggest-dropdown{position:absolute;left:0;right:0;top:100%;margin:1px -1px 0;border:1px solid #cac2b5;background:#fff;box-shadow:0 2px 4px rgba(0,0,0,.2);z-index:990}.mage-suggest-dropdown ul{margin:0;padding:0;list-style:none}.mage-suggest-dropdown li{border-bottom:1px solid #e5e5e5;padding:0}.mage-suggest-dropdown li a{display:block}.mage-suggest-dropdown li a.ui-state-focus{background:#f5f5f5}.mage-suggest-dropdown li a,.mage-suggest-dropdown .jstree li a:hover,.mage-suggest-dropdown .jstree .jstree-hovered,.mage-suggest-dropdown .jstree .jstree-clicked{padding:6px 12px 5px;text-decoration:none;color:#333}.mage-suggest-dropdown .jstree li a:hover,.mage-suggest-dropdown .jstree .jstree-hovered,.mage-suggest-dropdown .jstree .jstree-clicked{border:none}.mage-suggest-dropdown .jstree li{border-bottom:0}.mage-suggest-dropdown .jstree li a{display:inline-block}.mage-suggest-dropdown .jstree .mage-suggest-selected>a{color:#000;background:#f1ffeb}.field-category_ids .mage-suggest-dropdown,.field-new_category_parent .mage-suggest-dropdown{max-height:200px;overflow:auto}.mage-suggest-dropdown .jstree .mage-suggest-selected>a:hover,.mage-suggest-dropdown .jstree .mage-suggest-selected>.jstree-hovered,.mage-suggest-dropdown .jstree .mage-suggest-selected>.jstree-clicked,.mage-suggest-dropdown .jstree .mage-suggest-selected.mage-suggest-not-active>.jstree-hovered,.mage-suggest-dropdown .jstree .mage-suggest-selected.mage-suggest-not-active>.jstree-clicked{background:#e5ffd9}.mage-suggest-dropdown .jstree .mage-suggest-not-active>a{color:#d4d4d4}.mage-suggest-dropdown .jstree .mage-suggest-not-active>a:hover,.mage-suggest-dropdown .jstree .mage-suggest-not-active>.jstree-hovered,.mage-suggest-dropdown .jstree .mage-suggest-not-active>.jstree-clicked{background:#f5f5f5}.mage-suggest-dropdown .category-path{font-size:11px;margin-left:10px;color:#9ba8b5}.suggest-expandable .action-dropdown .action-toggle{display:inline-block;max-width:500px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;background:0 0;border:none;box-shadow:none;color:#676056;font-size:12px;padding:5px 4px;filter:none}.suggest-expandable .action-dropdown .action-toggle span{display:inline}.suggest-expandable .action-dropdown .action-toggle:before{display:inline-block;float:right;margin-left:4px;font-size:13px;color:#b2b0ad}.suggest-expandable .action-dropdown .action-toggle:hover:before{color:#7e7e7e}.suggest-expandable .dropdown-menu{margin:1px 0 0;left:0;right:auto;width:245px;z-index:4}.suggest-expandable .mage-suggest{border:none;border-radius:3px 3px 0 0}.suggest-expandable .mage-suggest:after{top:10px;right:8px}.suggest-expandable .mage-suggest-inner .title{margin:0;padding:0 10px 4px;text-transform:uppercase;color:#a6a098;font-size:12px;border-bottom:1px solid #e5e5e5}.suggest-expandable .mage-suggest-inner>input[type=search],.suggest-expandable .mage-suggest-inner>input.search{position:relative;margin:6px 5px 5px;padding-right:20px;border:1px solid #ada89e;width:236px;z-index:1}.suggest-expandable .mage-suggest-inner>input.ui-autocomplete-loading,.suggest-expandable .mage-suggest-inner>input.mage-suggest-state-loading{background:#fff url("../mui/images/ajax-loader-small.gif") no-repeat 190px 50%}.suggest-expandable .mage-suggest-dropdown{margin-top:0;border-top:0;border-radius:0 0 3px 3px;max-height:300px;overflow:auto;width:100%;float:left}.suggest-expandable .mage-suggest-dropdown ul{margin:0;padding:0;list-style:none}.suggest-expandable .action-show-all:hover,.suggest-expandable .action-show-all:active,.suggest-expandable .action-show-all:focus,.suggest-expandable .action-show-all[disabled]{border-top:1px solid #e5e5e5;display:block;width:100%;padding:8px 10px 10px;text-align:left;font:12px/1.333 Arial,Verdana,sans-serif;color:#676056}.product-actions .suggest-expandable{max-width:500px;float:left;margin-top:1px}.page-actions.fixed #product-template-suggest-container{display:none}.catalog-category-edit .col-2-left-layout:before{display:none}.category-content .ui-tabs-panel .fieldset{padding-top:40px}.category-content .ui-tabs-panel .fieldset .legend{display:none}.attributes-edit-form .field:not(.field-weight) .addon{display:block;position:relative}.attributes-edit-form .field:not(.field-weight) .addon input[type=text]{border-width:1px}.attributes-edit-form .field:not(.field-weight) .addon .addafter{display:block;border:0;height:auto;width:auto}.attributes-edit-form .field:not(.field-weight) .addon input:focus~.addafter{box-shadow:none}.attributes-edit-form .with-addon .textarea{margin:0}.attributes-edit-form .attribute-change-checkbox{display:block;margin-top:5px}.attributes-edit-form .attribute-change-checkbox .label{float:none;padding:0;width:auto}.attributes-edit-form .attribute-change-checkbox .checkbox{margin-right:5px;width:auto}.attributes-edit-form .field-price .addon>input,.attributes-edit-form .field-special_price .addon>input,.attributes-edit-form .field-gift_wrapping_price .addon>input,.attributes-edit-form .field-msrp .addon>input,.attributes-edit-form .field-gift_wrapping_price .addon>input{padding-left:23px}.attributes-edit-form .field-price .addafter>strong,.attributes-edit-form .field-special_price .addafter>strong,.attributes-edit-form .field-gift_wrapping_price .addafter>strong,.attributes-edit-form .field-msrp .addafter>strong,.attributes-edit-form .field-gift_wrapping_price .addafter>strong{left:5px;position:absolute;top:3px}.attributes-edit-form .field.type-price input:focus+label,.attributes-edit-form .field-price input:focus+label,.attributes-edit-form .field-special_price input:focus+label,.attributes-edit-form .field-msrp input:focus+label,.attributes-edit-form .field-weight input:focus+label{box-shadow:none}.attributes-edit-form .field-special_from_date>.control .input-text,.attributes-edit-form .field-special_to_date>.control .input-text,.attributes-edit-form .field-news_from_date>.control .input-text,.attributes-edit-form .field-news_to_date>.control .input-text,.attributes-edit-form .field-custom_design_from>.control .input-text,.attributes-edit-form .field-custom_design_to>.control .input-text{border-width:1px;width:130px}.attributes-edit-form .field-weight .fields-group-2 .control{padding-right:27px}.attributes-edit-form .field-weight .fields-group-2 .control .addafter+.addafter{border-width:1px 1px 1px 0;border-style:solid;height:28px;right:0;position:absolute;top:0}.attributes-edit-form .field-weight .fields-group-2 .control .addafter strong{line-height:28px}.attributes-edit-form .field-weight .fields-group-2 .control>input:focus+.addafter+.addafter{box-shadow:0 0 8px rgba(82,168,236,.6)}.attributes-edit-form .field-gift_message_available .addon>input[type=checkbox],.attributes-edit-form .field-gift_wrapping_available .addon>input[type=checkbox]{width:auto;margin-right:5px}.attributes-edit-form .fieldset>.addafter{display:none}.advanced-inventory-edit .field.choice{display:block;margin:3px 0 0}.advanced-inventory-edit .field.choice .label{padding-top:1px}.product-actions:before,.product-actions:after{content:"";display:table}.product-actions:after{clear:both}.product-actions:before,.product-actions:after{content:"";display:table}.product-actions:after{clear:both}.product-actions .switcher{float:right}#configurable-attributes-container .actions-select{display:inline-block;position:relative}#configurable-attributes-container .actions-select:before,#configurable-attributes-container .actions-select:after{content:"";display:table}#configurable-attributes-container .actions-select:after{clear:both}#configurable-attributes-container .actions-select:before,#configurable-attributes-container .actions-select:after{content:"";display:table}#configurable-attributes-container .actions-select:after{clear:both}#configurable-attributes-container .actions-select .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}#configurable-attributes-container .actions-select .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}#configurable-attributes-container .actions-select .action.toggle:hover:after{color:inherit}#configurable-attributes-container .actions-select .action.toggle:active:after{color:inherit}#configurable-attributes-container .actions-select .action.toggle.active{display:inline-block;text-decoration:none}#configurable-attributes-container .actions-select .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}#configurable-attributes-container .actions-select .action.toggle.active:hover:after{color:inherit}#configurable-attributes-container .actions-select .action.toggle.active:active:after{color:inherit}#configurable-attributes-container .actions-select ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}#configurable-attributes-container .actions-select ul.dropdown li{margin:0;padding:3px 5px}#configurable-attributes-container .actions-select ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}#configurable-attributes-container .actions-select.active{overflow:visible}#configurable-attributes-container .actions-select.active ul.dropdown{display:block}#configurable-attributes-container .actions-select .action.toggle{padding:1px 8px;border:1px solid #ada89e;background:#fff;border-radius:0 2px 2px 0}#configurable-attributes-container .actions-select .action.toggle:after{width:14px;text-indent:-2px}#configurable-attributes-container .actions-select ul.dropdown li:hover{background:#eef8fc}#configurable-attributes-container .actions-select ul.dropdown a{color:#333;text-decoration:none}#product-variations-matrix .actions-image-uploader{display:inline-block;position:relative;display:block;width:50px}#product-variations-matrix .actions-image-uploader:before,#product-variations-matrix .actions-image-uploader:after{content:"";display:table}#product-variations-matrix .actions-image-uploader:after{clear:both}#product-variations-matrix .actions-image-uploader:before,#product-variations-matrix .actions-image-uploader:after{content:"";display:table}#product-variations-matrix .actions-image-uploader:after{clear:both}#product-variations-matrix .actions-image-uploader .action.split{float:left;margin:0}#product-variations-matrix .actions-image-uploader .action.toggle{float:right;margin:0}#product-variations-matrix .actions-image-uploader .action.toggle{padding:6px 5px;display:inline-block;text-decoration:none}#product-variations-matrix .actions-image-uploader .action.toggle>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}#product-variations-matrix .actions-image-uploader .action.toggle>span.focusable:active,#product-variations-matrix .actions-image-uploader .action.toggle>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}#product-variations-matrix .actions-image-uploader .action.toggle>span.focusable:active,#product-variations-matrix .actions-image-uploader .action.toggle>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}#product-variations-matrix .actions-image-uploader .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:14px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}#product-variations-matrix .actions-image-uploader .action.toggle:hover:after{color:inherit}#product-variations-matrix .actions-image-uploader .action.toggle:active:after{color:inherit}#product-variations-matrix .actions-image-uploader .action.toggle.active{display:inline-block;text-decoration:none}#product-variations-matrix .actions-image-uploader .action.toggle.active>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}#product-variations-matrix .actions-image-uploader .action.toggle.active>span.focusable:active,#product-variations-matrix .actions-image-uploader .action.toggle.active>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}#product-variations-matrix .actions-image-uploader .action.toggle.active>span.focusable:active,#product-variations-matrix .actions-image-uploader .action.toggle.active>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}#product-variations-matrix .actions-image-uploader .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:14px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}#product-variations-matrix .actions-image-uploader .action.toggle.active:hover:after{color:inherit}#product-variations-matrix .actions-image-uploader .action.toggle.active:active:after{color:inherit}#product-variations-matrix .actions-image-uploader ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}#product-variations-matrix .actions-image-uploader ul.dropdown li{margin:0;padding:3px 5px}#product-variations-matrix .actions-image-uploader ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}#product-variations-matrix .actions-image-uploader.active{overflow:visible}#product-variations-matrix .actions-image-uploader.active ul.dropdown{display:block}#product-variations-matrix .actions-image-uploader .action.toggle{padding:0 2px;border:1px solid #b7b2a7;background:#fff;border-radius:0 4px 4px 0;border-left:none;height:33px}#product-variations-matrix .actions-image-uploader .action.toggle.no-display{display:none}#product-variations-matrix .actions-image-uploader .action.toggle:after{width:12px;text-indent:-5px}#product-variations-matrix .actions-image-uploader ul.dropdown{left:0;margin-left:0;width:100px}#product-variations-matrix .actions-image-uploader ul.dropdown li:hover{background:#eef8fc}#product-variations-matrix .actions-image-uploader ul.dropdown a{color:#333;text-decoration:none}.debugging-hints .page-actions{position:relative;z-index:1}.debugging-hints .page-actions .debugging-hint-template-file{left:auto !important;right:0 !important}.filter-segments{list-style:none;padding:0}.adminhtml-report-customer-test-detail .col-id{width:35px}.adminhtml-report-customer-test-detail .col-period{white-space:nowrap;width:70px}.adminhtml-report-customer-test-detail .col-zip{width:50px}.adminhtml-report-customer-test-segment .col-id{width:35px}.adminhtml-report-customer-test-segment .col-status{width:65px}.adminhtml-report-customer-test-segment .col-qty{width:145px}.adminhtml-report-customer-test-segment .col-segment,.adminhtml-report-customer-test-segment .col-website{width:35%}.adminhtml-report-customer-test-segment .col-select{width:45px}.test-custom-attributes{margin-bottom:20px}.adminhtml-test-index th.col-id{text-align:left}.adminhtml-test-index .col-price{text-align:right;width:50px}.adminhtml-test-index .col-actions{width:50px}.adminhtml-test-index .col-select{width:60px}.adminhtml-test-edit .field-image .control{line-height:28px}.adminhtml-test-edit .field-image a{display:inline-block;margin:0 5px 0 0}.adminhtml-test-edit .field-image img{vertical-align:middle}.adminhtml-test-new .field-image .input-file,.adminhtml-test-edit .field-image .input-file{display:inline-block;margin:0 15px 0 0;width:auto}.adminhtml-test-new .field-image .addafter,.adminhtml-test-edit .field-image .addafter{border:0;box-shadow:none;display:inline-block;margin:0 15px 0 0;height:auto;width:auto}.adminhtml-test-new .field-image .delete-image,.adminhtml-test-edit .field-image .delete-image{display:inline-block;white-space:nowrap}.adminhtml-test-edit .field-image .delete-image input{margin:-3px 5px 0 0;width:auto;display:inline-block}.adminhtml-test-edit .field-image .addon .delete-image input:focus+label{border:0;box-shadow:none}.adminhtml-test-index .col-id{width:35px}.adminhtml-test-index .col-status{white-space:normal;width:75px}.adminhtml-test-index .col-websites{white-space:nowrap;width:200px}.adminhtml-test-index .col-price .label{display:inline-block;min-width:60px;white-space:nowrap}.adminhtml-test-index .col-price .price-excl-tax .price,.adminhtml-test-index .col-price .price-incl-tax .price{font-weight:700}.invitee_information,.inviter_information{width:48.9362%}.invitee_information{float:left}.inviter_information{float:right}.test_information .data-table th,.invitee_information .data-table th,.inviter_information .data-table th{width:20%;white-space:nowrap}.test_information .data-table textarea,.test_information .data-table input{width:100%}.tests-history ul{margin:0;padding-left:25px}.tests-history ul .status:before{display:inline-block;content:"|";margin:0 10px}.adminhtml-report-test-order .col-period{white-space:nowrap;width:70px}.adminhtml-report-test-order .col-inv-sent,.adminhtml-report-test-order .col-inv-acc,.adminhtml-report-test-order .col-acc,.adminhtml-report-test-order .col-rate{text-align:right;width:23%}.adminhtml-report-test-customer .col-id{width:35px}.adminhtml-report-test-customer .col-period{white-space:nowrap;width:70px}.adminhtml-report-test-customer .col-inv-sent,.adminhtml-report-test-customer .col-inv-acc{text-align:right;width:120px}.adminhtml-report-test-index .col-period{white-space:nowrap}.adminhtml-report-test-index .col-inv-sent,.adminhtml-report-test-index .col-inv-acc,.adminhtml-report-test-index .col-inv-disc,.adminhtml-report-test-index .col-inv-acc-rate,.adminhtml-report-test-index .col-inv-disc-rate{text-align:right;width:19%}.test_information .data-table,.invitee_information .data-table,.inviter_information .data-table{width:100%}.test_information .data-table tbody tr th,.invitee_information .data-table tbody tr th,.inviter_information .data-table tbody tr th{font-weight:700}.test_information .data-table tbody tr td,.test_information .data-table tbody tr th,.invitee_information .data-table tbody tr td,.invitee_information .data-table tbody tr th,.inviter_information .data-table tbody tr td,.inviter_information .data-table tbody tr th{background-color:#fff;border:0;padding:9px 10px 10px;color:#666;vertical-align:top}.test_information .data-table tbody tr:nth-child(2n+1) td,.test_information .data-table tbody tr:nth-child(2n+1) th,.invitee_information .data-table tbody tr:nth-child(2n+1) td,.invitee_information .data-table tbody tr:nth-child(2n+1) th,.inviter_information .data-table tbody tr:nth-child(2n+1) td,.inviter_information .data-table tbody tr:nth-child(2n+1) th{background-color:#fbfaf6}[class^=" adminhtml-test-"] .fieldset-wrapper-content .data-table .col-sort-order{width:80px}[class^=" adminhtml-test-"] .fieldset-wrapper-content .data-table td,[class^=" adminhtml-test-"] .fieldset-wrapper-content .accordion .config .data-table td{vertical-align:top}[class^=" adminhtml-test-"] .fieldset-wrapper-content .data-table td select,[class^=" adminhtml-test-"] .fieldset-wrapper-content .accordion .config .data-table td select{display:block;width:100%}[class^=" adminhtml-test-"] .fieldset-wrapper-content .data-table td .input-radio.global-scope,[class^=" adminhtml-test-"] .fieldset-wrapper-content .accordion .config .data-table td .input-radio.global-scope{margin-top:9px}.sales-order-create-index .ui-dialog .content>.test .field.text .input-text{width:100%}.sales-order-create-index .ui-dialog .content>.test .note .price{font-weight:600}.sales-order-create-index .ui-dialog .content>.test .note .price:before{content:": "}.sales-order-create-index .ui-dialog .content>.test .fixed.amount .label:after{content:": "}.sales-order-create-index .ui-dialog .content>.test .fixed.amount .control{display:inline-block;font-weight:600}.sales-order-create-index .ui-dialog .content>.test .fixed.amount .control .control-value{margin:-2px 0 0;padding:0}.eq-ie9 [class^=" adminhtml-test-"] .custom-options .data-table{word-wrap:normal;table-layout:auto}.rma-items .col-actions a.disabled,.newRma .col-actions a.disabled{cursor:default;opacity:.5}.rma-items .col-actions a.disabled:hover,.newRma .col-actions a.disabled:hover{text-decoration:none}.block.mselect-list .mselect-input{width:100%}.block.mselect-list .mselect-input-container .mselect-save{top:4px}.block.mselect-list .mselect-input-container .mselect-cancel{top:4px}html{font-size:62.5%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;font-size-adjust:100%}body,html{height:100%;min-height:100%}body{color:#676056;font-family:'Open Sans',sans-serif;line-height:1.33;font-weight:400;font-size:1.4rem;background:#f2ebde;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}body>*{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-shrink:0;flex-shrink:0;-webkit-flex-basis:auto;flex-basis:auto}.page-wrapper{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;min-height:100%;width:100%;max-width:100%;min-width:990px}.page-wrapper>*{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-shrink:0;flex-shrink:0;-webkit-flex-basis:auto;flex-basis:auto}.page-header{text-align:right}.page-header-wrapper{background-color:#31302b}.page-header:after{content:"";display:table;clear:both}.page-header .logo{margin-top:5px;float:left;text-decoration:none;display:inline-block}.page-header .logo:before{content:"";display:inline-block;vertical-align:middle;width:109px;height:35px;background-image:url("../images/logo.svg");background-size:109px 70px;background-repeat:no-repeat}.page-header .logo:after{display:inline-block;vertical-align:middle;margin-left:10px;content:attr(data-edition);font-weight:600;font-size:16px;color:#ef672f;margin-top:-2px}.page-header .logo span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.page-header .logo span.focusable:active,.page-header .logo span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.page-header .logo span.focusable:active,.page-header .logo span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.page-header .dropdown-menu{border:0}.admin-user{display:inline-block;vertical-align:top;position:relative;text-align:left}.admin-user-account{text-decoration:none;display:inline-block;padding:12px 14px;color:#f2ebde}.admin-user-account:after{font-family:"MUI-Icons";content:"\e02c";font-size:13px;line-height:13px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center;margin:-3px 0 0}.admin-user-account:link,.admin-user-account:visited{color:#f2ebde}.admin-user-account:focus,.admin-user-account:active,.admin-user-account:hover{color:#f2ebde;text-decoration:none}.active .admin-user-account{background-color:#fff;color:#676056}.admin-user-menu{padding:15px;white-space:nowrap;margin-top:0}.admin-user-menu li{border:0;padding:0}.admin-user-menu li:hover{background:0 0}.admin-user-menu a{display:block;color:#676056;font-size:13px;font-weight:400;line-height:1.385;padding:3px 12px 3px;text-decoration:none}.admin-user-menu a:focus,.admin-user-menu a:hover{text-decoration:underline}.admin-user-menu a:hover{color:#fff;background:#989287;text-decoration:none}.admin-user-menu a span:before{content:"("}.admin-user-menu a span:after{content:")"}.page-actions.fixed .page-actions-buttons{padding-right:15px}.page-main-actions{background:#e0dace;color:#645d53;padding:15px;margin-left:auto;margin-right:auto;box-sizing:border-box}.page-main-actions:before,.page-main-actions:after{content:"";display:table}.page-main-actions:after{clear:both}.page-main-actions:before,.page-main-actions:after{content:"";display:table}.page-main-actions:after{clear:both}.page-main-actions .page-actions{float:right}.page-main-actions .page-actions .page-actions-buttons{float:right;display:-webkit-flex;display:-ms-flexbox;display:flex;justify-content:flex-end}.page-main-actions .page-actions button,.page-main-actions .page-actions .action-add.mselect-button-add{margin-left:13px}.page-main-actions .page-actions button.primary,.page-main-actions .page-actions .action-add.mselect-button-add.primary{float:right;-ms-flex-order:2;-webkit-order:2;order:2}.page-main-actions .page-actions button.save:not(.primary),.page-main-actions .page-actions .action-add.mselect-button-add.save:not(.primary){float:right;-ms-flex-order:1;-webkit-order:1;order:1}.page-main-actions .page-actions button.back,.page-main-actions .page-actions button.action-back,.page-main-actions .page-actions button.delete,.page-main-actions .page-actions .action-add.mselect-button-add.back,.page-main-actions .page-actions .action-add.mselect-button-add.action-back,.page-main-actions .page-actions .action-add.mselect-button-add.delete{background-image:none;background:0 0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;margin:0 13px}.page-main-actions .page-actions button.back:focus,.page-main-actions .page-actions button.action-back:focus,.page-main-actions .page-actions button.delete:focus,.page-main-actions .page-actions button.back:active,.page-main-actions .page-actions button.action-back:active,.page-main-actions .page-actions button.delete:active,.page-main-actions .page-actions .action-add.mselect-button-add.back:focus,.page-main-actions .page-actions .action-add.mselect-button-add.action-back:focus,.page-main-actions .page-actions .action-add.mselect-button-add.delete:focus,.page-main-actions .page-actions .action-add.mselect-button-add.back:active,.page-main-actions .page-actions .action-add.mselect-button-add.action-back:active,.page-main-actions .page-actions .action-add.mselect-button-add.delete:active{background:0 0;border:none}.page-main-actions .page-actions button.back:hover,.page-main-actions .page-actions button.action-back:hover,.page-main-actions .page-actions button.delete:hover,.page-main-actions .page-actions .action-add.mselect-button-add.back:hover,.page-main-actions .page-actions .action-add.mselect-button-add.action-back:hover,.page-main-actions .page-actions .action-add.mselect-button-add.delete:hover{background:0 0;border:none}.page-main-actions .page-actions button.back.disabled,.page-main-actions .page-actions button.action-back.disabled,.page-main-actions .page-actions button.delete.disabled,.page-main-actions .page-actions button.back[disabled],.page-main-actions .page-actions button.action-back[disabled],.page-main-actions .page-actions button.delete[disabled],fieldset[disabled] .page-main-actions .page-actions button.back,fieldset[disabled] .page-main-actions .page-actions button.action-back,fieldset[disabled] .page-main-actions .page-actions button.delete,.page-main-actions .page-actions .action-add.mselect-button-add.back.disabled,.page-main-actions .page-actions .action-add.mselect-button-add.action-back.disabled,.page-main-actions .page-actions .action-add.mselect-button-add.delete.disabled,.page-main-actions .page-actions .action-add.mselect-button-add.back[disabled],.page-main-actions .page-actions .action-add.mselect-button-add.action-back[disabled],.page-main-actions .page-actions .action-add.mselect-button-add.delete[disabled],fieldset[disabled] .page-main-actions .page-actions .action-add.mselect-button-add.back,fieldset[disabled] .page-main-actions .page-actions .action-add.mselect-button-add.action-back,fieldset[disabled] .page-main-actions .page-actions .action-add.mselect-button-add.delete{cursor:not-allowed;pointer-events:none;opacity:.5}.ie .page-main-actions .page-actions button.back,.ie .page-main-actions .page-actions button.action-back,.ie .page-main-actions .page-actions button.delete,.ie .page-main-actions .page-actions .action-add.mselect-button-add.back,.ie .page-main-actions .page-actions .action-add.mselect-button-add.action-back,.ie .page-main-actions .page-actions .action-add.mselect-button-add.delete{margin-top:6px}.page-main-actions .page-actions button.delete,.page-main-actions .page-actions .action-add.mselect-button-add.delete{color:#e22626;float:left;-ms-flex-order:-1;-webkit-order:-1;order:-1}.page-main-actions .page-actions button.back,.page-main-actions .page-actions button.action-back,.page-main-actions .page-actions .action-add.mselect-button-add.back,.page-main-actions .page-actions .action-add.mselect-button-add.action-back{float:left;-ms-flex-order:-1;-webkit-order:-1;order:-1;display:inline-block;text-decoration:none}.page-main-actions .page-actions button.back:before,.page-main-actions .page-actions button.action-back:before,.page-main-actions .page-actions .action-add.mselect-button-add.back:before,.page-main-actions .page-actions .action-add.mselect-button-add.action-back:before{font-family:'icons-blank-theme';content:'\e625';font-size:inherit;line-height:normal;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center;margin:0 2px 0 0}.page-main-actions .page-actions .actions-split{margin-left:13px;float:right;-ms-flex-order:2;-webkit-order:2;order:2}.page-main-actions .page-actions .actions-split button.primary,.page-main-actions .page-actions .actions-split .action-add.mselect-button-add.primary{float:left}.page-main-actions .page-actions .actions-split .dropdown-menu{text-align:left}.page-main-actions .page-actions .actions-split .dropdown-menu .item{display:block}.page-main-actions .page-actions.fixed{position:fixed;top:0;left:0;right:0;z-index:10;padding:0;background:-webkit-linear-gradient(top,#f5f2ed 0%,#f5f2ed 56%,rgba(245,242,237,0) 100%);background:-ms-linear-gradient(top,#f5f2ed 0%,#f5f2ed 56%,rgba(245,242,237,0) 100%);background:linear-gradient(to bottom,#f5f2ed 0%,#f5f2ed 56%,rgba(245,242,237,0) 100%);background:#e0dace}.page-main-actions .page-actions.fixed .page-actions-inner{position:relative;padding-top:15px;padding-bottom:15px;min-height:36px;text-align:right;box-sizing:border-box}.page-main-actions .page-actions.fixed .page-actions-inner:before,.page-main-actions .page-actions.fixed .page-actions-inner:after{content:"";display:table}.page-main-actions .page-actions.fixed .page-actions-inner:after{clear:both}.page-main-actions .page-actions.fixed .page-actions-inner:before,.page-main-actions .page-actions.fixed .page-actions-inner:after{content:"";display:table}.page-main-actions .page-actions.fixed .page-actions-inner:after{clear:both}.page-main-actions .page-actions.fixed .page-actions-inner:before{text-align:left;content:attr(data-title);float:left;font-size:20px;max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.lt-ie10 .page-main-actions .page-actions.fixed .page-actions-inner{background:#f5f2ed}.page-main-actions .store-switcher{margin-top:5px}.store-switcher{display:inline-block;font-size:13px}.store-switcher .label{margin-right:5px}.store-switcher .actions.dropdown{display:inline-block;position:relative}.store-switcher .actions.dropdown:before,.store-switcher .actions.dropdown:after{content:"";display:table}.store-switcher .actions.dropdown:after{clear:both}.store-switcher .actions.dropdown:before,.store-switcher .actions.dropdown:after{content:"";display:table}.store-switcher .actions.dropdown:after{clear:both}.store-switcher .actions.dropdown .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.store-switcher .actions.dropdown .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:20px;color:#645d53;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.store-switcher .actions.dropdown .action.toggle:hover:after{color:#645d53}.store-switcher .actions.dropdown .action.toggle:active:after{color:#645d53}.store-switcher .actions.dropdown .action.toggle.active{display:inline-block;text-decoration:none}.store-switcher .actions.dropdown .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:20px;color:#645d53;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.store-switcher .actions.dropdown .action.toggle.active:hover:after{color:#645d53}.store-switcher .actions.dropdown .action.toggle.active:active:after{color:#645d53}.store-switcher .actions.dropdown .dropdown-menu{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px #ada89e solid;position:absolute;z-index:100;top:100%;min-width:195px;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.store-switcher .actions.dropdown .dropdown-menu li{margin:0;padding:0}.store-switcher .actions.dropdown .dropdown-menu li:hover{background:0 0;cursor:pointer}.store-switcher .actions.dropdown.active{overflow:visible}.store-switcher .actions.dropdown.active .dropdown-menu{display:block}.store-switcher .actions.dropdown .action.toggle{background-image:none;background:0 0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;color:#026294;line-height:normal;margin-top:2px;vertical-align:middle}.store-switcher .actions.dropdown .action.toggle:focus,.store-switcher .actions.dropdown .action.toggle:active{background:0 0;border:none}.store-switcher .actions.dropdown .action.toggle:hover{background:0 0;border:none}.store-switcher .actions.dropdown .action.toggle.disabled,.store-switcher .actions.dropdown .action.toggle[disabled],fieldset[disabled] .store-switcher .actions.dropdown .action.toggle{cursor:not-allowed;pointer-events:none;opacity:.5}.store-switcher .actions.dropdown ul.dropdown-menu{margin-top:4px;padding-top:5px;left:0}.store-switcher .actions.dropdown ul.dropdown-menu li{border:0;cursor:default}.store-switcher .actions.dropdown ul.dropdown-menu li:hover{cursor:default}.store-switcher .actions.dropdown ul.dropdown-menu li a,.store-switcher .actions.dropdown ul.dropdown-menu li span{padding:5px 13px;display:block;color:#645d53}.store-switcher .actions.dropdown ul.dropdown-menu li a{text-decoration:none}.store-switcher .actions.dropdown ul.dropdown-menu li a:hover{background:#edf9fb}.store-switcher .actions.dropdown ul.dropdown-menu li span{color:#ababab;cursor:default}.store-switcher .actions.dropdown ul.dropdown-menu li.current span{color:#645d53;background:#eee}.store-switcher .actions.dropdown ul.dropdown-menu .store-switcher-store a,.store-switcher .actions.dropdown ul.dropdown-menu .store-switcher-store span{padding-left:26px}.store-switcher .actions.dropdown ul.dropdown-menu .store-switcher-store-view a,.store-switcher .actions.dropdown ul.dropdown-menu .store-switcher-store-view span{padding-left:39px}.store-switcher .actions.dropdown ul.dropdown-menu .dropdown-toolbar{border-top:1px #ededed solid;margin-top:10px}.store-switcher .actions.dropdown ul.dropdown-menu .dropdown-toolbar a{display:inline-block;text-decoration:none;display:block}.store-switcher .actions.dropdown ul.dropdown-menu .dropdown-toolbar a:before{font-family:'icons-blank-theme';content:'\e606';font-size:20px;line-height:normal;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:text-top;text-align:center;margin:0 3px 0 -4px}.tooltip{display:inline-block;margin-left:5px}.tooltip .help span,.tooltip .help a{width:16px;height:16px;text-align:center;background:rgba(194,186,169,.5);cursor:pointer;border-radius:10px;vertical-align:middle;display:inline-block;text-decoration:none}.tooltip .help span:hover,.tooltip .help a:hover{background:#c2baa9}.tooltip .help span>span,.tooltip .help a>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.tooltip .help span>span.focusable:active,.tooltip .help a>span.focusable:active,.tooltip .help span>span.focusable:focus,.tooltip .help a>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.tooltip .help span>span.focusable:active,.tooltip .help a>span.focusable:active,.tooltip .help span>span.focusable:focus,.tooltip .help a>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.tooltip .help span:before,.tooltip .help a:before{font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;content:'?';font-size:13px;line-height:16px;color:#5a534a;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center}.tooltip .help span:before,.tooltip .help a:before{font-weight:700}.tooltip .tooltip-content{display:none;position:absolute;max-width:200px;margin-top:10px;margin-left:-19px;padding:4px 8px;border-radius:3px;background:#000;background:rgba(49,48,43,.8);color:#fff;text-shadow:none;z-index:20}.tooltip .tooltip-content:before{content:'';position:absolute;width:0;height:0;top:-5px;left:20px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000;opacity:.8}.tooltip .tooltip-content.loading{position:absolute}.tooltip .tooltip-content.loading:before{border-bottom-color:rgba(0,0,0,.3)}.tooltip:hover>.tooltip-content{display:block}button,.action-add.mselect-button-add{border-radius:2px;background-image:none;background:#f2ebde;padding:6px 13px;color:#645d53;border:1px solid #ada89e;cursor:pointer;display:inline-block;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.3rem;font-weight:500;line-height:1.4rem;box-sizing:border-box;margin:0;vertical-align:middle}button:focus,button:active,.action-add.mselect-button-add:focus,.action-add.mselect-button-add:active{background:#cac3b4;border:1px solid #989287}button:hover,.action-add.mselect-button-add:hover{background:#cac3b4}button.disabled,button[disabled],fieldset[disabled] button,.action-add.mselect-button-add.disabled,.action-add.mselect-button-add[disabled],fieldset[disabled] .action-add.mselect-button-add{cursor:default;pointer-events:none;opacity:.5}button.primary,.action-add.mselect-button-add.primary{background-image:none;background:#007dbd;padding:6px 13px;color:#fff;border:1px solid #0a6c9f;cursor:pointer;display:inline-block;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.3rem;font-weight:500;box-sizing:border-box;vertical-align:middle}button.primary:focus,button.primary:active,.action-add.mselect-button-add.primary:focus,.action-add.mselect-button-add.primary:active{background:#026294;border:1px solid #004c74;color:#fff}button.primary:hover,.action-add.mselect-button-add.primary:hover{background:#026294;border:1px solid #026294}button.primary.disabled,button.primary[disabled],fieldset[disabled] button.primary,.action-add.mselect-button-add.primary.disabled,.action-add.mselect-button-add.primary[disabled],fieldset[disabled] .action-add.mselect-button-add.primary{cursor:default;pointer-events:none;opacity:.5}.actions-split{display:inline-block;position:relative;vertical-align:middle}.actions-split button,.actions-split .action-add.mselect-button-add{margin-left:0!important}.actions-split:before,.actions-split:after{content:"";display:table}.actions-split:after{clear:both}.actions-split:before,.actions-split:after{content:"";display:table}.actions-split:after{clear:both}.actions-split .action-default{float:left;margin:0}.actions-split .action-toggle{float:right;margin:0}.actions-split button.action-default,.actions-split .action-add.mselect-button-add.action-default{border-top-right-radius:0;border-bottom-right-radius:0}.actions-split button+.action-toggle,.actions-split .action-add.mselect-button-add+.action-toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.actions-split .action-toggle{padding:6px 5px;display:inline-block;text-decoration:none}.actions-split .action-toggle>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.actions-split .action-toggle>span.focusable:active,.actions-split .action-toggle>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.actions-split .action-toggle>span.focusable:active,.actions-split .action-toggle>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.actions-split .action-toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:14px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.actions-split .action-toggle:hover:after{color:inherit}.actions-split .action-toggle:active:after{color:inherit}.actions-split .action-toggle.active{display:inline-block;text-decoration:none}.actions-split .action-toggle.active>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.actions-split .action-toggle.active>span.focusable:active,.actions-split .action-toggle.active>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.actions-split .action-toggle.active>span.focusable:active,.actions-split .action-toggle.active>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.actions-split .action-toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:14px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.actions-split .action-toggle.active:hover:after{color:inherit}.actions-split .action-toggle.active:active:after{color:inherit}.actions-split .dropdown-menu{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:175px;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.actions-split .dropdown-menu li{margin:0;padding:3px 5px}.actions-split .dropdown-menu li:hover{background:#e8e8e8;cursor:pointer}.actions-split .dropdown-menu:before,.actions-split .dropdown-menu:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.actions-split .dropdown-menu:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff}.actions-split .dropdown-menu:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb}.actions-split .dropdown-menu:before{top:-12px;right:10px}.actions-split .dropdown-menu:after{top:-14px;right:9px}.actions-split.active{overflow:visible}.actions-split.active .dropdown-menu{display:block}.actions-split .action-toggle:after{height:13px}.page-content:after{content:"";display:table;clear:both}.page-wrapper>.page-content{margin-bottom:20px}.page-footer{padding:15px 0}.page-footer-wrapper{background-color:#e0dacf;margin-top:auto}.page-footer:after{content:"";display:table;clear:both}.footer-legal{float:right;width:550px}.footer-legal .link-report,.footer-legal .magento-version,.footer-legal .copyright{font-size:13px}.footer-legal:before{content:"";display:inline-block;vertical-align:middle;position:absolute;z-index:1;margin-top:2px;margin-left:-35px;width:30px;height:35px;background-size:109px 70px;background:url("../images/logo.svg") no-repeat 0 -21px}.icon-error{margin-left:15px;color:#c00815;font-size:11px}.icon-error:before{font-family:'MUI-Icons';content:"\e086";font-size:13px;line-height:13px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center;margin:-1px 5px 0 0}.ui-widget-overlay{position:fixed}.control .nested{padding:0}.control *:first-child{margin-bottom:0}.field-tooltip{display:inline-block;vertical-align:top;margin-top:5px;position:relative;z-index:1;width:0;overflow:visible}.field-choice .field-tooltip{margin-top:10px}.field-tooltip:hover{z-index:99}.field-tooltip-action{position:relative;z-index:2;margin-left:18px;width:22px;height:22px;display:inline-block;cursor:pointer}.field-tooltip-action:before{content:"?";font-weight:500;font-size:18px;display:inline-block;overflow:hidden;height:22px;border-radius:11px;line-height:22px;width:22px;text-align:center;color:#fff;background-color:#514943}.field-tooltip-action span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.field-tooltip-action span.focusable:active,.field-tooltip-action span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.field-tooltip-action span.focusable:active,.field-tooltip-action span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.control-text:focus+.field-tooltip-content,.field-tooltip:hover .field-tooltip-content{display:block}.field-tooltip-content{display:none;position:absolute;z-index:1;width:320px;background:#fff8d7;padding:15px 25px;right:-66px;border:1px solid #adadad;border-radius:1px;bottom:42px;box-shadow:0 2px 8px 0 rgba(0,0,0,.3)}.field-tooltip-content:after,.field-tooltip-content:before{content:"";display:block;width:0;height:0;border:16px solid transparent;border-top-color:#adadad;position:absolute;right:20px;top:100%;z-index:3}.field-tooltip-content:after{border-top-color:#fff8d7;margin-top:-1px;z-index:4}.form__field.field-error .control [class*=control-]{border-color:#e22626}.form__field.field-error .control [class*=control-]:before{border-color:#e22626}.form__field .mage-error{border:1px solid #e22626;display:block;margin:2px 0 0;padding:6px 10px 10px;background:#fff8d6;color:#555;font-size:12px;font-weight:500;box-sizing:border-box;max-width:380px}.no-flexbox.no-flexboxlegacy .form__field .control-addon+.mage-error{display:inline-block;width:100%}.form__field{position:relative;z-index:1}.form__field:hover{z-index:2}.control .form__field{position:static}.form__field[data-config-scope]:before{content:attr(data-config-scope);display:inline-block;position:absolute;color:gray;right:0;top:6px}.control .form__field[data-config-scope]:nth-child(n+2):before{content:""}.form__field.field-disabled>.label{color:#999}.form__field.field-disabled.field .control [class*=control-][disabled]{background-color:#e9e9e9;opacity:.5;color:#303030;border-color:#adadad}.control-fields .label~.control{width:100%}.form__field{border:0;padding:0}.form__field .note{color:#303030;padding:0;margin:10px 0 0;max-width:380px}.form__field .note:before{display:none}.form__field.form__field{margin-bottom:0}.form__field.form__field+.form__field.form__field{margin-top:15px}.form__field.form__field:not(.choice)~.choice{margin-left:20px;margin-top:5px}.form__field.form__field.choice~.choice{margin-top:9px}.form__field.form__field~.choice:last-child{margin-bottom:8px}.fieldset>.form__field{margin-bottom:30px}.form__field .label{color:#303030}.form__field:not(.choice)>.label{font-size:14px;font-weight:600;width:30%;padding-right:30px;padding-top:0;line-height:33px;white-space:nowrap}.form__field:not(.choice)>.label:before{content:".";visibility:hidden;width:0;margin-left:-7px;overflow:hidden}.form__field:not(.choice)>.label span{white-space:normal;display:inline-block;vertical-align:middle;line-height:1.2}.form__field.required>.label:after{content:"";margin-left:0}.form__field.required>.label span:after{content:"*";color:#eb5202;display:inline;font-weight:500;font-size:16px;margin-top:2px;position:absolute;z-index:1;margin-left:10px}.form__field .control-file{margin-top:6px}.form__field .control-select{line-height:33px}.form__field .control-select:not([multiple]),.form__field .control-text{height:33px;max-width:380px}.form__field .control-addon{max-width:380px}.form__field .control-textarea,.form__field .control-select,.form__field .control-text{border:1px solid #adadad;border-radius:1px;padding:0 10px;color:#303030;background-color:#fff;font-weight:500;font-size:15px;min-width:11em}.form__field .control-textarea:focus,.form__field .control-select:focus,.form__field .control-text:focus{outline:0;border-color:#007bdb;box-shadow:none}.form__field .control-text{line-height:auto}.form__field .control-textarea{padding-top:6px;padding-bottom:6px;line-height:1.18em}.form__field .control-select[multiple],.form__field .control-textarea{width:100%;height:calc(6*1.2em + 14px)}.form__field .control-value{display:inline-block;padding:6px 10px}.form__field .control-fields .form__field:nth-child(n+2):not(.choice)>.label{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.form__field .control-fields .form__field:nth-child(n+2):not(.choice)>.label.focusable:active,.form__field .control-fields .form__field:nth-child(n+2):not(.choice)>.label.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.form__field .control-fields .form__field:nth-child(n+2):not(.choice)>.label.focusable:active,.form__field .control-fields .form__field:nth-child(n+2):not(.choice)>.label.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.form__field .control-select{padding:0}.form__field .control-select option{box-sizing:border-box;padding:4px 10px;display:block}.form__field .control-select optgroup{font-weight:600;display:block;padding:4px 10px;line-height:33px;list-style:inside;font-style:normal}.form__field .control-range>.form__field:nth-child(2):before{content:"\2014";content:":";display:inline-block;margin-left:-25px;float:left;width:20px;line-height:33px;text-align:center}.form__field.choice{position:relative;z-index:1;padding-top:8px;padding-left:26px;padding-right:0}.form__field.choice .label{font-weight:500;padding:0;display:inline;float:none;line-height:18px}.form__field.choice input{position:absolute;top:8px;margin-top:3px!important}.form__field.choice input[disabled]+.label{opacity:.5;cursor:not-allowed}.control>.form__field.choice{max-width:380px}.control>.form__field.choice:nth-child(1):nth-last-child(2),.control>.form__field.choice:nth-child(2):nth-last-child(1){display:inline-block}.control>.form__field.choice:nth-child(1):nth-last-child(2)+.choice,.control>.form__field.choice:nth-child(2):nth-last-child(1)+.choice{margin-left:41px;margin-top:0}.control>.form__field.choice:nth-child(1):nth-last-child(2)+.choice:before,.control>.form__field.choice:nth-child(2):nth-last-child(1)+.choice:before{content:"";position:absolute;display:inline-block;height:20px;top:8px;left:-20px;width:1px;background:#ccc}.form__field.choice .label{cursor:pointer}.form__field.choice .label:before{content:"";position:absolute;z-index:1;border:1px solid #adadad;width:14px;height:14px;top:10px;left:0;border-radius:2px;background:url("../Magento_Ui/images/choice_bkg.png") no-repeat -100% -100%}.form__field.choice input:focus+.label:before{outline:0;border-color:#007bdb}.form__field.choice .control-radio+.label:before{border-radius:8px}.form__field.choice .control-radio:checked+.label:before{background-position:-26px -1px}.form__field.choice .control-checkbox:checked+.label:before{background-position:-1px -1px}.form__field.choice input{opacity:0}.fieldset>.form__field.choice{margin-left:30%}.form__field .control-after,.form__field .control-before{border:0;color:#858585;font-weight:300;font-size:15px;line-height:33px;display:inline-block;height:33px;box-sizing:border-box;padding:0 3px}.no-flexbox.no-flexboxlegacy .form__field .control-before,.no-flexbox.no-flexboxlegacy .form__field .control-addon{float:left;white-space:nowrap}.form__field .control-addon{display:inline-flex;max-width:380px;width:100%;flex-flow:row nowrap;position:relative;z-index:1}.form__field .control-addon>*{position:relative;z-index:1}.form__field .control-addon .control-text[disabled][type],.form__field .control-addon .control-select[disabled][type],.form__field .control-addon .control-select,.form__field .control-addon .control-text{background:transparent!important;border:0;width:auto;vertical-align:top;order:1;flex:1}.form__field .control-addon .control-text[disabled][type]:focus,.form__field .control-addon .control-select[disabled][type]:focus,.form__field .control-addon .control-select:focus,.form__field .control-addon .control-text:focus{box-shadow:none}.form__field .control-addon .control-text[disabled][type]:focus+label:before,.form__field .control-addon .control-select[disabled][type]:focus+label:before,.form__field .control-addon .control-select:focus+label:before,.form__field .control-addon .control-text:focus+label:before{outline:0;border-color:#007bdb}.form__field .control-addon .control-text[disabled][type]+label,.form__field .control-addon .control-select[disabled][type]+label,.form__field .control-addon .control-select+label,.form__field .control-addon .control-text+label{padding-left:10px;position:static!important;z-index:0}.form__field .control-addon .control-text[disabled][type]+label>*,.form__field .control-addon .control-select[disabled][type]+label>*,.form__field .control-addon .control-select+label>*,.form__field .control-addon .control-text+label>*{vertical-align:top;position:relative;z-index:2}.form__field .control-addon .control-text[disabled][type]+label:before,.form__field .control-addon .control-select[disabled][type]+label:before,.form__field .control-addon .control-select+label:before,.form__field .control-addon .control-text+label:before{box-sizing:border-box;border-radius:1px;border:1px solid #adadad;content:"";display:block;position:absolute;top:0;left:0;width:100%;height:100%;z-index:0;background:#fff}.form__field .control-addon .control-text[disabled][type][disabled]+label:before,.form__field .control-addon .control-select[disabled][type][disabled]+label:before,.form__field .control-addon .control-select[disabled]+label:before,.form__field .control-addon .control-text[disabled]+label:before{opacity:.5;background:#e9e9e9}.form__field .control-after{order:3}.form__field .control-after:last-child{padding-right:10px}.form__field .control-before{order:0}.form__field .control-some{display:flex}.form__field [class*=control-grouped]{display:table;width:100%;table-layout:fixed;box-sizing:border-box}.form__field [class*=control-grouped]>.form__field{display:table-cell;width:50%;vertical-align:top}.form__field [class*=control-grouped]>.form__field>.control{width:100%;float:none}.form__field [class*=control-grouped]>.form__field:nth-child(n+2){padding-left:20px}.form__field [class*=control-grouped]>.form__field:nth-child(n+2):not(.choice) .label{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.form__field [class*=control-grouped]>.form__field:nth-child(n+2):not(.choice) .label.focusable:active,.form__field [class*=control-grouped]>.form__field:nth-child(n+2):not(.choice) .label.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.form__field [class*=control-grouped]>.form__field:nth-child(n+2):not(.choice) .label.focusable:active,.form__field [class*=control-grouped]>.form__field:nth-child(n+2):not(.choice) .label.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.form__field [required]{box-shadow:none}fieldset.form__field{position:relative}fieldset.form__field [class*=control-grouped]>.form__field:first-child>.label,fieldset.form__field .control-fields>.form__field:first-child>.label{position:absolute;left:0;top:0;opacity:0;cursor:pointer;width:30%}.control-text+.ui-datepicker-trigger{background-image:none;background:0 0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;line-height:inherit;font-weight:400;text-decoration:none;margin-left:-40px;display:inline-block}.control-text+.ui-datepicker-trigger img{display:none}.control-text+.ui-datepicker-trigger:focus,.control-text+.ui-datepicker-trigger:active{background:0 0;border:none}.control-text+.ui-datepicker-trigger:hover{background:0 0;border:none}.control-text+.ui-datepicker-trigger.disabled,.control-text+.ui-datepicker-trigger[disabled],fieldset[disabled] .control-text+.ui-datepicker-trigger{cursor:not-allowed;pointer-events:none;opacity:.5}.control-text+.ui-datepicker-trigger>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.control-text+.ui-datepicker-trigger>span.focusable:active,.control-text+.ui-datepicker-trigger>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.control-text+.ui-datepicker-trigger>span.focusable:active,.control-text+.ui-datepicker-trigger>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.control-text+.ui-datepicker-trigger:after{font-family:'icons-blank-theme';content:'\e612';font-size:38px;line-height:33px;color:#514943;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}[class*=tab-nav-item]:not(ul):active,[class*=tab-nav-item]:not(ul):focus{box-shadow:none;outline:none}.customer-index-edit .col-2-left-layout,.customer-index-edit .col-1-layout{background:#fff}.customer-index-edit{background:#fff}.customer-index-edit .col-2-left-layout{background:#fff}.customer-index-edit .main-col{padding-left:40px}.customer-index-edit .page-main-actions{background:0 0}.tab-nav.block{margin-bottom:40px}.tab-nav.block:first-child{margin-top:16px}.tab-nav.block .block-title{padding:7px 20px}.tab-nav-items{padding:0;border:1px solid #d3d3d3;box-shadow:0 0 4px rgba(50,50,50,.35);margin:0 0 40px;background:#f7f7f7}.tab-nav-item{padding:0;list-style-type:none;border-bottom:1px solid #e0e0e0;position:relative;margin:0 15px;z-index:1}.tab-nav-item:last-child{border-bottom:0}.tab-nav-item.ui-state-active{z-index:2;background:#fff;padding:1px 14px;border:2px solid #eb5202;margin:-1px}.tab-nav-item.ui-state-active .tab-nav-item-link{padding:13px 15px 13px;color:#eb5202}.tab-nav-item.ui-tabs-loading{position:relative;z-index:1}.tab-nav-item.ui-tabs-loading:before{content:"";display:block;position:absolute;z-index:2;background:url("../images/loader-2.gif") no-repeat 50% 50%;background-size:120px;width:20px;height:20px;top:13px;left:-10px}.tab-nav-item.ui-tabs-loading.ui-state-active:before{top:12px;left:4px}.tab-nav-item-link{display:block;padding:15px;color:#666;line-height:1}.tab-nav-item-link:focus,.tab-nav-item-link:active,.tab-nav-item-link:hover{outline:0;color:#eb5202;text-decoration:none}.ui-state-active .tab-nav-item-link{color:#666;font-weight:600}.tab-nav-item-link.changed{font-style:italic}.listing-tiles{overflow:hidden;margin-top:-10px;margin-left:-10px}.listing-tiles .listing-tile{background-color:#f2ebde;display:block;width:238px;height:200px;float:left;border:1px solid #676056;margin-top:10px;margin-left:10px;border-radius:4px;text-align:center}.listing-tiles .listing-tile.disabled{border-color:red}.listing-tiles .listing-tile.enabled{border-color:green}.listing .disabled{color:red}.listing .enabled{color:green}.pager{text-align:left;padding-bottom:10px}.pager:before,.pager:after{content:"";display:table}.pager:after{clear:both}.pager:before,.pager:after{content:"";display:table}.pager:after{clear:both}.pager [data-part=left]{display:inline-block;width:45%;float:left;text-align:left}.pager [data-part=right]{display:inline-block;width:45%;text-align:right;float:right;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.pager .action-next{cursor:pointer}.pager .action-previous{cursor:pointer}.pager{text-align:left}.pager [data-part=left]{display:inline-block;width:45%;text-align:left}.pager [data-part=right]{display:inline-block;width:45%;text-align:right;float:right}.grid .col-title{min-width:90px;text-align:center}.grid-actions [data-part=search]{display:inline-block;margin:0 30px}.grid-actions [data-part=search] input[type=text]{vertical-align:bottom;width:460px}.grid .actions-split .dropdown-menu{right:auto;left:auto;text-align:left;color:#676056;font-weight:400}.grid .actions-split .dropdown-menu:after{right:auto;left:9px}.grid .actions-split .dropdown-menu:before{right:auto;left:10px}.grid .grid-actions{padding:10px 0}.grid .hor-scroll{padding-top:10px}.grid .select-box{display:inline-block;vertical-align:top;margin:-12px -10px -7px;padding:12px 10px 7px;width:100%}.filters-toggle{background:#f2ebde;padding:6px 13px;color:#645d53;border:1px solid #ada89e;cursor:pointer;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.3rem;font-weight:500;line-height:1.4rem;box-sizing:border-box;margin:3px;vertical-align:middle;display:inline-block;background-image:none;background:0 0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400}.filters-toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:30px;line-height:15px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.filters-toggle:hover:after{color:inherit}.filters-toggle:active:after{color:inherit}.filters-toggle:focus,.filters-toggle:active{background:#cac3b4;border:1px solid #989287}.filters-toggle:hover{background:#cac3b4}.filters-toggle.disabled,.filters-toggle[disabled],fieldset[disabled] .filters-toggle{cursor:default;pointer-events:none;opacity:.5}.filters-toggle:focus,.filters-toggle:active{background:0 0;border:none}.filters-toggle:hover{background:0 0;border:none}.filters-toggle.disabled,.filters-toggle[disabled],fieldset[disabled] .filters-toggle{cursor:not-allowed;pointer-events:none;opacity:.5}.filters-toggle:after{margin-top:2px;margin-left:-3px}.filters-toggle.active:after{content:'\e618'}.filters-current{padding:10px 0;display:none}.filters-current.active{display:block}.filters-items{margin:0;padding:0;list-style:none none;display:inline}.filters-item{display:inline-block;margin:0 5px 5px 0;padding:2px 2px 2px 4px;border-radius:3px;background:#f7f3eb}.filters-item .item-label{font-weight:600}.filters-item .item-label:after{content:": "}.filters-item .action-remove{background-image:none;background:#f2ebde;padding:6px 13px;color:#645d53;border:1px solid #ada89e;cursor:pointer;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.3rem;font-weight:500;line-height:1.4rem;box-sizing:border-box;margin:3px;vertical-align:middle;display:inline-block;text-decoration:none;padding:0}.filters-item .action-remove>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.filters-item .action-remove>span.focusable:active,.filters-item .action-remove>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.filters-item .action-remove>span.focusable:active,.filters-item .action-remove>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.filters-item .action-remove:before{font-family:'icons-blank-theme';content:'\e616';font-size:16px;line-height:16px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.filters-item .action-remove:hover:before{color:inherit}.filters-item .action-remove:active:before{color:inherit}.filters-item .action-remove:focus,.filters-item .action-remove:active{background:#cac3b4;border:1px solid #989287}.filters-item .action-remove:hover{background:#cac3b4}.filters-item .action-remove.disabled,.filters-item .action-remove[disabled],fieldset[disabled] .filters-item .action-remove{cursor:default;pointer-events:none;opacity:.5}.filters-form{position:relative;z-index:1;margin:14px 0;background:#fff;border:1px solid #bbb;box-shadow:0 3px 3px rgba(0,0,0,.15)}.filters-form .action-close{position:absolute;top:3px;right:7px;background:#f2ebde;padding:6px 13px;color:#645d53;border:1px solid #ada89e;cursor:pointer;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.3rem;font-weight:500;line-height:1.4rem;box-sizing:border-box;margin:3px;vertical-align:middle;display:inline-block;background-image:none;background:0 0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400}.filters-form .action-close>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.filters-form .action-close>span.focusable:active,.filters-form .action-close>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.filters-form .action-close>span.focusable:active,.filters-form .action-close>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.filters-form .action-close:before{font-family:'icons-blank-theme';content:'\e616';font-size:42px;line-height:42px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.filters-form .action-close:hover:before{color:inherit}.filters-form .action-close:active:before{color:inherit}.filters-form .action-close:focus,.filters-form .action-close:active{background:#cac3b4;border:1px solid #989287}.filters-form .action-close:hover{background:#cac3b4}.filters-form .action-close.disabled,.filters-form .action-close[disabled],fieldset[disabled] .filters-form .action-close{cursor:default;pointer-events:none;opacity:.5}.filters-form .action-close:focus,.filters-form .action-close:active{background:0 0;border:none}.filters-form .action-close:hover{background:0 0;border:none}.filters-form .action-close.disabled,.filters-form .action-close[disabled],fieldset[disabled] .filters-form .action-close{cursor:not-allowed;pointer-events:none;opacity:.5}.filters-actions{margin:18px;text-align:right}.filters-fieldset{padding-bottom:0}.filters-fieldset .field{border:0;margin:0 0 20px;box-sizing:border-box;display:inline-block;padding:0 12px 0 0;width:33.33333333%;vertical-align:top}.filters-fieldset .field:before,.filters-fieldset .field:after{content:"";display:table}.filters-fieldset .field:after{clear:both}.filters-fieldset .field:before,.filters-fieldset .field:after{content:"";display:table}.filters-fieldset .field:after{clear:both}.filters-fieldset .field.choice:before,.filters-fieldset .field.no-label:before{box-sizing:border-box;content:" ";height:1px;float:left;padding:6px 15px 0 0;width:35%}.filters-fieldset .field .description{box-sizing:border-box;float:left;padding:6px 15px 0 0;text-align:right;width:35%}.filters-fieldset .field:not(.choice)>.label{box-sizing:border-box;float:left;padding:6px 15px 0 0;text-align:right;width:35%}.filters-fieldset .field:not(.choice)>.control{float:left;width:65%}.filters-fieldset .field:last-child{margin-bottom:0}.filters-fieldset .field+.fieldset{clear:both}.filters-fieldset .field>.label{font-weight:700}.filters-fieldset .field>.label+br{display:none}.filters-fieldset .field .choice input{vertical-align:top}.filters-fieldset .field .fields.group:before,.filters-fieldset .field .fields.group:after{content:"";display:table}.filters-fieldset .field .fields.group:after{clear:both}.filters-fieldset .field .fields.group:before,.filters-fieldset .field .fields.group:after{content:"";display:table}.filters-fieldset .field .fields.group:after{clear:both}.filters-fieldset .field .fields.group .field{box-sizing:border-box;float:left}.filters-fieldset .field .fields.group.group-2 .field{width:50% !important}.filters-fieldset .field .fields.group.group-3 .field{width:33.3% !important}.filters-fieldset .field .fields.group.group-4 .field{width:25% !important}.filters-fieldset .field .fields.group.group-5 .field{width:20% !important}.filters-fieldset .field .addon{display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;padding:0;width:100%}.filters-fieldset .field .addon textarea,.filters-fieldset .field .addon select,.filters-fieldset .field .addon input{-ms-flex-order:2;-webkit-order:2;order:2;-webkit-flex-basis:100%;flex-basis:100%;box-shadow:none;display:inline-block;margin:0;width:auto}.filters-fieldset .field .addon .addbefore,.filters-fieldset .field .addon .addafter{-ms-flex-order:3;-webkit-order:3;order:3;display:inline-block;box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:32px;width:100%;padding:0 9px;font-size:14px;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;width:auto;white-space:nowrap;vertical-align:middle}.filters-fieldset .field .addon .addbefore:disabled,.filters-fieldset .field .addon .addafter:disabled{opacity:.5}.filters-fieldset .field .addon .addbefore::-moz-placeholder,.filters-fieldset .field .addon .addafter::-moz-placeholder{color:#c2c2c2}.filters-fieldset .field .addon .addbefore::-webkit-input-placeholder,.filters-fieldset .field .addon .addafter::-webkit-input-placeholder{color:#c2c2c2}.filters-fieldset .field .addon .addbefore:-ms-input-placeholder,.filters-fieldset .field .addon .addafter:-ms-input-placeholder{color:#c2c2c2}.filters-fieldset .field .addon .addbefore{float:left;-ms-flex-order:1;-webkit-order:1;order:1}.filters-fieldset .field .additional{margin-top:10px}.filters-fieldset .field.required>.label:after{content:'*';font-size:1.2rem;color:#e02b27;margin:0 0 0 5px}.filters-fieldset .field .note{font-size:1.2rem;margin:3px 0 0;padding:0;display:inline-block;text-decoration:none}.filters-fieldset .field .note:before{font-family:'icons-blank-theme';content:'\e618';font-size:24px;line-height:12px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.filters-fieldset .field .label{color:#676056;font-size:13px;font-weight:600;margin:0}.filters .field-date .group .hasDatepicker{width:100%;padding-right:30px}.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger{background-image:none;background:0 0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;line-height:inherit;font-weight:400;text-decoration:none;margin-left:-33px;display:inline-block;width:30px}.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger img{display:none}.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger:focus,.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger:active{background:0 0;border:none}.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger:hover{background:0 0;border:none}.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger.disabled,.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger[disabled],fieldset[disabled] .filters .field-date .group .hasDatepicker+.ui-datepicker-trigger{cursor:not-allowed;pointer-events:none;opacity:.5}.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger>span.focusable:active,.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger>span.focusable:active,.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger:after{font-family:'icons-blank-theme';content:'\e612';font-size:35px;line-height:30px;color:#514943;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.filters .field-range .group .field{margin-bottom:0}.filters .field-range .group .control{width:100%;box-sizing:border-box;padding-right:0;position:relative;z-index:1}.mass-select{position:relative;margin:-6px -10px;padding:6px 2px 6px 10px;z-index:1;white-space:nowrap}.mass-select.active{background:rgba(0,0,0,.2)}.mass-select-toggle{background:#f2ebde;padding:6px 13px;color:#645d53;border:1px solid #ada89e;cursor:pointer;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.3rem;font-weight:500;line-height:1.4rem;box-sizing:border-box;margin:3px;vertical-align:middle;display:inline-block;background-image:none;background:0 0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400}.mass-select-toggle>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.mass-select-toggle>span.focusable:active,.mass-select-toggle>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.mass-select-toggle>span.focusable:active,.mass-select-toggle>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.mass-select-toggle:before{font-family:'icons-blank-theme';content:'\e607';font-size:30px;line-height:15px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.mass-select-toggle:hover:before{color:inherit}.mass-select-toggle:active:before{color:inherit}.mass-select-toggle:focus,.mass-select-toggle:active{background:#cac3b4;border:1px solid #989287}.mass-select-toggle:hover{background:#cac3b4}.mass-select-toggle.disabled,.mass-select-toggle[disabled],fieldset[disabled] .mass-select-toggle{cursor:default;pointer-events:none;opacity:.5}.mass-select-toggle:focus,.mass-select-toggle:active{background:0 0;border:none}.mass-select-toggle:hover{background:0 0;border:none}.mass-select-toggle.disabled,.mass-select-toggle[disabled],fieldset[disabled] .mass-select-toggle{cursor:not-allowed;pointer-events:none;opacity:.5}.mass-select-toggle:before{margin-top:-2px;text-indent:-5px;color:#fff}.mass-select-toggle:hover:before{color:#fff}.mass-select-toggle:active:before,.mass-select-toggle.active:before{content:'\e618'}.mass-select-field{display:inline}.mass-select-menu{display:none;position:absolute;top:100%;left:0;text-align:left;margin:0;padding:0;list-style:none none;background:#fff;border:1px solid #bbb;min-width:175px;box-shadow:0 3px 3px rgba(0,0,0,.15)}.mass-select-menu li{margin:0;padding:4px 15px;border-bottom:1px solid #e5e5e5}.mass-select-menu li:hover{background:#e8e8e8;cursor:pointer}.mass-select-menu span{font-weight:400;font-size:13px;color:#645d53}.mass-select-menu.active{display:block}.grid-loading-mask{position:absolute;left:0;top:0;right:0;bottom:0;background:rgba(255,255,255,.5);z-index:100}.grid-loading-mask .grid-loader{position:absolute;margin:auto;left:0;top:0;right:0;bottom:0;width:218px;height:149px;background:url('../images/loader-2.gif') 50% 50% no-repeat}.addon input{border-width:1px 0 1px 1px}.addon input~.addafter strong{display:inline-block;background:#fff;line-height:24px;margin:0 3px 0 -2px;padding-left:4px;padding-right:4px;position:relative;font-size:12px;top:0}.addon input:focus~.addafter{border-color:#75b9f0;box-shadow:0 0 8px rgba(82,168,236,.6)}.addon input:focus~.addafter strong{margin-top:0}.addon .addafter{background:0 0;color:#a6a6a6;border-width:1px 1px 1px 0;border-radius:2px 2px 0 0;padding:0;border-color:#ada89e}.addon .pager input{border-width:1px}.field .control input[type=text][disabled],.field .control input[type=text][disabled]~.addafter,.field .control select[disabled],.field .control select[disabled]~.addafter{background-color:#fff;border-color:#eee;box-shadow:none;color:#999}.field .control input[type=text][disabled]~.addafter strong,.field .control select[disabled]~.addafter strong{background-color:#fff}.field-price.addon{direction:rtl}.field-price.addon>*{direction:ltr}.field-price.addon .addafter{border-width:1px 0 1px 1px;border-radius:2px 0 0 2px}.field-price.addon input:first-child{border-radius:0 2px 2px 0}.field-price input{border-width:1px 1px 1px 0}.field-price input:focus{box-shadow:0 0 8px rgba(82,168,236,.6)}.field-price input:focus~label.addafter{box-shadow:0 0 8px rgba(82,168,236,.6)}.field-price input~label.addafter strong{margin-left:2px;margin-right:-2px}.field-price.addon>input{width:99px;float:left}.field-price .control{position:relative}.field-price label.mage-error{position:absolute;left:0;top:30px}.version-fieldset .grid-actions{border-bottom:1px solid #f2ebde;margin:0 0 15px;padding:0 0 15px}.navigation>ul,.message-system,.page-header,.page-actions.fixed .page-actions-inner,.page-content,.page-footer{width:auto;min-width:960px;max-width:1300px;margin:0 auto;padding-left:15px;padding-right:15px;box-sizing:border-box;width:100%}.pager label.page,.filters .field-range .group .label,.mass-select-field .label{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visually-hidden.focusable:active,.visually-hidden.focusable:focus,.pager label.page.focusable:active,.pager label.page.focusable:focus,.filters .field-range .group .label.focusable:active,.filters .field-range .group .label.focusable:focus,.mass-select-field .label.focusable:active,.mass-select-field .label.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}table th.required:after,.data-table th.required-entry:after,.data-table td.required-entry:after,.grid-actions .filter.required .label span:after,.grid-actions .required:after,.accordion .config .data-table td.required-entry:after{content:'*';color:#e22626;font-weight:400;margin-left:3px}.grid th.required:after,.grid th .required:after{content:'*';color:#f9d4d4;font-weight:400;margin-left:3px}.grid td.col-period,.grid td.col-date,.grid td.col-date_to,.grid td.col-date_from,.grid td.col-ended_at,.grid td.col-created_at,.grid td.col-updated_at,.grid td.col-customer_since,.grid td.col-session_start_time,.grid td.col-last_activity,.grid td.col-email,.grid td.col-name,.grid td.col-sku,.grid td.col-firstname,.grid td.col-lastname,.grid td.col-title,.grid td.col-label,.grid td.col-product,.grid td.col-set_name,.grid td.col-websites,.grid td.col-time,.grid td.col-billing_name,.grid td.col-shipping_name,.grid td.col-phone,.grid td.col-type,.product-options .grouped-items-table .col-name,.product-options .grouped-items-table .col-sku,.sales-order-create-index .data-table .col-product,[class^=' adminhtml-rma-'] .fieldset-wrapper .data-table td,[class^=' adminhtml-rma-'] .grid .col-product_sku,[class^=' adminhtml-rma-'] .grid .col-product_name,.col-grid_segment_name,.adminhtml-catalog-event-index .col-category,[class^=' catalog-search'] .col-search_query,[class^=' catalog-search'] .col-synonym_for,[class^=' catalog-search'] .col-redirect,.adminhtml-urlrewrite-index .col-request_path,.adminhtml-cms-page-index .col-title,.adminhtml-cms-page-index .col-identifier,.adminhtml-cms-hierarchy-index .col-title,.adminhtml-cms-hierarchy-index .col-identifier,.col-banner_name,.adminhtml-widget-instance-index .col-title,.reports-index-search .col-query_text,.adminhtml-rma-item-attribute-index .grid .col-attr-code,.adminhtml-system-store-index .grid td,.catalog-product-attribute-index .col-attr-code,.catalog-product-attribute-index .col-label,.adminhtml-export-index .col-code,.adminhtml-logging-index .grid .col-fullaction,.adminhtml-system-variable-index .grid .col-code,.adminhtml-logging-index .grid .col-info,.dashboard-secondary .dashboard-item tr>td:first-child,.ui-tabs-panel .dashboard-data .col-name,.data-table-td-max .data-table td,[class^=' adminhtml-rma-'] .fieldset-wrapper .accordion .config .data-table td,.data-table-td-max .accordion .config .data-table td,.order-account-information .data-table td,[class^=' adminhtml-rma-'] .rma-request-details .data-table td{overflow:hidden;text-overflow:ellipsis}td.col-period,td.col-date,td.col-date_to,td.col-date_from,td.col-ended_at,td.col-created_at,td.col-updated_at,td.col-customer_since,td.col-session_start_time,td.col-time,td.col-sku,td.col-type,[class^=' adminhtml-rma-'] #rma_items_grid_table .headings th,.adminhtml-process-list .col-action a,.adminhtml-process-list .col-mode{white-space:nowrap}table thead tr th:first-child,table tfoot tr th:first-child,table tfoot tr td:first-child{border-left:0}table thead tr th:last-child,table tfoot tr th:last-child,table tfoot tr td:last-child{border-right:0}.form-inline .grid-actions .label,.form-inline .massaction .label{padding:0;width:auto}.grid .col-action,.grid .col-actions,.grid .col-qty,.grid .col-purchases,.catalog-product-edit .ui-tabs-panel .grid .col-price,.catalog-product-edit .ui-tabs-panel .grid .col-position{width:50px}.grid .col-order-number,.grid .col-real_order_id,.grid .col-invoice-number,.grid .col-increment_id,.grid .col-transaction-id,.grid .col-parent-transaction-id,.grid .col-reference_id,.grid .col-status,.grid .col-price,.grid .col-position,.grid .col-base_grand_total,.grid .col-grand_total,.grid .col-sort_order,.grid .col-carts,.grid .col-priority,.grid .col-severity,.sales-order-create-index .col-in_products,[class^=' reports-'] [class^=col-total],[class^=' reports-'] [class^=col-average],[class^=' reports-'] [class^=col-ref-],[class^=' reports-'] [class^=col-rate],[class^=' reports-'] [class^=col-tax-amount],[class^=' adminhtml-customer-'] .col-required,.adminhtml-rma-item-attribute-index .col-required,[class^=' adminhtml-customer-'] .col-system,.adminhtml-rma-item-attribute-index .col-system,[class^=' adminhtml-customer-'] .col-is_visible,.adminhtml-rma-item-attribute-index .col-is_visible,[class^=' adminhtml-customer-'] .col-sort_order,.adminhtml-rma-item-attribute-index .col-sort_order,.catalog-product-attribute-index [class^=' col-is_'],.catalog-product-attribute-index .col-required,.catalog-product-attribute-index .col-system,.adminhtml-test-index .col-is_listed,[class^=' tests-report-test'] [class^=col-inv-]{width:70px}.grid .col-phone,.sales-order-view .grid .col-period,.sales-order-create-index .col-phone,[class^=' adminhtml-rma-'] .grid .col-product_sku,.adminhtml-rma-edit .col-product,.adminhtml-rma-edit .col-sku,.catalog-product-edit .ui-tabs-panel .grid .col-name,.catalog-product-edit .ui-tabs-panel .grid .col-type,.catalog-product-edit .ui-tabs-panel .grid .col-sku,.customer-index-index .grid .col-customer_since,.customer-index-index .grid .col-billing_country_id,[class^=' customer-index-'] .fieldset-wrapper .grid .col-created_at,[class^=' customer-index-'] .accordion .grid .col-created_at{max-width:70px;width:70px}.sales-order-view .grid .col-name,.sales-order-create-index .data-table .col-product,[class^=' adminhtml-rma-'] .grid .col-name,[class^=' adminhtml-rma-'] .grid .col-product,[class^=' catalog-search'] .col-search_query,[class^=' catalog-search'] .col-synonym_for,[class^=' catalog-search'] .col-redirect,.adminhtml-urlrewrite-index .col-request_path,.reports-report-shopcart-abandoned .grid .col-name,.tax-rule-index .grid .col-title,.adminhtml-rma-item-attribute-index .grid .col-attr-code,.dashboard-secondary .dashboard-item tr>td:first-child{max-width:150px;width:150px}[class^=' sales-order-'] .grid .col-name,.catalog-category-edit .grid .col-name,.adminhtml-catalog-event-index .col-category,.adminhtml-banner-edit .grid .col-name,.reports-report-product-lowstock .grid .col-sku,.newsletter-problem-index .grid .col-name,.newsletter-problem-index .grid .col-subject,.newsletter-problem-index .grid .col-product,.adminhtml-rma-item-attribute-index .grid .col-label,.adminhtml-export-index .col-label,.adminhtml-export-index .col-code,.adminhtml-scheduled-operation-index .grid .col-name,.adminhtml-logging-index .grid .col-fullaction,.test-report-customer-wishlist-wishlist .grid .col-name,.test-report-customer-wishlist-wishlist .grid .col-subject,.test-report-customer-wishlist-wishlist .grid .col-product{max-width:220px;width:220px}.grid .col-period,.grid .col-date,.grid .col-date_to,.grid .col-date_from,.grid .col-ended_at,.grid .col-created_at,.grid .col-updated_at,.grid .col-customer_since,.grid .col-session_start_time,.grid .col-last_activity,.grid .col-email,.grid .col-items_total,.grid .col-firstname,.grid .col-lastname,.grid .col-status-default,.grid .col-websites,.grid .col-time,.grid .col-billing_name,.grid .col-shipping_name,.sales-order-index .grid .col-name,.product-options .grouped-items-table .col-name,.product-options .grouped-items-table .col-sku,[class^=' sales-order-view'] .grid .col-customer_name,[class^=' adminhtml-rma-'] .grid .col-product_name,.catalog-product-index .grid .col-name,.catalog-product-review-index .grid .col-name,.catalog-product-review-index .grid .col-title,.customer-index-edit .ui-tabs-panel .grid .col-name,.review-product-index .grid .col-name,.adminhtml-cms-page-index .col-title,.adminhtml-cms-page-index .col-identifier,.catalog-product-attribute-index .col-attr-code,.catalog-product-attribute-index .col-label,.adminhtml-logging-index .grid .col-info{max-width:110px;width:110px}.grid .col-name,.grid .col-product,.col-banner_name,.adminhtml-widget-instance-index .col-title,[class^=' adminhtml-customer-'] .col-label,.adminhtml-rma-item-attribute-index .col-label,.adminhtml-system-variable-index .grid .col-code,.ui-tabs-panel .dashboard-data .col-name,.adminhtml-test-index .col-label{max-width:370px;width:370px}.col-grid_segment_name,.reports-index-search .col-query_text{max-width:570px;width:570px}[class^=' adminhtml-rma-'] .fieldset-wrapper .data-table td,.reports-report-product-lowstock .grid .col-name,.reports-report-shopcart-product .grid .col-name,.reports-report-review-customer .grid .col-name,[class^=' adminhtml-rma-'] .fieldset-wrapper .accordion .config .data-table td{max-width:670px;width:670px}.reports-report-sales-invoiced .grid .col-period,.reports-report-sales-refunde .grid .col-period,[class^=' tests-report-test'] .grid .col-period{width:auto}.grid .col-select,.grid .col-id,.grid .col-number{width:40px}.sales-order-create-index .grid,.sales-order-create-index .grid-actions,.adminhtml-export-index .grid-actions,.adminhtml-export-index .grid{padding-left:0;padding-right:0}[class^=' adminhtml-rma-'] .col-actions a,[class^=' customer-index-'] .col-action a,.adminhtml-notification-index .col-actions a{display:block;margin:0 0 3px;white-space:nowrap}.data-table-td-max .accordion .config .data-table td,.order-account-information .data-table td,[class^=' adminhtml-rma-'] .rma-request-details .data-table td{max-width:250px;width:250px}.catalog-product-edit .ui-tabs-panel .grid .hor-scroll,.catalog-product-index .grid .hor-scroll,.review-product-index .grid .hor-scroll,.adminhtml-rma-edit .hor-scroll{overflow-x:auto}.add-clearer:after,.massaction:after,.navigation>ul:after{content:"";display:table;clear:both}.test-content{width:calc(20px + 100*0.2)}.test-content:before{content:'.test {\A ' attr(data-attribute) ': 0.2em;' '\A content:\'';white-space:pre}.test-content:after{content:' Test\';\A}' "\A" '\A.test + .test._other ~ ul > li' " {\A height: @var;\A content: ' + ';\A}";white-space:pre}.test-content-calc{width:calc((100%/12*2) - 10px)}.test-svg-xml-image{background:url('data:image/svg+xml;utf8,') no-repeat left center}
\ No newline at end of file
diff --git a/dev/tests/integration/testsuite/Magento/Framework/View/_files/static/theme/web/css/styles.css b/dev/tests/integration/testsuite/Magento/Framework/View/_files/static/theme/web/css/styles.css
index 8b1d0fae6d96b..90ca42321c921 100644
--- a/dev/tests/integration/testsuite/Magento/Framework/View/_files/static/theme/web/css/styles.css
+++ b/dev/tests/integration/testsuite/Magento/Framework/View/_files/static/theme/web/css/styles.css
@@ -1000,15 +1000,13 @@ fieldset[disabled] .pager .action-next {
}
@font-face {
font-family: 'icons-blank-theme';
- src: url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.eot');
- src: url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.eot?#iefix') format('embedded-opentype'), url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff2') format('woff2'), url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff') format('woff'), url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.ttf') format('truetype'), url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.svg#icons-blank-theme') format('svg');
+ src: url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff2') format('woff2'), url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff') format('woff');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'icons-blank-theme';
- src: url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.eot');
- src: url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.eot?#iefix') format('embedded-opentype'), url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff2') format('woff2'), url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff') format('woff'), url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.ttf') format('truetype');
+ src: url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff2') format('woff2'), url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff') format('woff');
font-weight: normal;
font-style: normal;
}
diff --git a/dev/tests/integration/testsuite/Magento/Sales/Model/InvoiceEmailSenderHandlerTest.php b/dev/tests/integration/testsuite/Magento/Sales/Model/InvoiceEmailSenderHandlerTest.php
new file mode 100644
index 0000000000000..332092946c4d6
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/Model/InvoiceEmailSenderHandlerTest.php
@@ -0,0 +1,103 @@
+create(
+ \Magento\Sales\Model\Order\Email\Container\InvoiceIdentity::class
+ );
+ /** @var \Magento\Sales\Model\Order\Email\Sender\InvoiceSender $invoiceSender */
+ $invoiceSender = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+ ->create(
+ \Magento\Sales\Model\Order\Email\Sender\InvoiceSender::class,
+ [
+ 'identityContainer' => $invoiceIdentity,
+ ]
+ );
+ $entityResource = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+ ->create(\Magento\Sales\Model\ResourceModel\Order\Invoice::class);
+ $this->entityCollection = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
+ \Magento\Sales\Model\ResourceModel\Order\Invoice\Collection::class
+ );
+ $this->emailSender = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
+ \Magento\Sales\Model\EmailSenderHandler::class,
+ [
+ 'emailSender' => $invoiceSender,
+ 'entityResource' => $entityResource,
+ 'entityCollection' => $this->entityCollection,
+ 'identityContainer' => $invoiceIdentity,
+ ]
+ );
+ }
+
+ /**
+ * @magentoAppIsolation enabled
+ * @magentoDbIsolation disabled
+ * @magentoDataFixture Magento/Sales/_files/invoice_list_different_stores.php
+ */
+ public function testInvoiceEmailSenderExecute()
+ {
+ $expectedResult = 1;
+
+ $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+
+ /** @var Config $defConfig */
+ $defConfig = $objectManager->create(Config::class);
+ $defConfig->setScope(ScopeConfigInterface::SCOPE_TYPE_DEFAULT);
+ $defConfig->setDataByPath('sales_email/general/async_sending', 1);
+ $defConfig->save();
+
+ /** @var Config $storeConfig */
+ $storeConfig = $objectManager->create(Config::class);
+ $storeConfig->setScope(ScopeInterface::SCOPE_STORES);
+ $storeConfig->setStore('fixture_second_store');
+ $storeConfig->setDataByPath('sales_email/invoice/enabled', 0);
+ $storeConfig->save();
+
+ $sendCollection = clone $this->entityCollection;
+ $sendCollection->addFieldToFilter('send_email', ['eq' => 1]);
+ $sendCollection->addFieldToFilter('email_sent', ['null' => true]);
+
+ $this->emailSender->sendEmails();
+
+ $this->assertCount($expectedResult, $sendCollection->getItems());
+ }
+
+ /**
+ * @inheritdoc
+ * @throws \Magento\Framework\Exception\LocalizedException
+ * @throws \Exception
+ */
+ protected function tearDown()
+ {
+ /** @var \Magento\Config\Model\Config $defConfig */
+ $defConfig = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+ ->create(\Magento\Config\Model\Config::class);
+ $defConfig->setScope(\Magento\Framework\App\Config\ScopeConfigInterface::SCOPE_TYPE_DEFAULT);
+ $defConfig->setDataByPath('sales_email/general/async_sending', 0);
+ $defConfig->save();
+ }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/invoice_list.php b/dev/tests/integration/testsuite/Magento/Sales/_files/invoice_list.php
index 669b1a4268388..b5a4f5fa1eb0b 100644
--- a/dev/tests/integration/testsuite/Magento/Sales/_files/invoice_list.php
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/invoice_list.php
@@ -53,9 +53,9 @@
],
];
-/** @var array $creditMemoData */
+/** @var array $invoiceData */
foreach ($invoices as $invoiceData) {
- /** @var \Magento\Sales\Model\Order\Creditmemo $creditMemo */
+ /** @var \Magento\Sales\Model\Order\Invoice $invoice */
$invoice = $objectManager->create(\Magento\Sales\Model\Order\Invoice::class);
$invoice
->setData($invoiceData)
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/invoice_list_different_stores.php b/dev/tests/integration/testsuite/Magento/Sales/_files/invoice_list_different_stores.php
new file mode 100644
index 0000000000000..e6a1947b72edd
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/invoice_list_different_stores.php
@@ -0,0 +1,132 @@
+create(\Magento\Store\Model\Store::class);
+$secondStoreId = $store->load('fixture_second_store')->getId();
+
+$orders = [
+ [
+ 'increment_id' => '100000002',
+ 'state' => \Magento\Sales\Model\Order::STATE_NEW,
+ 'status' => 'processing',
+ 'grand_total' => 120.00,
+ 'subtotal' => 120.00,
+ 'base_grand_total' => 120.00,
+ 'store_id' => 0,
+ 'website_id' => 1,
+ ],
+ [
+ 'increment_id' => '100000003',
+ 'state' => \Magento\Sales\Model\Order::STATE_PROCESSING,
+ 'status' => 'processing',
+ 'grand_total' => 140.00,
+ 'base_grand_total' => 140.00,
+ 'subtotal' => 140.00,
+ 'store_id' => 1,
+ 'website_id' => 0,
+ ],
+ [
+ 'increment_id' => '100000004',
+ 'state' => \Magento\Sales\Model\Order::STATE_PROCESSING,
+ 'status' => 'closed',
+ 'grand_total' => 140.00,
+ 'base_grand_total' => 140.00,
+ 'subtotal' => 140.00,
+ 'store_id' => $secondStoreId,
+ 'website_id' => 1,
+ ],
+];
+
+/** @var \Magento\Sales\Model\Order\Address $billingAddress */
+$billingAddress = $objectManager->create(\Magento\Sales\Model\Order\Address::class, ['data' => $addressData]);
+$billingAddress->setAddressType('billing');
+
+/** @var \Magento\Sales\Model\Order\Address $shippingAddress */
+$shippingAddress = clone $billingAddress;
+$shippingAddress->setId(null)->setAddressType('shipping');
+
+/** @var \Magento\Sales\Model\Order\Payment $payment */
+$payment = $objectManager->create(\Magento\Sales\Model\Order\Payment::class);
+$payment->setMethod('checkmo');
+$payment->setAdditionalInformation('last_trans_id', '11122');
+$payment->setAdditionalInformation('metadata', [
+ 'type' => 'free',
+ 'fraudulent' => false,
+]);
+
+/** @var \Magento\Sales\Model\Order\Item $orderItem */
+$orderItem = $objectManager->create(\Magento\Sales\Model\Order\Item::class);
+$orderItem->setProductId($product->getId())->setQtyOrdered(2);
+$orderItem->setBasePrice($product->getPrice());
+$orderItem->setPrice($product->getPrice());
+$orderItem->setRowTotal($product->getPrice());
+$orderItem->setProductType('simple');
+
+/** @var \Magento\Sales\Api\InvoiceManagementInterface $orderService */
+$orderService = \Magento\TestFramework\ObjectManager::getInstance()->create(
+ \Magento\Sales\Api\InvoiceManagementInterface::class
+);
+
+/** @var \Magento\Sales\Api\OrderRepositoryInterface $orderRepository */
+$orderRepository = $objectManager->create(\Magento\Sales\Api\OrderRepositoryInterface::class);
+
+foreach ($orders as $orderFixture) {
+ /** @var \Magento\Sales\Model\Order $order */
+ $order = $objectManager->create(\Magento\Sales\Model\Order::class);
+ $order->setData($orderFixture);
+ $order->setIncrementId(
+ $orderFixture['increment_id']
+ )->setStoreId(
+ $orderFixture['store_id']
+ )->setState(
+ $orderFixture['state']
+ )->setStatus(
+ $orderFixture['status']
+ )->setSubtotal(
+ $orderFixture['subtotal']
+ )->setGrandTotal(
+ $orderFixture['grand_total']
+ )->setBaseSubtotal(
+ $orderFixture['subtotal']
+ )->setBaseGrandTotal(
+ $orderFixture['base_grand_total']
+ )->setCustomerIsGuest(
+ true
+ )->setCustomerEmail(
+ 'customer@null.com'
+ )->setBillingAddress(
+ clone $billingAddress
+ )->setShippingAddress(
+ clone $shippingAddress
+ )->addItem(
+ clone $orderItem
+ )->setPayment(
+ clone $payment
+ );
+
+ $orderRepository->save($order);
+
+ /** @var \Magento\Sales\Model\Order\Invoice $invoice */
+ $invoice = $orderService->prepareInvoice($order, $order->getItems());
+ $invoice->register();
+ $invoice->setSendEmail(1);
+ $invoice->setStoreId($orderFixture['store_id']);
+ $order = $invoice->getOrder();
+ $order->setIsInProcess(true);
+ $transactionSave = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+ ->create(\Magento\Framework\DB\Transaction::class);
+ $transactionSave->addObject($invoice)->addObject($order)->save();
+}
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/invoice_list_different_stores_rollback.php b/dev/tests/integration/testsuite/Magento/Sales/_files/invoice_list_different_stores_rollback.php
new file mode 100644
index 0000000000000..803a69cabf77b
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/invoice_list_different_stores_rollback.php
@@ -0,0 +1,9 @@
+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 0000000000000..9d88fe48ae111
--- /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 0000000000000..79ec3259fd86a
--- /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/Setup/Declaration/WhitelistDeclarationTest.php b/dev/tests/integration/testsuite/Magento/Setup/Declaration/WhitelistDeclarationTest.php
new file mode 100644
index 0000000000000..6b92e687284db
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Setup/Declaration/WhitelistDeclarationTest.php
@@ -0,0 +1,162 @@
+create(ResourceConnection::class);
+ $objectManager->removeSharedInstance(ResourceConnection::class);
+ $objectManager->addSharedInstance($resourceConnection, ResourceConnection::class);
+ $this->componentRegistrar = $objectManager->get(ComponentRegistrarInterface::class);
+ $this->schemaConfig = $objectManager->create(SchemaConfigInterface::class);
+ }
+
+ /**
+ * Checks that all declared table elements also declared into whitelist declaration.
+ *
+ * @appIsolation
+ * @throws \Exception
+ */
+ public function testConstraintsAndIndexesAreWhitelisted()
+ {
+ $undeclaredElements = [];
+ $resultMessage = "New table elements that do not exist in the whitelist declaration:\n";
+ $whitelistTables = $this->getWhiteListTables();
+ $declarativeSchema = $this->schemaConfig->getDeclarationConfig();
+
+ foreach ($declarativeSchema->getTables() as $schemaTable) {
+ $tableNameWithoutPrefix = $schemaTable->getNameWithoutPrefix();
+ foreach ($schemaTable->getConstraints() as $constraint) {
+ $constraintNameWithoutPrefix = $constraint->getNameWithoutPrefix();
+ if (isset($whitelistTables[$tableNameWithoutPrefix][Constraint::TYPE][$constraintNameWithoutPrefix])) {
+ continue;
+ }
+
+ $undeclaredElements[$tableNameWithoutPrefix][Constraint::TYPE][] = $constraintNameWithoutPrefix;
+ }
+
+ foreach ($schemaTable->getIndexes() as $index) {
+ $indexNameWithoutPrefix = $index->getNameWithoutPrefix();
+ if (isset($whitelistTables[$tableNameWithoutPrefix][Index::TYPE][$indexNameWithoutPrefix])) {
+ continue;
+ }
+
+ $undeclaredElements[$tableNameWithoutPrefix][Index::TYPE][] = $indexNameWithoutPrefix;
+ }
+ }
+
+ $undeclaredElements = $this->filterUndeclaredElements($undeclaredElements);
+
+ if (!empty($undeclaredElements)) {
+ $resultMessage .= json_encode($undeclaredElements, JSON_PRETTY_PRINT);
+ }
+
+ $this->assertEmpty($undeclaredElements, $resultMessage);
+ }
+
+ /**
+ * Excludes ignored elements from the list of undeclared table elements.
+ *
+ * @param array $undeclaredElements
+ * @return array
+ */
+ private function filterUndeclaredElements(array $undeclaredElements): array
+ {
+ $files = Files::getFiles([__DIR__ . '/_files/ignore_whitelisting'], '*.json');
+ $ignoredElements = [];
+ foreach ($files as $filePath) {
+ $ignoredElements = array_merge_recursive(
+ $ignoredElements,
+ json_decode(file_get_contents($filePath), true)
+ );
+ }
+
+ return $this->arrayRecursiveDiff($undeclaredElements, $ignoredElements);
+ }
+
+ /**
+ * Performs a recursive comparison of two arrays.
+ *
+ * @param array $array1
+ * @param array $array2
+ * @return array
+ */
+ private function arrayRecursiveDiff(array $array1, array $array2): array
+ {
+ $diffResult = [];
+
+ foreach ($array1 as $key => $value) {
+ if (array_key_exists($key, $array2)) {
+ if (is_array($value)) {
+ $recursiveDiffResult = $this->arrayRecursiveDiff($value, $array2[$key]);
+ if (count($recursiveDiffResult)) {
+ $diffResult[$key] = $recursiveDiffResult;
+ }
+ } else {
+ if (!in_array($value, $array2)) {
+ $diffResult[] = $value;
+ }
+ }
+ } else {
+ $diffResult[$key] = $value;
+ }
+ }
+
+ return $diffResult;
+ }
+
+ /**
+ * @return array
+ */
+ private function getWhiteListTables(): array
+ {
+ $whiteListTables = [];
+
+ foreach ($this->componentRegistrar->getPaths(ComponentRegistrar::MODULE) as $path) {
+ $whiteListPath = $path . DIRECTORY_SEPARATOR . 'etc' .
+ DIRECTORY_SEPARATOR . 'db_schema_whitelist.json';
+
+ if (file_exists($whiteListPath)) {
+ $whiteListTables = array_replace_recursive(
+ $whiteListTables,
+ json_decode(file_get_contents($whiteListPath), true)
+ );
+ }
+ }
+
+ return $whiteListTables;
+ }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Setup/Declaration/_files/ignore_whitelisting/ce.json b/dev/tests/integration/testsuite/Magento/Setup/Declaration/_files/ignore_whitelisting/ce.json
new file mode 100644
index 0000000000000..881481ab407bc
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Setup/Declaration/_files/ignore_whitelisting/ce.json
@@ -0,0 +1,7 @@
+{
+ "patch_list": {
+ "constraint": [
+ "PRIMARY"
+ ]
+ }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Signifyd/Observer/PlaceOrderTest.php b/dev/tests/integration/testsuite/Magento/Signifyd/Observer/PlaceOrderTest.php
index d4204314453e5..e547187be5ed7 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 8991825c9381e..49a0a2d33e236 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 0000000000000..e53b0431503e7
--- /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 0000000000000..9b731813fea3b
--- /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/Store/Controller/Store/SwitchActionTest.php b/dev/tests/integration/testsuite/Magento/Store/Controller/Store/SwitchActionTest.php
index dfd979f03c576..bc8ca2ba07a80 100644
--- a/dev/tests/integration/testsuite/Magento/Store/Controller/Store/SwitchActionTest.php
+++ b/dev/tests/integration/testsuite/Magento/Store/Controller/Store/SwitchActionTest.php
@@ -48,8 +48,5 @@ protected function changeStoreCode($from, $to)
$store->load($from, 'code');
$store->setCode($to);
$store->save();
- /** @var \Magento\Store\Model\StoreManagerInterface $storeManager */
- $storeManager = $this->_objectManager->get(\Magento\Store\Model\StoreManagerInterface::class);
- $storeManager->reinitStores();
}
}
diff --git a/dev/tests/integration/testsuite/Magento/Store/_files/core_fixturestore.php b/dev/tests/integration/testsuite/Magento/Store/_files/core_fixturestore.php
index e3971ad912a78..a4a640a24de50 100644
--- a/dev/tests/integration/testsuite/Magento/Store/_files/core_fixturestore.php
+++ b/dev/tests/integration/testsuite/Magento/Store/_files/core_fixturestore.php
@@ -21,9 +21,6 @@
->setSortOrder(10)
->setIsActive(1);
$store->save();
-
- /* Refresh stores memory cache */
- Bootstrap::getObjectManager()->get(\Magento\Store\Model\StoreManagerInterface::class)->reinitStores();
}
//if test using this fixture relies on full text functionality it is required to explicitly perform re-indexation
diff --git a/dev/tests/integration/testsuite/Magento/Store/_files/core_fixturestore_rollback.php b/dev/tests/integration/testsuite/Magento/Store/_files/core_fixturestore_rollback.php
index d6b9e1d9abc70..95d13111e6193 100644
--- a/dev/tests/integration/testsuite/Magento/Store/_files/core_fixturestore_rollback.php
+++ b/dev/tests/integration/testsuite/Magento/Store/_files/core_fixturestore_rollback.php
@@ -23,6 +23,3 @@
$registry->unregister('isSecureArea');
$registry->register('isSecureArea', false);
-
-/* Refresh stores memory cache */
-$objectManager->get(\Magento\Store\Model\StoreManagerInterface::class)->reinitStores();
diff --git a/dev/tests/integration/testsuite/Magento/Store/_files/core_second_third_fixturestore.php b/dev/tests/integration/testsuite/Magento/Store/_files/core_second_third_fixturestore.php
index 139f36ca3c9d6..3cb429822eb9a 100644
--- a/dev/tests/integration/testsuite/Magento/Store/_files/core_second_third_fixturestore.php
+++ b/dev/tests/integration/testsuite/Magento/Store/_files/core_second_third_fixturestore.php
@@ -27,8 +27,3 @@
$store = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(\Magento\Store\Model\Store::class);
$store->setCode('thirdstore')->setName('Third Store')->setSortOrder(10)->setIsActive(1);
$store->save();
-
-/* Refresh stores memory cache */
-\Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
- \Magento\Store\Model\StoreManagerInterface::class
-)->reinitStores();
diff --git a/dev/tests/integration/testsuite/Magento/Store/_files/core_second_third_fixturestore_rollback.php b/dev/tests/integration/testsuite/Magento/Store/_files/core_second_third_fixturestore_rollback.php
index 1799845aced48..19d064bb79834 100644
--- a/dev/tests/integration/testsuite/Magento/Store/_files/core_second_third_fixturestore_rollback.php
+++ b/dev/tests/integration/testsuite/Magento/Store/_files/core_second_third_fixturestore_rollback.php
@@ -35,8 +35,3 @@
$registry->unregister('isSecureArea');
$registry->register('isSecureArea', false);
-
-/* Refresh stores memory cache */
-\Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
- \Magento\Store\Model\StoreManagerInterface::class
-)->reinitStores();
diff --git a/dev/tests/integration/testsuite/Magento/Store/_files/fixture_store_with_catalogsearch_index.php b/dev/tests/integration/testsuite/Magento/Store/_files/fixture_store_with_catalogsearch_index.php
index 064dfbcdbe2be..d5fd725e7df4d 100644
--- a/dev/tests/integration/testsuite/Magento/Store/_files/fixture_store_with_catalogsearch_index.php
+++ b/dev/tests/integration/testsuite/Magento/Store/_files/fixture_store_with_catalogsearch_index.php
@@ -21,11 +21,4 @@
->setSortOrder(10)
->setIsActive(1);
$store->save();
-
- Bootstrap::getObjectManager()
- ->get(\Magento\Framework\Event\ManagerInterface::class)
- ->dispatch('store_add', ['store' => $store]);
-
- /* Refresh stores memory cache */
- Bootstrap::getObjectManager()->get(\Magento\Store\Model\StoreManagerInterface::class)->reinitStores();
}
diff --git a/dev/tests/integration/testsuite/Magento/Store/_files/fixture_store_with_catalogsearch_index_rollback.php b/dev/tests/integration/testsuite/Magento/Store/_files/fixture_store_with_catalogsearch_index_rollback.php
index 8a69f83882ade..251635dcff09f 100644
--- a/dev/tests/integration/testsuite/Magento/Store/_files/fixture_store_with_catalogsearch_index_rollback.php
+++ b/dev/tests/integration/testsuite/Magento/Store/_files/fixture_store_with_catalogsearch_index_rollback.php
@@ -20,8 +20,3 @@
$registry->unregister('isSecureArea');
$registry->register('isSecureArea', false);
-
-/* Refresh stores memory cache */
-\Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
- \Magento\Store\Model\StoreManagerInterface::class
-)->reinitStores();
diff --git a/dev/tests/integration/testsuite/Magento/Store/_files/second_store.php b/dev/tests/integration/testsuite/Magento/Store/_files/second_store.php
index a97457a581393..af008a28d611b 100644
--- a/dev/tests/integration/testsuite/Magento/Store/_files/second_store.php
+++ b/dev/tests/integration/testsuite/Magento/Store/_files/second_store.php
@@ -6,6 +6,7 @@
* See COPYING.txt for license details.
*/
+/** @var \Magento\Store\Model\Store $store */
$store = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(\Magento\Store\Model\Store::class);
if (!$store->load('fixture_second_store', 'code')->getId()) {
$websiteId = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
@@ -30,8 +31,3 @@
);
$store->save();
}
-
-/* Refresh stores memory cache */
-\Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
- \Magento\Store\Model\StoreManagerInterface::class
-)->reinitStores();
diff --git a/dev/tests/integration/testsuite/Magento/Store/_files/second_store_rollback.php b/dev/tests/integration/testsuite/Magento/Store/_files/second_store_rollback.php
index 4fc5d3b65b270..56ba31fad4ed2 100644
--- a/dev/tests/integration/testsuite/Magento/Store/_files/second_store_rollback.php
+++ b/dev/tests/integration/testsuite/Magento/Store/_files/second_store_rollback.php
@@ -20,8 +20,3 @@
$registry->unregister('isSecureArea');
$registry->register('isSecureArea', false);
-
-/* Refresh stores memory cache */
-\Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
- \Magento\Store\Model\StoreManagerInterface::class
-)->reinitStores();
diff --git a/dev/tests/integration/testsuite/Magento/Store/_files/second_website_with_two_stores.php b/dev/tests/integration/testsuite/Magento/Store/_files/second_website_with_two_stores.php
index 078b590132f06..016acca1e8e04 100644
--- a/dev/tests/integration/testsuite/Magento/Store/_files/second_website_with_two_stores.php
+++ b/dev/tests/integration/testsuite/Magento/Store/_files/second_website_with_two_stores.php
@@ -51,10 +51,6 @@
);
$store->save();
}
-/* Refresh stores memory cache */
-\Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
- \Magento\Store\Model\StoreManagerInterface::class
-)->reinitStores();
/* Refresh CatalogSearch index */
/** @var \Magento\Framework\Indexer\IndexerRegistry $indexerRegistry */
diff --git a/dev/tests/integration/testsuite/Magento/Store/_files/second_website_with_two_stores_rollback.php b/dev/tests/integration/testsuite/Magento/Store/_files/second_website_with_two_stores_rollback.php
index b97dc4dd40bd9..eef8cf960944c 100644
--- a/dev/tests/integration/testsuite/Magento/Store/_files/second_website_with_two_stores_rollback.php
+++ b/dev/tests/integration/testsuite/Magento/Store/_files/second_website_with_two_stores_rollback.php
@@ -27,8 +27,3 @@
$registry->unregister('isSecureArea');
$registry->register('isSecureArea', false);
-
-/* Refresh stores memory cache */
-\Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
- \Magento\Store\Model\StoreManagerInterface::class
-)->reinitStores();
diff --git a/dev/tests/integration/testsuite/Magento/Store/_files/store.php b/dev/tests/integration/testsuite/Magento/Store/_files/store.php
index e49d16e2ede68..94ea5a9364b87 100644
--- a/dev/tests/integration/testsuite/Magento/Store/_files/store.php
+++ b/dev/tests/integration/testsuite/Magento/Store/_files/store.php
@@ -37,6 +37,3 @@
$store->save();
}
}
-$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
-/* Refresh stores memory cache */
-$objectManager->get('Magento\Store\Model\StoreManagerInterface')->reinitStores();
diff --git a/dev/tests/integration/testsuite/Magento/Store/_files/store_rollback.php b/dev/tests/integration/testsuite/Magento/Store/_files/store_rollback.php
index 3b437f08c8c33..8289244d6581a 100644
--- a/dev/tests/integration/testsuite/Magento/Store/_files/store_rollback.php
+++ b/dev/tests/integration/testsuite/Magento/Store/_files/store_rollback.php
@@ -31,8 +31,3 @@
$registry->unregister('isSecureArea');
$registry->register('isSecureArea', false);
-
-/* Refresh stores memory cache */
-\Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
- \Magento\Store\Model\StoreManagerInterface::class
-)->reinitStores();
diff --git a/dev/tests/integration/testsuite/Magento/Store/_files/websites_different_countries.php b/dev/tests/integration/testsuite/Magento/Store/_files/websites_different_countries.php
index 7a20eee640585..13a43d0a710a3 100644
--- a/dev/tests/integration/testsuite/Magento/Store/_files/websites_different_countries.php
+++ b/dev/tests/integration/testsuite/Magento/Store/_files/websites_different_countries.php
@@ -44,9 +44,6 @@
$store->save();
}
-/* Refresh stores memory cache */
-$objectManager->get(\Magento\Store\Model\StoreManagerInterface::class)->reinitStores();
-
//Setting up allowed countries
$configResource = $objectManager->get(\Magento\Config\Model\ResourceModel\Config::class);
//Allowed countries for default website.
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 0000000000000..969d9530ae542
--- /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/integration/testsuite/Magento/Weee/Model/ResourceModel/AttributeTest.php b/dev/tests/integration/testsuite/Magento/Weee/Model/ResourceModel/AttributeTest.php
new file mode 100644
index 0000000000000..725a8f72c8d01
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Weee/Model/ResourceModel/AttributeTest.php
@@ -0,0 +1,119 @@
+objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+ $this->model = $this->objectManager->get(
+ \Magento\Catalog\Model\ResourceModel\Attribute::class
+ );
+ $this->productResource = $this->objectManager->get(
+ \Magento\Catalog\Model\ResourceModel\Product::class
+ );
+ $this->productRepository = $this->objectManager->create(ProductRepositoryInterface::class);
+ $this->metadataPool = $this->objectManager->get(MetadataPool::class);
+ }
+
+ /**
+ * Retrieve eav attribute row.
+ *
+ * @param int $entityTypeId
+ * @param int $attributeSetId
+ * @param int $attributeId
+ * @return array|false
+ */
+ private function getEavEntityAttributeRow(int $entityTypeId, int $attributeSetId, int $attributeId)
+ {
+ $connection = $this->productResource->getConnection();
+ $select = $connection->select()
+ ->from($this->productResource->getTable('eav_entity_attribute'))
+ ->where('attribute_set_id=?', $attributeSetId)
+ ->where('attribute_id=?', $attributeId)
+ ->where('entity_type_id=?', $entityTypeId);
+
+ return $connection->fetchRow($select);
+ }
+
+ /**
+ * Test to delete entity attribute with type "Fixed Product Tax".
+ *
+ * @magentoDataFixture Magento/Weee/_files/fixed_product_attribute.php
+ * @return void
+ */
+ public function testDeleteEntityFixedTax() : void
+ {
+ /* @var EavAttribute $attribute */
+ $attribute = $this->objectManager->get(EavAttribute::class);
+ $attribute->loadByCode(\Magento\Catalog\Model\Product::ENTITY, 'fixed_product_attribute');
+
+ $entityEavAttributeRow = $this->getEavEntityAttributeRow(
+ (int)$attribute->getEntityTypeId(),
+ 4,
+ (int)$attribute->getId()
+ );
+ $this->assertNotEmpty(
+ $entityEavAttributeRow['entity_attribute_id'],
+ 'The record is absent in table `eav_entity_attribute` for `fixed_product_attribute`'
+ );
+
+ $attribute->setData('entity_attribute_id', $entityEavAttributeRow['entity_attribute_id']);
+ $this->model->deleteEntity($attribute);
+
+ $entityEavAttributeRow = $this->getEavEntityAttributeRow(
+ (int)$attribute->getEntityTypeId(),
+ 4,
+ (int)$attribute->getId()
+ );
+ $this->assertEmpty(
+ $entityEavAttributeRow,
+ 'The record was not removed from table `eav_entity_attribute` for `fixed_product_attribute`'
+ );
+ }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Weee/_files/fixed_product_attribute.php b/dev/tests/integration/testsuite/Magento/Weee/_files/fixed_product_attribute.php
new file mode 100644
index 0000000000000..a20d1cac94228
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Weee/_files/fixed_product_attribute.php
@@ -0,0 +1,33 @@
+create(\Magento\Eav\Model\Entity\Attribute\Set::class);
+
+$entityType = $objectManager->create(\Magento\Eav\Model\Entity\Type::class)->loadByCode('catalog_product');
+$defaultSetId = $objectManager->create(\Magento\Catalog\Model\Product::class)->getDefaultAttributeSetid();
+
+$attributeGroupId = $attributeSet->getDefaultGroupId($entityType->getDefaultAttributeSetId());
+
+$attributeData = [
+ 'entity_type_id' => $entityType->getId(),
+ 'attribute_code' => 'fixed_product_attribute',
+ 'backend_model' => 'Magento\Weee\Model\Attribute\Backend\Weee\Tax',
+ 'is_required' => 0,
+ 'is_user_defined' => 1,
+ 'is_static' => 1,
+ 'attribute_set_id' => $defaultSetId,
+ 'attribute_group_id' => $attributeGroupId,
+];
+
+/** @var \Magento\Catalog\Model\Entity\Attribute $attribute */
+$attribute = $objectManager->create(\Magento\Eav\Model\Entity\Attribute::class);
+$attribute->setData($attributeData);
+$attribute->save();
diff --git a/dev/tests/integration/testsuite/Magento/Weee/_files/fixed_product_attribute_rollback.php b/dev/tests/integration/testsuite/Magento/Weee/_files/fixed_product_attribute_rollback.php
new file mode 100644
index 0000000000000..1d6e15b2e9a97
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Weee/_files/fixed_product_attribute_rollback.php
@@ -0,0 +1,14 @@
+get(\Magento\Eav\Model\Entity\Attribute::class);
+$attribute->loadByCode(\Magento\Catalog\Model\Product::ENTITY, 'fixed_product_attribute');
+$attribute->delete();
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 21c04d098ae6c..ec820e537789a 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 d3b5072a767bd..24dc535638514 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 396b62df0dfe9..60115c4ac2c64 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/setup-integration/_files/Magento/TestSetupDeclarationModule1/etc/db_schema.xml b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/etc/db_schema.xml
index c57581d7f1621..5b8a4c8f37c99 100644
--- a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/etc/db_schema.xml
+++ b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/etc/db_schema.xml
@@ -30,7 +30,7 @@
nullable="true"/>
-
+
@@ -53,14 +53,15 @@
-
+
-
-
+
diff --git a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/etc/db_schema_whitelist.json b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/etc/db_schema_whitelist.json
index 14b4887b662e2..49866f645d09d 100644
--- a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/etc/db_schema_whitelist.json
+++ b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/etc/db_schema_whitelist.json
@@ -23,7 +23,7 @@
"int_disabled_auto_increment": true
},
"constraint": {
- "unique_null_key": true
+ "AUTO_INCREMENT_TEST_INT_AUTO_INCREMENT_WITH_NULLABLE": true
}
},
"test_table": {
@@ -46,11 +46,11 @@
"varbinary_rename": true
},
"index": {
- "speedup_index": true
+ "TEST_TABLE_TINYINT_BIGINT": true
},
"constraint": {
- "some_unique_key": true,
- "some_foreign_key": true
+ "TEST_TABLE_SMALLINT_BIGINT": true,
+ "TEST_TABLE_TINYINT_REFERENCE_TABLE_TINYINT_REF": true
}
},
"store": {
@@ -59,7 +59,7 @@
"store_owner": true
},
"constraint": {
- "STORE_OWNER_ID_REFERENCE": true
+ "STORE_STORE_OWNER_ID_STORE_OWNER_OWNER_ID": true
}
},
"store_owner": {
diff --git a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/declarative_installer/column_modification.php b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/declarative_installer/column_modification.php
index a48a0a21b4f9b..a69e456ec4a8b 100644
--- a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/declarative_installer/column_modification.php
+++ b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/declarative_installer/column_modification.php
@@ -7,7 +7,7 @@
'auto_increment_test' => 'CREATE TABLE `auto_increment_test` (
`int_auto_increment_with_nullable` int(15) unsigned DEFAULT NULL,
`int_disabled_auto_increment` smallint(12) unsigned DEFAULT \'0\',
- UNIQUE KEY `unique_null_key` (`int_auto_increment_with_nullable`)
+ UNIQUE KEY `AUTO_INCREMENT_TEST_INT_AUTO_INCREMENT_WITH_NULLABLE` (`int_auto_increment_with_nullable`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8',
'reference_table' => 'CREATE TABLE `reference_table` (
`tinyint_ref` tinyint(7) NOT NULL AUTO_INCREMENT,
@@ -39,8 +39,9 @@
`mediumblob` mediumblob,
`blob` blob,
`boolean` tinyint(1) DEFAULT \'1\',
- UNIQUE KEY `some_unique_key` (`smallint`,`bigint`),
- KEY `speedup_index` (`tinyint`,`bigint`),
- CONSTRAINT `some_foreign_key` FOREIGN KEY (`tinyint`) REFERENCES `reference_table` (`tinyint_ref`) ON DELETE NO ACTION
+ UNIQUE KEY `TEST_TABLE_SMALLINT_BIGINT` (`smallint`,`bigint`),
+ KEY `TEST_TABLE_TINYINT_BIGINT` (`tinyint`,`bigint`),
+ CONSTRAINT `TEST_TABLE_TINYINT_REFERENCE_TABLE_TINYINT_REF` FOREIGN KEY (`tinyint`)
+REFERENCES `reference_table` (`tinyint_ref`) ON DELETE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8',
];
diff --git a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/declarative_installer/column_removal.php b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/declarative_installer/column_removal.php
index dea57d5d9a803..0091b89845a73 100644
--- a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/declarative_installer/column_removal.php
+++ b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/declarative_installer/column_removal.php
@@ -6,7 +6,7 @@
return [
'auto_increment_test' => 'CREATE TABLE `auto_increment_test` (
`int_auto_increment_with_nullable` int(12) unsigned NOT NULL AUTO_INCREMENT,
- UNIQUE KEY `unique_null_key` (`int_auto_increment_with_nullable`)
+ UNIQUE KEY `AUTO_INCREMENT_TEST_INT_AUTO_INCREMENT_WITH_NULLABLE` (`int_auto_increment_with_nullable`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8',
'reference_table' => 'CREATE TABLE `reference_table` (
`tinyint_ref` tinyint(7) NOT NULL AUTO_INCREMENT,
@@ -37,8 +37,9 @@
`blob` blob,
`boolean` tinyint(1) DEFAULT NULL,
`varbinary_rename` varbinary(255) DEFAULT \'10101\',
- UNIQUE KEY `some_unique_key` (`smallint`,`bigint`),
- KEY `speedup_index` (`tinyint`,`bigint`),
- CONSTRAINT `some_foreign_key` FOREIGN KEY (`tinyint`) REFERENCES `reference_table` (`tinyint_ref`) ON DELETE NO ACTION
+ UNIQUE KEY `TEST_TABLE_SMALLINT_BIGINT` (`smallint`,`bigint`),
+ KEY `TEST_TABLE_TINYINT_BIGINT` (`tinyint`,`bigint`),
+ CONSTRAINT `TEST_TABLE_TINYINT_REFERENCE_TABLE_TINYINT_REF` FOREIGN KEY (`tinyint`)
+REFERENCES `reference_table` (`tinyint_ref`) ON DELETE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8',
];
diff --git a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/declarative_installer/constraint_modification.php b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/declarative_installer/constraint_modification.php
index 26ba8848095b3..01e007edb7684 100644
--- a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/declarative_installer/constraint_modification.php
+++ b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/declarative_installer/constraint_modification.php
@@ -7,7 +7,7 @@
'auto_increment_test' => 'CREATE TABLE `auto_increment_test` (
`int_auto_increment_with_nullable` int(12) unsigned NOT NULL AUTO_INCREMENT,
`int_disabled_auto_increment` smallint(12) unsigned DEFAULT \'0\',
- UNIQUE KEY `unique_null_key` (`int_auto_increment_with_nullable`)
+ UNIQUE KEY `AUTO_INCREMENT_TEST_INT_AUTO_INCREMENT_WITH_NULLABLE` (`int_auto_increment_with_nullable`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8',
'reference_table' => 'CREATE TABLE `reference_table` (
`tinyint_ref` tinyint(7) NOT NULL AUTO_INCREMENT,
@@ -23,7 +23,7 @@
`bigint_not_default_not_nullable` bigint(2) unsigned NOT NULL,
`smallint_ref` smallint(254) NOT NULL DEFAULT \'0\',
PRIMARY KEY (`tinyint_ref`,`smallint_ref`),
- UNIQUE KEY `smallint_unique` (`smallint_ref`)
+ UNIQUE KEY `REFERENCE_TABLE_SMALLINT_REF` (`smallint_ref`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8',
'test_table' => 'CREATE TABLE `test_table` (
`smallint` smallint(3) DEFAULT NULL,
@@ -43,16 +43,16 @@
`boolean` tinyint(1) DEFAULT NULL,
`integer_main` int(12) unsigned DEFAULT NULL,
`smallint_main` smallint(254) NOT NULL DEFAULT \'0\',
- UNIQUE KEY `some_unique_key` (`smallint`,`float`),
- UNIQUE KEY `some_unique_key_2` (`double`),
- KEY `some_foreign_key_new` (`smallint_main`),
- KEY `some_foreign_key_without_action` (`integer_main`),
- KEY `speedup_index_renamed` (`tinyint`,`bigint`),
- CONSTRAINT `some_foreign_key` FOREIGN KEY (`tinyint`) REFERENCES `reference_table` (`tinyint_ref`)
-ON DELETE SET NULL,
- CONSTRAINT `some_foreign_key_new` FOREIGN KEY (`smallint_main`) REFERENCES `reference_table` (`smallint_ref`)
-ON DELETE CASCADE,
- CONSTRAINT `some_foreign_key_without_action` FOREIGN KEY (`integer_main`) REFERENCES `auto_increment_test`
-(`int_auto_increment_with_nullable`) ON DELETE CASCADE
+ UNIQUE KEY `TEST_TABLE_SMALLINT_FLOAT` (`smallint`,`float`),
+ UNIQUE KEY `TEST_TABLE_DOUBLE` (`double`),
+ KEY `TEST_TABLE_TINYINT_BIGINT` (`tinyint`,`bigint`),
+ KEY `TEST_TABLE_SMALLINT_MAIN_REFERENCE_TABLE_SMALLINT_REF` (`smallint_main`),
+ KEY `FK_FB77604C299EB8612D01E4AF8D9931F2` (`integer_main`),
+ CONSTRAINT `FK_FB77604C299EB8612D01E4AF8D9931F2` FOREIGN KEY (`integer_main`)
+REFERENCES `auto_increment_test` (`int_auto_increment_with_nullable`) ON DELETE CASCADE,
+ CONSTRAINT `TEST_TABLE_SMALLINT_MAIN_REFERENCE_TABLE_SMALLINT_REF` FOREIGN KEY (`smallint_main`)
+REFERENCES `reference_table` (`smallint_ref`) ON DELETE CASCADE,
+ CONSTRAINT `TEST_TABLE_TINYINT_REFERENCE_TABLE_TINYINT_REF` FOREIGN KEY (`tinyint`)
+REFERENCES `reference_table` (`tinyint_ref`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8',
];
diff --git a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/declarative_installer/installation.php b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/declarative_installer/installation.php
index 82f945070443f..3e807c25e3519 100644
--- a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/declarative_installer/installation.php
+++ b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/declarative_installer/installation.php
@@ -7,7 +7,7 @@
'auto_increment_test' => 'CREATE TABLE `auto_increment_test` (
`int_auto_increment_with_nullable` int(12) unsigned NOT NULL AUTO_INCREMENT,
`int_disabled_auto_increment` smallint(12) unsigned DEFAULT \'0\',
- UNIQUE KEY `unique_null_key` (`int_auto_increment_with_nullable`)
+ UNIQUE KEY `AUTO_INCREMENT_TEST_INT_AUTO_INCREMENT_WITH_NULLABLE` (`int_auto_increment_with_nullable`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8',
'reference_table' => 'CREATE TABLE `reference_table` (
`tinyint_ref` tinyint(7) NOT NULL AUTO_INCREMENT,
@@ -39,8 +39,9 @@
`mediumblob` mediumblob,
`blob` blob,
`boolean` tinyint(1) DEFAULT NULL,
- UNIQUE KEY `some_unique_key` (`smallint`,`bigint`),
- KEY `speedup_index` (`tinyint`,`bigint`),
- CONSTRAINT `some_foreign_key` FOREIGN KEY (`tinyint`) REFERENCES `reference_table` (`tinyint_ref`) ON DELETE NO ACTION
+ UNIQUE KEY `TEST_TABLE_SMALLINT_BIGINT` (`smallint`,`bigint`),
+ KEY `TEST_TABLE_TINYINT_BIGINT` (`tinyint`,`bigint`),
+ CONSTRAINT `TEST_TABLE_TINYINT_REFERENCE_TABLE_TINYINT_REF` FOREIGN KEY (`tinyint`)
+REFERENCES `reference_table` (`tinyint_ref`) ON DELETE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8',
];
diff --git a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/declarative_installer/rollback.php b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/declarative_installer/rollback.php
index aa80af695cc99..f5b98ce8a2735 100644
--- a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/declarative_installer/rollback.php
+++ b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/declarative_installer/rollback.php
@@ -10,8 +10,9 @@
'before' => [
'store' => 'CREATE TABLE `store` (
`store_owner_id` smallint(5) DEFAULT NULL COMMENT \'Store Owner Reference\',
- KEY `STORE_OWNER_ID_REFERENCE` (`store_owner_id`),
- CONSTRAINT `STORE_OWNER_ID_REFERENCE` FOREIGN KEY (`store_owner_id`) REFERENCES `store_owner` (`owner_id`) ON DELETE SET NULL
+ KEY `STORE_STORE_OWNER_ID_STORE_OWNER_OWNER_ID` (`store_owner_id`),
+ CONSTRAINT `STORE_STORE_OWNER_ID_STORE_OWNER_OWNER_ID` FOREIGN KEY (`store_owner_id`)
+REFERENCES `store_owner` (`owner_id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8',
'store_owner' => 'CREATE TABLE `store_owner` (
`owner_id` smallint(5) NOT NULL AUTO_INCREMENT,
diff --git a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/declarative_installer/table_removal.php b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/declarative_installer/table_removal.php
index 3b607574d167a..7bd0213c6590d 100644
--- a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/declarative_installer/table_removal.php
+++ b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/declarative_installer/table_removal.php
@@ -7,6 +7,6 @@
'auto_increment_test' => 'CREATE TABLE `auto_increment_test` (
`int_auto_increment_with_nullable` int(12) unsigned NOT NULL AUTO_INCREMENT,
`int_disabled_auto_increment` smallint(12) unsigned DEFAULT \'0\',
- UNIQUE KEY `unique_null_key` (`int_auto_increment_with_nullable`)
+ UNIQUE KEY `AUTO_INCREMENT_TEST_INT_AUTO_INCREMENT_WITH_NULLABLE` (`int_auto_increment_with_nullable`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8'
];
diff --git a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/dry_run_log.php b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/dry_run_log.php
index 43680b4218f66..e642e57701149 100644
--- a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/dry_run_log.php
+++ b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/dry_run_log.php
@@ -22,7 +22,7 @@
CREATE TABLE `auto_increment_test` (
`int_auto_increment_with_nullable` int(12) UNSIGNED NOT NULL AUTO_INCREMENT ,
`int_disabled_auto_increment` smallint(12) UNSIGNED NULL DEFAULT 0 ,
-CONSTRAINT `unique_null_key` UNIQUE KEY (`int_auto_increment_with_nullable`)
+CONSTRAINT `AUTO_INCREMENT_TEST_INT_AUTO_INCREMENT_WITH_NULLABLE` UNIQUE KEY (`int_auto_increment_with_nullable`)
) ENGINE=innodb DEFAULT CHARSET=utf8 DEFAULT COLLATE=utf8_general_ci
CREATE TABLE `test_table` (
@@ -41,9 +41,9 @@
`mediumblob` mediumblob NULL ,
`blob` blob NULL ,
`boolean` BOOLEAN NULL ,
-CONSTRAINT `some_unique_key` UNIQUE KEY (`smallint`,`bigint`),
-CONSTRAINT `some_foreign_key` FOREIGN KEY (`tinyint`) REFERENCES `reference_table` (`tinyint_ref`) ON DELETE NO ACTION,
-INDEX `speedup_index` (`tinyint`,`bigint`)
+CONSTRAINT `TEST_TABLE_SMALLINT_BIGINT` UNIQUE KEY (`smallint`,`bigint`),
+CONSTRAINT `TEST_TABLE_TINYINT_REFERENCE_TABLE_TINYINT_REF` FOREIGN KEY (`tinyint`) REFERENCES `reference_table` (`tinyint_ref`) ON DELETE NO ACTION,
+INDEX `TEST_TABLE_TINYINT_BIGINT` (`tinyint`,`bigint`)
) ENGINE=innodb DEFAULT CHARSET=utf8 DEFAULT COLLATE=utf8_general_ci
CREATE TABLE `patch_list` (
diff --git a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/foreign_key_interpreter_result.php b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/foreign_key_interpreter_result.php
index e912d9fb96f47..76fcf6b2fad11 100644
--- a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/foreign_key_interpreter_result.php
+++ b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/foreign_key_interpreter_result.php
@@ -31,9 +31,9 @@
],
],
'constraint' => [
- 'some_foreign_key' => [
+ 'TEST_TABLE_TINYINT_REFERENCE_TABLE_TINYINT_REF' => [
'type' => 'foreign',
- 'name' => 'some_foreign_key',
+ 'name' => 'TEST_TABLE_TINYINT_REFERENCE_TABLE_TINYINT_REF',
'column' => 'tinyint',
'table' => 'test_table',
'referenceTable' => 'reference_table',
diff --git a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/valid_xml_revision_1.php b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/valid_xml_revision_1.php
index 7aaf37ba156f5..cd42a1e8fc360 100644
--- a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/valid_xml_revision_1.php
+++ b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/valid_xml_revision_1.php
@@ -120,12 +120,12 @@
],
],
'constraint' => [
- 'unique_null_key' => [
+ 'AUTO_INCREMENT_TEST_INT_AUTO_INCREMENT_WITH_NULLABLE' => [
'column' => [
'int_auto_increment_with_nullable' => 'int_auto_increment_with_nullable',
],
'type' => 'unique',
- 'name' => 'unique_null_key',
+ 'name' => 'AUTO_INCREMENT_TEST_INT_AUTO_INCREMENT_WITH_NULLABLE',
],
],
'name' => 'auto_increment_test',
@@ -225,17 +225,17 @@
],
],
'constraint' => [
- 'some_unique_key' => [
+ 'TEST_TABLE_SMALLINT_BIGINT' => [
'column' => [
'smallint' => 'smallint',
'bigint' => 'bigint',
],
'type' => 'unique',
- 'name' => 'some_unique_key',
+ 'name' => 'TEST_TABLE_SMALLINT_BIGINT',
],
- 'some_foreign_key' => [
+ 'TEST_TABLE_TINYINT_REFERENCE_TABLE_TINYINT_REF' => [
'type' => 'foreign',
- 'name' => 'some_foreign_key',
+ 'name' => 'TEST_TABLE_TINYINT_REFERENCE_TABLE_TINYINT_REF',
'column' => 'tinyint',
'table' => 'test_table',
'referenceTable' => 'reference_table',
@@ -244,12 +244,12 @@
],
],
'index' => [
- 'speedup_index' => [
+ 'TEST_TABLE_TINYINT_BIGINT' => [
'column' => [
'tinyint' => 'tinyint',
'bigint' => 'bigint',
],
- 'name' => 'speedup_index',
+ 'name' => 'TEST_TABLE_TINYINT_BIGINT',
'indexType' => 'btree',
],
],
diff --git a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/base_update/InstallSchema.php b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/base_update/InstallSchema.php
new file mode 100644
index 0000000000000..22cfcd1fa2870
--- /dev/null
+++ b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/base_update/InstallSchema.php
@@ -0,0 +1,126 @@
+startSetup();
+
+ //Create first table
+ $table = $installer->getConnection()
+ ->newTable($installer->getTable('reference_table'))
+ ->addColumn(
+ 'smallint_ref',
+ \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT,
+ 3,
+ ['primary' => true, 'identity' => true, 'nullable' => false],
+ 'Smallint'
+ )
+ ->setComment('Reference table');
+ $installer->getConnection()->createTable($table);
+
+ $testTable = $installer->getConnection()->newTable($installer->getTable('test_table'))
+ ->addColumn(
+ 'smallint',
+ \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT,
+ 2,
+ ['nullable' => true, 'default' => 0],
+ 'Smallint'
+ )
+ ->addColumn(
+ 'bigint',
+ \Magento\Framework\DB\Ddl\Table::TYPE_BIGINT,
+ 10,
+ ['nullable' => true, 'unsigned' => false, 'default' => 0],
+ 'Bigint'
+ )
+ ->addColumn(
+ 'float',
+ \Magento\Framework\DB\Ddl\Table::TYPE_FLOAT,
+ null,
+ ['default' => 0],
+ 'Float'
+ )
+ ->addColumn(
+ 'date',
+ \Magento\Framework\DB\Ddl\Table::TYPE_DATE,
+ null,
+ [],
+ 'Date'
+ )
+ ->addColumn(
+ 'timestamp',
+ \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
+ null,
+ ['default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT_UPDATE],
+ 'Timestamp'
+ )
+ ->addColumn(
+ 'mediumtext',
+ \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
+ 11222222,
+ [],
+ 'Mediumtext'
+ )
+ ->addColumn(
+ 'varchar',
+ \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
+ 254,
+ ['nullable' => true],
+ 'Varchar'
+ )
+ ->addColumn(
+ 'boolean',
+ \Magento\Framework\DB\Ddl\Table::TYPE_BOOLEAN,
+ 1,
+ [],
+ 'Boolean'
+ )
+ ->addIndex(
+ $installer->getIdxName('test_table', ['smallint', 'bigint']),
+ ['smallint', 'bigint'],
+ ['type' => \Magento\Framework\DB\Adapter\Pdo\Mysql::INDEX_TYPE_UNIQUE]
+ )
+ ->addIndex(
+ $installer->getIdxName('test_table', ['bigint']),
+ ['bigint']
+ )
+ ->addForeignKey(
+ $installer->getFkName(
+ $installer->getTable('test_table'),
+ 'smallint',
+ 'reference_table',
+ 'smallint_ref'
+ ),
+ 'smallint',
+ $installer->getTable('reference_table'),
+ 'smallint_ref',
+ \Magento\Framework\DB\Ddl\Table::ACTION_CASCADE
+ )
+ ->setComment('Test Table');
+ $installer->getConnection()->createTable($testTable);
+
+ $installer->endSetup();
+ }
+}
diff --git a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/base_update/db_schema.xml b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/base_update/db_schema.xml
new file mode 100644
index 0000000000000..7384c4ed7baab
--- /dev/null
+++ b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/base_update/db_schema.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/before_rollback/db_schema.xml b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/before_rollback/db_schema.xml
index 242b555a14949..4d3d51b9c0237 100644
--- a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/before_rollback/db_schema.xml
+++ b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/before_rollback/db_schema.xml
@@ -10,7 +10,7 @@
diff --git a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/column_modifications/db_schema.xml b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/column_modifications/db_schema.xml
index a748af135c209..0adcd5c52f962 100644
--- a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/column_modifications/db_schema.xml
+++ b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/column_modifications/db_schema.xml
@@ -29,7 +29,7 @@
-
+
@@ -52,14 +52,15 @@
-
+
-
-
+
diff --git a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/column_removals/db_schema.xml b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/column_removals/db_schema.xml
index e7361dd28fc0a..4b78f436eab37 100644
--- a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/column_removals/db_schema.xml
+++ b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/column_removals/db_schema.xml
@@ -27,7 +27,7 @@
@@ -50,14 +50,15 @@
-
+
-
-
+
diff --git a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/column_removals/db_schema_whitelist.json b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/column_removals/db_schema_whitelist.json
index 890fea33106b7..9105a2b0b25cb 100644
--- a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/column_removals/db_schema_whitelist.json
+++ b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/column_removals/db_schema_whitelist.json
@@ -23,7 +23,7 @@
"int_disabled_auto_increment": true
},
"constraint": {
- "unique_null_key": true
+ "AUTO_INCREMENT_TEST_INT_AUTO_INCREMENT_WITH_NULLABLE": true
}
},
"test_table": {
@@ -46,11 +46,11 @@
"varbinary_rename": true
},
"index": {
- "speedup_index": true
+ "TEST_TABLE_TINYINT_BIGINT": true
},
"constraint": {
- "some_unique_key": true,
- "some_foreign_key": true
+ "TEST_TABLE_SMALLINT_BIGINT": true,
+ "TEST_TABLE_TINYINT_REFERENCE_TABLE_TINYINT_REF": true
}
}
}
diff --git a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/constraint_modifications/db_schema.xml b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/constraint_modifications/db_schema.xml
index 97f1862e14028..68f2810e8eed7 100644
--- a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/constraint_modifications/db_schema.xml
+++ b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/constraint_modifications/db_schema.xml
@@ -26,7 +26,7 @@
-
+
@@ -35,7 +35,7 @@
nullable="true"/>
-
+
@@ -60,21 +60,23 @@
-
+
-
+
-
-
-
+
diff --git a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/constraint_modifications/db_schema_whitelist.json b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/constraint_modifications/db_schema_whitelist.json
index bcae522f68995..16ff756ef552a 100644
--- a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/constraint_modifications/db_schema_whitelist.json
+++ b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/constraint_modifications/db_schema_whitelist.json
@@ -23,7 +23,7 @@
"int_disabled_auto_increment": true
},
"constraint": {
- "unique_null_key": true
+ "AUTO_INCREMENT_TEST_INT_AUTO_INCREMENT_WITH_NULLABLE": true
}
},
"test_table": {
@@ -46,11 +46,11 @@
"varbinary_rename": true
},
"index": {
- "speedup_index": true
+ "TEST_TABLE_TINYINT_BIGINT": true
},
"constraint": {
- "some_unique_key": true,
- "some_foreign_key": true
+ "TEST_TABLE_SMALLINT_BIGINT": true,
+ "TEST_TABLE_TINYINT_REFERENCE_TABLE_TINYINT_REF": true
}
}
}
diff --git a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/drop_table/db_schema.xml b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/drop_table/db_schema.xml
index 57403cbea3fdc..0a0131e500641 100644
--- a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/drop_table/db_schema.xml
+++ b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/drop_table/db_schema.xml
@@ -12,7 +12,7 @@
nullable="true"/>
-
+
diff --git a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/foreign_key_interpreter/db_schema.xml b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/foreign_key_interpreter/db_schema.xml
index 2b8b162bf2a9e..e4a5ca05d02fe 100644
--- a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/foreign_key_interpreter/db_schema.xml
+++ b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/foreign_key_interpreter/db_schema.xml
@@ -12,7 +12,8 @@
diff --git a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/old_diff/InstallSchema.php b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/old_diff/InstallSchema.php
index 3b73610f18270..8678218a51e05 100644
--- a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/old_diff/InstallSchema.php
+++ b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/old_diff/InstallSchema.php
@@ -97,16 +97,21 @@ public function install(SchemaSetupInterface $setup, ModuleContextInterface $con
'Boolean'
)
->addIndex(
- 'some_unique_key',
+ $installer->getIdxName($installer->getTable('test_table'), ['smallint', 'bigint']),
['smallint', 'bigint'],
['type' => \Magento\Framework\DB\Adapter\Pdo\Mysql::INDEX_TYPE_UNIQUE]
)
->addIndex(
- 'speedup_index',
+ $installer->getIdxName($installer->getTable('test_table'), ['bigint']),
['bigint']
)
->addForeignKey(
- 'some_foreign_key',
+ $installer->getFkName(
+ $installer->getTable('test_table'),
+ 'smallint',
+ $installer->getTable('reference_table'),
+ 'smallint_ref'
+ ),
'smallint',
$installer->getTable('reference_table'),
'smallint_ref',
diff --git a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/old_diff/db_schema.xml b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/old_diff/db_schema.xml
index 97b375d228e0c..6b92440ca92f5 100644
--- a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/old_diff/db_schema.xml
+++ b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/revisions/old_diff/db_schema.xml
@@ -22,13 +22,14 @@
-
+
-
-
+
diff --git a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule3/etc/db_schema.xml b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule3/etc/db_schema.xml
index 00b5d6f9bb27d..b6ff634e6ef1d 100644
--- a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule3/etc/db_schema.xml
+++ b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule3/etc/db_schema.xml
@@ -21,7 +21,8 @@
-
diff --git a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule5/etc/db_schema.xml b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule5/etc/db_schema.xml
index 00b5d6f9bb27d..b6ff634e6ef1d 100644
--- a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule5/etc/db_schema.xml
+++ b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule5/etc/db_schema.xml
@@ -21,7 +21,8 @@
-
diff --git a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule6/etc/db_schema.xml b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule6/etc/db_schema.xml
index 3eeb141c2e606..9263004c6e7f6 100644
--- a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule6/etc/db_schema.xml
+++ b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule6/etc/db_schema.xml
@@ -30,7 +30,7 @@
nullable="true"/>
-
+
@@ -53,14 +53,15 @@
-
+
-
-
+
diff --git a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule6/etc/db_schema_whitelist.json b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule6/etc/db_schema_whitelist.json
index 890fea33106b7..9105a2b0b25cb 100644
--- a/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule6/etc/db_schema_whitelist.json
+++ b/dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule6/etc/db_schema_whitelist.json
@@ -23,7 +23,7 @@
"int_disabled_auto_increment": true
},
"constraint": {
- "unique_null_key": true
+ "AUTO_INCREMENT_TEST_INT_AUTO_INCREMENT_WITH_NULLABLE": true
}
},
"test_table": {
@@ -46,11 +46,11 @@
"varbinary_rename": true
},
"index": {
- "speedup_index": true
+ "TEST_TABLE_TINYINT_BIGINT": true
},
"constraint": {
- "some_unique_key": true,
- "some_foreign_key": true
+ "TEST_TABLE_SMALLINT_BIGINT": true,
+ "TEST_TABLE_TINYINT_REFERENCE_TABLE_TINYINT_REF": true
}
}
}
diff --git a/dev/tests/setup-integration/framework/Magento/TestFramework/Annotation/ReinstallInstance.php b/dev/tests/setup-integration/framework/Magento/TestFramework/Annotation/ReinstallInstance.php
index 6f7949861928e..e3825db2bd1f1 100644
--- a/dev/tests/setup-integration/framework/Magento/TestFramework/Annotation/ReinstallInstance.php
+++ b/dev/tests/setup-integration/framework/Magento/TestFramework/Annotation/ReinstallInstance.php
@@ -33,12 +33,12 @@ public function __construct(\Magento\TestFramework\Application $application)
public function startTest()
{
- $this->application->reinitialize();
/** @var ObjectManager $objectManager */
$objectManager = Bootstrap::getObjectManager();
$resourceConnection = $objectManager->create(ResourceConnection::class);
$objectManager->removeSharedInstance(ResourceConnection::class);
$objectManager->addSharedInstance($resourceConnection, ResourceConnection::class);
+ $this->application->reinitialize();
}
/**
diff --git a/dev/tests/setup-integration/testsuite/Magento/Setup/BCMultiModuleTest.php b/dev/tests/setup-integration/testsuite/Magento/Setup/BCMultiModuleTest.php
index 6ea79f9628e39..f40339fd02439 100644
--- a/dev/tests/setup-integration/testsuite/Magento/Setup/BCMultiModuleTest.php
+++ b/dev/tests/setup-integration/testsuite/Magento/Setup/BCMultiModuleTest.php
@@ -7,14 +7,12 @@
namespace Magento\Setup;
use Magento\Framework\Module\DbVersionInfo;
-use Magento\Framework\Module\ModuleList;
use Magento\Framework\Module\ModuleResource;
use Magento\Framework\Setup\Declaration\Schema\Db\DbSchemaReaderInterface;
use Magento\TestFramework\Deploy\CliCommand;
use Magento\TestFramework\Deploy\TableData;
use Magento\TestFramework\Deploy\TestModuleManager;
use Magento\TestFramework\Helper\Bootstrap;
-use Magento\TestFramework\ObjectManager;
use Magento\TestFramework\TestCase\SetupTestCase;
/**
@@ -77,7 +75,7 @@ public function testFirstCleanInstall()
//Check if declaration is applied
$indexes = $this->dbSchemaReader->readIndexes('test_table', 'default');
self::assertCount(1, $indexes);
- self::assertArrayHasKey('speedup_index', $indexes);
+ self::assertArrayHasKey('TEST_TABLE_TINYINT_BIGINT', $indexes);
//Check UpgradeSchema old format, that modify declaration
$columns = $this->dbSchemaReader->readColumns('test_table', 'default');
$floatColumn = $columns['float'];
@@ -199,4 +197,69 @@ public function testDSFirstRelease()
$tables = $this->dbSchemaReader->readTables('default');
self::assertNotContains('custom_table', $tables);
}
+
+ /**
+ * @moduleName Magento_TestSetupDeclarationModule1
+ * @dataProvider firstCleanInstallOneModuleDataProvider
+ * @param string $dbPrefix
+ * @param string $tableName
+ * @param string $indexName
+ * @param string $constraintName
+ * @param string $foreignKeyName
+ * @throws \Exception
+ */
+ public function testFirstCleanInstallOneModule(
+ string $dbPrefix,
+ string $tableName,
+ string $indexName,
+ string $constraintName,
+ string $foreignKeyName
+ ) {
+ $this->cliCommand->install(
+ [
+ 'Magento_TestSetupDeclarationModule1'
+ ],
+ [
+ 'db-prefix' => $dbPrefix,
+ ]
+ );
+
+ $indexes = $this->dbSchemaReader
+ ->readIndexes($tableName, 'default');
+ self::assertCount(1, $indexes);
+ self::assertArrayHasKey($indexName, $indexes);
+
+ $constraints = $this->dbSchemaReader
+ ->readConstraints($tableName, 'default');
+ self::assertCount(1, $constraints);
+ self::assertArrayHasKey($constraintName, $constraints);
+
+ $foreignKeys = $this->dbSchemaReader
+ ->readReferences($tableName, 'default');
+ self::assertCount(1, $foreignKeys);
+ self::assertArrayHasKey($foreignKeyName, $foreignKeys);
+ }
+
+ /**
+ * @return array
+ */
+ public function firstCleanInstallOneModuleDataProvider()
+ {
+ return [
+ 'Installation without db prefix' => [
+ 'dbPrefix' => '',
+ 'tableName' => 'test_table',
+ 'indexName' => 'TEST_TABLE_TINYINT_BIGINT',
+ 'constraintName' => 'TEST_TABLE_SMALLINT_BIGINT',
+ 'foreignKeyName' => 'TEST_TABLE_TINYINT_REFERENCE_TABLE_TINYINT_REF',
+ ],
+ 'Installation with db prefix' => [
+ 'dbPrefix' => 'spec_',
+ 'tableName' => 'spec_test_table',
+ 'indexName' => 'SPEC_TEST_TABLE_TINYINT_BIGINT',
+ 'constraintName' => 'SPEC_TEST_TABLE_SMALLINT_BIGINT',
+ 'foreignKeyName' => 'SPEC_TEST_TABLE_TINYINT_SPEC_REFERENCE_TABLE_TINYINT_REF',
+ ]
+ ];
+ }
}
diff --git a/dev/tests/setup-integration/testsuite/Magento/Setup/DeclarativeInstallerTest.php b/dev/tests/setup-integration/testsuite/Magento/Setup/DeclarativeInstallerTest.php
index 2bdf85bc95217..34d432e566fec 100644
--- a/dev/tests/setup-integration/testsuite/Magento/Setup/DeclarativeInstallerTest.php
+++ b/dev/tests/setup-integration/testsuite/Magento/Setup/DeclarativeInstallerTest.php
@@ -80,7 +80,7 @@ public function testInstallation()
//Second time installation should not find anything as we do not change anything
self::assertNull($diff->getAll());
$shardData = $this->describeTable->describeShard(Sharding::DEFAULT_CONNECTION);
- self::assertEquals($this->getData(), $shardData);
+ self::assertEquals($this->getTrimmedData(), $shardData);
}
/**
@@ -111,7 +111,7 @@ public function testInstallationWithColumnsModification()
);
self::assertNull($diff->getAll());
$shardData = $this->describeTable->describeShard(Sharding::DEFAULT_CONNECTION);
- self::assertEquals($this->getData(), $shardData);
+ self::assertEquals($this->getTrimmedData(), $shardData);
}
/**
@@ -157,7 +157,7 @@ public function testInstallationWithColumnsRemoval()
);
self::assertNull($diff->getAll());
$shardData = $this->describeTable->describeShard(Sharding::DEFAULT_CONNECTION);
- self::assertEquals($this->getData(), $shardData);
+ self::assertEquals($this->getTrimmedData(), $shardData);
}
/**
@@ -243,7 +243,7 @@ public function testInstallWithCodeBaseRollback()
['Magento_TestSetupDeclarationModule1']
);
$beforeRollback = $this->describeTable->describeShard('default');
- self::assertEquals($this->getData()['before'], $beforeRollback);
+ self::assertEquals($this->getTrimmedData()['before'], $beforeRollback);
//Move db_schema.xml file and tried to install
$this->moduleManager->updateRevision(
'Magento_TestSetupDeclarationModule1',
diff --git a/dev/tests/setup-integration/testsuite/Magento/Setup/DeclarativeSchemaBuilderTest.php b/dev/tests/setup-integration/testsuite/Magento/Setup/DeclarativeSchemaBuilderTest.php
index 07544c25c45e4..d4126d9d1e16c 100644
--- a/dev/tests/setup-integration/testsuite/Magento/Setup/DeclarativeSchemaBuilderTest.php
+++ b/dev/tests/setup-integration/testsuite/Magento/Setup/DeclarativeSchemaBuilderTest.php
@@ -79,7 +79,7 @@ public function testSchemaBuilder()
/**
* @var Reference $foreignKey
*/
- $foreignKey = $testTable->getConstraintByName('some_foreign_key');
+ $foreignKey = $testTable->getConstraintByName('TEST_TABLE_TINYINT_REFERENCE_TABLE_TINYINT_REF');
self::assertEquals('NO ACTION', $foreignKey->getOnDelete());
self::assertEquals('tinyint_ref', $foreignKey->getReferenceColumn()->getName());
}
diff --git a/dev/tests/setup-integration/testsuite/Magento/Setup/DiffOldSchemaTest.php b/dev/tests/setup-integration/testsuite/Magento/Setup/DiffOldSchemaTest.php
index 3fb117896eaa9..0521a832ae392 100644
--- a/dev/tests/setup-integration/testsuite/Magento/Setup/DiffOldSchemaTest.php
+++ b/dev/tests/setup-integration/testsuite/Magento/Setup/DiffOldSchemaTest.php
@@ -96,6 +96,58 @@ public function testOldDiff()
);
}
+ /**
+ * @moduleName Magento_TestSetupDeclarationModule1
+ * @param string $dbPrefix
+ * @throws \Exception
+ * @dataProvider oldSchemaUpgradeDataProvider
+ */
+ public function testOldSchemaUpgrade(string $dbPrefix)
+ {
+ $this->moduleManager->updateRevision(
+ 'Magento_TestSetupDeclarationModule1',
+ 'old_diff_before',
+ 'db_schema.xml',
+ 'etc'
+ );
+ $this->moduleManager->updateRevision(
+ 'Magento_TestSetupDeclarationModule1',
+ 'base_update',
+ 'InstallSchema.php',
+ 'Setup'
+ );
+ $this->cliCommad->install(
+ ['Magento_TestSetupDeclarationModule1'],
+ ['db-prefix' => $dbPrefix]
+ );
+ //Move db_schema.xml
+ $this->moduleManager->updateRevision(
+ 'Magento_TestSetupDeclarationModule1',
+ 'base_update',
+ 'db_schema.xml',
+ 'etc'
+ );
+ $declarativeSchema = $this->schemaConfig->getDeclarationConfig();
+ $generatedSchema = $this->schemaConfig->getDbConfig();
+ $diff = $this->schemaDiff->diff($declarativeSchema, $generatedSchema);
+ self::assertEmpty($diff->getAll());
+ }
+
+ /**
+ * @return array
+ */
+ public function oldSchemaUpgradeDataProvider(): array
+ {
+ return [
+ 'Without db prefix' => [
+ 'dbPrefix' => '',
+ ],
+ 'With db prefix' => [
+ 'dbPrefix' => 'spec_',
+ ],
+ ];
+ }
+
/**
* @return array
*/
diff --git a/dev/tests/static/framework/Magento/TestFramework/Utility/ChangedFiles.php b/dev/tests/static/framework/Magento/TestFramework/Utility/ChangedFiles.php
index 6470bc0c22086..3d7f5f2604d7a 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 e33b771b3c645..c552e0daa97df 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 8048925a4e542..5877ee5cbcc48 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/tools/UpgradeScripts/pre_composer_update_2.3.php b/dev/tools/UpgradeScripts/pre_composer_update_2.3.php
new file mode 100644
index 0000000000000..6fe629e717b93
--- /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/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessor/FilterProcessor.php b/lib/internal/Magento/Framework/Api/SearchCriteria/CollectionProcessor/FilterProcessor.php
index b663a3a2f733c..c9f10c183b50c 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 7e8d79eead7e1..b0dfc50e9f972 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 ccf9838d6649f..e2a070503f61f 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 7a9814bcd6932..5d4f18037d023 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/Bulk/OperationInterface.php b/lib/internal/Magento/Framework/Bulk/OperationInterface.php
index 4b626ac659626..c1cac9f171430 100644
--- a/lib/internal/Magento/Framework/Bulk/OperationInterface.php
+++ b/lib/internal/Magento/Framework/Bulk/OperationInterface.php
@@ -10,7 +10,7 @@
* @api
* @since 100.2.0
*/
-interface OperationInterface
+interface OperationInterface extends \Magento\Framework\Api\ExtensibleDataInterface
{
/**#@+
* Constants for keys of data array. Identical to the name of the getter in snake case
diff --git a/lib/internal/Magento/Framework/Data/Collection/Filesystem.php b/lib/internal/Magento/Framework/Data/Collection/Filesystem.php
index 67d2a020864dd..330ff4e975e8a 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/Filesystem/Io/File.php b/lib/internal/Magento/Framework/Filesystem/Io/File.php
index 7849fdf31031f..c1cfebc7a0ac1 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/Logger/Handler/Syslog.php b/lib/internal/Magento/Framework/Logger/Handler/Syslog.php
new file mode 100644
index 0000000000000..4964cc45f85d7
--- /dev/null
+++ b/lib/internal/Magento/Framework/Logger/Handler/Syslog.php
@@ -0,0 +1,28 @@
+name = $name;
return $this;
}
+
+ /**
+ * @param string $key Key is used as index
+ * @param string $value
+ * @return void
+ */
+ public function setData(string $key, string $value)
+ {
+ $this->data[$key] = $value;
+ }
+
+ /**
+ * @param array $data
+ * @return void
+ */
+ public function addData(array $data)
+ {
+ $this->data = $data;
+ }
+
+ /**
+ * @param TSampleInterface[] $list
+ * @return void
+ */
+ public function addObjectList(array $list)
+ {
+ $this->data['objects'] = $list;
+ }
}
diff --git a/lib/internal/Magento/Framework/Reflection/Test/Unit/TypeProcessorTest.php b/lib/internal/Magento/Framework/Reflection/Test/Unit/TypeProcessorTest.php
index 4543b3b6eec12..4a61d003e32a8 100644
--- a/lib/internal/Magento/Framework/Reflection/Test/Unit/TypeProcessorTest.php
+++ b/lib/internal/Magento/Framework/Reflection/Test/Unit/TypeProcessorTest.php
@@ -8,24 +8,22 @@
use Magento\Framework\Exception\SerializationException;
use Magento\Framework\Reflection\Test\Unit\Fixture\TSample;
+use Magento\Framework\Reflection\TypeProcessor;
use Zend\Code\Reflection\ClassReflection;
-/**
- * Type processor Test
- */
class TypeProcessorTest extends \PHPUnit\Framework\TestCase
{
/**
- * @var \Magento\Framework\Reflection\TypeProcessor
+ * @var TypeProcessor
*/
- protected $_typeProcessor;
+ private $typeProcessor;
/**
* Set up helper.
*/
protected function setUp()
{
- $this->_typeProcessor = new \Magento\Framework\Reflection\TypeProcessor();
+ $this->typeProcessor = new TypeProcessor();
}
/**
@@ -33,11 +31,11 @@ protected function setUp()
*/
public function testGetTypesData()
{
- $this->_typeProcessor->setTypeData('typeA', ['dataA']);
- $this->_typeProcessor->setTypeData('typeB', ['dataB']);
+ $this->typeProcessor->setTypeData('typeA', ['dataA']);
+ $this->typeProcessor->setTypeData('typeB', ['dataB']);
$this->assertEquals(
['typeA' => ['dataA'], 'typeB' => ['dataB']],
- $this->_typeProcessor->getTypesData()
+ $this->typeProcessor->getTypesData()
);
}
@@ -46,11 +44,11 @@ public function testGetTypesData()
*/
public function testSetTypesData()
{
- $this->_typeProcessor->setTypeData('typeC', ['dataC']);
- $this->assertEquals(['typeC' => ['dataC']], $this->_typeProcessor->getTypesData());
+ $this->typeProcessor->setTypeData('typeC', ['dataC']);
+ $this->assertEquals(['typeC' => ['dataC']], $this->typeProcessor->getTypesData());
$typeData = ['typeA' => ['dataA'], 'typeB' => ['dataB']];
- $this->_typeProcessor->setTypesData($typeData);
- $this->assertEquals($typeData, $this->_typeProcessor->getTypesData());
+ $this->typeProcessor->setTypesData($typeData);
+ $this->assertEquals($typeData, $this->typeProcessor->getTypesData());
}
/**
@@ -59,7 +57,7 @@ public function testSetTypesData()
*/
public function testGetTypeDataInvalidArgumentException()
{
- $this->_typeProcessor->getTypeData('NonExistentType');
+ $this->typeProcessor->getTypeData('NonExistentType');
}
/**
@@ -67,8 +65,8 @@ public function testGetTypeDataInvalidArgumentException()
*/
public function testGetTypeData()
{
- $this->_typeProcessor->setTypeData('typeA', ['dataA']);
- $this->assertEquals(['dataA'], $this->_typeProcessor->getTypeData('typeA'));
+ $this->typeProcessor->setTypeData('typeA', ['dataA']);
+ $this->assertEquals(['dataA'], $this->typeProcessor->getTypeData('typeA'));
}
/**
@@ -76,85 +74,88 @@ public function testGetTypeData()
*/
public function testSetTypeDataArrayMerge()
{
- $this->_typeProcessor->setTypeData('typeA', ['dataA1']);
- $this->_typeProcessor->setTypeData('typeA', ['dataA2']);
- $this->_typeProcessor->setTypeData('typeA', ['dataA3']);
- $this->_typeProcessor->setTypeData('typeA', [null]);
- $this->assertEquals(['dataA1', 'dataA2', 'dataA3', null], $this->_typeProcessor->getTypeData('typeA'));
+ $this->typeProcessor->setTypeData('typeA', ['dataA1']);
+ $this->typeProcessor->setTypeData('typeA', ['dataA2']);
+ $this->typeProcessor->setTypeData('typeA', ['dataA3']);
+ $this->typeProcessor->setTypeData('typeA', [null]);
+ $this->assertEquals(
+ ['dataA1', 'dataA2', 'dataA3', null],
+ $this->typeProcessor->getTypeData('typeA')
+ );
}
public function testNormalizeType()
{
- $this->assertEquals('blah', $this->_typeProcessor->normalizeType('blah'));
- $this->assertEquals('string', $this->_typeProcessor->normalizeType('str'));
- $this->assertEquals('int', $this->_typeProcessor->normalizeType('integer'));
- $this->assertEquals('boolean', $this->_typeProcessor->normalizeType('bool'));
- $this->assertEquals('anyType', $this->_typeProcessor->normalizeType('mixed'));
+ $this->assertEquals('blah', $this->typeProcessor->normalizeType('blah'));
+ $this->assertEquals('string', $this->typeProcessor->normalizeType('str'));
+ $this->assertEquals('int', $this->typeProcessor->normalizeType('integer'));
+ $this->assertEquals('boolean', $this->typeProcessor->normalizeType('bool'));
+ $this->assertEquals('anyType', $this->typeProcessor->normalizeType('mixed'));
}
public function testIsTypeSimple()
{
- $this->assertTrue($this->_typeProcessor->isTypeSimple('string'));
- $this->assertTrue($this->_typeProcessor->isTypeSimple('string[]'));
- $this->assertTrue($this->_typeProcessor->isTypeSimple('int'));
- $this->assertTrue($this->_typeProcessor->isTypeSimple('float'));
- $this->assertTrue($this->_typeProcessor->isTypeSimple('double'));
- $this->assertTrue($this->_typeProcessor->isTypeSimple('boolean'));
- $this->assertFalse($this->_typeProcessor->isTypeSimple('blah'));
+ $this->assertTrue($this->typeProcessor->isTypeSimple('string'));
+ $this->assertTrue($this->typeProcessor->isTypeSimple('string[]'));
+ $this->assertTrue($this->typeProcessor->isTypeSimple('int'));
+ $this->assertTrue($this->typeProcessor->isTypeSimple('float'));
+ $this->assertTrue($this->typeProcessor->isTypeSimple('double'));
+ $this->assertTrue($this->typeProcessor->isTypeSimple('boolean'));
+ $this->assertFalse($this->typeProcessor->isTypeSimple('blah'));
}
public function testIsTypeAny()
{
- $this->assertTrue($this->_typeProcessor->isTypeAny('mixed'));
- $this->assertTrue($this->_typeProcessor->isTypeAny('mixed[]'));
- $this->assertFalse($this->_typeProcessor->isTypeAny('int'));
- $this->assertFalse($this->_typeProcessor->isTypeAny('int[]'));
+ $this->assertTrue($this->typeProcessor->isTypeAny('mixed'));
+ $this->assertTrue($this->typeProcessor->isTypeAny('mixed[]'));
+ $this->assertFalse($this->typeProcessor->isTypeAny('int'));
+ $this->assertFalse($this->typeProcessor->isTypeAny('int[]'));
}
public function testIsArrayType()
{
- $this->assertFalse($this->_typeProcessor->isArrayType('string'));
- $this->assertTrue($this->_typeProcessor->isArrayType('string[]'));
+ $this->assertFalse($this->typeProcessor->isArrayType('string'));
+ $this->assertTrue($this->typeProcessor->isArrayType('string[]'));
}
public function testIsValidTypeDeclaration()
{
- $this->assertTrue($this->_typeProcessor->isValidTypeDeclaration('Traversable')); // Interface
- $this->assertTrue($this->_typeProcessor->isValidTypeDeclaration('stdObj')); // Class
- $this->assertTrue($this->_typeProcessor->isValidTypeDeclaration('array'));
- $this->assertTrue($this->_typeProcessor->isValidTypeDeclaration('callable'));
- $this->assertTrue($this->_typeProcessor->isValidTypeDeclaration('self'));
- $this->assertTrue($this->_typeProcessor->isValidTypeDeclaration('self'));
- $this->assertFalse($this->_typeProcessor->isValidTypeDeclaration('string'));
- $this->assertFalse($this->_typeProcessor->isValidTypeDeclaration('string[]'));
- $this->assertFalse($this->_typeProcessor->isValidTypeDeclaration('int'));
- $this->assertFalse($this->_typeProcessor->isValidTypeDeclaration('float'));
- $this->assertFalse($this->_typeProcessor->isValidTypeDeclaration('double'));
- $this->assertFalse($this->_typeProcessor->isValidTypeDeclaration('boolean'));
- $this->assertFalse($this->_typeProcessor->isValidTypeDeclaration('[]'));
- $this->assertFalse($this->_typeProcessor->isValidTypeDeclaration('mixed[]'));
- $this->assertFalse($this->_typeProcessor->isValidTypeDeclaration('stdObj[]'));
- $this->assertFalse($this->_typeProcessor->isValidTypeDeclaration('Traversable[]'));
+ $this->assertTrue($this->typeProcessor->isValidTypeDeclaration('Traversable')); // Interface
+ $this->assertTrue($this->typeProcessor->isValidTypeDeclaration('stdObj')); // Class
+ $this->assertTrue($this->typeProcessor->isValidTypeDeclaration('array'));
+ $this->assertTrue($this->typeProcessor->isValidTypeDeclaration('callable'));
+ $this->assertTrue($this->typeProcessor->isValidTypeDeclaration('self'));
+ $this->assertTrue($this->typeProcessor->isValidTypeDeclaration('self'));
+ $this->assertFalse($this->typeProcessor->isValidTypeDeclaration('string'));
+ $this->assertFalse($this->typeProcessor->isValidTypeDeclaration('string[]'));
+ $this->assertFalse($this->typeProcessor->isValidTypeDeclaration('int'));
+ $this->assertFalse($this->typeProcessor->isValidTypeDeclaration('float'));
+ $this->assertFalse($this->typeProcessor->isValidTypeDeclaration('double'));
+ $this->assertFalse($this->typeProcessor->isValidTypeDeclaration('boolean'));
+ $this->assertFalse($this->typeProcessor->isValidTypeDeclaration('[]'));
+ $this->assertFalse($this->typeProcessor->isValidTypeDeclaration('mixed[]'));
+ $this->assertFalse($this->typeProcessor->isValidTypeDeclaration('stdObj[]'));
+ $this->assertFalse($this->typeProcessor->isValidTypeDeclaration('Traversable[]'));
}
public function getArrayItemType()
{
- $this->assertEquals('string', $this->_typeProcessor->getArrayItemType('str[]'));
- $this->assertEquals('string', $this->_typeProcessor->getArrayItemType('string[]'));
- $this->assertEquals('integer', $this->_typeProcessor->getArrayItemType('int[]'));
- $this->assertEquals('boolean', $this->_typeProcessor->getArrayItemType('bool[]'));
- $this->assertEquals('any', $this->_typeProcessor->getArrayItemType('mixed[]'));
+ $this->assertEquals('string', $this->typeProcessor->getArrayItemType('str[]'));
+ $this->assertEquals('string', $this->typeProcessor->getArrayItemType('string[]'));
+ $this->assertEquals('integer', $this->typeProcessor->getArrayItemType('int[]'));
+ $this->assertEquals('boolean', $this->typeProcessor->getArrayItemType('bool[]'));
+ $this->assertEquals('any', $this->typeProcessor->getArrayItemType('mixed[]'));
}
public function testTranslateTypeName()
{
$this->assertEquals(
'TestModule1V1EntityItem',
- $this->_typeProcessor->translateTypeName(\Magento\TestModule1\Service\V1\Entity\Item::class)
+ $this->typeProcessor->translateTypeName(\Magento\TestModule1\Service\V1\Entity\Item::class)
);
$this->assertEquals(
'TestModule3V1EntityParameter[]',
- $this->_typeProcessor->translateTypeName('\Magento\TestModule3\Service\V1\Entity\Parameter[]')
+ $this->typeProcessor->translateTypeName('\Magento\TestModule3\Service\V1\Entity\Parameter[]')
);
}
@@ -164,47 +165,47 @@ public function testTranslateTypeName()
*/
public function testTranslateTypeNameInvalidArgumentException()
{
- $this->_typeProcessor->translateTypeName('\Magento\TestModule3\V1\Parameter[]');
+ $this->typeProcessor->translateTypeName('\Magento\TestModule3\V1\Parameter[]');
}
public function testTranslateArrayTypeName()
{
- $this->assertEquals('ArrayOfComplexType', $this->_typeProcessor->translateArrayTypeName('complexType'));
+ $this->assertEquals('ArrayOfComplexType', $this->typeProcessor->translateArrayTypeName('complexType'));
}
public function testProcessSimpleTypeIntToString()
{
$value = 1;
$type = 'string';
- $this->assertSame('1', $this->_typeProcessor->processSimpleAndAnyType($value, $type));
+ $this->assertSame('1', $this->typeProcessor->processSimpleAndAnyType($value, $type));
}
public function testProcessSimpleTypeStringToInt()
{
$value = '1';
$type = 'int';
- $this->assertSame(1, $this->_typeProcessor->processSimpleAndAnyType($value, $type));
+ $this->assertSame(1, $this->typeProcessor->processSimpleAndAnyType($value, $type));
}
public function testProcessSimpleTypeMixed()
{
$value = 1;
$type = 'mixed';
- $this->assertSame(1, $this->_typeProcessor->processSimpleAndAnyType($value, $type));
+ $this->assertSame(1, $this->typeProcessor->processSimpleAndAnyType($value, $type));
}
public function testProcessSimpleTypeIntArrayToStringArray()
{
$value = [1, 2, 3, 4, 5];
$type = 'string[]';
- $this->assertSame(['1', '2', '3', '4', '5'], $this->_typeProcessor->processSimpleAndAnyType($value, $type));
+ $this->assertSame(['1', '2', '3', '4', '5'], $this->typeProcessor->processSimpleAndAnyType($value, $type));
}
public function testProcessSimpleTypeStringArrayToIntArray()
{
$value = ['1', '2', '3', '4', '5'];
$type = 'int[]';
- $this->assertSame([1, 2, 3, 4, 5], $this->_typeProcessor->processSimpleAndAnyType($value, $type));
+ $this->assertSame([1, 2, 3, 4, 5], $this->typeProcessor->processSimpleAndAnyType($value, $type));
}
/**
@@ -212,10 +213,11 @@ public function testProcessSimpleTypeStringArrayToIntArray()
*/
public function testProcessSimpleTypeException($value, $type)
{
- $this->expectException(SerializationException::class);
- $this->expectExceptionMessage('The "'
- . $value . '" value\'s type is invalid. The "' . $type . '" type was expected. Verify and try again.');
- $this->_typeProcessor->processSimpleAndAnyType($value, $type);
+ $this->expectException(
+ SerializationException::class,
+ 'Invalid type for value: "' . $value . '". Expected Type: "' . $type . '"'
+ );
+ $this->typeProcessor->processSimpleAndAnyType($value, $type);
}
public static function processSimpleTypeExceptionProvider()
@@ -234,32 +236,89 @@ public function testProcessSimpleTypeInvalidType()
{
$value = 1;
$type = 'int[]';
- $this->_typeProcessor->processSimpleAndAnyType($value, $type);
+ $this->typeProcessor->processSimpleAndAnyType($value, $type);
}
/**
* @expectedException \LogicException
* @expectedExceptionMessageRegExp /@param annotation is incorrect for the parameter "name" \w+/
*/
- public function testGetParamType()
+ public function testGetParamTypeWithIncorrectAnnotation()
{
- $class = new ClassReflection(\Magento\Framework\Reflection\Test\Unit\DataObject::class);
+ $class = new ClassReflection(DataObject::class);
$methodReflection = $class->getMethod('setName');
$paramsReflection = $methodReflection->getParameters();
- $this->_typeProcessor->getParamType($paramsReflection[0]);
+ $this->typeProcessor->getParamType($paramsReflection[0]);
}
- public function testGetParameterDescription()
+ /**
+ * Checks a case for different array param types.
+ *
+ * @param string $methodName
+ * @param string $type
+ * @dataProvider arrayParamTypeDataProvider
+ */
+ public function testGetArrayParamType(string $methodName, string $type)
{
- $class = new ClassReflection(\Magento\Framework\Reflection\Test\Unit\DataObject::class);
- $methodReflection = $class->getMethod('setName');
+ $class = new ClassReflection(DataObject::class);
+ $methodReflection = $class->getMethod($methodName);
+ $params = $methodReflection->getParameters();
+ $this->assertEquals($type, $this->typeProcessor->getParamType(array_pop($params)));
+ }
+
+ /**
+ * Get list of methods with expected param types.
+ *
+ * @return array
+ */
+ public function arrayParamTypeDataProvider()
+ {
+ return [
+ ['method name' => 'addData', 'type' => 'array[]'],
+ ['method name' => 'addObjectList', 'type' => 'TSampleInterface[]']
+ ];
+ }
+
+ /**
+ * Checks a case when method param has additional description.
+ *
+ * @param string $methodName
+ * @param array $descriptions
+ * @dataProvider methodParamsDataProvider
+ */
+ public function testGetParameterDescription(string $methodName, array $descriptions)
+ {
+ $class = new ClassReflection(DataObject::class);
+ $methodReflection = $class->getMethod($methodName);
$paramsReflection = $methodReflection->getParameters();
- $this->assertEquals('Name of the attribute', $this->_typeProcessor->getParamDescription($paramsReflection[0]));
+ foreach ($paramsReflection as $paramReflection) {
+ $description = array_shift($descriptions);
+ $this->assertEquals(
+ $description,
+ $this->typeProcessor->getParamDescription($paramReflection)
+ );
+ }
+ }
+
+ /**
+ * Gets list of method names with params and their descriptions.
+ *
+ * @return array
+ */
+ public function methodParamsDataProvider()
+ {
+ return [
+ ['method name' => 'setName', 'descriptions' => ['Name of the attribute']],
+ ['method name' => 'setData', 'descriptions' => ['Key is used as index', null]],
+ ];
}
public function testGetOperationName()
{
- $this->assertEquals("resNameMethodName", $this->_typeProcessor->getOperationName("resName", "methodName"));
+ $this->assertEquals(
+ "resNameMethodName",
+ $this->typeProcessor->getOperationName("resName", "methodName")
+ );
}
/**
@@ -277,19 +336,19 @@ public function testGetReturnTypeWithInheritDocBlock()
$classReflection = new ClassReflection(TSample::class);
$methodReflection = $classReflection->getMethod('getPropertyName');
- self::assertEquals($expected, $this->_typeProcessor->getGetterReturnType($methodReflection));
+ self::assertEquals($expected, $this->typeProcessor->getGetterReturnType($methodReflection));
}
/**
* Checks a case when method and parent interface don't have `@return` annotation.
*
* @expectedException \InvalidArgumentException
- * @expectedExceptionMessage Getter return type must be specified using @return annotation. See Magento\Framework\Reflection\Test\Unit\Fixture\TSample::getName()
+ * @expectedExceptionMessage Method's return type must be specified using @return annotation. See Magento\Framework\Reflection\Test\Unit\Fixture\TSample::getName()
*/
public function testGetReturnTypeWithoutReturnTag()
{
$classReflection = new ClassReflection(TSample::class);
$methodReflection = $classReflection->getMethod('getName');
- $this->_typeProcessor->getGetterReturnType($methodReflection);
+ $this->typeProcessor->getGetterReturnType($methodReflection);
}
}
diff --git a/lib/internal/Magento/Framework/Reflection/TypeProcessor.php b/lib/internal/Magento/Framework/Reflection/TypeProcessor.php
index 80285853b43c6..d7206032c68c7 100644
--- a/lib/internal/Magento/Framework/Reflection/TypeProcessor.php
+++ b/lib/internal/Magento/Framework/Reflection/TypeProcessor.php
@@ -9,6 +9,7 @@
use Magento\Framework\Exception\SerializationException;
use Magento\Framework\Phrase;
use Zend\Code\Reflection\ClassReflection;
+use Zend\Code\Reflection\DocBlock\Tag\ParamTag;
use Zend\Code\Reflection\DocBlock\Tag\ReturnTag;
use Zend\Code\Reflection\DocBlockReflection;
use Zend\Code\Reflection\MethodReflection;
@@ -522,35 +523,24 @@ public function getParamType(ParameterReflection $param)
}
if ($type == 'array') {
// try to determine class, if it's array of objects
- $docBlock = $param->getDeclaringFunction()->getDocBlock();
- $pattern = "/\@param\s+([\w\\\_]+\[\])\s+\\\${$param->getName()}\n/";
- $matches = [];
- if (preg_match($pattern, $docBlock->getContents(), $matches)) {
- return $matches[1];
- }
- return "{$type}[]";
+ $paramDocBlock = $this->getParamDocBlockTag($param);
+ $paramTypes = $paramDocBlock->getTypes();
+ $paramType = array_shift($paramTypes);
+ return strpos($paramType, '[]') !== false ? $paramType : "{$paramType}[]";
}
return $type;
}
/**
- * Get parameter description
+ * Gets method parameter description.
*
* @param ParameterReflection $param
* @return string|null
*/
public function getParamDescription(ParameterReflection $param)
{
- $docBlock = $param->getDeclaringFunction()->getDocBlock();
- $docBlockLines = explode("\n", $docBlock->getContents());
- $pattern = "/\@param\s+([\w\\\_\[\]\|]+)\s+(\\\${$param->getName()})\s(.*)/";
- $matches = [];
-
- foreach ($docBlockLines as $line) {
- if (preg_match($pattern, $line, $matches)) {
- return $matches[3];
- }
- }
+ $paramDocBlock = $this->getParamDocBlockTag($param);
+ return $paramDocBlock->getDescription();
}
/**
@@ -731,7 +721,7 @@ private function getMethodReturnAnnotation(MethodReflection $methodReflection)
// throw an exception if even implemented interface doesn't have return annotations
if (empty($returnAnnotations)) {
throw new \InvalidArgumentException(
- "Getter return type must be specified using @return annotation. "
+ "Method's return type must be specified using @return annotation. "
. "See {$methodReflection->getDeclaringClass()->getName()}::{$methodName}()"
);
}
@@ -750,10 +740,24 @@ private function getReturnFromDocBlock(MethodReflection $methodReflection)
$methodDocBlock = $methodReflection->getDocBlock();
if (!$methodDocBlock) {
throw new \InvalidArgumentException(
- "Each getter must have a doc block. "
+ "Each method must have a doc block. "
. "See {$methodReflection->getDeclaringClass()->getName()}::{$methodReflection->getName()}()"
);
}
return current($methodDocBlock->getTags('return'));
}
+
+ /**
+ * Gets method's param doc block.
+ *
+ * @param ParameterReflection $param
+ * @return ParamTag
+ */
+ private function getParamDocBlockTag(ParameterReflection $param): ParamTag
+ {
+ $docBlock = $param->getDeclaringFunction()
+ ->getDocBlock();
+ $paramsTag = $docBlock->getTags('param');
+ return $paramsTag[$param->getPosition()];
+ }
}
diff --git a/lib/internal/Magento/Framework/Setup/Declaration/Schema/Declaration/SchemaBuilder.php b/lib/internal/Magento/Framework/Setup/Declaration/Schema/Declaration/SchemaBuilder.php
index 7f73e742e0a6c..830fcb293a8f1 100644
--- a/lib/internal/Magento/Framework/Setup/Declaration/Schema/Declaration/SchemaBuilder.php
+++ b/lib/internal/Magento/Framework/Setup/Declaration/Schema/Declaration/SchemaBuilder.php
@@ -5,7 +5,9 @@
*/
namespace Magento\Framework\Setup\Declaration\Schema\Declaration;
+use Magento\Framework\DB\Adapter\AdapterInterface;
use Magento\Framework\Phrase;
+use Magento\Framework\Setup\Declaration\Schema\TableNameResolver;
use Magento\Framework\Stdlib\BooleanUtils;
use Magento\Framework\Setup\Exception;
use Magento\Framework\Setup\Declaration\Schema\Dto\Column;
@@ -66,6 +68,11 @@ class SchemaBuilder
*/
private $resourceConnection;
+ /**
+ * @var TableNameResolver
+ */
+ private $tableNameResolver;
+
/**
* SchemaBuilder constructor.
*
@@ -74,6 +81,7 @@ class SchemaBuilder
* @param Sharding $sharding
* @param ValidationComposite $validationComposite
* @param \Magento\Framework\App\ResourceConnection $resourceConnection
+ * @param TableNameResolver $tableNameResolver
* @internal param array $tablesData
*/
public function __construct(
@@ -81,13 +89,15 @@ public function __construct(
BooleanUtils $booleanUtils,
Sharding $sharding,
ValidationComposite $validationComposite,
- \Magento\Framework\App\ResourceConnection $resourceConnection
+ \Magento\Framework\App\ResourceConnection $resourceConnection,
+ TableNameResolver $tableNameResolver
) {
$this->sharding = $sharding;
$this->elementFactory = $elementFactory;
$this->booleanUtils = $booleanUtils;
$this->validationComposite = $validationComposite;
$this->resourceConnection = $resourceConnection;
+ $this->tableNameResolver = $tableNameResolver;
}
/**
@@ -275,6 +285,35 @@ private function convertColumnNamesToObjects(array $columnNames, Table $table)
return $columns;
}
+ /**
+ * Provides the full index name based on the prefix value.
+ *
+ * @param string $name
+ * @param Table $table
+ * @param array $columns
+ * @param string $type
+ * @return string
+ */
+ private function getFullIndexName(
+ string $name,
+ Table $table,
+ array $columns,
+ string $type = AdapterInterface::INDEX_TYPE_INDEX
+ ) {
+ if (AdapterInterface::INDEX_TYPE_PRIMARY === $type) {
+ return $name;
+ }
+
+ $tableName = $this->tableNameResolver->getNameOfOriginTable($table->getName());
+
+ return $this->resourceConnection
+ ->getIdxName(
+ $tableName,
+ $columns,
+ $type
+ );
+ }
+
/**
* Convert and instantiate index objects.
*
@@ -296,6 +335,21 @@ private function processIndexes(array $tableData, $resource, Table $table)
continue;
}
+ /**
+ * Temporary solution.
+ * @see MAGETWO-91365
+ */
+ $indexType = AdapterInterface::INDEX_TYPE_INDEX;
+ if (isset($indexData['indexType']) && $indexData['indexType'] === AdapterInterface::INDEX_TYPE_FULLTEXT) {
+ $indexType = $indexData['indexType'];
+ }
+
+ $indexData['name'] = $this->getFullIndexName(
+ $indexData['name'],
+ $table,
+ $indexData['column'],
+ $indexType
+ );
$indexData = $this->processGenericData($indexData, $resource, $table);
$indexData['columns'] = $this->convertColumnNamesToObjects($indexData['column'], $table);
$index = $this->elementFactory->create('index', $indexData);
@@ -354,9 +408,25 @@ private function processConstraints(array $tableData, $resource, Schema $schema,
$constraintData['referenceColumn'],
$constraintData['referenceTable']
);
+ /**
+ * Calculation of the full name of Foreign Key based on the prefix value.
+ */
+ $constraintData['name'] = $this->resourceConnection
+ ->getFkName(
+ $this->tableNameResolver->getNameOfOriginTable($table->getName()),
+ $constraintData['column']->getName(),
+ $constraintData['referenceTable']->getName(),
+ $constraintData['referenceColumn']->getName()
+ );
$constraint = $this->elementFactory->create($constraintData['type'], $constraintData);
$constraints[$constraint->getName()] = $constraint;
} else {
+ $constraintData['name'] = $this->getFullIndexName(
+ $constraintData['name'],
+ $table,
+ $constraintData['column'],
+ $constraintData['type']
+ );
$constraintData['columns'] = $this->convertColumnNamesToObjects($constraintData['column'], $table);
$constraint = $this->elementFactory->create($constraintData['type'], $constraintData);
$constraints[$constraint->getName()] = $constraint;
diff --git a/lib/internal/Magento/Framework/Setup/Declaration/Schema/Diff/Diff.php b/lib/internal/Magento/Framework/Setup/Declaration/Schema/Diff/Diff.php
index cb222d8b0c3d1..0e857567689c4 100644
--- a/lib/internal/Magento/Framework/Setup/Declaration/Schema/Diff/Diff.php
+++ b/lib/internal/Magento/Framework/Setup/Declaration/Schema/Diff/Diff.php
@@ -7,8 +7,10 @@
namespace Magento\Framework\Setup\Declaration\Schema\Diff;
use Magento\Framework\Component\ComponentRegistrar;
+use Magento\Framework\Setup\Declaration\Schema\Dto\Constraint;
use Magento\Framework\Setup\Declaration\Schema\Dto\Constraints\Reference;
use Magento\Framework\Setup\Declaration\Schema\Dto\ElementInterface;
+use Magento\Framework\Setup\Declaration\Schema\Dto\Index;
use Magento\Framework\Setup\Declaration\Schema\Dto\Table;
use Magento\Framework\Setup\Declaration\Schema\Dto\TableElementInterface;
use Magento\Framework\Setup\Declaration\Schema\ElementHistory;
@@ -158,20 +160,41 @@ private function getWhiteListTables()
* @param string $operation
* @return bool
*/
- public function canBeRegistered(ElementInterface $object, $operation)
+ public function canBeRegistered(ElementInterface $object, $operation): bool
{
if (!isset($this->destructiveOperations[$operation])) {
return true;
}
+ $checkResult = false;
$whiteList = $this->getWhiteListTables();
- $type = $object->getElementType();
if ($object instanceof TableElementInterface) {
- return isset($whiteList[$object->getTable()->getNameWithoutPrefix()][$type][$object->getName()]);
+ $tableNameWithoutPrefix = $object->getTable()->getNameWithoutPrefix();
+ $type = $object->getElementType();
+
+ if ($this->isElementHaveAutoGeneratedName($object)) {
+ $checkResult =
+ isset($whiteList[$tableNameWithoutPrefix][$type][$object->getNameWithoutPrefix()]);
+ } else {
+ $checkResult = isset($whiteList[$tableNameWithoutPrefix][$type][$object->getName()]);
+ }
+ } elseif ($object instanceof Table) {
+ $checkResult = isset($whiteList[$object->getNameWithoutPrefix()]);
}
- return isset($whiteList[$object->getNameWithoutPrefix()]);
+ return $checkResult;
+ }
+
+ /**
+ * Check if the element has an auto-generated name.
+ *
+ * @param ElementInterface $element
+ * @return bool
+ */
+ private function isElementHaveAutoGeneratedName(ElementInterface $element): bool
+ {
+ return in_array($element->getElementType(), [Index::TYPE, Constraint::TYPE], true);
}
/**
diff --git a/lib/internal/Magento/Framework/Setup/Declaration/Schema/Diff/TableDiff.php b/lib/internal/Magento/Framework/Setup/Declaration/Schema/Diff/TableDiff.php
index 2030b192935e7..87045df864a3e 100644
--- a/lib/internal/Magento/Framework/Setup/Declaration/Schema/Diff/TableDiff.php
+++ b/lib/internal/Magento/Framework/Setup/Declaration/Schema/Diff/TableDiff.php
@@ -7,10 +7,10 @@
namespace Magento\Framework\Setup\Declaration\Schema\Diff;
use Magento\Framework\Setup\Declaration\Schema\Dto\Column;
+use Magento\Framework\Setup\Declaration\Schema\Dto\Constraint;
use Magento\Framework\Setup\Declaration\Schema\Dto\ElementInterface;
use Magento\Framework\Setup\Declaration\Schema\Dto\Index;
use Magento\Framework\Setup\Declaration\Schema\Dto\Table;
-use Magento\Framework\Setup\Declaration\Schema\Operations\AddComplexElement;
use Magento\Framework\Setup\Declaration\Schema\Operations\ModifyColumn;
/**
@@ -91,12 +91,14 @@ private function turnOffForeignKeys(Table $declaredTable, Table $generatedTable,
if ($elementHistory->getNew() instanceof Column) {
$column = $elementHistory->getNew();
$references = $generatedTable->getReferenceConstraints();
- $declaredReferences = $declaredTable->getReferenceConstraints();
+ $declaredReferences = $this->getElementsListByNameWithoutPrefix(
+ $declaredTable->getReferenceConstraints()
+ );
foreach ($references as $reference) {
/** In case when we have foreign key on column, that should be modified */
if ($reference->getColumn()->getName() === $column->getName() &&
- isset($declaredReferences[$reference->getName()])
+ isset($declaredReferences[$reference->getNameWithoutPrefix()])
) {
/**
* Lets disable foreign key and enable it again
@@ -104,7 +106,11 @@ private function turnOffForeignKeys(Table $declaredTable, Table $generatedTable,
* we will drop key, modify column, add key
*/
$diff = $this->diffManager->registerRemoval($diff, [$reference]);
- $diff = $this->diffManager->registerCreation($diff, $reference);
+ $diff = $this->diffManager
+ ->registerCreation(
+ $diff,
+ $declaredReferences[$reference->getNameWithoutPrefix()]
+ );
}
}
}
@@ -113,6 +119,22 @@ private function turnOffForeignKeys(Table $declaredTable, Table $generatedTable,
return $diff;
}
+ /**
+ * Switches keys of the array on the element name without prefix.
+ *
+ * @param Constraint[]|Index[] $elements
+ * @return array
+ */
+ private function getElementsListByNameWithoutPrefix(array $elements)
+ {
+ $elementsList = [];
+ foreach ($elements as $element) {
+ $elementsList[$element->getNameWithoutPrefix()] = $element;
+ }
+
+ return $elementsList;
+ }
+
/**
* Diff between tables.
*
@@ -135,6 +157,19 @@ public function diff(
$this->diffManager->registerTableModification($declaredTable, $generatedTable, $diff);
}
+ return $this->calculateDiff($declaredTable, $generatedTable, $diff);
+ }
+
+ /**
+ * Calculate the difference between tables.
+ *
+ * @param Table|ElementInterface $declaredTable
+ * @param Table|ElementInterface $generatedTable
+ * @param Diff $diff
+ * @return Diff
+ */
+ private function calculateDiff(ElementInterface $declaredTable, ElementInterface $generatedTable, Diff $diff)
+ {
$types = [self::COLUMN_DIFF_TYPE, self::CONSTRAINT_DIFF_TYPE, self::INDEX_DIFF_TYPE];
//We do inspection for each element type
foreach ($types as $elementType) {
@@ -146,6 +181,11 @@ public function diff(
$declaredElements = $this->excludeAutoIndexes($declaredTable, $declaredElements);
}
+ if (in_array($elementType, [self::CONSTRAINT_DIFF_TYPE, self::INDEX_DIFF_TYPE], true)) {
+ $generatedElements = $this->getElementsListByNameWithoutPrefix($generatedElements);
+ $declaredElements = $this->getElementsListByNameWithoutPrefix($declaredElements);
+ }
+
foreach ($declaredElements as $elementName => $element) {
//If it is new for generated (generated from db) elements - we need to create it
if (!isset($generatedElements[$elementName])) {
@@ -169,6 +209,7 @@ public function diff(
}
$diff = $this->turnOffForeignKeys($declaredTable, $generatedTable, $diff);
+
return $diff;
}
}
diff --git a/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Constraint.php b/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Constraint.php
index a7f7fcb2e6656..9f03c1c20cf49 100644
--- a/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Constraint.php
+++ b/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Constraint.php
@@ -34,20 +34,28 @@ class Constraint extends GenericElement implements
*/
private $table;
+ /**
+ * @var string
+ */
+ private $nameWithoutPrefix;
+
/**
* Constructor.
*
* @param string $name
* @param string $type
- * @param Table $table
+ * @param Table $table
+ * @param string $nameWithoutPrefix
*/
public function __construct(
string $name,
string $type,
- Table $table
+ Table $table,
+ string $nameWithoutPrefix
) {
parent::__construct($name, $type);
$this->table = $table;
+ $this->nameWithoutPrefix = $nameWithoutPrefix;
}
/**
@@ -67,4 +75,14 @@ public function getElementType()
{
return self::TYPE;
}
+
+ /**
+ * Retrieve the constraint name which is calculated without table prefix.
+ *
+ * @return string
+ */
+ public function getNameWithoutPrefix()
+ {
+ return $this->nameWithoutPrefix;
+ }
}
diff --git a/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Constraints/Internal.php b/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Constraints/Internal.php
index e15407a4a837d..486d43c023c7f 100644
--- a/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Constraints/Internal.php
+++ b/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Constraints/Internal.php
@@ -31,16 +31,18 @@ class Internal extends Constraint implements ElementDiffAwareInterface
*
* @param string $name
* @param string $type
- * @param Table $table
- * @param array $columns
+ * @param Table $table
+ * @param string $nameWithoutPrefix
+ * @param array $columns
*/
public function __construct(
$name,
$type,
Table $table,
+ string $nameWithoutPrefix,
array $columns
) {
- parent::__construct($name, $type, $table);
+ parent::__construct($name, $type, $table, $nameWithoutPrefix);
$this->columns = $columns;
}
diff --git a/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Constraints/Reference.php b/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Constraints/Reference.php
index b79e8fdd3cc2f..b5c8d16311448 100644
--- a/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Constraints/Reference.php
+++ b/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Constraints/Reference.php
@@ -46,9 +46,10 @@ class Reference extends Constraint implements ElementDiffAwareInterface
*
* @param string $name
* @param string $type
- * @param Table $table
+ * @param Table $table
+ * @param string $nameWithoutPrefix
* @param Column $column
- * @param Table $referenceTable
+ * @param Table $referenceTable
* @param Column $referenceColumn
* @param string $onDelete
* @SuppressWarnings(Magento.TypeDuplication)
@@ -57,12 +58,13 @@ public function __construct(
string $name,
string $type,
Table $table,
+ string $nameWithoutPrefix,
Column $column,
Table $referenceTable,
Column $referenceColumn,
string $onDelete
) {
- parent::__construct($name, $type, $table);
+ parent::__construct($name, $type, $table, $nameWithoutPrefix);
$this->column = $column;
$this->referenceTable = $referenceTable;
$this->referenceColumn = $referenceColumn;
diff --git a/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Factories/Foreign.php b/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Factories/Foreign.php
index 030f2a49d81df..0e1ad0768c4da 100644
--- a/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Factories/Foreign.php
+++ b/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Factories/Foreign.php
@@ -5,7 +5,9 @@
*/
namespace Magento\Framework\Setup\Declaration\Schema\Dto\Factories;
+use Magento\Framework\App\ResourceConnection;
use Magento\Framework\ObjectManagerInterface;
+use Magento\Framework\Setup\Declaration\Schema\TableNameResolver;
/**
* Foreign key constraint factory.
@@ -27,18 +29,34 @@ class Foreign implements FactoryInterface
*/
private $className;
+ /**
+ * @var ResourceConnection
+ */
+ private $resourceConnection;
+
+ /**
+ * @var TableNameResolver
+ */
+ private $tableNameResolver;
+
/**
* Constructor.
*
* @param ObjectManagerInterface $objectManager
- * @param string $className
+ * @param ResourceConnection $resourceConnection
+ * @param TableNameResolver $tableNameResolver
+ * @param string $className
*/
public function __construct(
ObjectManagerInterface $objectManager,
+ ResourceConnection $resourceConnection,
+ TableNameResolver $tableNameResolver,
$className = \Magento\Framework\Setup\Declaration\Schema\Dto\Constraints\Reference::class
) {
$this->objectManager = $objectManager;
+ $this->resourceConnection = $resourceConnection;
$this->className = $className;
+ $this->tableNameResolver = $tableNameResolver;
}
/**
@@ -50,6 +68,23 @@ public function create(array $data)
$data['onDelete'] = self::DEFAULT_ON_DELETE;
}
+ $nameWithoutPrefix = $data['name'];
+
+ if ($this->resourceConnection->getTablePrefix()) {
+ $nameWithoutPrefix = $this->resourceConnection
+ ->getConnection($data['table']->getResource())
+ ->getForeignKeyName(
+ $this->tableNameResolver->getNameOfOriginTable(
+ $data['table']->getNameWithoutPrefix()
+ ),
+ $data['column']->getName(),
+ $data['referenceTable']->getNameWithoutPrefix(),
+ $data['referenceColumn']->getName()
+ );
+ }
+
+ $data['nameWithoutPrefix'] = $nameWithoutPrefix;
+
return $this->objectManager->create($this->className, $data);
}
}
diff --git a/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Factories/Index.php b/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Factories/Index.php
index 919aa05634512..dd2acd7608867 100644
--- a/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Factories/Index.php
+++ b/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Factories/Index.php
@@ -5,7 +5,10 @@
*/
namespace Magento\Framework\Setup\Declaration\Schema\Dto\Factories;
+use Magento\Framework\App\ResourceConnection;
+use Magento\Framework\DB\Adapter\AdapterInterface;
use Magento\Framework\ObjectManagerInterface;
+use Magento\Framework\Setup\Declaration\Schema\TableNameResolver;
/**
* Index element factory.
@@ -27,18 +30,34 @@ class Index implements FactoryInterface
*/
private $className;
+ /**
+ * @var ResourceConnection
+ */
+ private $resourceConnection;
+
+ /**
+ * @var TableNameResolver
+ */
+ private $tableNameResolver;
+
/**
* Constructor.
*
* @param ObjectManagerInterface $objectManager
- * @param string $className
+ * @param ResourceConnection $resourceConnection
+ * @param TableNameResolver $tableNameResolver
+ * @param string $className
*/
public function __construct(
ObjectManagerInterface $objectManager,
+ ResourceConnection $resourceConnection,
+ TableNameResolver $tableNameResolver,
$className = \Magento\Framework\Setup\Declaration\Schema\Dto\Index::class
) {
$this->objectManager = $objectManager;
+ $this->resourceConnection = $resourceConnection;
$this->className = $className;
+ $this->tableNameResolver = $tableNameResolver;
}
/**
@@ -50,6 +69,30 @@ public function create(array $data)
$data['indexType'] = self::DEFAULT_INDEX_TYPE;
}
+ $nameWithoutPrefix = $data['name'];
+
+ if ($this->resourceConnection->getTablePrefix()) {
+ /**
+ * Temporary solution.
+ * @see MAGETWO-91365
+ */
+ $indexType = AdapterInterface::INDEX_TYPE_INDEX;
+ if ($data['indexType'] === AdapterInterface::INDEX_TYPE_FULLTEXT) {
+ $indexType = $data['indexType'];
+ }
+ $nameWithoutPrefix = $this->resourceConnection
+ ->getConnection($data['table']->getResource())
+ ->getIndexName(
+ $this->tableNameResolver->getNameOfOriginTable(
+ $data['table']->getNameWithoutPrefix()
+ ),
+ $data['column'],
+ $indexType
+ );
+ }
+
+ $data['nameWithoutPrefix'] = $nameWithoutPrefix;
+
return $this->objectManager->create($this->className, $data);
}
}
diff --git a/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Factories/Primary.php b/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Factories/Primary.php
index ca87ab34f007d..836e32efec057 100644
--- a/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Factories/Primary.php
+++ b/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Factories/Primary.php
@@ -45,6 +45,7 @@ public function __construct(
public function create(array $data)
{
$data['name'] = Internal::PRIMARY_NAME;
+ $data['nameWithoutPrefix'] = $data['name'];
return $this->objectManager->create($this->className, $data);
}
}
diff --git a/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Factories/Table.php b/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Factories/Table.php
index 7c552acda5157..0a8f5b4ad23b3 100644
--- a/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Factories/Table.php
+++ b/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Factories/Table.php
@@ -86,7 +86,7 @@ public function create(array $data)
$tablePrefix = $this->resourceConnection->getTablePrefix();
$nameWithoutPrefix = $data['name'];
if (!empty($tablePrefix) && strpos($nameWithoutPrefix, $tablePrefix) === 0) {
- $data['nameWithoutPrefix'] = str_replace($tablePrefix, "", $data['name']);
+ $data['nameWithoutPrefix'] = preg_replace('/^' . $tablePrefix . '/i', '', $data['name']);
} else {
$data['name'] = $tablePrefix . $data['name'];
$data['nameWithoutPrefix'] = $nameWithoutPrefix;
diff --git a/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Factories/Unique.php b/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Factories/Unique.php
index 3709f035fe3a4..57e5270b0c82e 100644
--- a/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Factories/Unique.php
+++ b/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Factories/Unique.php
@@ -5,7 +5,9 @@
*/
namespace Magento\Framework\Setup\Declaration\Schema\Dto\Factories;
+use Magento\Framework\App\ResourceConnection;
use Magento\Framework\ObjectManagerInterface;
+use Magento\Framework\Setup\Declaration\Schema\TableNameResolver;
/**
* Unique constraint DTO element factory.
@@ -22,18 +24,34 @@ class Unique implements FactoryInterface
*/
private $className;
+ /**
+ * @var ResourceConnection
+ */
+ private $resourceConnection;
+
+ /**
+ * @var TableNameResolver
+ */
+ private $tableNameResolver;
+
/**
* Constructor.
*
* @param ObjectManagerInterface $objectManager
- * @param string $className
+ * @param ResourceConnection $resourceConnection
+ * @param TableNameResolver $tableNameResolver
+ * @param string $className
*/
public function __construct(
ObjectManagerInterface $objectManager,
+ ResourceConnection $resourceConnection,
+ TableNameResolver $tableNameResolver,
$className = \Magento\Framework\Setup\Declaration\Schema\Dto\Constraints\Internal::class
) {
$this->objectManager = $objectManager;
+ $this->resourceConnection = $resourceConnection;
$this->className = $className;
+ $this->tableNameResolver = $tableNameResolver;
}
/**
@@ -41,6 +59,22 @@ public function __construct(
*/
public function create(array $data)
{
+ $nameWithoutPrefix = $data['name'];
+
+ if ($this->resourceConnection->getTablePrefix()) {
+ $nameWithoutPrefix = $this->resourceConnection
+ ->getConnection($data['table']->getResource())
+ ->getIndexName(
+ $this->tableNameResolver->getNameOfOriginTable(
+ $data['table']->getNameWithoutPrefix()
+ ),
+ $data['column'],
+ $data['type']
+ );
+ }
+
+ $data['nameWithoutPrefix'] = $nameWithoutPrefix;
+
return $this->objectManager->create($this->className, $data);
}
}
diff --git a/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Index.php b/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Index.php
index ea8c07bf19e4c..49436adad04e8 100644
--- a/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Index.php
+++ b/lib/internal/Magento/Framework/Setup/Declaration/Schema/Dto/Index.php
@@ -39,6 +39,11 @@ class Index extends GenericElement implements
*/
private $indexType;
+ /**
+ * @var string
+ */
+ private $nameWithoutPrefix;
+
/**
* Constructor.
*
@@ -47,18 +52,21 @@ class Index extends GenericElement implements
* @param Table $table
* @param array $columns
* @param string $indexType
+ * @param string $nameWithoutPrefix
*/
public function __construct(
string $name,
string $type,
Table $table,
array $columns,
- string $indexType
+ string $indexType,
+ string $nameWithoutPrefix
) {
parent::__construct($name, $type);
$this->table = $table;
$this->columns = $columns;
$this->indexType = $indexType;
+ $this->nameWithoutPrefix = $nameWithoutPrefix;
}
/**
@@ -123,4 +131,14 @@ public function getIndexType()
{
return $this->indexType;
}
+
+ /**
+ * Retrieve the index name which is calculated without table prefix.
+ *
+ * @return string
+ */
+ public function getNameWithoutPrefix()
+ {
+ return $this->nameWithoutPrefix;
+ }
}
diff --git a/lib/internal/Magento/Framework/Setup/Declaration/Schema/Operations/AddColumn.php b/lib/internal/Magento/Framework/Setup/Declaration/Schema/Operations/AddColumn.php
index 9cda6aa4a8842..9a42090ad31db 100644
--- a/lib/internal/Magento/Framework/Setup/Declaration/Schema/Operations/AddColumn.php
+++ b/lib/internal/Magento/Framework/Setup/Declaration/Schema/Operations/AddColumn.php
@@ -110,6 +110,7 @@ private function getTemporaryIndexHistory(Column $column)
Index::TYPE,
[
'name' => self::TEMPORARY_KEY,
+ 'column' => $column->getName(),
'columns' => [$column],
'table' => $column->getTable()
]
diff --git a/lib/internal/Magento/Framework/Setup/Declaration/Schema/TableNameResolver.php b/lib/internal/Magento/Framework/Setup/Declaration/Schema/TableNameResolver.php
new file mode 100644
index 0000000000000..6cca87bd19b80
--- /dev/null
+++ b/lib/internal/Magento/Framework/Setup/Declaration/Schema/TableNameResolver.php
@@ -0,0 +1,51 @@
+getFilterPattern(), $tableName, $matches);
+
+ return $tableIsReplica ? $matches['table_name'] : $tableName;
+ }
+
+ /**
+ * Provides a RegEx pattern used to search cloned temporary tables used as a replica.
+ *
+ * @return string
+ */
+ private function getFilterPattern(): string
+ {
+ if (!$this->filterPattern) {
+ $this->filterPattern = '#(?\S+)_replica$#i';
+ }
+
+ return $this->filterPattern;
+ }
+}
diff --git a/lib/internal/Magento/Framework/Setup/Declaration/Schema/etc/constraints/constraint.xsd b/lib/internal/Magento/Framework/Setup/Declaration/Schema/etc/constraints/constraint.xsd
index 61540ecc616b0..8c264bd95a076 100644
--- a/lib/internal/Magento/Framework/Setup/Declaration/Schema/etc/constraints/constraint.xsd
+++ b/lib/internal/Magento/Framework/Setup/Declaration/Schema/etc/constraints/constraint.xsd
@@ -10,6 +10,6 @@
-
+
diff --git a/lib/internal/Magento/Framework/Setup/Test/Unit/Declaration/Schema/Db/SchemaBuilderTest.php b/lib/internal/Magento/Framework/Setup/Test/Unit/Declaration/Schema/Db/SchemaBuilderTest.php
index 0a2eb60fda48a..15dfcc746407e 100644
--- a/lib/internal/Magento/Framework/Setup/Test/Unit/Declaration/Schema/Db/SchemaBuilderTest.php
+++ b/lib/internal/Magento/Framework/Setup/Test/Unit/Declaration/Schema/Db/SchemaBuilderTest.php
@@ -133,7 +133,8 @@ public function dataProvider()
'type' => 'primary',
'column' => [
'first_column'
- ]
+ ],
+ 'nameWithoutPrefix' => 'PRIMARY',
]
]
],
@@ -141,9 +142,10 @@ public function dataProvider()
'second_table' => [
'FIRST_INDEX' => [
'name' => 'FIRST_INDEX',
+ 'nameWithoutPrefix' => 'FIRST_INDEX',
'column' => [
'ref_column'
- ]
+ ],
]
]
]
@@ -221,6 +223,7 @@ private function createPrimaryConstraint(Table $table, array $columns)
'PRIMARY',
'primary',
$table,
+ 'PRIMARY',
$columns
);
}
@@ -240,7 +243,8 @@ private function createIndex($indexName, Table $table, array $columns)
'index',
$table,
$columns,
- 'btree'
+ 'btree',
+ $indexName
);
}
@@ -370,6 +374,7 @@ private function prepareSchemaMocks(array $columns, array $references, array $co
'some_foreign_key',
'foreign',
$table,
+ 'some_foreign_key',
$foreignColumn,
$refTable,
$refColumn,
@@ -429,6 +434,7 @@ private function prepareSchemaMocks(array $columns, array $references, array $co
'type' => 'primary',
'columns' => [$firstColumn],
'table' => $table,
+ 'nameWithoutPrefix' => 'PRIMARY',
'column' => ['first_column'],
]
],
@@ -460,6 +466,7 @@ private function prepareSchemaMocks(array $columns, array $references, array $co
'table' => $refTable,
'column' => ['ref_column'],
'columns' => [$refColumn],
+ 'nameWithoutPrefix' => 'FIRST_INDEX',
]
],
[
diff --git a/lib/internal/Magento/Framework/Setup/Test/Unit/Declaration/Schema/Declaration/SchemaBuilderTest.php b/lib/internal/Magento/Framework/Setup/Test/Unit/Declaration/Schema/Declaration/SchemaBuilderTest.php
index f596a448f1aba..a590a50edb72f 100644
--- a/lib/internal/Magento/Framework/Setup/Test/Unit/Declaration/Schema/Declaration/SchemaBuilderTest.php
+++ b/lib/internal/Magento/Framework/Setup/Test/Unit/Declaration/Schema/Declaration/SchemaBuilderTest.php
@@ -241,14 +241,16 @@ private function createIntegerColumn($name, Table $table)
*
* @param Table $table
* @param array $columns
+ * @param string $nameWithoutPrefix
* @return Internal
*/
- private function createPrimaryConstraint(Table $table, array $columns)
+ private function createPrimaryConstraint(Table $table, array $columns, $nameWithoutPrefix = 'PRIMARY')
{
return new Internal(
'PRIMARY',
'primary',
$table,
+ $nameWithoutPrefix,
$columns
);
}
@@ -259,16 +261,18 @@ private function createPrimaryConstraint(Table $table, array $columns)
* @param string $indexName
* @param Table $table
* @param array $columns
+ * @param string|null $nameWithoutPrefix
* @return Index
*/
- private function createIndex($indexName, Table $table, array $columns)
+ private function createIndex($indexName, Table $table, array $columns, $nameWithoutPrefix = null)
{
return new Index(
$indexName,
'index',
$table,
$columns,
- 'btree'
+ 'btree',
+ $nameWithoutPrefix ?: $indexName
);
}
@@ -295,13 +299,14 @@ private function createTimestampColumn($name, Table $table)
* @dataProvider tablesProvider
* @param array $tablesData
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
+ * @throws \Magento\Framework\Setup\Exception
*/
public function testBuild(array $tablesData)
{
$table = $this->createTable('first_table');
$refTable = $this->createTable('second_table');
$refColumn = $this->createIntegerColumn('ref_column', $refTable);
- $index = $this->createIndex('FIRST_INDEX', $table, [$refColumn]);
+ $index = $this->createIndex('PRE_FIRST_INDEX', $table, [$refColumn], 'FIRST_INDEX');
$refTable->addColumns([$refColumn]);
$refTable->addIndexes([$index]);
$firstColumn = $this->createIntegerAIColumn('first_column', $table);
@@ -312,6 +317,7 @@ public function testBuild(array $tablesData)
'some_foreign_key',
'foreign',
$table,
+ 'some_foreign_key',
$foreignColumn,
$refTable,
$refColumn,
diff --git a/lib/internal/Magento/Framework/Setup/Test/Unit/Declaration/Schema/Diff/DiffManagerTest.php b/lib/internal/Magento/Framework/Setup/Test/Unit/Declaration/Schema/Diff/DiffManagerTest.php
index 8a8aecb818348..22dc6c6d18a9e 100644
--- a/lib/internal/Magento/Framework/Setup/Test/Unit/Declaration/Schema/Diff/DiffManagerTest.php
+++ b/lib/internal/Magento/Framework/Setup/Test/Unit/Declaration/Schema/Diff/DiffManagerTest.php
@@ -107,8 +107,8 @@ public function testRegisterIndexModification()
''
);
$column = new Column('third', 'int', $table, 'Previous column');
- $index = new Index('index_type', 'index', $table, [$column], 'btree');
- $generatedIndex = new Index('index_type', 'index', $table, [$column], 'hash');
+ $index = new Index('index_type', 'index', $table, [$column], 'btree', 'index_type');
+ $generatedIndex = new Index('index_type', 'index', $table, [$column], 'hash', 'index_type');
$diff->expects(self::exactly(2))
->method('register')
->withConsecutive([$generatedIndex, 'drop_element', $generatedIndex], [$index, 'add_complex_element']);
@@ -142,7 +142,7 @@ public function testRegisterRemovalReference()
''
);
$column = new Column('third', 'int', $table, 'Previous column');
- $reference = new Reference('ref', 'foreign', $table, $column, $refTable, $column, 'CASCADE');
+ $reference = new Reference('ref', 'foreign', $table, 'ref', $column, $refTable, $column, 'CASCADE');
$diff->expects(self::exactly(2))
->method('register')
->withConsecutive(
@@ -169,7 +169,7 @@ public function testRegisterCreation()
''
);
$column = new Column('third', 'int', $table, 'Previous column');
- $reference = new Reference('ref', 'foreign', $table, $column, $table, $column, 'CASCADE');
+ $reference = new Reference('ref', 'foreign', $table, 'ref', $column, $table, $column, 'CASCADE');
$diff->expects(self::exactly(3))
->method('register')
->withConsecutive(
diff --git a/lib/internal/Magento/Framework/Setup/Test/Unit/Declaration/Schema/Dto/Factories/ForeignTest.php b/lib/internal/Magento/Framework/Setup/Test/Unit/Declaration/Schema/Dto/Factories/ForeignTest.php
new file mode 100644
index 0000000000000..ee4331e7bfc5b
--- /dev/null
+++ b/lib/internal/Magento/Framework/Setup/Test/Unit/Declaration/Schema/Dto/Factories/ForeignTest.php
@@ -0,0 +1,187 @@
+objectManagerHelper = new ObjectManagerHelper($this);
+ $this->objectManagerMock = $this->getMockBuilder(ObjectManagerInterface::class)
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->resourceConnectionMock = $this->getMockBuilder(ResourceConnection::class)
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->adapterMock = $this->getMockBuilder(AdapterInterface::class)
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->tableNameResolver = $this->getMockBuilder(TableNameResolver::class)
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->foreignFactory = $this->objectManagerHelper->getObject(
+ Foreign::class,
+ [
+ 'objectManager' => $this->objectManagerMock,
+ 'resourceConnection' => $this->resourceConnectionMock,
+ 'tableNameResolver' => $this->tableNameResolver,
+ ]
+ );
+ }
+
+ /**
+ * @param string $prefix
+ * @dataProvider createDataProvider
+ */
+ public function testCreate(string $prefix)
+ {
+ $resource = 'default';
+ $tableNameWithoutPrefix = 'table_name';
+ $tableName = $prefix . $tableNameWithoutPrefix;
+
+ $columnName = 'entity_id';
+ $referenceTableName = 'second_table';
+ $referenceColumnName = 'website_id';
+
+ $foreignKeyNameWithoutPrefix = 'table_name_field_name';
+ $foreignKeyName = $prefix . $foreignKeyNameWithoutPrefix;
+
+ $table = $this->objectManagerHelper->getObject(
+ DataObject::class,
+ [
+ 'data' => [
+ 'resource' => $resource,
+ 'name' => $tableName,
+ 'name_without_prefix' => $tableNameWithoutPrefix,
+ ],
+ ]
+ );
+
+ $columnMock = $this->objectManagerHelper->getObject(
+ DataObject::class,
+ [
+ 'data' => ['name' => $columnName],
+ ]
+ );
+
+ $referenceTableMock = $this->objectManagerHelper->getObject(
+ DataObject::class,
+ [
+ 'data' => ['name_without_prefix' => $referenceTableName],
+ ]
+ );
+
+ $referenceColumnMock = $this->objectManagerHelper->getObject(
+ DataObject::class,
+ [
+ 'data' => ['name' => $referenceColumnName],
+ ]
+ );
+
+ $data = [
+ 'name' => $foreignKeyName,
+ 'table' => $table,
+ 'column' => $columnMock,
+ 'referenceTable' => $referenceTableMock,
+ 'referenceColumn' => $referenceColumnMock,
+ ];
+
+ $expectedData = array_merge(
+ $data,
+ [
+ 'onDelete' => Foreign::DEFAULT_ON_DELETE,
+ 'nameWithoutPrefix' => $foreignKeyNameWithoutPrefix,
+ ]
+ );
+
+ $this->resourceConnectionMock
+ ->method('getTablePrefix')
+ ->willReturn($prefix);
+
+ $this->resourceConnectionMock
+ ->method('getConnection')
+ ->with($resource)
+ ->willReturn($this->adapterMock);
+
+ $this->tableNameResolver
+ ->method('getNameOfOriginTable')
+ ->with($tableNameWithoutPrefix)
+ ->willReturn($tableNameWithoutPrefix);
+
+ $this->adapterMock
+ ->method('getForeignKeyName')
+ ->with($tableNameWithoutPrefix, $columnName, $referenceTableName, $referenceColumnName)
+ ->willReturn($foreignKeyNameWithoutPrefix);
+
+ $this->objectManagerMock
+ ->expects($this->once())
+ ->method('create')
+ ->with(Reference::class, $expectedData);
+
+ $this->foreignFactory->create($data);
+ }
+
+ /**
+ * @return array
+ */
+ public function createDataProvider(): array
+ {
+ return [
+ 'Prefix is defined' => [
+ 'pref_',
+ ],
+ 'Prefix is not defined' => [
+ '',
+ ],
+ ];
+ }
+}
diff --git a/lib/internal/Magento/Framework/Setup/Test/Unit/Declaration/Schema/Operations/AddColumnTest.php b/lib/internal/Magento/Framework/Setup/Test/Unit/Declaration/Schema/Operations/AddColumnTest.php
index d061fc1fb6c9c..a8a8fb5b0c40c 100644
--- a/lib/internal/Magento/Framework/Setup/Test/Unit/Declaration/Schema/Operations/AddColumnTest.php
+++ b/lib/internal/Magento/Framework/Setup/Test/Unit/Declaration/Schema/Operations/AddColumnTest.php
@@ -179,7 +179,7 @@ public function testDoOperation()
->method('addElement')
->with('int', 'default', 'table', $definition, 'column')
->willReturn($statement);
- $index = new Index('index', 'index', $column->getTable(), [$column], 'btree');
+ $index = new Index('index', 'index', $column->getTable(), [$column], 'btree', 'index');
$this->elementFactoryMock->expects(self::once())
->method('create')
->willReturn($index);
diff --git a/lib/internal/Magento/Framework/Setup/Test/Unit/Declaration/Schema/ValidationRules/CheckReferenceColumnHasIndexTest.php b/lib/internal/Magento/Framework/Setup/Test/Unit/Declaration/Schema/ValidationRules/CheckReferenceColumnHasIndexTest.php
index a0bf758004346..396cc2b2e5b34 100644
--- a/lib/internal/Magento/Framework/Setup/Test/Unit/Declaration/Schema/ValidationRules/CheckReferenceColumnHasIndexTest.php
+++ b/lib/internal/Magento/Framework/Setup/Test/Unit/Declaration/Schema/ValidationRules/CheckReferenceColumnHasIndexTest.php
@@ -60,6 +60,7 @@ public function testValidate()
'ref',
'foreign',
$table,
+ 'ref',
$column,
$refTable,
$refColumn,
diff --git a/lib/internal/Magento/Framework/Setup/Test/Unit/Declaration/Schema/ValidationRules/ValidationRulesTest.php b/lib/internal/Magento/Framework/Setup/Test/Unit/Declaration/Schema/ValidationRules/ValidationRulesTest.php
index c4e88b569d9c2..ad547053f7bf2 100644
--- a/lib/internal/Magento/Framework/Setup/Test/Unit/Declaration/Schema/ValidationRules/ValidationRulesTest.php
+++ b/lib/internal/Magento/Framework/Setup/Test/Unit/Declaration/Schema/ValidationRules/ValidationRulesTest.php
@@ -64,6 +64,7 @@ public function testValidate()
'ref',
'foreign',
$table,
+ 'ref',
$column,
$refTable,
$refColumn,
diff --git a/lib/internal/Magento/Framework/Validator/Test/Unit/ConfigTest.php b/lib/internal/Magento/Framework/Validator/Test/Unit/ConfigTest.php
index 213a71c0087ea..6717095376625 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/internal/Magento/Framework/View/Template/Html/Minifier.php b/lib/internal/Magento/Framework/View/Template/Html/Minifier.php
index 0e25331a1e687..796cc8bef0f28 100644
--- a/lib/internal/Magento/Framework/View/Template/Html/Minifier.php
+++ b/lib/internal/Magento/Framework/View/Template/Html/Minifier.php
@@ -131,8 +131,8 @@ public function minify($file)
'#(?)[^\n\r]*#',
'',
preg_replace(
- '#(?)#',
- '$1',
+ '#(?)#',
+ ' $1',
preg_replace(
'#(?)[^\n\r]*#',
'',
diff --git a/lib/internal/Magento/Framework/View/Test/Unit/Template/Html/MinifierTest.php b/lib/internal/Magento/Framework/View/Test/Unit/Template/Html/MinifierTest.php
index 53b7fe827376f..f07f7f4bdd8c1 100644
--- a/lib/internal/Magento/Framework/View/Test/Unit/Template/Html/MinifierTest.php
+++ b/lib/internal/Magento/Framework/View/Test/Unit/Template/Html/MinifierTest.php
@@ -156,6 +156,11 @@ public function testMinify()
inline text
+ getSomeVariable() > 1):?>
+ getChildHtml('someChildBlock'); ?>
+
+ getChildHtml('anotherChildBlock'); ?>
+