diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7237ebfacf5e1..e17c4e14ffc7d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -785,7 +785,7 @@ Tests:
* Refactored controller actions in the Product area
* Moved commands cache.php, indexer.php, log.php, test.php, compiler.php, singletenant\_compiler.php, generator.php, pack.php, deploy.php and file\_assembler.php to the new bin/magento CLI framework
* Data Migration Tool
- * The Data Migraiton Tool is published in the separate [repository](https://github.com/magento/data-migration-tool-ce "Data Migration Tool repository")
+ * The Data Migration Tool is published in the separate [repository](https://github.com/magento/data-migration-tool-ce "Data Migration Tool repository")
* Fixed bugs
* Fixed an issue where error appeared during placing order with virtual product
* Fixed an issue where billing and shipping sections didn't contain address information on order print
diff --git a/app/code/Magento/Contact/view/frontend/web/css/source/_module.less b/app/code/Magento/Contact/view/frontend/web/css/source/_module.less
index 0aaec05aa2afe..d79806eecbe9b 100644
--- a/app/code/Magento/Contact/view/frontend/web/css/source/_module.less
+++ b/app/code/Magento/Contact/view/frontend/web/css/source/_module.less
@@ -21,6 +21,16 @@
}
}
+//
+// Desktop
+// _____________________________________________
+
+.media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) {
+ .contact-index-index .column:not(.sidebar-additional) .form.contact {
+ min-width: 600px;
+ }
+}
+
// Mobile
.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__m) {
.contact-index-index {
diff --git a/app/code/Magento/Customer/Model/Address.php b/app/code/Magento/Customer/Model/Address.php
index e9aa2839095d5..ea9b103f42273 100644
--- a/app/code/Magento/Customer/Model/Address.php
+++ b/app/code/Magento/Customer/Model/Address.php
@@ -122,7 +122,7 @@ public function __construct(
}
/**
- * Init model
+ * Initialize address model
*
* @return void
*/
@@ -167,7 +167,14 @@ public function updateData(AddressInterface $address)
}
/**
- * @inheritdoc
+ * Create address data object based on current address model.
+ *
+ * @param int|null $defaultBillingAddressId
+ * @param int|null $defaultShippingAddressId
+ * @return AddressInterface
+ * Use Api/Data/AddressInterface as a result of service operations. Don't rely on the model to provide
+ * the instance of Api/Data/AddressInterface
+ * @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
public function getDataModel($defaultBillingAddressId = null, $defaultShippingAddressId = null)
{
@@ -257,7 +264,7 @@ public function getDefaultAttributeCodes()
}
/**
- * Clone object handler
+ * Clone address
*
* @return void
*/
@@ -356,7 +363,11 @@ public function reindex()
}
/**
- * @inheritdoc
+ * Get a list of custom attribute codes.
+ *
+ * By default, entity can be extended only using extension attributes functionality.
+ *
+ * @return string[]
* @since 100.0.6
*/
protected function getCustomAttributesCodes()
diff --git a/app/code/Magento/Customer/Model/Customer.php b/app/code/Magento/Customer/Model/Customer.php
index b00f393f53734..1287dbe5df708 100644
--- a/app/code/Magento/Customer/Model/Customer.php
+++ b/app/code/Magento/Customer/Model/Customer.php
@@ -1054,17 +1054,6 @@ public function resetErrors()
return $this;
}
- /**
- * Prepare customer for delete
- *
- * @return $this
- */
- public function beforeDelete()
- {
- //TODO : Revisit and figure handling permissions in MAGETWO-11084 Implementation: Service Context Provider
- return parent::beforeDelete();
- }
-
/**
* Processing object after save data
*
@@ -1305,7 +1294,7 @@ public function getResetPasswordLinkExpirationPeriod()
}
/**
- * Create address instance
+ * Create Address from Factory
*
* @return Address
*/
@@ -1315,7 +1304,7 @@ protected function _createAddressInstance()
}
/**
- * Create address collection instance
+ * Create Address Collection from Factory
*
* @return \Magento\Customer\Model\ResourceModel\Address\Collection
*/
@@ -1325,7 +1314,7 @@ protected function _createAddressCollection()
}
/**
- * Returns templates types
+ * Get Template Types
*
* @return array
*/
diff --git a/app/code/Magento/Customer/Model/ResourceModel/CustomerRepository.php b/app/code/Magento/Customer/Model/ResourceModel/CustomerRepository.php
index b25838e245488..ddc0576cb0dae 100644
--- a/app/code/Magento/Customer/Model/ResourceModel/CustomerRepository.php
+++ b/app/code/Magento/Customer/Model/ResourceModel/CustomerRepository.php
@@ -171,7 +171,14 @@ public function __construct(
}
/**
- * @inheritdoc
+ * Create or update a customer.
+ *
+ * @param \Magento\Customer\Api\Data\CustomerInterface $customer
+ * @param string $passwordHash
+ * @return \Magento\Customer\Api\Data\CustomerInterface
+ * @throws \Magento\Framework\Exception\InputException If bad input is provided
+ * @throws \Magento\Framework\Exception\State\InputMismatchException If the provided email is already used
+ * @throws \Magento\Framework\Exception\LocalizedException
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.NPathComplexity)
*/
@@ -304,7 +311,13 @@ private function populateCustomerWithSecureData($customerModel, $passwordHash =
}
/**
- * @inheritdoc
+ * Retrieve customer.
+ *
+ * @param string $email
+ * @param int|null $websiteId
+ * @return \Magento\Customer\Api\Data\CustomerInterface
+ * @throws \Magento\Framework\Exception\NoSuchEntityException If customer with the specified email does not exist.
+ * @throws \Magento\Framework\Exception\LocalizedException
*/
public function get($email, $websiteId = null)
{
@@ -313,7 +326,12 @@ public function get($email, $websiteId = null)
}
/**
- * @inheritdoc
+ * Get customer by Customer ID.
+ *
+ * @param int $customerId
+ * @return \Magento\Customer\Api\Data\CustomerInterface
+ * @throws \Magento\Framework\Exception\NoSuchEntityException If customer with the specified ID does not exist.
+ * @throws \Magento\Framework\Exception\LocalizedException
*/
public function getById($customerId)
{
@@ -322,7 +340,15 @@ public function getById($customerId)
}
/**
- * @inheritdoc
+ * Retrieve customers which match a specified criteria.
+ *
+ * This call returns an array of objects, but detailed information about each object’s attributes might not be
+ * included. See http://devdocs.magento.com/codelinks/attributes.html#CustomerRepositoryInterface to determine
+ * which call to use to get detailed information about all attributes for an object.
+ *
+ * @param \Magento\Framework\Api\SearchCriteriaInterface $searchCriteria
+ * @return \Magento\Customer\Api\Data\CustomerSearchResultsInterface
+ * @throws \Magento\Framework\Exception\LocalizedException
*/
public function getList(SearchCriteriaInterface $searchCriteria)
{
@@ -362,7 +388,11 @@ public function getList(SearchCriteriaInterface $searchCriteria)
}
/**
- * @inheritdoc
+ * Delete customer.
+ *
+ * @param \Magento\Customer\Api\Data\CustomerInterface $customer
+ * @return bool true on success
+ * @throws \Magento\Framework\Exception\LocalizedException
*/
public function delete(CustomerInterface $customer)
{
@@ -370,7 +400,12 @@ public function delete(CustomerInterface $customer)
}
/**
- * @inheritdoc
+ * Delete customer by Customer ID.
+ *
+ * @param int $customerId
+ * @return bool true on success
+ * @throws \Magento\Framework\Exception\NoSuchEntityException
+ * @throws \Magento\Framework\Exception\LocalizedException
*/
public function deleteById($customerId)
{
diff --git a/app/code/Magento/Developer/i18n/de_DE.csv b/app/code/Magento/Developer/i18n/de_DE.csv
deleted file mode 100644
index e9c858101b71c..0000000000000
--- a/app/code/Magento/Developer/i18n/de_DE.csv
+++ /dev/null
@@ -1,5 +0,0 @@
-"Front-end development workflow","Front-end development workflow"
-"Workflow type","Workflow type"
-"Server side less compilation","Server side less compilation"
-"Client side less compilation","Client side less compilation"
-"Not available in production mode","Not available in production mode"
diff --git a/app/code/Magento/Developer/i18n/es_ES.csv b/app/code/Magento/Developer/i18n/es_ES.csv
deleted file mode 100644
index e9c858101b71c..0000000000000
--- a/app/code/Magento/Developer/i18n/es_ES.csv
+++ /dev/null
@@ -1,5 +0,0 @@
-"Front-end development workflow","Front-end development workflow"
-"Workflow type","Workflow type"
-"Server side less compilation","Server side less compilation"
-"Client side less compilation","Client side less compilation"
-"Not available in production mode","Not available in production mode"
diff --git a/app/code/Magento/Developer/i18n/fr_FR.csv b/app/code/Magento/Developer/i18n/fr_FR.csv
deleted file mode 100644
index e9c858101b71c..0000000000000
--- a/app/code/Magento/Developer/i18n/fr_FR.csv
+++ /dev/null
@@ -1,5 +0,0 @@
-"Front-end development workflow","Front-end development workflow"
-"Workflow type","Workflow type"
-"Server side less compilation","Server side less compilation"
-"Client side less compilation","Client side less compilation"
-"Not available in production mode","Not available in production mode"
diff --git a/app/code/Magento/Developer/i18n/nl_NL.csv b/app/code/Magento/Developer/i18n/nl_NL.csv
deleted file mode 100644
index e9c858101b71c..0000000000000
--- a/app/code/Magento/Developer/i18n/nl_NL.csv
+++ /dev/null
@@ -1,5 +0,0 @@
-"Front-end development workflow","Front-end development workflow"
-"Workflow type","Workflow type"
-"Server side less compilation","Server side less compilation"
-"Client side less compilation","Client side less compilation"
-"Not available in production mode","Not available in production mode"
diff --git a/app/code/Magento/Developer/i18n/pt_BR.csv b/app/code/Magento/Developer/i18n/pt_BR.csv
deleted file mode 100644
index e9c858101b71c..0000000000000
--- a/app/code/Magento/Developer/i18n/pt_BR.csv
+++ /dev/null
@@ -1,5 +0,0 @@
-"Front-end development workflow","Front-end development workflow"
-"Workflow type","Workflow type"
-"Server side less compilation","Server side less compilation"
-"Client side less compilation","Client side less compilation"
-"Not available in production mode","Not available in production mode"
diff --git a/app/code/Magento/Developer/i18n/zh_Hans_CN.csv b/app/code/Magento/Developer/i18n/zh_Hans_CN.csv
deleted file mode 100644
index e9c858101b71c..0000000000000
--- a/app/code/Magento/Developer/i18n/zh_Hans_CN.csv
+++ /dev/null
@@ -1,5 +0,0 @@
-"Front-end development workflow","Front-end development workflow"
-"Workflow type","Workflow type"
-"Server side less compilation","Server side less compilation"
-"Client side less compilation","Client side less compilation"
-"Not available in production mode","Not available in production mode"
diff --git a/app/code/Magento/Elasticsearch/Model/Adapter/BatchDataMapper/PriceFieldsProvider.php b/app/code/Magento/Elasticsearch/Model/Adapter/BatchDataMapper/PriceFieldsProvider.php
index 875d384a20596..56c84593256be 100644
--- a/app/code/Magento/Elasticsearch/Model/Adapter/BatchDataMapper/PriceFieldsProvider.php
+++ b/app/code/Magento/Elasticsearch/Model/Adapter/BatchDataMapper/PriceFieldsProvider.php
@@ -72,13 +72,15 @@ public function __construct(
*/
public function getFields(array $productIds, $storeId)
{
+ $websiteId = $this->storeManager->getStore($storeId)->getWebsiteId();
+
$priceData = $this->dataProvider->getSearchableAttribute('price')
? $this->resourceIndex->getPriceIndexData($productIds, $storeId)
: [];
$fields = [];
foreach ($productIds as $productId) {
- $fields[$productId] = $this->getProductPriceData($productId, $storeId, $priceData);
+ $fields[$productId] = $this->getProductPriceData($productId, $websiteId, $priceData);
}
return $fields;
diff --git a/app/code/Magento/ImportExport/Model/Import/Entity/AbstractEntity.php b/app/code/Magento/ImportExport/Model/Import/Entity/AbstractEntity.php
index 1fc3257ff2c1e..10b29a50a4064 100644
--- a/app/code/Magento/ImportExport/Model/Import/Entity/AbstractEntity.php
+++ b/app/code/Magento/ImportExport/Model/Import/Entity/AbstractEntity.php
@@ -408,7 +408,9 @@ protected function _saveValidatedBunches()
if ($source->valid()) {
try {
$rowData = $source->current();
- $skuSet[$rowData['sku']] = true;
+ if (array_key_exists('sku', $rowData)) {
+ $skuSet[$rowData['sku']] = true;
+ }
} catch (\InvalidArgumentException $e) {
$this->addRowError($e->getMessage(), $this->_processedRowsCount);
$this->_processedRowsCount++;
@@ -436,7 +438,7 @@ protected function _saveValidatedBunches()
$source->next();
}
}
- $this->_processedEntitiesCount = count($skuSet);
+ $this->_processedEntitiesCount = (count($skuSet)) ? : $this->_processedRowsCount;
return $this;
}
diff --git a/app/code/Magento/Msrp/i18n/de_DE.csv b/app/code/Magento/Msrp/i18n/de_DE.csv
deleted file mode 100644
index be8e733a4bfd1..0000000000000
--- a/app/code/Magento/Msrp/i18n/de_DE.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-"Enabling MAP by default will hide all product prices on Storefront.","Enabling MAP by default will hide all product prices on Storefront."
-"Warning!","Warning!"
diff --git a/app/code/Magento/Msrp/i18n/es_ES.csv b/app/code/Magento/Msrp/i18n/es_ES.csv
deleted file mode 100644
index be8e733a4bfd1..0000000000000
--- a/app/code/Magento/Msrp/i18n/es_ES.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-"Enabling MAP by default will hide all product prices on Storefront.","Enabling MAP by default will hide all product prices on Storefront."
-"Warning!","Warning!"
diff --git a/app/code/Magento/Msrp/i18n/fr_FR.csv b/app/code/Magento/Msrp/i18n/fr_FR.csv
deleted file mode 100644
index be8e733a4bfd1..0000000000000
--- a/app/code/Magento/Msrp/i18n/fr_FR.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-"Enabling MAP by default will hide all product prices on Storefront.","Enabling MAP by default will hide all product prices on Storefront."
-"Warning!","Warning!"
diff --git a/app/code/Magento/Msrp/i18n/nl_NL.csv b/app/code/Magento/Msrp/i18n/nl_NL.csv
deleted file mode 100644
index be8e733a4bfd1..0000000000000
--- a/app/code/Magento/Msrp/i18n/nl_NL.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-"Enabling MAP by default will hide all product prices on Storefront.","Enabling MAP by default will hide all product prices on Storefront."
-"Warning!","Warning!"
diff --git a/app/code/Magento/Msrp/i18n/pt_BR.csv b/app/code/Magento/Msrp/i18n/pt_BR.csv
deleted file mode 100644
index be8e733a4bfd1..0000000000000
--- a/app/code/Magento/Msrp/i18n/pt_BR.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-"Enabling MAP by default will hide all product prices on Storefront.","Enabling MAP by default will hide all product prices on Storefront."
-"Warning!","Warning!"
diff --git a/app/code/Magento/Msrp/i18n/zh_Hans_CN.csv b/app/code/Magento/Msrp/i18n/zh_Hans_CN.csv
deleted file mode 100644
index be8e733a4bfd1..0000000000000
--- a/app/code/Magento/Msrp/i18n/zh_Hans_CN.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-"Enabling MAP by default will hide all product prices on Storefront.","Enabling MAP by default will hide all product prices on Storefront."
-"Warning!","Warning!"
diff --git a/app/code/Magento/Paypal/README.md b/app/code/Magento/Paypal/README.md
index 8f4453ae0a058..0ed4f2e90291b 100644
--- a/app/code/Magento/Paypal/README.md
+++ b/app/code/Magento/Paypal/README.md
@@ -1,6 +1,6 @@
Module Magento\PayPal implements integration with the PayPal payment system. Namely, it enables the following payment methods:
-*PayPal Express Checkout
-*PayPal Payments Standard
-*PayPal Payments Pro
-*PayPal Credit
-*PayFlow Payment Gateway
+* PayPal Express Checkout
+* PayPal Payments Standard
+* PayPal Payments Pro
+* PayPal Credit
+* PayFlow Payment Gateway
diff --git a/app/code/Magento/ProductVideo/i18n/de_DE.csv b/app/code/Magento/ProductVideo/i18n/de_DE.csv
deleted file mode 100644
index ca24668bb8d16..0000000000000
--- a/app/code/Magento/ProductVideo/i18n/de_DE.csv
+++ /dev/null
@@ -1,10 +0,0 @@
-"Add video","Add video"
-"New Video","New Video"
-"Product Video","Product Video"
-"YouTube API key","YouTube API key"
-"You have not entered youtube API key. No information about youtube video will be retrieved.","You have not entered youtube API key. No information about youtube video will be retrieved."
-"Url","Url"
-"Preview Image","Preview Image"
-"Get Video Information","Get Video Information"
-"Youtube or Vimeo supported","Youtube or Vimeo supported"
-"Delete image in all store views","Delete image in all store views"
diff --git a/app/code/Magento/ProductVideo/i18n/es_ES.csv b/app/code/Magento/ProductVideo/i18n/es_ES.csv
deleted file mode 100644
index ca24668bb8d16..0000000000000
--- a/app/code/Magento/ProductVideo/i18n/es_ES.csv
+++ /dev/null
@@ -1,10 +0,0 @@
-"Add video","Add video"
-"New Video","New Video"
-"Product Video","Product Video"
-"YouTube API key","YouTube API key"
-"You have not entered youtube API key. No information about youtube video will be retrieved.","You have not entered youtube API key. No information about youtube video will be retrieved."
-"Url","Url"
-"Preview Image","Preview Image"
-"Get Video Information","Get Video Information"
-"Youtube or Vimeo supported","Youtube or Vimeo supported"
-"Delete image in all store views","Delete image in all store views"
diff --git a/app/code/Magento/ProductVideo/i18n/fr_FR.csv b/app/code/Magento/ProductVideo/i18n/fr_FR.csv
deleted file mode 100644
index ca24668bb8d16..0000000000000
--- a/app/code/Magento/ProductVideo/i18n/fr_FR.csv
+++ /dev/null
@@ -1,10 +0,0 @@
-"Add video","Add video"
-"New Video","New Video"
-"Product Video","Product Video"
-"YouTube API key","YouTube API key"
-"You have not entered youtube API key. No information about youtube video will be retrieved.","You have not entered youtube API key. No information about youtube video will be retrieved."
-"Url","Url"
-"Preview Image","Preview Image"
-"Get Video Information","Get Video Information"
-"Youtube or Vimeo supported","Youtube or Vimeo supported"
-"Delete image in all store views","Delete image in all store views"
diff --git a/app/code/Magento/ProductVideo/i18n/nl_NL.csv b/app/code/Magento/ProductVideo/i18n/nl_NL.csv
deleted file mode 100644
index 5ad8386573040..0000000000000
--- a/app/code/Magento/ProductVideo/i18n/nl_NL.csv
+++ /dev/null
@@ -1,10 +0,0 @@
-"Add video","Add video"
-"New Video","New Video"
-"Product Video","Product Video"
-"YouTube API key","YouTube API key"
-"You have not entered youtube API key. No information about youtube video will be retrieved.","You have not entered youtube API key. No information about youtube video will be retrieved."
-"Url","Url"
-"Preview Image","Preview Image"
-"Get Video Information","Get Video Information"
-"Youtube or Vimeo supported","Youtube or Vimeo supported"
-"Delete image in all store views","Delete image in all store views"
\ No newline at end of file
diff --git a/app/code/Magento/ProductVideo/i18n/pt_BR.csv b/app/code/Magento/ProductVideo/i18n/pt_BR.csv
deleted file mode 100644
index 5ad8386573040..0000000000000
--- a/app/code/Magento/ProductVideo/i18n/pt_BR.csv
+++ /dev/null
@@ -1,10 +0,0 @@
-"Add video","Add video"
-"New Video","New Video"
-"Product Video","Product Video"
-"YouTube API key","YouTube API key"
-"You have not entered youtube API key. No information about youtube video will be retrieved.","You have not entered youtube API key. No information about youtube video will be retrieved."
-"Url","Url"
-"Preview Image","Preview Image"
-"Get Video Information","Get Video Information"
-"Youtube or Vimeo supported","Youtube or Vimeo supported"
-"Delete image in all store views","Delete image in all store views"
\ No newline at end of file
diff --git a/app/code/Magento/ProductVideo/i18n/zh_Hans_CN.csv b/app/code/Magento/ProductVideo/i18n/zh_Hans_CN.csv
deleted file mode 100644
index 5ad8386573040..0000000000000
--- a/app/code/Magento/ProductVideo/i18n/zh_Hans_CN.csv
+++ /dev/null
@@ -1,10 +0,0 @@
-"Add video","Add video"
-"New Video","New Video"
-"Product Video","Product Video"
-"YouTube API key","YouTube API key"
-"You have not entered youtube API key. No information about youtube video will be retrieved.","You have not entered youtube API key. No information about youtube video will be retrieved."
-"Url","Url"
-"Preview Image","Preview Image"
-"Get Video Information","Get Video Information"
-"Youtube or Vimeo supported","Youtube or Vimeo supported"
-"Delete image in all store views","Delete image in all store views"
\ No newline at end of file
diff --git a/app/code/Magento/Search/i18n/de_DE.csv b/app/code/Magento/Search/i18n/de_DE.csv
deleted file mode 100644
index 8b4b04aa3b9ec..0000000000000
--- a/app/code/Magento/Search/i18n/de_DE.csv
+++ /dev/null
@@ -1 +0,0 @@
-"Search Engine","Search Engine"
diff --git a/app/code/Magento/Search/i18n/es_ES.csv b/app/code/Magento/Search/i18n/es_ES.csv
deleted file mode 100644
index 8b4b04aa3b9ec..0000000000000
--- a/app/code/Magento/Search/i18n/es_ES.csv
+++ /dev/null
@@ -1 +0,0 @@
-"Search Engine","Search Engine"
diff --git a/app/code/Magento/Search/i18n/fr_FR.csv b/app/code/Magento/Search/i18n/fr_FR.csv
deleted file mode 100644
index 8b4b04aa3b9ec..0000000000000
--- a/app/code/Magento/Search/i18n/fr_FR.csv
+++ /dev/null
@@ -1 +0,0 @@
-"Search Engine","Search Engine"
diff --git a/app/code/Magento/Search/i18n/nl_NL.csv b/app/code/Magento/Search/i18n/nl_NL.csv
deleted file mode 100644
index 8b4b04aa3b9ec..0000000000000
--- a/app/code/Magento/Search/i18n/nl_NL.csv
+++ /dev/null
@@ -1 +0,0 @@
-"Search Engine","Search Engine"
diff --git a/app/code/Magento/Search/i18n/pt_BR.csv b/app/code/Magento/Search/i18n/pt_BR.csv
deleted file mode 100644
index c10566a7c9800..0000000000000
--- a/app/code/Magento/Search/i18n/pt_BR.csv
+++ /dev/null
@@ -1 +0,0 @@
-"Search Engine","Mecanismo de Busca"
diff --git a/app/code/Magento/Search/i18n/zh_Hans_CN.csv b/app/code/Magento/Search/i18n/zh_Hans_CN.csv
deleted file mode 100644
index 8b4b04aa3b9ec..0000000000000
--- a/app/code/Magento/Search/i18n/zh_Hans_CN.csv
+++ /dev/null
@@ -1 +0,0 @@
-"Search Engine","Search Engine"
diff --git a/app/code/Magento/Swatches/i18n/de_DE.csv b/app/code/Magento/Swatches/i18n/de_DE.csv
deleted file mode 100644
index f0aa34bbef26e..0000000000000
--- a/app/code/Magento/Swatches/i18n/de_DE.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-"Swatch","Swatch"
-"Swatches per Product","Swatches per Product"
diff --git a/app/code/Magento/Swatches/i18n/es_ES.csv b/app/code/Magento/Swatches/i18n/es_ES.csv
deleted file mode 100644
index f0aa34bbef26e..0000000000000
--- a/app/code/Magento/Swatches/i18n/es_ES.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-"Swatch","Swatch"
-"Swatches per Product","Swatches per Product"
diff --git a/app/code/Magento/Swatches/i18n/fr_FR.csv b/app/code/Magento/Swatches/i18n/fr_FR.csv
deleted file mode 100644
index f0aa34bbef26e..0000000000000
--- a/app/code/Magento/Swatches/i18n/fr_FR.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-"Swatch","Swatch"
-"Swatches per Product","Swatches per Product"
diff --git a/app/code/Magento/Swatches/i18n/nl_NL.csv b/app/code/Magento/Swatches/i18n/nl_NL.csv
deleted file mode 100644
index f0aa34bbef26e..0000000000000
--- a/app/code/Magento/Swatches/i18n/nl_NL.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-"Swatch","Swatch"
-"Swatches per Product","Swatches per Product"
diff --git a/app/code/Magento/Swatches/i18n/pt_BR.csv b/app/code/Magento/Swatches/i18n/pt_BR.csv
deleted file mode 100644
index f0aa34bbef26e..0000000000000
--- a/app/code/Magento/Swatches/i18n/pt_BR.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-"Swatch","Swatch"
-"Swatches per Product","Swatches per Product"
diff --git a/app/code/Magento/Swatches/i18n/zh_Hans_CN.csv b/app/code/Magento/Swatches/i18n/zh_Hans_CN.csv
deleted file mode 100644
index f0aa34bbef26e..0000000000000
--- a/app/code/Magento/Swatches/i18n/zh_Hans_CN.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-"Swatch","Swatch"
-"Swatches per Product","Swatches per Product"
diff --git a/app/code/Magento/Ui/i18n/de_DE.csv b/app/code/Magento/Ui/i18n/de_DE.csv
deleted file mode 100644
index 2efac126b857c..0000000000000
--- a/app/code/Magento/Ui/i18n/de_DE.csv
+++ /dev/null
@@ -1,4 +0,0 @@
-"Log JS Errors to Session Storage","Log JS Errors to Session Storage"
-"If enabled, can be used by functional tests for extended reporting","If enabled, can be used by functional tests for extended reporting"
-"Log JS Errors to Session Storage Key","Log JS Errors to Session Storage Key"
-"Use this key to retrieve collected js errors","Use this key to retrieve collected js errors"
diff --git a/app/code/Magento/Ui/i18n/es_ES.csv b/app/code/Magento/Ui/i18n/es_ES.csv
deleted file mode 100644
index 2efac126b857c..0000000000000
--- a/app/code/Magento/Ui/i18n/es_ES.csv
+++ /dev/null
@@ -1,4 +0,0 @@
-"Log JS Errors to Session Storage","Log JS Errors to Session Storage"
-"If enabled, can be used by functional tests for extended reporting","If enabled, can be used by functional tests for extended reporting"
-"Log JS Errors to Session Storage Key","Log JS Errors to Session Storage Key"
-"Use this key to retrieve collected js errors","Use this key to retrieve collected js errors"
diff --git a/app/code/Magento/Ui/i18n/fr_FR.csv b/app/code/Magento/Ui/i18n/fr_FR.csv
deleted file mode 100644
index 2efac126b857c..0000000000000
--- a/app/code/Magento/Ui/i18n/fr_FR.csv
+++ /dev/null
@@ -1,4 +0,0 @@
-"Log JS Errors to Session Storage","Log JS Errors to Session Storage"
-"If enabled, can be used by functional tests for extended reporting","If enabled, can be used by functional tests for extended reporting"
-"Log JS Errors to Session Storage Key","Log JS Errors to Session Storage Key"
-"Use this key to retrieve collected js errors","Use this key to retrieve collected js errors"
diff --git a/app/code/Magento/Ui/i18n/nl_NL.csv b/app/code/Magento/Ui/i18n/nl_NL.csv
deleted file mode 100644
index 2efac126b857c..0000000000000
--- a/app/code/Magento/Ui/i18n/nl_NL.csv
+++ /dev/null
@@ -1,4 +0,0 @@
-"Log JS Errors to Session Storage","Log JS Errors to Session Storage"
-"If enabled, can be used by functional tests for extended reporting","If enabled, can be used by functional tests for extended reporting"
-"Log JS Errors to Session Storage Key","Log JS Errors to Session Storage Key"
-"Use this key to retrieve collected js errors","Use this key to retrieve collected js errors"
diff --git a/app/code/Magento/Ui/i18n/pt_BR.csv b/app/code/Magento/Ui/i18n/pt_BR.csv
deleted file mode 100644
index 2efac126b857c..0000000000000
--- a/app/code/Magento/Ui/i18n/pt_BR.csv
+++ /dev/null
@@ -1,4 +0,0 @@
-"Log JS Errors to Session Storage","Log JS Errors to Session Storage"
-"If enabled, can be used by functional tests for extended reporting","If enabled, can be used by functional tests for extended reporting"
-"Log JS Errors to Session Storage Key","Log JS Errors to Session Storage Key"
-"Use this key to retrieve collected js errors","Use this key to retrieve collected js errors"
diff --git a/app/code/Magento/Ui/i18n/zh_Hans_CN.csv b/app/code/Magento/Ui/i18n/zh_Hans_CN.csv
deleted file mode 100644
index 2efac126b857c..0000000000000
--- a/app/code/Magento/Ui/i18n/zh_Hans_CN.csv
+++ /dev/null
@@ -1,4 +0,0 @@
-"Log JS Errors to Session Storage","Log JS Errors to Session Storage"
-"If enabled, can be used by functional tests for extended reporting","If enabled, can be used by functional tests for extended reporting"
-"Log JS Errors to Session Storage Key","Log JS Errors to Session Storage Key"
-"Use this key to retrieve collected js errors","Use this key to retrieve collected js errors"
diff --git a/app/code/Magento/Ui/view/base/web/js/lib/core/storage/local.js b/app/code/Magento/Ui/view/base/web/js/lib/core/storage/local.js
index 038907c21224d..adeb510ab3e40 100644
--- a/app/code/Magento/Ui/view/base/web/js/lib/core/storage/local.js
+++ b/app/code/Magento/Ui/view/base/web/js/lib/core/storage/local.js
@@ -114,8 +114,8 @@ define([
*
* @param {String} path - Path to the property.
*
- * @example Retrieveing data.
- * localStoarge =>
+ * @example Retrieving data.
+ * localStorage =>
* 'appData' => '
* "one": {"two": "three"}
* '
@@ -139,7 +139,7 @@ define([
*
* @example Setting data.
* storage.set('one.two', 'four');
- * => localStoarge =>
+ * => localStorage =>
* 'appData' => '
* "one": {"two": "four"}
* '
@@ -159,7 +159,7 @@ define([
*
* @example Removing data.
* storage.remove('one.two', 'four');
- * => localStoarge =>
+ * => localStorage =>
* 'appData' => '
* "one": {}
* '
diff --git a/app/code/Magento/Ui/view/base/web/js/lib/knockout/template/renderer.js b/app/code/Magento/Ui/view/base/web/js/lib/knockout/template/renderer.js
index 2e0c53373f807..2cfd961619249 100644
--- a/app/code/Magento/Ui/view/base/web/js/lib/knockout/template/renderer.js
+++ b/app/code/Magento/Ui/view/base/web/js/lib/knockout/template/renderer.js
@@ -519,7 +519,7 @@ define([
},
/**
- * Custom 'render' attrobute handler function. Wraps child elements
+ * Custom 'render' attribute handler function. Wraps child elements
* of a node with knockout's 'ko template:' comment tag.
*
* @param {HTMLElement} node - Element to be processed.
diff --git a/app/code/Magento/Ui/view/base/web/js/lib/logger/logger-utils.js b/app/code/Magento/Ui/view/base/web/js/lib/logger/logger-utils.js
index fe83f600132ed..bf7ae0cdc3e98 100644
--- a/app/code/Magento/Ui/view/base/web/js/lib/logger/logger-utils.js
+++ b/app/code/Magento/Ui/view/base/web/js/lib/logger/logger-utils.js
@@ -42,14 +42,14 @@ define([], function () {
* Method that creates object of messages
* @param {String} requested - log message that showing that request for class is started
* @param {String} loaded - log message that show when requested class is loaded
- * @param {String} failded - log message that show when requested class is failed
+ * @param {String} failed - log message that show when requested class is failed
* @returns {Object}
*/
- LogUtils.prototype.createMessages = function (requested, loaded, failded) {
+ LogUtils.prototype.createMessages = function (requested, loaded, failed) {
return {
requested: requested || '',
loaded: loaded || '',
- failed: failded || ''
+ failed: failed || ''
};
};
@@ -57,14 +57,14 @@ define([], function () {
* Method that creates object of log levels
* @param {String} requested - log message that showing that request for class is started
* @param {String} loaded - log message that show when requested class is loaded
- * @param {String} failded - log message that show when requested class is failed
+ * @param {String} failed - log message that show when requested class is failed
* @returns {Object}
*/
- LogUtils.prototype.createLevels = function (requested, loaded, failded) {
+ LogUtils.prototype.createLevels = function (requested, loaded, failed) {
return {
requested: requested || 'info',
loaded: loaded || 'info',
- failed: failded || 'warn'
+ failed: failed || 'warn'
};
};
diff --git a/app/code/Magento/Ui/view/base/web/js/lib/validation/validator.js b/app/code/Magento/Ui/view/base/web/js/lib/validation/validator.js
index 8ebbf88775b86..407984c7881a2 100644
--- a/app/code/Magento/Ui/view/base/web/js/lib/validation/validator.js
+++ b/app/code/Magento/Ui/view/base/web/js/lib/validation/validator.js
@@ -64,7 +64,7 @@ define([
}
/**
- * Validates provied value by a specified set of rules.
+ * Validates provided value by a specified set of rules.
*
* @param {(String|Object)} rules - One or many validation rules.
* @param {*} value - Value to be checked.
diff --git a/app/code/Magento/Ui/view/base/web/js/lib/view/utils/dom-observer.js b/app/code/Magento/Ui/view/base/web/js/lib/view/utils/dom-observer.js
index 03012918f4a0d..f8e752fb77af2 100644
--- a/app/code/Magento/Ui/view/base/web/js/lib/view/utils/dom-observer.js
+++ b/app/code/Magento/Ui/view/base/web/js/lib/view/utils/dom-observer.js
@@ -141,7 +141,7 @@ define([
}
/**
- * Calls handlers assocoiated with an added node.
+ * Calls handlers associated with an added node.
* Adds listeners for the node removal.
*
* @param {HTMLElement} node - Added node.
@@ -163,7 +163,7 @@ define([
}
/**
- * Calls handlers assocoiated with a removed node.
+ * Calls handlers associated with a removed node.
*
* @param {HTMLElement} node - Removed node.
*/
diff --git a/lib/internal/Magento/Framework/Config/ConfigOptionsListConstants.php b/lib/internal/Magento/Framework/Config/ConfigOptionsListConstants.php
index 92f0302d93baf..6bdb74ef7b89a 100644
--- a/lib/internal/Magento/Framework/Config/ConfigOptionsListConstants.php
+++ b/lib/internal/Magento/Framework/Config/ConfigOptionsListConstants.php
@@ -47,7 +47,7 @@ class ConfigOptionsListConstants
const CONFIG_PATH_SCD_ON_DEMAND_IN_PRODUCTION = 'static_content_on_demand_in_production';
/**
- * Paramater for forcing HTML minification even if file is already minified.
+ * Parameter for forcing HTML minification even if file is already minified.
*/
const CONFIG_PATH_FORCE_HTML_MINIFICATION = 'force_html_minification';
diff --git a/lib/internal/Magento/Framework/Event/Invoker/InvokerDefault.php b/lib/internal/Magento/Framework/Event/Invoker/InvokerDefault.php
index a7a387b5def81..acd0a61633557 100644
--- a/lib/internal/Magento/Framework/Event/Invoker/InvokerDefault.php
+++ b/lib/internal/Magento/Framework/Event/Invoker/InvokerDefault.php
@@ -9,7 +9,12 @@
namespace Magento\Framework\Event\Invoker;
use Magento\Framework\Event\Observer;
+use Psr\Log\LoggerInterface;
+use Magento\Framework\App\State;
+/**
+ * Default Invoker.
+ */
class InvokerDefault implements \Magento\Framework\Event\InvokerInterface
{
/**
@@ -22,20 +27,29 @@ class InvokerDefault implements \Magento\Framework\Event\InvokerInterface
/**
* Application state
*
- * @var \Magento\Framework\App\State
+ * @var State
*/
protected $_appState;
+ /**
+ * @var LoggerInterface
+ */
+ private $logger;
+
/**
* @param \Magento\Framework\Event\ObserverFactory $observerFactory
- * @param \Magento\Framework\App\State $appState
+ * @param State $appState
+ * @param LoggerInterface $logger
*/
public function __construct(
\Magento\Framework\Event\ObserverFactory $observerFactory,
- \Magento\Framework\App\State $appState
+ State $appState,
+ LoggerInterface $logger = null
) {
$this->_observerFactory = $observerFactory;
$this->_appState = $appState;
+ $this->logger = $logger ?: \Magento\Framework\App\ObjectManager::getInstance()
+ ->get(LoggerInterface::class);
}
/**
@@ -61,6 +75,8 @@ public function dispatch(array $configuration, Observer $observer)
}
/**
+ * Execute Observer.
+ *
* @param \Magento\Framework\Event\ObserverInterface $object
* @param Observer $observer
* @return $this
@@ -70,7 +86,7 @@ protected function _callObserverMethod($object, $observer)
{
if ($object instanceof \Magento\Framework\Event\ObserverInterface) {
$object->execute($observer);
- } elseif ($this->_appState->getMode() == \Magento\Framework\App\State::MODE_DEVELOPER) {
+ } elseif ($this->_appState->getMode() == State::MODE_DEVELOPER) {
throw new \LogicException(
sprintf(
'Observer "%s" must implement interface "%s"',
@@ -78,6 +94,12 @@ protected function _callObserverMethod($object, $observer)
\Magento\Framework\Event\ObserverInterface::class
)
);
+ } else {
+ $this->logger->warning(sprintf(
+ 'Observer "%s" must implement interface "%s"',
+ get_class($object),
+ \Magento\Framework\Event\ObserverInterface::class
+ ));
}
return $this;
}
diff --git a/lib/internal/Magento/Framework/Event/Test/Unit/Invoker/InvokerDefaultTest.php b/lib/internal/Magento/Framework/Event/Test/Unit/Invoker/InvokerDefaultTest.php
index 37f650dbef6a0..e6ec123823854 100644
--- a/lib/internal/Magento/Framework/Event/Test/Unit/Invoker/InvokerDefaultTest.php
+++ b/lib/internal/Magento/Framework/Event/Test/Unit/Invoker/InvokerDefaultTest.php
@@ -5,6 +5,9 @@
*/
namespace Magento\Framework\Event\Test\Unit\Invoker;
+/**
+ * Test for Magento\Framework\Event\Invoker\InvokerDefault.
+ */
class InvokerDefaultTest extends \PHPUnit\Framework\TestCase
{
/**
@@ -32,6 +35,11 @@ class InvokerDefaultTest extends \PHPUnit\Framework\TestCase
*/
protected $_invokerDefault;
+ /**
+ * @var |Psr\Log|LoggerInterface
+ */
+ private $loggerMock;
+
protected function setUp()
{
$this->_observerFactoryMock = $this->createMock(\Magento\Framework\Event\ObserverFactory::class);
@@ -41,10 +49,12 @@ protected function setUp()
['execute']
);
$this->_appStateMock = $this->createMock(\Magento\Framework\App\State::class);
+ $this->loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$this->_invokerDefault = new \Magento\Framework\Event\Invoker\InvokerDefault(
$this->_observerFactoryMock,
- $this->_appStateMock
+ $this->_appStateMock,
+ $this->loggerMock
);
}
@@ -166,13 +176,15 @@ public function testWrongInterfaceCallWithDisabledDeveloperMode($shared)
$this->returnValue($notObserver)
);
$this->_appStateMock->expects(
- $this->once()
+ $this->exactly(1)
)->method(
'getMode'
)->will(
$this->returnValue(\Magento\Framework\App\State::MODE_PRODUCTION)
);
+ $this->loggerMock->expects($this->once())->method('warning');
+
$this->_invokerDefault->dispatch(
[
'shared' => $shared,
diff --git a/pub/.htaccess b/pub/.htaccess
index 85a204c85e8a8..6a97a6d14dc00 100644
--- a/pub/.htaccess
+++ b/pub/.htaccess
@@ -47,11 +47,6 @@
php_flag session.auto_start off
############################################
-## Enable resulting html compression
-
- #php_flag zlib.output_compression on
-
-###########################################
# Disable user agent verification to not break multiple image upload
php_flag suhosin.session.cryptua off
diff --git a/setup/performance-toolkit/benchmark.jmx b/setup/performance-toolkit/benchmark.jmx
index c0d57ba0e2cef..2035da9d58265 100644
--- a/setup/performance-toolkit/benchmark.jmx
+++ b/setup/performance-toolkit/benchmark.jmx
@@ -364,6 +364,16 @@
${__P(graphQLPoolUsers,1)}
=
+
+ graphqlAddConfigurableProductToCartPercentage
+ ${__P(graphqlAddConfigurableProductToCartPercentage,0)}
+ =
+
+
+ graphqlAddSimpleProductToCartPercentage
+ ${__P(graphqlAddSimpleProductToCartPercentage,0)}
+ =
+
graphqlGetCategoryListByCategoryIdPercentage
${__P(graphqlGetCategoryListByCategoryIdPercentage,0)}
@@ -40572,6 +40582,534 @@ vars.putObject("category", categories[number]);
+
+
+ 1
+ false
+ 1
+ ${graphqlAddSimpleProductToCartPercentage}
+ mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx
+
+
+
+var testLabel = "${testLabel}" ? " (${testLabel})" : "";
+if (testLabel
+ && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy'
+) {
+ if (sampler.getName().indexOf(testLabel) == -1) {
+ sampler.setName(sampler.getName() + testLabel);
+ }
+} else if (sampler.getName().indexOf("SetUp - ") == -1) {
+ sampler.setName("SetUp - " + sampler.getName());
+}
+
+ javascript
+ mpaf/tool/fragments/_system/setup_label.jmx
+
+
+
+ vars.put("testLabel", "Add Simple Product To Cart");
+
+ true
+
+
+
+
+
+
+ Content-Type
+ application/json
+
+
+ Accept
+ */*
+
+
+ mpaf/tool/fragments/ce/api/header_manager_before_token.jmx
+
+
+
+ mpaf/tool/fragments/ce/common/init_random_generator_setup.jmx
+
+import java.util.Random;
+
+Random random = new Random();
+if (${seedForRandom} > 0) {
+ random.setSeed(${seedForRandom} + ${__threadNum});
+}
+
+vars.putObject("randomIntGenerator", random);
+
+
+
+ true
+
+
+
+
+
+import java.util.Random;
+
+Random random = vars.getObject("randomIntGenerator");
+number = random.nextInt(props.get("simple_products_list").size());
+product = props.get("simple_products_list").get(number);
+
+vars.put("product_url_key", product.get("url_key"));
+vars.put("product_id", product.get("id"));
+vars.put("product_name", product.get("title"));
+vars.put("product_uenc", product.get("uenc"));
+vars.put("product_sku", product.get("sku"));
+
+
+
+ true
+ mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx
+
+
+
+ true
+
+
+
+ false
+ {"query":"mutation {\n createEmptyCart\n}","variables":null,"operationName":null}
+ =
+
+
+
+
+ ${graphql_port_number}
+ 60000
+ 200000
+ ${request_protocol}
+
+ ${base_path}graphql
+ POST
+ true
+ false
+ true
+ false
+ false
+
+ mpaf/tool/fragments/ce/graphql/create_empty_cart.jmx
+
+
+
+ quote_id
+ $.data.createEmptyCart
+
+
+ BODY
+
+
+
+
+
+ true
+
+
+
+ false
+ {"query":"mutation { \n addSimpleProductsToCart(\n input: {\n cart_id: \"${quote_id}\"\n cartItems: [\n {\n data: {\n qty: 2\n sku: \"${product_sku}\"\n }\n }\n ]\n }\n ) {\n cart {\n items {\n qty\n product {\n sku\n }\n }\n }\n }\n}","variables":null,"operationName":null}
+ =
+
+
+
+
+ ${graphql_port_number}
+ 60000
+ 200000
+ ${request_protocol}
+
+ ${base_path}graphql
+ POST
+ true
+ false
+ true
+ false
+ false
+
+ mpaf/tool/fragments/ce/graphql/add_simple_product_to_cart.jmx
+
+
+
+
+ addSimpleProductsToCart
+ "sku":"${product_sku}"
+
+ Assertion.response_data
+ false
+ 2
+
+
+
+
+
+ true
+
+
+
+ false
+ {"query":"{\n cart(cart_id: \"${quote_id}\") {\n items {\n id\n qty\n product {\n sku\n }\n }\n }\n}","variables":null,"operationName":null}
+ =
+
+
+
+
+ ${graphql_port_number}
+ 60000
+ 200000
+ ${request_protocol}
+
+ ${base_path}graphql
+ POST
+ true
+ false
+ true
+ false
+ false
+
+ mpaf/tool/fragments/ce/graphql/get_cart.jmx
+
+
+
+ item_id
+ $.data.cart.items[0].id
+
+
+ BODY
+
+
+
+
+
+ true
+
+
+
+ false
+ {"query":"mutation {\n removeItemFromCart(\n input: {\n cart_id: \"${quote_id}\"\n cart_item_id: ${item_id}\n }\n ) {\n cart {\n items {\n qty\n }\n }\n }\n}","variables":null,"operationName":null}
+ =
+
+
+
+
+ ${graphql_port_number}
+ 60000
+ 200000
+ ${request_protocol}
+
+ ${base_path}graphql
+ POST
+ true
+ false
+ true
+ false
+ false
+
+ mpaf/tool/fragments/ce/graphql/remove_simple_product_from_cart.jmx
+
+
+
+
+ {"data":{"removeItemFromCart":{"cart":{"items":[]}}}}
+
+ Assertion.response_data
+ false
+ 8
+
+
+
+
+
+
+
+ 1
+ false
+ 1
+ ${graphqlAddConfigurableProductToCartPercentage}
+ mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx
+
+
+
+var testLabel = "${testLabel}" ? " (${testLabel})" : "";
+if (testLabel
+ && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy'
+) {
+ if (sampler.getName().indexOf(testLabel) == -1) {
+ sampler.setName(sampler.getName() + testLabel);
+ }
+} else if (sampler.getName().indexOf("SetUp - ") == -1) {
+ sampler.setName("SetUp - " + sampler.getName());
+}
+
+ javascript
+ mpaf/tool/fragments/_system/setup_label.jmx
+
+
+
+ vars.put("testLabel", "Add Configurable Product To Cart");
+
+ true
+
+
+
+
+
+
+ Content-Type
+ application/json
+
+
+ Accept
+ */*
+
+
+ mpaf/tool/fragments/ce/api/header_manager_before_token.jmx
+
+
+
+ mpaf/tool/fragments/ce/common/init_random_generator_setup.jmx
+
+import java.util.Random;
+
+Random random = new Random();
+if (${seedForRandom} > 0) {
+ random.setSeed(${seedForRandom} + ${__threadNum});
+}
+
+vars.putObject("randomIntGenerator", random);
+
+
+
+ true
+
+
+
+
+
+import java.util.Random;
+
+Random random = vars.getObject("randomIntGenerator");
+number = random.nextInt(props.get("configurable_products_list").size());
+product = props.get("configurable_products_list").get(number);
+
+vars.put("product_url_key", product.get("url_key"));
+vars.put("product_id", product.get("id"));
+vars.put("product_name", product.get("title"));
+vars.put("product_uenc", product.get("uenc"));
+vars.put("product_sku", product.get("sku"));
+
+
+
+ true
+ mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx
+
+
+
+ true
+
+
+
+ false
+ {"query":"query productDetailByName($name: String, $onServer: Boolean!) {\n products(filter: { name: { eq: $name } }) {\n items {\n id\n sku\n name\n ... on ConfigurableProduct {\n configurable_options {\n attribute_code\n attribute_id\n id\n label\n values {\n default_label\n label\n store_label\n use_default_value\n value_index\n }\n }\n variants {\n product {\n #fashion_color\n #fashion_size\n id\n media_gallery_entries {\n disabled\n file\n label\n position\n }\n sku\n stock_status\n }\n }\n }\n meta_title @include(if: $onServer)\n meta_keyword @include(if: $onServer)\n meta_description @include(if: $onServer)\n }\n }\n}","variables":{"name":"${product_name}","onServer":false},"operationName":"productDetailByName"}
+ =
+
+
+
+
+ ${graphql_port_number}
+ 60000
+ 200000
+ ${request_protocol}
+
+ ${base_path}graphql
+ POST
+ true
+ false
+ true
+ false
+ false
+
+ mpaf/tool/fragments/ce/graphql/get_configurable_product_details_by_name.jmx
+
+
+
+
+ "sku":"${product_sku}","name":"${product_name}"
+
+ Assertion.response_data
+ false
+ 2
+
+
+
+
+ product_option
+ $.data.products.items[0].variants[0].product.sku
+
+
+ BODY
+ mpaf/tool/fragments/ce/graphql/extract_configurable_product_option.jmx
+
+
+
+
+ true
+
+
+
+ false
+ {"query":"mutation {\n createEmptyCart\n}","variables":null,"operationName":null}
+ =
+
+
+
+
+ ${graphql_port_number}
+ 60000
+ 200000
+ ${request_protocol}
+
+ ${base_path}graphql
+ POST
+ true
+ false
+ true
+ false
+ false
+
+ mpaf/tool/fragments/ce/graphql/create_empty_cart.jmx
+
+
+
+ quote_id
+ $.data.createEmptyCart
+
+
+ BODY
+
+
+
+
+
+ true
+
+
+
+ false
+ {"query":"mutation {\n addConfigurableProductsToCart(\n input: {\n cart_id: \"${quote_id}\"\n cartItems: [\n {\n variant_sku: \"${product_option}\"\n data: {\n qty: 2\n sku: \"${product_option}\"\n }\n }\n ]\n }\n ) {\n cart {\n items {\n id\n qty\n product {\n name\n sku\n }\n ... on ConfigurableCartItem {\n configurable_options {\n option_label\n }\n }\n }\n }\n }\n}","variables":null,"operationName":null}
+ =
+
+
+
+
+ ${graphql_port_number}
+ 60000
+ 200000
+ ${request_protocol}
+
+ ${base_path}graphql
+ POST
+ true
+ false
+ true
+ false
+ false
+
+ mpaf/tool/fragments/ce/graphql/add_configurable_product_to_cart.jmx
+
+
+
+
+ addConfigurableProductsToCart
+ "sku":"${product_option}"
+
+ Assertion.response_data
+ false
+ 2
+
+
+
+
+
+ true
+
+
+
+ false
+ {"query":"{\n cart(cart_id: \"${quote_id}\") {\n items {\n id\n qty\n product {\n sku\n }\n }\n }\n}","variables":null,"operationName":null}
+ =
+
+
+
+
+ ${graphql_port_number}
+ 60000
+ 200000
+ ${request_protocol}
+
+ ${base_path}graphql
+ POST
+ true
+ false
+ true
+ false
+ false
+
+ mpaf/tool/fragments/ce/graphql/get_cart.jmx
+
+
+
+ item_id
+ $.data.cart.items[0].id
+
+
+ BODY
+
+
+
+
+
+ true
+
+
+
+ false
+ {"query":"mutation {\n removeItemFromCart(\n input: {\n cart_id: \"${quote_id}\"\n cart_item_id: ${item_id}\n }\n ) {\n cart {\n items {\n qty\n }\n }\n }\n}","variables":null,"operationName":null}
+ =
+
+
+
+
+ ${graphql_port_number}
+ 60000
+ 200000
+ ${request_protocol}
+
+ ${base_path}graphql
+ POST
+ true
+ false
+ true
+ false
+ false
+
+ mpaf/tool/fragments/ce/graphql/remove_configurable_product_from_cart.jmx
+
+
+
+
+ {"data":{"removeItemFromCart":{"cart":{"items":[]}}}}
+
+ Assertion.response_data
+ false
+ 8
+
+
+
+
+