diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Product/Collection.php b/app/code/Magento/Catalog/Model/ResourceModel/Product/Collection.php
index 41b3f9781c8a0..e983ec062751d 100644
--- a/app/code/Magento/Catalog/Model/ResourceModel/Product/Collection.php
+++ b/app/code/Magento/Catalog/Model/ResourceModel/Product/Collection.php
@@ -1735,7 +1735,9 @@ public function addAttributeToSort($attribute, $dir = self::SORT_ORDER_ASC)
if ($attribute == 'price' && $storeId != 0) {
$this->addPriceData();
if ($this->_productLimitationFilters->isUsingPriceIndex()) {
- $this->getSelect()->order("price_index.min_price {$dir}");
+ $this->getSelect()->order(
+ new \Zend_Db_Expr("price_index.min_price = 0, price_index.min_price {$dir}")
+ );
return $this;
}
}
diff --git a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontAssertNotExistProductInRecentlyComparedWidgetActionGroup.xml b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontAssertNotExistProductInRecentlyComparedWidgetActionGroup.xml
new file mode 100644
index 0000000000000..800685861ea3b
--- /dev/null
+++ b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontAssertNotExistProductInRecentlyComparedWidgetActionGroup.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+ Validate that the provided Product does not appear in the Recently Compared Products widget.
+
+
+
+
+
+
+
+
+
diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/StoreFrontRecentlyComparedAtWebsiteLevelTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/StoreFrontRecentlyComparedAtWebsiteLevelTest.xml
new file mode 100644
index 0000000000000..f675e66f42aea
--- /dev/null
+++ b/app/code/Magento/Catalog/Test/Mftf/Test/StoreFrontRecentlyComparedAtWebsiteLevelTest.xml
@@ -0,0 +1,106 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/code/Magento/Catalog/view/frontend/web/js/product/provider-compared.js b/app/code/Magento/Catalog/view/frontend/web/js/product/provider-compared.js
index 93f01682b4e48..11e092e47ae22 100644
--- a/app/code/Magento/Catalog/view/frontend/web/js/product/provider-compared.js
+++ b/app/code/Magento/Catalog/view/frontend/web/js/product/provider-compared.js
@@ -31,13 +31,27 @@ define([
*/
dataFilter: function (data) {
var providerData = this.idsStorage.prepareData(customerData.get(this.identifiersConfig.provider)().items),
- result = {};
+ result = {},
+ productCurrentScope,
+ scopeId;
- _.each(data, function (value, key) {
- if (!providerData[key]) {
- result[key] = value;
- }
- });
+ if (typeof this.data.productCurrentScope !== 'undefined') {
+ productCurrentScope = this.data.productCurrentScope;
+ scopeId = productCurrentScope === 'store' ? window.checkout.storeId :
+ productCurrentScope === 'group' ? window.checkout.storeGroupId :
+ window.checkout.websiteId;
+ _.each(data, function (value, key) {
+ if (!providerData[productCurrentScope + '-' + scopeId + '-' + key]) {
+ result[key] = value;
+ }
+ });
+ } else {
+ _.each(data, function (value, key) {
+ if (!providerData[key]) {
+ result[key] = value;
+ }
+ });
+ }
return result;
},
diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/Image/Placeholder.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/Image/Placeholder.php
index f5cf2a9ef82ff..e7ce63784addf 100644
--- a/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/Image/Placeholder.php
+++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/Image/Placeholder.php
@@ -8,7 +8,9 @@
namespace Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\Image;
use Magento\Catalog\Model\View\Asset\PlaceholderFactory;
+use Magento\Framework\App\Area;
use Magento\Framework\View\Asset\Repository as AssetRepository;
+use Magento\Framework\View\DesignInterface;
/**
* Image Placeholder provider
@@ -25,16 +27,24 @@ class Placeholder
*/
private $assetRepository;
+ /**
+ * @var DesignInterface
+ */
+ private $themeDesign;
+
/**
* @param PlaceholderFactory $placeholderFactory
* @param AssetRepository $assetRepository
+ * @param DesignInterface $themeDesign
*/
public function __construct(
PlaceholderFactory $placeholderFactory,
- AssetRepository $assetRepository
+ AssetRepository $assetRepository,
+ DesignInterface $themeDesign
) {
$this->placeholderFactory = $placeholderFactory;
$this->assetRepository = $assetRepository;
+ $this->themeDesign = $themeDesign;
}
/**
@@ -52,8 +62,14 @@ public function getPlaceholder(string $imageType): string
return $imageAsset->getUrl();
}
- return $this->assetRepository->getUrl(
- "Magento_Catalog::images/product/placeholder/{$imageType}.jpg"
+ $params = [
+ 'area' => Area::AREA_FRONTEND,
+ 'themeId' => $this->themeDesign->getConfigurationDesignTheme(Area::AREA_FRONTEND),
+ ];
+
+ return $this->assetRepository->getUrlWithParams(
+ "Magento_Catalog::images/product/placeholder/{$imageType}.jpg",
+ $params
);
}
}
diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/Image/Placeholder/Theme.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/Image/Placeholder/Theme.php
deleted file mode 100644
index dc48c5ef69346..0000000000000
--- a/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/Image/Placeholder/Theme.php
+++ /dev/null
@@ -1,71 +0,0 @@
-scopeConfig = $scopeConfig;
- $this->storeManager = $storeManager;
- $this->themeProvider = $themeProvider;
- }
-
- /**
- * Get theme model
- *
- * @return array
- * @throws \Magento\Framework\Exception\NoSuchEntityException
- */
- public function getThemeData(): array
- {
- $themeId = $this->scopeConfig->getValue(
- \Magento\Framework\View\DesignInterface::XML_PATH_THEME_ID,
- \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
- $this->storeManager->getStore()->getId()
- );
-
- /** @var $theme \Magento\Framework\View\Design\ThemeInterface */
- $theme = $this->themeProvider->getThemeById($themeId);
-
- $data = $theme->getData();
- $data['themeModel'] = $theme;
-
- return $data;
- }
-}
diff --git a/app/code/Magento/ConfigurableProduct/Model/Plugin/ProductRepositorySave.php b/app/code/Magento/ConfigurableProduct/Model/Plugin/ProductRepositorySave.php
index 54b6e42ff7678..8bc7f05b49e30 100644
--- a/app/code/Magento/ConfigurableProduct/Model/Plugin/ProductRepositorySave.php
+++ b/app/code/Magento/ConfigurableProduct/Model/Plugin/ProductRepositorySave.php
@@ -5,15 +5,17 @@
*/
namespace Magento\ConfigurableProduct\Model\Plugin;
-use Magento\Catalog\Model\ProductFactory;
use Magento\Catalog\Api\Data\ProductInterface;
use Magento\Framework\Exception\InputException;
use Magento\Catalog\Api\ProductRepositoryInterface;
-use Magento\Framework\Exception\CouldNotSaveException;
use Magento\ConfigurableProduct\Api\Data\OptionInterface;
use Magento\Catalog\Api\ProductAttributeRepositoryInterface;
use Magento\ConfigurableProduct\Model\Product\Type\Configurable;
+use Magento\Framework\Exception\NoSuchEntityException;
+/**
+ * Plugin to validate product links of configurable product and reset configurable attributes
+ */
class ProductRepositorySave
{
/**
@@ -22,46 +24,45 @@ class ProductRepositorySave
private $productAttributeRepository;
/**
- * @var ProductFactory
+ * @var ProductRepositoryInterface
*/
- private $productFactory;
+ private $productRepository;
/**
* @param ProductAttributeRepositoryInterface $productAttributeRepository
- * @param ProductFactory $productFactory
+ * @param ProductRepositoryInterface $productRepository
*/
public function __construct(
ProductAttributeRepositoryInterface $productAttributeRepository,
- ProductFactory $productFactory
+ ProductRepositoryInterface $productRepository
) {
$this->productAttributeRepository = $productAttributeRepository;
- $this->productFactory = $productFactory;
+ $this->productRepository = $productRepository;
}
/**
- * Validate product links and reset configurable attributes to configurable product
+ * Validate product links of configurable product
*
* @param ProductRepositoryInterface $subject
- * @param ProductInterface $result
* @param ProductInterface $product
* @param bool $saveOptions
- * @return ProductInterface
- * @throws CouldNotSaveException
+ * @return array
* @throws InputException
+ * @throws NoSuchEntityException
*
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
- public function afterSave(
+ public function beforeSave(
ProductRepositoryInterface $subject,
- ProductInterface $result,
ProductInterface $product,
$saveOptions = false
) {
+ $result[] = $product;
if ($product->getTypeId() !== Configurable::TYPE_CODE) {
return $result;
}
- $extensionAttributes = $result->getExtensionAttributes();
+ $extensionAttributes = $product->getExtensionAttributes();
if ($extensionAttributes === null) {
return $result;
}
@@ -81,23 +82,49 @@ public function afterSave(
$attributeCodes[] = $attributeCode;
}
$this->validateProductLinks($attributeCodes, $configurableLinks);
+
+ return $result;
+ }
+
+ /**
+ * Reset configurable attributes to configurable product
+ *
+ * @param ProductRepositoryInterface $subject
+ * @param ProductInterface $result
+ * @param ProductInterface $product
+ * @param bool $saveOptions
+ * @return ProductInterface
+ *
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+ */
+ public function afterSave(
+ ProductRepositoryInterface $subject,
+ ProductInterface $result,
+ ProductInterface $product,
+ $saveOptions = false
+ ) {
+ if ($product->getTypeId() !== Configurable::TYPE_CODE) {
+ return $result;
+ }
$result->getTypeInstance()->resetConfigurableAttributes($product);
return $result;
}
/**
+ * Validate product links
+ *
* @param array $attributeCodes
* @param array $linkIds
- * @return $this
+ * @return void
* @throws InputException
+ * @throws NoSuchEntityException
*/
private function validateProductLinks(array $attributeCodes, array $linkIds)
{
$valueMap = [];
-
foreach ($linkIds as $productId) {
- $variation = $this->productFactory->create()->load($productId);
+ $variation = $this->productRepository->getById($productId);
$valueKey = '';
foreach ($attributeCodes as $attributeCode) {
if (!$variation->getData($attributeCode)) {
diff --git a/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Plugin/ProductRepositorySaveTest.php b/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Plugin/ProductRepositorySaveTest.php
index 1c3e421ae924f..ea8bb065a7786 100644
--- a/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Plugin/ProductRepositorySaveTest.php
+++ b/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Plugin/ProductRepositorySaveTest.php
@@ -9,30 +9,26 @@
use Magento\Catalog\Api\ProductAttributeRepositoryInterface;
use Magento\Catalog\Api\ProductRepositoryInterface;
use Magento\Catalog\Model\Product;
-use Magento\Catalog\Model\ProductFactory;
use Magento\ConfigurableProduct\Api\Data\OptionInterface;
use Magento\ConfigurableProduct\Model\Plugin\ProductRepositorySave;
use Magento\ConfigurableProduct\Model\Product\Type\Configurable;
use Magento\ConfigurableProduct\Test\Unit\Model\Product\ProductExtensionAttributes;
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
-use PHPUnit_Framework_MockObject_MockObject as MockObject;
+use PHPUnit\Framework\MockObject\MockObject;
+use PHPUnit\Framework\TestCase;
/**
- * Class ProductRepositorySaveTest
+ * Test for ProductRepositorySave plugin
+ *
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
-class ProductRepositorySaveTest extends \PHPUnit\Framework\TestCase
+class ProductRepositorySaveTest extends TestCase
{
/**
* @var ProductAttributeRepositoryInterface|MockObject
*/
private $productAttributeRepository;
- /**
- * @var ProductFactory|MockObject
- */
- private $productFactory;
-
/**
* @var Product|MockObject
*/
@@ -68,15 +64,13 @@ class ProductRepositorySaveTest extends \PHPUnit\Framework\TestCase
*/
private $plugin;
+ /**
+ * @inheritdoc
+ */
protected function setUp()
{
$this->productAttributeRepository = $this->getMockForAbstractClass(ProductAttributeRepositoryInterface::class);
- $this->productFactory = $this->getMockBuilder(ProductFactory::class)
- ->disableOriginalConstructor()
- ->setMethods(['create'])
- ->getMock();
-
$this->product = $this->getMockBuilder(Product::class)
->disableOriginalConstructor()
->setMethods(['getTypeId', 'getExtensionAttributes'])
@@ -102,12 +96,15 @@ protected function setUp()
ProductRepositorySave::class,
[
'productAttributeRepository' => $this->productAttributeRepository,
- 'productFactory' => $this->productFactory
+ 'productRepository' => $this->productRepository
]
);
}
- public function testAfterSaveWhenProductIsSimple()
+ /**
+ * Validating the result after saving a configurable product
+ */
+ public function testBeforeSaveWhenProductIsSimple()
{
$this->product->expects(static::once())
->method('getTypeId')
@@ -116,18 +113,21 @@ public function testAfterSaveWhenProductIsSimple()
->method('getExtensionAttributes');
$this->assertEquals(
- $this->result,
- $this->plugin->afterSave($this->productRepository, $this->result, $this->product)
+ $this->product,
+ $this->plugin->beforeSave($this->productRepository, $this->product)[0]
);
}
- public function testAfterSaveWithoutOptions()
+ /**
+ * Test saving a configurable product without attribute options
+ */
+ public function testBeforeSaveWithoutOptions()
{
$this->product->expects(static::once())
->method('getTypeId')
->willReturn(Configurable::TYPE_CODE);
- $this->result->expects(static::once())
+ $this->product->expects(static::once())
->method('getExtensionAttributes')
->willReturn($this->extensionAttributes);
@@ -142,23 +142,25 @@ public function testAfterSaveWithoutOptions()
->method('get');
$this->assertEquals(
- $this->result,
- $this->plugin->afterSave($this->productRepository, $this->result, $this->product)
+ $this->product,
+ $this->plugin->beforeSave($this->productRepository, $this->product)[0]
);
}
/**
+ * Test saving a configurable product with same set of attribute values
+ *
* @expectedException \Magento\Framework\Exception\InputException
* @expectedExceptionMessage Products "5" and "4" have the same set of attribute values.
*/
- public function testAfterSaveWithLinks()
+ public function testBeforeSaveWithLinks()
{
$links = [4, 5];
$this->product->expects(static::once())
->method('getTypeId')
->willReturn(Configurable::TYPE_CODE);
- $this->result->expects(static::once())
+ $this->product->expects(static::once())
->method('getExtensionAttributes')
->willReturn($this->extensionAttributes);
$this->extensionAttributes->expects(static::once())
@@ -173,27 +175,26 @@ public function testAfterSaveWithLinks()
$product = $this->getMockBuilder(Product::class)
->disableOriginalConstructor()
- ->setMethods(['load', 'getData', '__wakeup'])
+ ->setMethods(['getData', '__wakeup'])
->getMock();
- $this->productFactory->expects(static::exactly(2))
- ->method('create')
+ $this->productRepository->expects(static::exactly(2))
+ ->method('getById')
->willReturn($product);
- $product->expects(static::exactly(2))
- ->method('load')
- ->willReturnSelf();
$product->expects(static::never())
->method('getData');
- $this->plugin->afterSave($this->productRepository, $this->result, $this->product);
+ $this->plugin->beforeSave($this->productRepository, $this->product);
}
/**
+ * Test saving a configurable product with missing attribute
+ *
* @expectedException \Magento\Framework\Exception\InputException
* @expectedExceptionMessage Product with id "4" does not contain required attribute "color".
*/
- public function testAfterSaveWithLinksWithMissingAttribute()
+ public function testBeforeSaveWithLinksWithMissingAttribute()
{
$simpleProductId = 4;
$links = [$simpleProductId, 5];
@@ -208,7 +209,7 @@ public function testAfterSaveWithLinksWithMissingAttribute()
->method('getTypeId')
->willReturn(Configurable::TYPE_CODE);
- $this->result->expects(static::once())
+ $this->product->expects(static::once())
->method('getExtensionAttributes')
->willReturn($this->extensionAttributes);
$this->extensionAttributes->expects(static::once())
@@ -228,29 +229,28 @@ public function testAfterSaveWithLinksWithMissingAttribute()
$product = $this->getMockBuilder(Product::class)
->disableOriginalConstructor()
- ->setMethods(['load', 'getData', '__wakeup'])
+ ->setMethods(['getData', '__wakeup'])
->getMock();
- $this->productFactory->expects(static::once())
- ->method('create')
+ $this->productRepository->expects(static::once())
+ ->method('getById')
->willReturn($product);
- $product->expects(static::once())
- ->method('load')
- ->with($simpleProductId)
- ->willReturnSelf();
+
$product->expects(static::once())
->method('getData')
->with($attributeCode)
->willReturn(false);
- $this->plugin->afterSave($this->productRepository, $this->result, $this->product);
+ $this->plugin->beforeSave($this->productRepository, $this->product);
}
/**
+ * Test saving a configurable product with duplicate attributes
+ *
* @expectedException \Magento\Framework\Exception\InputException
* @expectedExceptionMessage Products "5" and "4" have the same set of attribute values.
*/
- public function testAfterSaveWithLinksWithDuplicateAttributes()
+ public function testBeforeSaveWithLinksWithDuplicateAttributes()
{
$links = [4, 5];
$attributeCode = 'color';
@@ -264,7 +264,7 @@ public function testAfterSaveWithLinksWithDuplicateAttributes()
->method('getTypeId')
->willReturn(Configurable::TYPE_CODE);
- $this->result->expects(static::once())
+ $this->product->expects(static::once())
->method('getExtensionAttributes')
->willReturn($this->extensionAttributes);
$this->extensionAttributes->expects(static::once())
@@ -284,20 +284,18 @@ public function testAfterSaveWithLinksWithDuplicateAttributes()
$product = $this->getMockBuilder(Product::class)
->disableOriginalConstructor()
- ->setMethods(['load', 'getData', '__wakeup'])
+ ->setMethods(['getData', '__wakeup'])
->getMock();
- $this->productFactory->expects(static::exactly(2))
- ->method('create')
+ $this->productRepository->expects(static::exactly(2))
+ ->method('getById')
->willReturn($product);
- $product->expects(static::exactly(2))
- ->method('load')
- ->willReturnSelf();
+
$product->expects(static::exactly(4))
->method('getData')
->with($attributeCode)
->willReturn($attributeId);
- $this->plugin->afterSave($this->productRepository, $this->result, $this->product);
+ $this->plugin->beforeSave($this->productRepository, $this->product);
}
}
diff --git a/app/code/Magento/Elasticsearch/Model/ResourceModel/Fulltext/Collection/SearchResultApplier.php b/app/code/Magento/Elasticsearch/Model/ResourceModel/Fulltext/Collection/SearchResultApplier.php
index 4693b7502c5c1..54b8c1966ee12 100644
--- a/app/code/Magento/Elasticsearch/Model/ResourceModel/Fulltext/Collection/SearchResultApplier.php
+++ b/app/code/Magento/Elasticsearch/Model/ResourceModel/Fulltext/Collection/SearchResultApplier.php
@@ -69,10 +69,22 @@ public function apply()
foreach ($items as $item) {
$ids[] = (int)$item->getId();
}
- $this->collection->getSelect()->where('e.entity_id IN (?)', $ids);
- $orderList = join(',', $ids);
- $this->collection->getSelect()->reset(\Magento\Framework\DB\Select::ORDER);
- $this->collection->getSelect()->order(new \Zend_Db_Expr("FIELD(e.entity_id,$orderList)"));
+ $this->collection->getSelect()
+ ->where('e.entity_id IN (?)', $ids)
+ ->reset(\Magento\Framework\DB\Select::ORDER);
+ $sortOrder = $this->searchResult->getSearchCriteria()
+ ->getSortOrders();
+ if (!empty($sortOrder['price']) && $this->collection->getLimitationFilters()->isUsingPriceIndex()) {
+ $sortDirection = $sortOrder['price'];
+ $this->collection->getSelect()
+ ->order(
+ new \Zend_Db_Expr("price_index.min_price = 0, price_index.min_price {$sortDirection}")
+ );
+ } else {
+ $orderList = join(',', $ids);
+ $this->collection->getSelect()
+ ->order(new \Zend_Db_Expr("FIELD(e.entity_id,$orderList)"));
+ }
}
/**
diff --git a/app/code/Magento/ProductAlert/Controller/Add.php b/app/code/Magento/ProductAlert/Controller/Add.php
index 9498fa0e3d802..f8291ee5ffe15 100644
--- a/app/code/Magento/ProductAlert/Controller/Add.php
+++ b/app/code/Magento/ProductAlert/Controller/Add.php
@@ -10,6 +10,9 @@
use Magento\Customer\Model\Session as CustomerSession;
use Magento\Framework\App\RequestInterface;
+/**
+ * Abstract controller for notifying.
+ */
abstract class Add extends Action
{
/**
@@ -39,8 +42,8 @@ public function dispatch(RequestInterface $request)
{
if (!$this->customerSession->authenticate()) {
$this->_actionFlag->set('', 'no-dispatch', true);
- if (!$this->customerSession->getBeforeUrl()) {
- $this->customerSession->setBeforeUrl($this->_redirect->getRefererUrl());
+ if (!$this->customerSession->getBeforeAuthUrl()) {
+ $this->customerSession->setBeforeAuthUrl($this->_redirect->getRefererUrl());
}
}
return parent::dispatch($request);
diff --git a/app/code/Magento/ProductAlert/Controller/Unsubscribe/Email.php b/app/code/Magento/ProductAlert/Controller/Unsubscribe/Email.php
index d2f589374c225..09f3adc8e1296 100644
--- a/app/code/Magento/ProductAlert/Controller/Unsubscribe/Email.php
+++ b/app/code/Magento/ProductAlert/Controller/Unsubscribe/Email.php
@@ -8,18 +8,19 @@
namespace Magento\ProductAlert\Controller\Unsubscribe;
+use Magento\Customer\Model\Session as CustomerSession;
use Magento\Framework\App\Action\Context;
use Magento\Framework\App\Action\HttpGetActionInterface;
-use Magento\Framework\App\Action\Action;
use Magento\Framework\View\Result\Page;
use Magento\Framework\View\Result\PageFactory;
+use Magento\ProductAlert\Controller\Unsubscribe as UnsubscribeController;
/**
* Unsubscribing from 'Back in stock Alert'.
*
* Is used to transform a Get request that triggered in the email into the Post request endpoint
*/
-class Email extends Action implements HttpGetActionInterface
+class Email extends UnsubscribeController implements HttpGetActionInterface
{
/**
* @var PageFactory
@@ -29,13 +30,15 @@ class Email extends Action implements HttpGetActionInterface
/**
* @param Context $context
* @param PageFactory $resultPageFactory
+ * @param CustomerSession $customerSession
*/
public function __construct(
Context $context,
- PageFactory $resultPageFactory
+ PageFactory $resultPageFactory,
+ CustomerSession $customerSession
) {
$this->resultPageFactory = $resultPageFactory;
- parent::__construct($context);
+ parent::__construct($context, $customerSession);
}
/**
diff --git a/app/code/Magento/ProductAlert/view/frontend/layout/productalert_unsubscribe_email.xml b/app/code/Magento/ProductAlert/view/frontend/layout/productalert_unsubscribe_email.xml
index 8666fb83e01e3..4b759514e4b7f 100644
--- a/app/code/Magento/ProductAlert/view/frontend/layout/productalert_unsubscribe_email.xml
+++ b/app/code/Magento/ProductAlert/view/frontend/layout/productalert_unsubscribe_email.xml
@@ -8,7 +8,7 @@
-
+
diff --git a/app/code/Magento/Sales/Block/Order/Email/Creditmemo/Items.php b/app/code/Magento/Sales/Block/Order/Email/Creditmemo/Items.php
index 0b691eff5757b..0a1e87e5e0a27 100644
--- a/app/code/Magento/Sales/Block/Order/Email/Creditmemo/Items.php
+++ b/app/code/Magento/Sales/Block/Order/Email/Creditmemo/Items.php
@@ -5,6 +5,13 @@
*/
namespace Magento\Sales\Block\Order\Email\Creditmemo;
+use Magento\Framework\App\ObjectManager;
+use Magento\Framework\View\Element\Template\Context;
+use Magento\Sales\Api\CreditmemoRepositoryInterface;
+use Magento\Sales\Api\Data\OrderInterface;
+use Magento\Sales\Api\Data\CreditmemoInterface;
+use Magento\Sales\Api\OrderRepositoryInterface;
+
/**
* Sales Order Email creditmemo items
*
@@ -14,6 +21,36 @@
*/
class Items extends \Magento\Sales\Block\Items\AbstractItems
{
+ /**
+ * @var OrderRepositoryInterface
+ */
+ private $orderRepository;
+
+ /**
+ * @var CreditmemoRepositoryInterface
+ */
+ private $creditmemoRepository;
+
+ /**
+ * @param Context $context
+ * @param array $data
+ * @param OrderRepositoryInterface|null $orderRepository
+ * @param CreditmemoRepositoryInterface|null $creditmemoRepository
+ */
+ public function __construct(
+ Context $context,
+ array $data = [],
+ ?OrderRepositoryInterface $orderRepository = null,
+ ?CreditmemoRepositoryInterface $creditmemoRepository = null
+ ) {
+ $this->orderRepository =
+ $orderRepository ?: ObjectManager::getInstance()->get(OrderRepositoryInterface::class);
+ $this->creditmemoRepository =
+ $creditmemoRepository ?: ObjectManager::getInstance()->get(CreditmemoRepositoryInterface::class);
+
+ parent::__construct($context, $data);
+ }
+
/**
* Prepare item before output
*
@@ -25,4 +62,54 @@ protected function _prepareItem(\Magento\Framework\View\Element\AbstractBlock $r
$renderer->getItem()->setOrder($this->getOrder());
$renderer->getItem()->setSource($this->getCreditmemo());
}
+
+ /**
+ * Returns order.
+ *
+ * Custom email templates are only allowed to use scalar values for variable data.
+ * So order is loaded by order_id, that is passed to block from email template.
+ * For legacy custom email templates it can pass as an object.
+ *
+ * @return OrderInterface|null
+ */
+ public function getOrder()
+ {
+ $order = $this->getData('order');
+ if ($order !== null) {
+ return $order;
+ }
+
+ $orderId = (int)$this->getData('order_id');
+ if ($orderId) {
+ $order = $this->orderRepository->get($orderId);
+ $this->setData('order', $order);
+ }
+
+ return $this->getData('order');
+ }
+
+ /**
+ * Returns creditmemo.
+ *
+ * Custom email templates are only allowed to use scalar values for variable data.
+ * So creditmemo is loaded by creditmemo_id, that is passed to block from email template.
+ * For legacy custom email templates it can pass as an object.
+ *
+ * @return CreditmemoInterface|null
+ */
+ public function getCreditmemo()
+ {
+ $creditmemo = $this->getData('creditmemo');
+ if ($creditmemo !== null) {
+ return $creditmemo;
+ }
+
+ $creditmemoId = (int)$this->getData('creditmemo_id');
+ if ($creditmemoId) {
+ $creditmemo = $this->creditmemoRepository->get($creditmemoId);
+ $this->setData('creditmemo', $creditmemo);
+ }
+
+ return $this->getData('creditmemo');
+ }
}
diff --git a/app/code/Magento/Sales/Block/Order/Email/Invoice/Items.php b/app/code/Magento/Sales/Block/Order/Email/Invoice/Items.php
index bc7756816d32a..cc2b197ab0eb2 100644
--- a/app/code/Magento/Sales/Block/Order/Email/Invoice/Items.php
+++ b/app/code/Magento/Sales/Block/Order/Email/Invoice/Items.php
@@ -6,6 +6,13 @@
namespace Magento\Sales\Block\Order\Email\Invoice;
+use Magento\Framework\App\ObjectManager;
+use Magento\Framework\View\Element\Template\Context;
+use Magento\Sales\Api\Data\InvoiceInterface;
+use Magento\Sales\Api\Data\OrderInterface;
+use Magento\Sales\Api\InvoiceRepositoryInterface;
+use Magento\Sales\Api\OrderRepositoryInterface;
+
/**
* Sales Order Email Invoice items
*
@@ -14,6 +21,36 @@
*/
class Items extends \Magento\Sales\Block\Items\AbstractItems
{
+ /**
+ * @var OrderRepositoryInterface
+ */
+ private $orderRepository;
+
+ /**
+ * @var InvoiceRepositoryInterface
+ */
+ private $invoiceRepository;
+
+ /**
+ * @param Context $context
+ * @param array $data
+ * @param OrderRepositoryInterface|null $orderRepository
+ * @param InvoiceRepositoryInterface|null $invoiceRepository
+ */
+ public function __construct(
+ Context $context,
+ array $data = [],
+ ?OrderRepositoryInterface $orderRepository = null,
+ ?InvoiceRepositoryInterface $invoiceRepository = null
+ ) {
+ $this->orderRepository =
+ $orderRepository ?: ObjectManager::getInstance()->get(OrderRepositoryInterface::class);
+ $this->invoiceRepository =
+ $invoiceRepository ?: ObjectManager::getInstance()->get(InvoiceRepositoryInterface::class);
+
+ parent::__construct($context, $data);
+ }
+
/**
* Prepare item before output
*
@@ -25,4 +62,54 @@ protected function _prepareItem(\Magento\Framework\View\Element\AbstractBlock $r
$renderer->getItem()->setOrder($this->getOrder());
$renderer->getItem()->setSource($this->getInvoice());
}
+
+ /**
+ * Returns order.
+ *
+ * Custom email templates are only allowed to use scalar values for variable data.
+ * So order is loaded by order_id, that is passed to block from email template.
+ * For legacy custom email templates it can pass as an object.
+ *
+ * @return OrderInterface|null
+ */
+ public function getOrder()
+ {
+ $order = $this->getData('order');
+ if ($order !== null) {
+ return $order;
+ }
+
+ $orderId = (int)$this->getData('order_id');
+ if ($orderId) {
+ $order = $this->orderRepository->get($orderId);
+ $this->setData('order', $order);
+ }
+
+ return $this->getData('order');
+ }
+
+ /**
+ * Returns invoice.
+ *
+ * Custom email templates are only allowed to use scalar values for variable data.
+ * So invoice is loaded by invoice_id, that is passed to block from email template.
+ * For legacy custom email templates it can pass as an object.
+ *
+ * @return InvoiceInterface|null
+ */
+ public function getInvoice()
+ {
+ $invoice = $this->getData('invoice');
+ if ($invoice !== null) {
+ return $invoice;
+ }
+
+ $invoiceId = (int)$this->getData('invoice_id');
+ if ($invoiceId) {
+ $invoice = $this->invoiceRepository->get($invoiceId);
+ $this->setData('invoice', $invoice);
+ }
+
+ return $this->getData('invoice');
+ }
}
diff --git a/app/code/Magento/Sales/Block/Order/Email/Items.php b/app/code/Magento/Sales/Block/Order/Email/Items.php
index ddce387b91068..e11981285f04f 100644
--- a/app/code/Magento/Sales/Block/Order/Email/Items.php
+++ b/app/code/Magento/Sales/Block/Order/Email/Items.php
@@ -11,10 +11,61 @@
*/
namespace Magento\Sales\Block\Order\Email;
+use Magento\Framework\App\ObjectManager;
+use Magento\Framework\View\Element\Template\Context;
+use Magento\Sales\Api\Data\OrderInterface;
+use Magento\Sales\Api\OrderRepositoryInterface;
+
/**
+ * Sales Order Email items.
+ *
* @api
* @since 100.0.2
*/
class Items extends \Magento\Sales\Block\Items\AbstractItems
{
+ /**
+ * @var OrderRepositoryInterface
+ */
+ private $orderRepository;
+
+ /**
+ * @param Context $context
+ * @param array $data
+ * @param OrderRepositoryInterface|null $orderRepository
+ */
+ public function __construct(
+ Context $context,
+ array $data = [],
+ ?OrderRepositoryInterface $orderRepository = null
+ ) {
+ $this->orderRepository = $orderRepository ?: ObjectManager::getInstance()->get(OrderRepositoryInterface::class);
+
+ parent::__construct($context, $data);
+ }
+
+ /**
+ * Returns order.
+ *
+ * Custom email templates are only allowed to use scalar values for variable data.
+ * So order is loaded by order_id, that is passed to block from email template.
+ * For legacy custom email templates it can pass as an object.
+ *
+ * @return OrderInterface|null
+ */
+ public function getOrder()
+ {
+ $order = $this->getData('order');
+
+ if ($order !== null) {
+ return $order;
+ }
+ $orderId = (int)$this->getData('order_id');
+ if ($orderId) {
+ $order = $this->orderRepository->get($orderId);
+ $this->setData('order', $order);
+ }
+
+ return $this->getData('order');
+ }
}
diff --git a/app/code/Magento/Sales/Block/Order/Email/Shipment/Items.php b/app/code/Magento/Sales/Block/Order/Email/Shipment/Items.php
index a4c9a7b80a00d..1f9b353180fd9 100644
--- a/app/code/Magento/Sales/Block/Order/Email/Shipment/Items.php
+++ b/app/code/Magento/Sales/Block/Order/Email/Shipment/Items.php
@@ -6,6 +6,13 @@
namespace Magento\Sales\Block\Order\Email\Shipment;
+use Magento\Framework\App\ObjectManager;
+use Magento\Framework\View\Element\Template\Context;
+use Magento\Sales\Api\Data\ShipmentInterface;
+use Magento\Sales\Api\Data\OrderInterface;
+use Magento\Sales\Api\OrderRepositoryInterface;
+use Magento\Sales\Api\ShipmentRepositoryInterface;
+
/**
* Sales Order Email Shipment items
*
@@ -14,6 +21,36 @@
*/
class Items extends \Magento\Sales\Block\Items\AbstractItems
{
+ /**
+ * @var OrderRepositoryInterface
+ */
+ private $orderRepository;
+
+ /**
+ * @var ShipmentRepositoryInterface
+ */
+ private $shipmentRepository;
+
+ /**
+ * @param Context $context
+ * @param array $data
+ * @param OrderRepositoryInterface|null $orderRepository
+ * @param ShipmentRepositoryInterface|null $creditmemoRepository
+ */
+ public function __construct(
+ Context $context,
+ array $data = [],
+ ?OrderRepositoryInterface $orderRepository = null,
+ ?ShipmentRepositoryInterface $creditmemoRepository = null
+ ) {
+ $this->orderRepository =
+ $orderRepository ?: ObjectManager::getInstance()->get(OrderRepositoryInterface::class);
+ $this->shipmentRepository =
+ $creditmemoRepository ?: ObjectManager::getInstance()->get(ShipmentRepositoryInterface::class);
+
+ parent::__construct($context, $data);
+ }
+
/**
* Prepare item before output
*
@@ -25,4 +62,54 @@ protected function _prepareItem(\Magento\Framework\View\Element\AbstractBlock $r
$renderer->getItem()->setOrder($this->getOrder());
$renderer->getItem()->setSource($this->getShipment());
}
+
+ /**
+ * Returns order.
+ *
+ * Custom email templates are only allowed to use scalar values for variable data.
+ * So order is loaded by order_id, that is passed to block from email template.
+ * For legacy custom email templates it can pass as an object.
+ *
+ * @return OrderInterface|null
+ */
+ public function getOrder()
+ {
+ $order = $this->getData('order');
+ if ($order !== null) {
+ return $order;
+ }
+
+ $orderId = (int)$this->getData('order_id');
+ if ($orderId) {
+ $order = $this->orderRepository->get($orderId);
+ $this->setData('order', $order);
+ }
+
+ return $this->getData('order');
+ }
+
+ /**
+ * Returns shipment.
+ *
+ * Custom email templates are only allowed to use scalar values for variable data.
+ * So shipment is loaded by shipment_id, that is passed to block from email template.
+ * For legacy custom email templates it can pass as an object.
+ *
+ * @return ShipmentInterface|null
+ */
+ public function getShipment()
+ {
+ $shipment = $this->getData('shipment');
+ if ($shipment !== null) {
+ return $shipment;
+ }
+
+ $shipmentId = (int)$this->getData('shipment_id');
+ if ($shipmentId) {
+ $shipment = $this->shipmentRepository->get($shipmentId);
+ $this->setData('shipment', $shipment);
+ }
+
+ return $this->getData('shipment');
+ }
}
diff --git a/app/code/Magento/Sales/Model/Order/Email/Sender/CreditmemoSender.php b/app/code/Magento/Sales/Model/Order/Email/Sender/CreditmemoSender.php
index e6d528fb93a34..c27afe9fb5b0d 100644
--- a/app/code/Magento/Sales/Model/Order/Email/Sender/CreditmemoSender.php
+++ b/app/code/Magento/Sales/Model/Order/Email/Sender/CreditmemoSender.php
@@ -17,7 +17,7 @@
use Magento\Framework\DataObject;
/**
- * Class CreditmemoSender
+ * Sends order creditmemo email to the customer.
*
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
@@ -108,7 +108,9 @@ public function send(Creditmemo $creditmemo, $forceSyncMode = false)
$transport = [
'order' => $order,
+ 'order_id' => $order->getId(),
'creditmemo' => $creditmemo,
+ 'creditmemo_id' => $creditmemo->getId(),
'comment' => $creditmemo->getCustomerNoteNotify() ? $creditmemo->getCustomerNote() : '',
'billing' => $order->getBillingAddress(),
'payment_html' => $this->getPaymentHtml($order),
diff --git a/app/code/Magento/Sales/Model/Order/Email/Sender/InvoiceSender.php b/app/code/Magento/Sales/Model/Order/Email/Sender/InvoiceSender.php
index 79133af6d6fb8..05164d1b7b5f3 100644
--- a/app/code/Magento/Sales/Model/Order/Email/Sender/InvoiceSender.php
+++ b/app/code/Magento/Sales/Model/Order/Email/Sender/InvoiceSender.php
@@ -17,7 +17,7 @@
use Magento\Framework\DataObject;
/**
- * Class InvoiceSender
+ * Sends order invoice email to the customer.
*
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
@@ -108,7 +108,9 @@ public function send(Invoice $invoice, $forceSyncMode = false)
$transport = [
'order' => $order,
+ 'order_id' => $order->getId(),
'invoice' => $invoice,
+ 'invoice_id' => $invoice->getId(),
'comment' => $invoice->getCustomerNoteNotify() ? $invoice->getCustomerNote() : '',
'billing' => $order->getBillingAddress(),
'payment_html' => $this->getPaymentHtml($order),
diff --git a/app/code/Magento/Sales/Model/Order/Email/Sender/OrderSender.php b/app/code/Magento/Sales/Model/Order/Email/Sender/OrderSender.php
index c67804475cd65..a2d61c3b2d31d 100644
--- a/app/code/Magento/Sales/Model/Order/Email/Sender/OrderSender.php
+++ b/app/code/Magento/Sales/Model/Order/Email/Sender/OrderSender.php
@@ -16,7 +16,8 @@
use Magento\Framework\DataObject;
/**
- * Class OrderSender
+ * Sends order email to the customer.
+ *
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class OrderSender extends Sender
@@ -125,6 +126,7 @@ protected function prepareTemplate(Order $order)
{
$transport = [
'order' => $order,
+ 'order_id' => $order->getId(),
'billing' => $order->getBillingAddress(),
'payment_html' => $this->getPaymentHtml($order),
'store' => $order->getStore(),
diff --git a/app/code/Magento/Sales/Model/Order/Email/Sender/ShipmentSender.php b/app/code/Magento/Sales/Model/Order/Email/Sender/ShipmentSender.php
index c6b40800d5160..4c8e1744ac0e0 100644
--- a/app/code/Magento/Sales/Model/Order/Email/Sender/ShipmentSender.php
+++ b/app/code/Magento/Sales/Model/Order/Email/Sender/ShipmentSender.php
@@ -17,7 +17,7 @@
use Magento\Framework\DataObject;
/**
- * Class for shipment email notification sender
+ * Sends order shipment email to the customer.
*
* @deprecated since this class works only with the concrete model and no data interface
* @see \Magento\Sales\Model\Order\Shipment\Sender\EmailSender
@@ -110,7 +110,9 @@ public function send(Shipment $shipment, $forceSyncMode = false)
$transport = [
'order' => $order,
+ 'order_id' => $order->getId(),
'shipment' => $shipment,
+ 'shipment_id' => $shipment->getId(),
'comment' => $shipment->getCustomerNoteNotify() ? $shipment->getCustomerNote() : '',
'billing' => $order->getBillingAddress(),
'payment_html' => $this->getPaymentHtml($order),
diff --git a/app/code/Magento/Sales/Model/Order/Shipment/Sender/EmailSender.php b/app/code/Magento/Sales/Model/Order/Shipment/Sender/EmailSender.php
index 1d4418c50047d..fe68555d9f7c7 100644
--- a/app/code/Magento/Sales/Model/Order/Shipment/Sender/EmailSender.php
+++ b/app/code/Magento/Sales/Model/Order/Shipment/Sender/EmailSender.php
@@ -104,7 +104,9 @@ public function send(
$transport = [
'order' => $order,
+ 'order_id' => $order->getId(),
'shipment' => $shipment,
+ 'shipment_id' => $shipment->getId(),
'comment' => $comment ? $comment->getComment() : '',
'billing' => $order->getBillingAddress(),
'payment_html' => $this->getPaymentHtml($order),
diff --git a/app/code/Magento/Sales/Test/Unit/Model/Order/Email/Sender/AbstractSenderTest.php b/app/code/Magento/Sales/Test/Unit/Model/Order/Email/Sender/AbstractSenderTest.php
index 2f4e0e927db2c..39c85b955d9b5 100644
--- a/app/code/Magento/Sales/Test/Unit/Model/Order/Email/Sender/AbstractSenderTest.php
+++ b/app/code/Magento/Sales/Test/Unit/Model/Order/Email/Sender/AbstractSenderTest.php
@@ -5,6 +5,22 @@
*/
namespace Magento\Sales\Test\Unit\Model\Order\Email\Sender;
+use Magento\Framework\App\Config;
+use Magento\Framework\App\Config\ScopeConfigInterface;
+use Magento\Framework\Event\Manager;
+use Magento\Payment\Helper\Data;
+use Magento\Payment\Model\Info;
+use Magento\Sales\Model\Order;
+use Magento\Sales\Model\Order\Address;
+use Magento\Sales\Model\Order\Address\Renderer;
+use Magento\Sales\Model\Order\Email\Container\Template;
+use Magento\Sales\Model\Order\Email\Sender;
+use Magento\Sales\Model\Order\Email\SenderBuilderFactory;
+use Magento\Store\Model\Store;
+use PHPUnit\Framework\MockObject\Matcher\InvokedCount;
+use PHPUnit\Framework\MockObject\MockObject;
+use Psr\Log\LoggerInterface;
+
/**
* Class AbstractSenderTest
*
@@ -13,89 +29,89 @@
abstract class AbstractSenderTest extends \PHPUnit\Framework\TestCase
{
/**
- * @var \Magento\Sales\Model\Order\Email\Sender|\PHPUnit_Framework_MockObject_MockObject
+ * @var Sender|MockObject
*/
protected $senderMock;
/**
- * @var \PHPUnit_Framework_MockObject_MockObject
+ * @var MockObject
*/
protected $senderBuilderFactoryMock;
/**
- * @var \PHPUnit_Framework_MockObject_MockObject
+ * @var MockObject
*/
protected $templateContainerMock;
/**
- * @var \PHPUnit_Framework_MockObject_MockObject
+ * @var MockObject
*/
protected $identityContainerMock;
/**
- * @var \PHPUnit_Framework_MockObject_MockObject
+ * @var MockObject
*/
protected $storeMock;
/**
- * @var \PHPUnit_Framework_MockObject_MockObject
+ * @var MockObject
*/
protected $orderMock;
/**
- * @var \PHPUnit_Framework_MockObject_MockObject
+ * @var MockObject
*/
protected $paymentHelper;
/**
- * @var \Magento\Sales\Model\Order\Address\Renderer|\PHPUnit_Framework_MockObject_MockObject
+ * @var Renderer|MockObject
*/
protected $addressRenderer;
/**
* Global configuration storage mock.
*
- * @var \Magento\Framework\App\Config\ScopeConfigInterface|\PHPUnit_Framework_MockObject_MockObject
+ * @var ScopeConfigInterface|MockObject
*/
protected $globalConfig;
/**
- * @var \Magento\Sales\Model\Order\Address|\PHPUnit_Framework_MockObject_MockObject
+ * @var Address|MockObject
*/
protected $addressMock;
/**
- * @var \Magento\Framework\Event\Manager | \PHPUnit_Framework_MockObject_MockObject
+ * @var Manager|MockObject
*/
protected $eventManagerMock;
/**
- * @var \PHPUnit_Framework_MockObject_MockObject
+ * @var MockObject
*/
protected $loggerMock;
public function stepMockSetup()
{
$this->senderMock = $this->createPartialMock(
- \Magento\Sales\Model\Order\Email\Sender::class,
+ Sender::class,
['send', 'sendCopyTo']
);
$this->senderBuilderFactoryMock = $this->createPartialMock(
- \Magento\Sales\Model\Order\Email\SenderBuilderFactory::class,
+ SenderBuilderFactory::class,
['create']
);
$this->templateContainerMock = $this->createPartialMock(
- \Magento\Sales\Model\Order\Email\Container\Template::class,
+ Template::class,
['setTemplateVars']
);
- $this->storeMock = $this->createPartialMock(\Magento\Store\Model\Store::class, ['getStoreId', '__wakeup']);
+ $this->storeMock = $this->createPartialMock(Store::class, ['getStoreId', '__wakeup']);
$this->orderMock = $this->createPartialMock(
- \Magento\Sales\Model\Order::class,
+ Order::class,
[
- 'getStore', 'getBillingAddress', 'getPayment',
+ 'getId', 'getStore', 'getBillingAddress', 'getPayment',
'__wakeup', 'getCustomerIsGuest', 'getCustomerName',
'getCustomerEmail', 'getShippingAddress', 'setSendEmail',
'setEmailSent', 'getCreatedAtFormatted', 'getIsNotVirtual',
@@ -105,23 +121,23 @@ public function stepMockSetup()
$this->orderMock->expects($this->any())
->method('getStore')
->will($this->returnValue($this->storeMock));
- $paymentInfoMock = $this->createMock(\Magento\Payment\Model\Info::class);
+ $paymentInfoMock = $this->createMock(Info::class);
$this->orderMock->expects($this->any())
->method('getPayment')
->will($this->returnValue($paymentInfoMock));
- $this->addressRenderer = $this->createMock(\Magento\Sales\Model\Order\Address\Renderer::class);
- $this->addressMock = $this->createMock(\Magento\Sales\Model\Order\Address::class);
- $this->eventManagerMock = $this->createMock(\Magento\Framework\Event\Manager::class);
+ $this->addressRenderer = $this->createMock(Renderer::class);
+ $this->addressMock = $this->createMock(Address::class);
+ $this->eventManagerMock = $this->createMock(Manager::class);
- $this->paymentHelper = $this->createPartialMock(\Magento\Payment\Helper\Data::class, ['getInfoBlockHtml']);
+ $this->paymentHelper = $this->createPartialMock(Data::class, ['getInfoBlockHtml']);
$this->paymentHelper->expects($this->any())
->method('getInfoBlockHtml')
->will($this->returnValue('payment'));
- $this->globalConfig = $this->createPartialMock(\Magento\Framework\App\Config::class, ['getValue']);
+ $this->globalConfig = $this->createPartialMock(Config::class, ['getValue']);
- $this->loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
+ $this->loggerMock = $this->createMock(LoggerInterface::class);
}
/**
@@ -168,14 +184,14 @@ public function stepIdentityContainerInit($identityMockClassName)
}
/**
- * @param \PHPUnit_Framework_MockObject_Matcher_InvokedCount $sendExpects
- * @param \PHPUnit_Framework_MockObject_Matcher_InvokedCount $sendCopyToExpects
+ * @param InvokedCount $sendExpects
+ * @param InvokedCount $sendCopyToExpects
*/
protected function stepSend(
- \PHPUnit\Framework\MockObject\Matcher\InvokedCount $sendExpects,
- \PHPUnit\Framework\MockObject\Matcher\InvokedCount $sendCopyToExpects
+ InvokedCount $sendExpects,
+ InvokedCount $sendCopyToExpects
) {
- $senderMock = $this->createPartialMock(\Magento\Sales\Model\Order\Email\Sender::class, ['send', 'sendCopyTo']);
+ $senderMock = $this->createPartialMock(Sender::class, ['send', 'sendCopyTo']);
$senderMock->expects($sendExpects)
->method('send');
$senderMock->expects($sendCopyToExpects)
diff --git a/app/code/Magento/Sales/Test/Unit/Model/Order/Email/Sender/CreditmemoSenderTest.php b/app/code/Magento/Sales/Test/Unit/Model/Order/Email/Sender/CreditmemoSenderTest.php
index 72a51a15db592..6bcabea7df202 100644
--- a/app/code/Magento/Sales/Test/Unit/Model/Order/Email/Sender/CreditmemoSenderTest.php
+++ b/app/code/Magento/Sales/Test/Unit/Model/Order/Email/Sender/CreditmemoSenderTest.php
@@ -5,25 +5,36 @@
*/
namespace Magento\Sales\Test\Unit\Model\Order\Email\Sender;
+use Magento\Sales\Api\Data\OrderInterface;
+use Magento\Sales\Model\Order\Address;
+use Magento\Sales\Model\Order\Creditmemo;
+use Magento\Sales\Model\ResourceModel\Order\Creditmemo as CreditmemoResource;
+use Magento\Sales\Model\Order\Email\Container\CreditmemoIdentity;
use Magento\Sales\Model\Order\Email\Sender\CreditmemoSender;
+use Magento\Sales\Model\ResourceModel\EntityAbstract;
+use PHPUnit\Framework\MockObject\MockObject;
/**
* Test for Magento\Sales\Model\Order\Email\Sender\CreditmemoSender class.
*/
class CreditmemoSenderTest extends AbstractSenderTest
{
+ private const CREDITMEMO_ID = 1;
+
+ private const ORDER_ID = 1;
+
/**
- * @var \Magento\Sales\Model\Order\Email\Sender\CreditmemoSender
+ * @var CreditmemoSender
*/
protected $sender;
/**
- * @var \Magento\Sales\Model\Order\Creditmemo|\PHPUnit_Framework_MockObject_MockObject
+ * @var Creditmemo|MockObject
*/
protected $creditmemoMock;
/**
- * @var \Magento\Sales\Model\ResourceModel\EntityAbstract|\PHPUnit_Framework_MockObject_MockObject
+ * @var EntityAbstract|MockObject
*/
protected $creditmemoResourceMock;
@@ -32,14 +43,15 @@ protected function setUp()
$this->stepMockSetup();
$this->creditmemoResourceMock = $this->createPartialMock(
- \Magento\Sales\Model\ResourceModel\Order\Creditmemo::class,
+ CreditmemoResource::class,
['saveAttribute']
);
$this->creditmemoMock = $this->createPartialMock(
- \Magento\Sales\Model\Order\Creditmemo::class,
+ Creditmemo::class,
[
'getStore',
+ 'getId',
'__wakeup',
'getOrder',
'setSendEmail',
@@ -54,9 +66,13 @@ protected function setUp()
$this->creditmemoMock->expects($this->any())
->method('getOrder')
->will($this->returnValue($this->orderMock));
+ $this->creditmemoMock->method('getId')
+ ->willReturn(self::CREDITMEMO_ID);
+ $this->orderMock->method('getId')
+ ->willReturn(self::ORDER_ID);
$this->identityContainerMock = $this->createPartialMock(
- \Magento\Sales\Model\Order\Email\Container\CreditmemoIdentity::class,
+ CreditmemoIdentity::class,
['getStore', 'isEnabled', 'getConfigValue', 'getTemplateId', 'getGuestTemplateId', 'getCopyMethod']
);
$this->identityContainerMock->expects($this->any())
@@ -104,7 +120,7 @@ public function testSend($configValue, $forceSyncMode, $customerNoteNotify, $ema
->willReturn($configValue);
if (!$configValue || $forceSyncMode) {
- $addressMock = $this->createMock(\Magento\Sales\Model\Order\Address::class);
+ $addressMock = $this->createMock(Address::class);
$this->addressRenderer->expects($this->exactly(2))
->method('format')
@@ -142,7 +158,9 @@ public function testSend($configValue, $forceSyncMode, $customerNoteNotify, $ema
->with(
[
'order' => $this->orderMock,
+ 'order_id' => self::ORDER_ID,
'creditmemo' => $this->creditmemoMock,
+ 'creditmemo_id' => self::CREDITMEMO_ID,
'comment' => $customerNoteNotify ? $comment : '',
'billing' => $addressMock,
'payment_html' => 'payment',
@@ -240,7 +258,7 @@ public function testSendVirtualOrder($isVirtualOrder, $formatCallCount, $expecte
$frontendStatusLabel = 'Complete';
$isNotVirtual = false;
- $this->orderMock->setData(\Magento\Sales\Api\Data\OrderInterface::IS_VIRTUAL, $isVirtualOrder);
+ $this->orderMock->setData(OrderInterface::IS_VIRTUAL, $isVirtualOrder);
$this->orderMock->expects($this->any())
->method('getCustomerName')
@@ -267,7 +285,7 @@ public function testSendVirtualOrder($isVirtualOrder, $formatCallCount, $expecte
->with('sales_email/general/async_sending')
->willReturn(false);
- $addressMock = $this->createMock(\Magento\Sales\Model\Order\Address::class);
+ $addressMock = $this->createMock(Address::class);
$this->addressRenderer->expects($this->exactly($formatCallCount))
->method('format')
@@ -285,7 +303,9 @@ public function testSendVirtualOrder($isVirtualOrder, $formatCallCount, $expecte
->with(
[
'order' => $this->orderMock,
+ 'order_id' => self::ORDER_ID,
'creditmemo' => $this->creditmemoMock,
+ 'creditmemo_id' => self::CREDITMEMO_ID,
'comment' => '',
'billing' => $addressMock,
'payment_html' => 'payment',
diff --git a/app/code/Magento/Sales/Test/Unit/Model/Order/Email/Sender/InvoiceSenderTest.php b/app/code/Magento/Sales/Test/Unit/Model/Order/Email/Sender/InvoiceSenderTest.php
index 00a1855055a84..206db7b9c7e0b 100644
--- a/app/code/Magento/Sales/Test/Unit/Model/Order/Email/Sender/InvoiceSenderTest.php
+++ b/app/code/Magento/Sales/Test/Unit/Model/Order/Email/Sender/InvoiceSenderTest.php
@@ -5,25 +5,36 @@
*/
namespace Magento\Sales\Test\Unit\Model\Order\Email\Sender;
+use Magento\Sales\Api\Data\OrderInterface;
+use Magento\Sales\Model\Order\Address;
+use Magento\Sales\Model\Order\Email\Container\InvoiceIdentity;
use Magento\Sales\Model\Order\Email\Sender\InvoiceSender;
+use Magento\Sales\Model\Order\Invoice;
+use Magento\Sales\Model\ResourceModel\Order\Invoice as InvoiceResource;
+use Magento\Sales\Model\ResourceModel\EntityAbstract;
+use PHPUnit\Framework\MockObject\MockObject;
/**
* Test for Magento\Sales\Model\Order\Email\Sender\InvoiceSender class.
*/
class InvoiceSenderTest extends AbstractSenderTest
{
+ private const INVOICE_ID = 1;
+
+ private const ORDER_ID = 1;
+
/**
- * @var \Magento\Sales\Model\Order\Email\Sender\InvoiceSender
+ * @var InvoiceSender
*/
protected $sender;
/**
- * @var \Magento\Sales\Model\Order\Invoice|\PHPUnit_Framework_MockObject_MockObject
+ * @var Invoice|MockObject
*/
protected $invoiceMock;
/**
- * @var \Magento\Sales\Model\ResourceModel\EntityAbstract|\PHPUnit_Framework_MockObject_MockObject
+ * @var EntityAbstract|MockObject
*/
protected $invoiceResourceMock;
@@ -32,14 +43,15 @@ protected function setUp()
$this->stepMockSetup();
$this->invoiceResourceMock = $this->createPartialMock(
- \Magento\Sales\Model\ResourceModel\Order\Invoice::class,
+ InvoiceResource::class,
['saveAttribute']
);
$this->invoiceMock = $this->createPartialMock(
- \Magento\Sales\Model\Order\Invoice::class,
+ Invoice::class,
[
'getStore',
+ 'getId',
'__wakeup',
'getOrder',
'setSendEmail',
@@ -55,8 +67,13 @@ protected function setUp()
->method('getOrder')
->will($this->returnValue($this->orderMock));
+ $this->invoiceMock->method('getId')
+ ->willReturn(self::INVOICE_ID);
+ $this->orderMock->method('getId')
+ ->willReturn(self::ORDER_ID);
+
$this->identityContainerMock = $this->createPartialMock(
- \Magento\Sales\Model\Order\Email\Container\InvoiceIdentity::class,
+ InvoiceIdentity::class,
['getStore', 'isEnabled', 'getConfigValue', 'getTemplateId', 'getGuestTemplateId', 'getCopyMethod']
);
$this->identityContainerMock->expects($this->any())
@@ -104,7 +121,7 @@ public function testSend($configValue, $forceSyncMode, $customerNoteNotify, $ema
->willReturn($configValue);
if (!$configValue || $forceSyncMode) {
- $addressMock = $this->createMock(\Magento\Sales\Model\Order\Address::class);
+ $addressMock = $this->createMock(Address::class);
$this->addressRenderer->expects($this->any())
->method('format')
@@ -148,7 +165,9 @@ public function testSend($configValue, $forceSyncMode, $customerNoteNotify, $ema
->with(
[
'order' => $this->orderMock,
+ 'order_id' => self::ORDER_ID,
'invoice' => $this->invoiceMock,
+ 'invoice_id' => self::INVOICE_ID,
'comment' => $customerNoteNotify ? $comment : '',
'billing' => $addressMock,
'payment_html' => 'payment',
@@ -240,7 +259,7 @@ public function sendDataProvider()
public function testSendVirtualOrder($isVirtualOrder, $formatCallCount, $expectedShippingAddress)
{
$billingAddress = 'address_test';
- $this->orderMock->setData(\Magento\Sales\Api\Data\OrderInterface::IS_VIRTUAL, $isVirtualOrder);
+ $this->orderMock->setData(OrderInterface::IS_VIRTUAL, $isVirtualOrder);
$customerName = 'Test Customer';
$frontendStatusLabel = 'Complete';
$isNotVirtual = false;
@@ -254,7 +273,7 @@ public function testSendVirtualOrder($isVirtualOrder, $formatCallCount, $expecte
->with('sales_email/general/async_sending')
->willReturn(false);
- $addressMock = $this->createMock(\Magento\Sales\Model\Order\Address::class);
+ $addressMock = $this->createMock(Address::class);
$this->addressRenderer->expects($this->exactly($formatCallCount))
->method('format')
@@ -287,7 +306,9 @@ public function testSendVirtualOrder($isVirtualOrder, $formatCallCount, $expecte
->with(
[
'order' => $this->orderMock,
+ 'order_id' => self::ORDER_ID,
'invoice' => $this->invoiceMock,
+ 'invoice_id' => self::INVOICE_ID,
'comment' => '',
'billing' => $addressMock,
'payment_html' => 'payment',
diff --git a/app/code/Magento/Sales/Test/Unit/Model/Order/Email/Sender/OrderSenderTest.php b/app/code/Magento/Sales/Test/Unit/Model/Order/Email/Sender/OrderSenderTest.php
index a033e41dd8e8b..7d5cb7028ddc3 100644
--- a/app/code/Magento/Sales/Test/Unit/Model/Order/Email/Sender/OrderSenderTest.php
+++ b/app/code/Magento/Sales/Test/Unit/Model/Order/Email/Sender/OrderSenderTest.php
@@ -5,17 +5,25 @@
*/
namespace Magento\Sales\Test\Unit\Model\Order\Email\Sender;
+use Magento\Sales\Api\Data\OrderInterface;
+use Magento\Sales\Model\Order\Address;
+use Magento\Sales\Model\Order\Email\Container\OrderIdentity;
use Magento\Sales\Model\Order\Email\Sender\OrderSender;
+use Magento\Sales\Model\ResourceModel\EntityAbstract;
+use Magento\Sales\Model\ResourceModel\Order;
+use PHPUnit\Framework\MockObject\MockObject;
class OrderSenderTest extends AbstractSenderTest
{
+ private const ORDER_ID = 1;
+
/**
- * @var \Magento\Sales\Model\Order\Email\Sender\OrderSender
+ * @var OrderSender
*/
protected $sender;
/**
- * @var \Magento\Sales\Model\ResourceModel\EntityAbstract|\PHPUnit_Framework_MockObject_MockObject
+ * @var EntityAbstract|MockObject
*/
protected $orderResourceMock;
@@ -24,18 +32,21 @@ protected function setUp()
$this->stepMockSetup();
$this->orderResourceMock = $this->createPartialMock(
- \Magento\Sales\Model\ResourceModel\Order::class,
+ Order::class,
['saveAttribute']
);
$this->identityContainerMock = $this->createPartialMock(
- \Magento\Sales\Model\Order\Email\Container\OrderIdentity::class,
+ OrderIdentity::class,
['getStore', 'isEnabled', 'getConfigValue', 'getTemplateId', 'getGuestTemplateId', 'getCopyMethod']
);
$this->identityContainerMock->expects($this->any())
->method('getStore')
->will($this->returnValue($this->storeMock));
+ $this->orderMock->method('getId')
+ ->willReturn(self::ORDER_ID);
+
$this->sender = new OrderSender(
$this->templateContainerMock,
$this->identityContainerMock,
@@ -86,7 +97,7 @@ public function testSend($configValue, $forceSyncMode, $emailSendingResult, $sen
->method('getCopyMethod')
->willReturn('copy');
- $addressMock = $this->createMock(\Magento\Sales\Model\Order\Address::class);
+ $addressMock = $this->createMock(Address::class);
$this->addressRenderer->expects($this->any())
->method('format')
@@ -127,6 +138,7 @@ public function testSend($configValue, $forceSyncMode, $emailSendingResult, $sen
->with(
[
'order' => $this->orderMock,
+ 'order_id' => self::ORDER_ID,
'billing' => $addressMock,
'payment_html' => 'payment',
'store' => $this->storeMock,
@@ -237,7 +249,7 @@ public function sendDataProvider()
public function testSendVirtualOrder($isVirtualOrder, $formatCallCount, $expectedShippingAddress)
{
$address = 'address_test';
- $this->orderMock->setData(\Magento\Sales\Api\Data\OrderInterface::IS_VIRTUAL, $isVirtualOrder);
+ $this->orderMock->setData(OrderInterface::IS_VIRTUAL, $isVirtualOrder);
$createdAtFormatted='Oct 14, 2019, 4:11:58 PM';
$customerName = 'test customer';
$frontendStatusLabel = 'Complete';
@@ -260,7 +272,7 @@ public function testSendVirtualOrder($isVirtualOrder, $formatCallCount, $expecte
->method('getCopyMethod')
->willReturn('copy');
- $addressMock = $this->createMock(\Magento\Sales\Model\Order\Address::class);
+ $addressMock = $this->createMock(Address::class);
$this->addressRenderer->expects($this->exactly($formatCallCount))
->method('format')
@@ -295,6 +307,7 @@ public function testSendVirtualOrder($isVirtualOrder, $formatCallCount, $expecte
->with(
[
'order' => $this->orderMock,
+ 'order_id' => self::ORDER_ID,
'billing' => $addressMock,
'payment_html' => 'payment',
'store' => $this->storeMock,
diff --git a/app/code/Magento/Sales/Test/Unit/Model/Order/Email/Sender/ShipmentSenderTest.php b/app/code/Magento/Sales/Test/Unit/Model/Order/Email/Sender/ShipmentSenderTest.php
index dcd80646b168c..7dfda5f9e0b41 100644
--- a/app/code/Magento/Sales/Test/Unit/Model/Order/Email/Sender/ShipmentSenderTest.php
+++ b/app/code/Magento/Sales/Test/Unit/Model/Order/Email/Sender/ShipmentSenderTest.php
@@ -5,7 +5,14 @@
*/
namespace Magento\Sales\Test\Unit\Model\Order\Email\Sender;
+use Magento\Sales\Api\Data\OrderInterface;
+use Magento\Sales\Model\Order\Address;
+use Magento\Sales\Model\Order\Email\Container\ShipmentIdentity;
use Magento\Sales\Model\Order\Email\Sender\ShipmentSender;
+use Magento\Sales\Model\Order\Shipment;
+use Magento\Sales\Model\ResourceModel\Order\Shipment as ShipmentResource;
+use Magento\Sales\Model\ResourceModel\EntityAbstract;
+use PHPUnit\Framework\MockObject\MockObject;
/**
* Test for Magento\Sales\Model\Order\Email\Sender\ShipmentSender class
@@ -15,18 +22,22 @@
*/
class ShipmentSenderTest extends AbstractSenderTest
{
+ private const SHIPMENT_ID = 1;
+
+ private const ORDER_ID = 1;
+
/**
- * @var \Magento\Sales\Model\Order\Email\Sender\ShipmentSender
+ * @var ShipmentSender
*/
protected $sender;
/**
- * @var \Magento\Sales\Model\Order\Shipment|\PHPUnit_Framework_MockObject_MockObject
+ * @var Shipment|MockObject
*/
protected $shipmentMock;
/**
- * @var \Magento\Sales\Model\ResourceModel\EntityAbstract|\PHPUnit_Framework_MockObject_MockObject
+ * @var EntityAbstract|MockObject
*/
protected $shipmentResourceMock;
@@ -35,14 +46,15 @@ protected function setUp()
$this->stepMockSetup();
$this->shipmentResourceMock = $this->createPartialMock(
- \Magento\Sales\Model\ResourceModel\Order\Shipment::class,
+ ShipmentResource::class,
['saveAttribute']
);
$this->shipmentMock = $this->createPartialMock(
- \Magento\Sales\Model\Order\Shipment::class,
+ Shipment::class,
[
'getStore',
+ 'getId',
'__wakeup',
'getOrder',
'setSendEmail',
@@ -58,8 +70,13 @@ protected function setUp()
->method('getOrder')
->will($this->returnValue($this->orderMock));
+ $this->shipmentMock->method('getId')
+ ->willReturn(self::SHIPMENT_ID);
+ $this->orderMock->method('getId')
+ ->willReturn(self::ORDER_ID);
+
$this->identityContainerMock = $this->createPartialMock(
- \Magento\Sales\Model\Order\Email\Container\ShipmentIdentity::class,
+ ShipmentIdentity::class,
['getStore', 'isEnabled', 'getConfigValue', 'getTemplateId', 'getGuestTemplateId', 'getCopyMethod']
);
$this->identityContainerMock->expects($this->any())
@@ -107,7 +124,7 @@ public function testSend($configValue, $forceSyncMode, $customerNoteNotify, $ema
->willReturn($configValue);
if (!$configValue || $forceSyncMode) {
- $addressMock = $this->createMock(\Magento\Sales\Model\Order\Address::class);
+ $addressMock = $this->createMock(Address::class);
$this->addressRenderer->expects($this->any())
->method('format')
@@ -151,7 +168,9 @@ public function testSend($configValue, $forceSyncMode, $customerNoteNotify, $ema
->with(
[
'order' => $this->orderMock,
+ 'order_id' => self::ORDER_ID,
'shipment' => $this->shipmentMock,
+ 'shipment_id' => self::SHIPMENT_ID,
'comment' => $customerNoteNotify ? $comment : '',
'billing' => $addressMock,
'payment_html' => 'payment',
@@ -243,7 +262,7 @@ public function sendDataProvider()
public function testSendVirtualOrder($isVirtualOrder, $formatCallCount, $expectedShippingAddress)
{
$address = 'address_test';
- $this->orderMock->setData(\Magento\Sales\Api\Data\OrderInterface::IS_VIRTUAL, $isVirtualOrder);
+ $this->orderMock->setData(OrderInterface::IS_VIRTUAL, $isVirtualOrder);
$customerName = 'Test Customer';
$frontendStatusLabel = 'Complete';
$isNotVirtual = false;
@@ -257,7 +276,7 @@ public function testSendVirtualOrder($isVirtualOrder, $formatCallCount, $expecte
->with('sales_email/general/async_sending')
->willReturn(false);
- $addressMock = $this->createMock(\Magento\Sales\Model\Order\Address::class);
+ $addressMock = $this->createMock(Address::class);
$this->addressRenderer->expects($this->exactly($formatCallCount))
->method('format')
@@ -291,7 +310,9 @@ public function testSendVirtualOrder($isVirtualOrder, $formatCallCount, $expecte
->with(
[
'order' => $this->orderMock,
+ 'order_id' => self::ORDER_ID,
'shipment' => $this->shipmentMock,
+ 'shipment_id' => self::SHIPMENT_ID,
'comment' => '',
'billing' => $addressMock,
'payment_html' => 'payment',
diff --git a/app/code/Magento/Sales/Test/Unit/Model/Order/Shipment/Sender/EmailSenderTest.php b/app/code/Magento/Sales/Test/Unit/Model/Order/Shipment/Sender/EmailSenderTest.php
index 2262fbf03c1a1..4bca8e6a4b730 100644
--- a/app/code/Magento/Sales/Test/Unit/Model/Order/Shipment/Sender/EmailSenderTest.php
+++ b/app/code/Magento/Sales/Test/Unit/Model/Order/Shipment/Sender/EmailSenderTest.php
@@ -5,96 +5,120 @@
*/
namespace Magento\Sales\Test\Unit\Model\Order\Shipment\Sender;
+use Magento\Framework\App\Config\ScopeConfigInterface;
+use Magento\Framework\Event\ManagerInterface;
+use Magento\Payment\Helper\Data;
+use Magento\Payment\Model\Info;
+use Magento\Sales\Api\Data\ShipmentCommentCreationInterface;
+use Magento\Sales\Api\Data\ShipmentInterface;
+use Magento\Sales\Model\Order;
+use Magento\Sales\Model\Order\Address;
+use Magento\Sales\Model\Order\Address\Renderer;
+use Magento\Sales\Model\Order\Email\Container\ShipmentIdentity;
+use Magento\Sales\Model\Order\Email\Container\Template;
+use Magento\Sales\Model\Order\Email\Sender;
+use Magento\Sales\Model\Order\Email\SenderBuilderFactory;
+use Magento\Sales\Model\Order\Shipment\Sender\EmailSender;
+use Magento\Sales\Model\ResourceModel\Order\Shipment;
+use Magento\Store\Model\Store;
+use PHPUnit\Framework\MockObject\MockObject;
+use PHPUnit\Framework\TestCase;
+use Psr\Log\LoggerInterface;
+
/**
* Unit test for email notification sender for Shipment.
*
* @SuppressWarnings(PHPMD.TooManyFields)
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
-class EmailSenderTest extends \PHPUnit\Framework\TestCase
+class EmailSenderTest extends TestCase
{
+ private const SHIPMENT_ID = 1;
+
+ private const ORDER_ID = 1;
+
/**
- * @var \Magento\Sales\Model\Order\Shipment\Sender\EmailSender
+ * @var EmailSender
*/
private $subject;
/**
- * @var \Magento\Sales\Model\Order|\PHPUnit_Framework_MockObject_MockObject
+ * @var Order|MockObject
*/
private $orderMock;
/**
- * @var \Magento\Store\Model\Store|\PHPUnit_Framework_MockObject_MockObject
+ * @var Store|MockObject
*/
private $storeMock;
/**
- * @var \Magento\Sales\Model\Order\Email\Sender|\PHPUnit_Framework_MockObject_MockObject
+ * @var Sender|MockObject
*/
private $senderMock;
/**
- * @var \Psr\Log\LoggerInterface|\PHPUnit_Framework_MockObject_MockObject
+ * @var LoggerInterface|MockObject
*/
private $loggerMock;
/**
- * @var \Magento\Sales\Api\Data\ShipmentInterface|\PHPUnit_Framework_MockObject_MockObject
+ * @var ShipmentInterface|MockObject
*/
private $shipmentMock;
/**
- * @var \Magento\Sales\Api\Data\ShipmentCommentCreationInterface|\PHPUnit_Framework_MockObject_MockObject
+ * @var ShipmentCommentCreationInterface|MockObject
*/
private $commentMock;
/**
- * @var \Magento\Sales\Model\Order\Address|\PHPUnit_Framework_MockObject_MockObject
+ * @var Address|MockObject
*/
private $addressMock;
/**
- * @var \Magento\Framework\App\Config\ScopeConfigInterface|\PHPUnit_Framework_MockObject_MockObject
+ * @var ScopeConfigInterface|MockObject
*/
private $globalConfigMock;
/**
- * @var \Magento\Framework\Event\ManagerInterface|\PHPUnit_Framework_MockObject_MockObject
+ * @var ManagerInterface|MockObject
*/
private $eventManagerMock;
/**
- * @var \Magento\Payment\Model\Info|\PHPUnit_Framework_MockObject_MockObject
+ * @var Info|MockObject
*/
private $paymentInfoMock;
/**
- * @var \Magento\Payment\Helper\Data|\PHPUnit_Framework_MockObject_MockObject
+ * @var Data|MockObject
*/
private $paymentHelperMock;
/**
- * @var \Magento\Sales\Model\ResourceModel\Order\Shipment|\PHPUnit_Framework_MockObject_MockObject
+ * @var Shipment|MockObject
*/
private $shipmentResourceMock;
/**
- * @var \Magento\Sales\Model\Order\Address\Renderer|\PHPUnit_Framework_MockObject_MockObject
+ * @var Renderer|MockObject
*/
private $addressRendererMock;
/**
- * @var \Magento\Sales\Model\Order\Email\Container\Template|\PHPUnit_Framework_MockObject_MockObject
+ * @var Template|MockObject
*/
private $templateContainerMock;
/**
- * @var \Magento\Sales\Model\Order\Email\Container\ShipmentIdentity|\PHPUnit_Framework_MockObject_MockObject
+ * @var ShipmentIdentity|MockObject
*/
private $identityContainerMock;
/**
- * @var \Magento\Sales\Model\Order\Email\SenderBuilderFactory|\PHPUnit_Framework_MockObject_MockObject
+ * @var SenderBuilderFactory|MockObject
*/
private $senderBuilderFactoryMock;
@@ -103,11 +127,11 @@ class EmailSenderTest extends \PHPUnit\Framework\TestCase
*/
protected function setUp()
{
- $this->orderMock = $this->getMockBuilder(\Magento\Sales\Model\Order::class)
+ $this->orderMock = $this->getMockBuilder(Order::class)
->disableOriginalConstructor()
->getMock();
- $this->storeMock = $this->getMockBuilder(\Magento\Store\Model\Store::class)
+ $this->storeMock = $this->getMockBuilder(Store::class)
->setMethods(['getStoreId'])
->disableOriginalConstructor()
->getMock();
@@ -119,21 +143,21 @@ protected function setUp()
->method('getStore')
->willReturn($this->storeMock);
- $this->senderMock = $this->getMockBuilder(\Magento\Sales\Model\Order\Email\Sender::class)
+ $this->senderMock = $this->getMockBuilder(Sender::class)
->disableOriginalConstructor()
->setMethods(['send', 'sendCopyTo'])
->getMock();
- $this->loggerMock = $this->getMockBuilder(\Psr\Log\LoggerInterface::class)
+ $this->loggerMock = $this->getMockBuilder(LoggerInterface::class)
->disableOriginalConstructor()
->getMockForAbstractClass();
- $this->shipmentMock = $this->getMockBuilder(\Magento\Sales\Model\Order\Shipment::class)
+ $this->shipmentMock = $this->getMockBuilder(Order\Shipment::class)
->disableOriginalConstructor()
- ->setMethods(['setSendEmail', 'setEmailSent'])
+ ->setMethods(['setSendEmail', 'setEmailSent', 'getId'])
->getMock();
- $this->commentMock = $this->getMockBuilder(\Magento\Sales\Api\Data\ShipmentCommentCreationInterface::class)
+ $this->commentMock = $this->getMockBuilder(ShipmentCommentCreationInterface::class)
->disableOriginalConstructor()
->getMockForAbstractClass();
@@ -141,7 +165,7 @@ protected function setUp()
->method('getComment')
->willReturn('Comment text');
- $this->addressMock = $this->getMockBuilder(\Magento\Sales\Model\Order\Address::class)
+ $this->addressMock = $this->getMockBuilder(Address::class)
->disableOriginalConstructor()
->getMock();
@@ -151,16 +175,19 @@ protected function setUp()
$this->orderMock->expects($this->any())
->method('getShippingAddress')
->willReturn($this->addressMock);
+ $this->orderMock->expects($this->any())
+ ->method('getId')
+ ->willReturn(self::ORDER_ID);
- $this->globalConfigMock = $this->getMockBuilder(\Magento\Framework\App\Config\ScopeConfigInterface::class)
+ $this->globalConfigMock = $this->getMockBuilder(ScopeConfigInterface::class)
->disableOriginalConstructor()
->getMockForAbstractClass();
- $this->eventManagerMock = $this->getMockBuilder(\Magento\Framework\Event\ManagerInterface::class)
+ $this->eventManagerMock = $this->getMockBuilder(ManagerInterface::class)
->disableOriginalConstructor()
->getMockForAbstractClass();
- $this->paymentInfoMock = $this->getMockBuilder(\Magento\Payment\Model\Info::class)
+ $this->paymentInfoMock = $this->getMockBuilder(Info::class)
->disableOriginalConstructor()
->getMock();
@@ -168,7 +195,7 @@ protected function setUp()
->method('getPayment')
->willReturn($this->paymentInfoMock);
- $this->paymentHelperMock = $this->getMockBuilder(\Magento\Payment\Helper\Data::class)
+ $this->paymentHelperMock = $this->getMockBuilder(Data::class)
->disableOriginalConstructor()
->getMock();
@@ -177,11 +204,11 @@ protected function setUp()
->with($this->paymentInfoMock, 1)
->willReturn('Payment Info Block');
- $this->shipmentResourceMock = $this->getMockBuilder(\Magento\Sales\Model\ResourceModel\Order\Shipment::class)
+ $this->shipmentResourceMock = $this->getMockBuilder(Shipment::class)
->disableOriginalConstructor()
->getMock();
- $this->addressRendererMock = $this->getMockBuilder(\Magento\Sales\Model\Order\Address\Renderer::class)
+ $this->addressRendererMock = $this->getMockBuilder(Renderer::class)
->disableOriginalConstructor()
->getMock();
@@ -190,12 +217,12 @@ protected function setUp()
->with($this->addressMock, 'html')
->willReturn('Formatted address');
- $this->templateContainerMock = $this->getMockBuilder(\Magento\Sales\Model\Order\Email\Container\Template::class)
+ $this->templateContainerMock = $this->getMockBuilder(Template::class)
->disableOriginalConstructor()
->getMock();
$this->identityContainerMock = $this->getMockBuilder(
- \Magento\Sales\Model\Order\Email\Container\ShipmentIdentity::class
+ ShipmentIdentity::class
)
->disableOriginalConstructor()
->getMock();
@@ -205,13 +232,13 @@ protected function setUp()
->willReturn($this->storeMock);
$this->senderBuilderFactoryMock = $this->getMockBuilder(
- \Magento\Sales\Model\Order\Email\SenderBuilderFactory::class
+ SenderBuilderFactory::class
)
->disableOriginalConstructor()
->setMethods(['create'])
->getMock();
- $this->subject = new \Magento\Sales\Model\Order\Shipment\Sender\EmailSender(
+ $this->subject = new EmailSender(
$this->templateContainerMock,
$this->identityContainerMock,
$this->senderBuilderFactoryMock,
@@ -247,6 +274,9 @@ public function testSend($configValue, $forceSyncMode, $isComment, $emailSending
$this->commentMock = null;
}
+ $this->shipmentMock->expects($this->any())
+ ->method('getId')
+ ->willReturn(self::SHIPMENT_ID);
$this->shipmentMock->expects($this->once())
->method('setSendEmail')
->with($emailSendingResult);
@@ -254,7 +284,9 @@ public function testSend($configValue, $forceSyncMode, $isComment, $emailSending
if (!$configValue || $forceSyncMode) {
$transport = [
'order' => $this->orderMock,
+ 'order_id' => self::ORDER_ID,
'shipment' => $this->shipmentMock,
+ 'shipment_id' => self::SHIPMENT_ID,
'comment' => $isComment ? 'Comment text' : '',
'billing' => $this->addressMock,
'payment_html' => 'Payment Info Block',
diff --git a/app/code/Magento/Sales/view/frontend/email/creditmemo_new.html b/app/code/Magento/Sales/view/frontend/email/creditmemo_new.html
index 5ae6f5f9d82c7..f475503528dc9 100644
--- a/app/code/Magento/Sales/view/frontend/email/creditmemo_new.html
+++ b/app/code/Magento/Sales/view/frontend/email/creditmemo_new.html
@@ -22,6 +22,8 @@
"var store_hours":"Store Hours",
"var creditmemo":"Credit Memo",
"var order":"Order",
+"var order_id": "Order DB Id",
+"var creditmemo_id": "Credit Memo DB Id",
"var order_data.is_not_virtual":"Order Type"
} @-->
{{template config_path="design/email/header_template"}}
@@ -82,7 +84,7 @@
{{trans "Shipping Method"}}
{{/depend}}
- {{layout handle="sales_email_order_creditmemo_items" creditmemo=$creditmemo order=$order}}
+ {{layout handle="sales_email_order_creditmemo_items" creditmemo_id=$creditmemo_id order_id=$order_id}}
diff --git a/app/code/Magento/Sales/view/frontend/email/creditmemo_new_guest.html b/app/code/Magento/Sales/view/frontend/email/creditmemo_new_guest.html
index 657de2aae2045..d8a8a0baeca98 100644
--- a/app/code/Magento/Sales/view/frontend/email/creditmemo_new_guest.html
+++ b/app/code/Magento/Sales/view/frontend/email/creditmemo_new_guest.html
@@ -21,7 +21,9 @@
"var store_hours":"Store Hours",
"var creditmemo":"Credit Memo",
"var order":"Order",
-"var order_data.is_not_virtual":"Order Type"
+"var order_data.is_not_virtual":"Order Type",
+"var order_id": "Order DB Id",
+"var creditmemo_id": "Credit Memo DB Id"
} @-->
{{template config_path="design/email/header_template"}}
@@ -80,7 +82,7 @@ {{trans "Shipping Method"}}
{{/depend}}
- {{layout handle="sales_email_order_creditmemo_items" creditmemo=$creditmemo order=$order}}
+ {{layout handle="sales_email_order_creditmemo_items" creditmemo_id=$creditmemo_id order_id=$order_id}}
diff --git a/app/code/Magento/Sales/view/frontend/email/invoice_new.html b/app/code/Magento/Sales/view/frontend/email/invoice_new.html
index 68773ee9d7570..c4818172449a2 100644
--- a/app/code/Magento/Sales/view/frontend/email/invoice_new.html
+++ b/app/code/Magento/Sales/view/frontend/email/invoice_new.html
@@ -22,6 +22,8 @@
"var store_hours":"Store Hours",
"var invoice": "Invoice",
"var order": "Order",
+"var order_id": "Order DB Id",
+"var invoice_id": "Invoice DB Id",
"var order_data.is_not_virtual": "Order Type"
} @-->
{{template config_path="design/email/header_template"}}
@@ -82,7 +84,7 @@ {{trans "Shipping Method"}}
{{/depend}}
- {{layout area="frontend" handle="sales_email_order_invoice_items" invoice=$invoice order=$order}}
+ {{layout area="frontend" handle="sales_email_order_invoice_items" invoice_id=$invoice_id order_id=$order_id}}
diff --git a/app/code/Magento/Sales/view/frontend/email/invoice_new_guest.html b/app/code/Magento/Sales/view/frontend/email/invoice_new_guest.html
index 5053ccc2ac635..c06630fd249ab 100644
--- a/app/code/Magento/Sales/view/frontend/email/invoice_new_guest.html
+++ b/app/code/Magento/Sales/view/frontend/email/invoice_new_guest.html
@@ -21,6 +21,8 @@
"var store_hours":"Store Hours",
"var invoice": "Invoice",
"var order": "Order",
+"var order_id": "Order DB Id",
+"var invoice_id": "Invoice DB Id",
"var order_data.is_not_virtual": "Order Type"
} @-->
{{template config_path="design/email/header_template"}}
@@ -80,7 +82,7 @@ {{trans "Shipping Method"}}
{{/depend}}
- {{layout handle="sales_email_order_invoice_items" invoice=$invoice order=$order}}
+ {{layout handle="sales_email_order_invoice_items" invoice_id=$invoice_id order_id=$order_id}}
diff --git a/app/code/Magento/Sales/view/frontend/email/order_new.html b/app/code/Magento/Sales/view/frontend/email/order_new.html
index 13c436b131b82..a411e8d5b29b3 100644
--- a/app/code/Magento/Sales/view/frontend/email/order_new.html
+++ b/app/code/Magento/Sales/view/frontend/email/order_new.html
@@ -22,6 +22,7 @@
"var this.getUrl($store,'customer/account/',[_nosid:1])":"Customer Account URL",
"var order_data.is_not_virtual":"Order Type",
"var order":"Order",
+"var order_id": "Order DB Id",
"var order_data.customer_name":"Customer Name"
} @-->
@@ -90,7 +91,7 @@ {{trans "Shipping Method"}}
{{/depend}}
- {{layout handle="sales_email_order_items" order=$order area="frontend"}}
+ {{layout handle="sales_email_order_items" order_id=$order_id area="frontend"}}
diff --git a/app/code/Magento/Sales/view/frontend/email/order_new_guest.html b/app/code/Magento/Sales/view/frontend/email/order_new_guest.html
index 866a1ad87f9b1..dc3a8e9f69aca 100644
--- a/app/code/Magento/Sales/view/frontend/email/order_new_guest.html
+++ b/app/code/Magento/Sales/view/frontend/email/order_new_guest.html
@@ -21,6 +21,7 @@
"var store_email":"Store Email",
"var store_hours":"Store Hours",
"var order_data.is_not_virtual":"Order Type",
+"var order_id": "Order DB Id",
"var order":"Order"
} @-->
{{template config_path="design/email/header_template"}}
@@ -85,7 +86,7 @@ {{trans "Shipping Method"}}
{{/depend}}
- {{layout handle="sales_email_order_items" order=$order}}
+ {{layout handle="sales_email_order_items" order_id=$order_id }}
diff --git a/app/code/Magento/Sales/view/frontend/email/shipment_new.html b/app/code/Magento/Sales/view/frontend/email/shipment_new.html
index 39823a0c9d80b..39397979d2aaa 100644
--- a/app/code/Magento/Sales/view/frontend/email/shipment_new.html
+++ b/app/code/Magento/Sales/view/frontend/email/shipment_new.html
@@ -23,7 +23,9 @@
"var store_hours":"Store Hours",
"var order_data.is_not_virtual": "Order Type",
"var shipment": "Shipment",
-"var order": "Order"
+"var order": "Order",
+"var order_id": "Order DB Id",
+"var shipment_id": "Shipment DB Id"
} @-->
{{template config_path="design/email/header_template"}}
@@ -59,7 +61,7 @@ {{trans "Your Shipment #%shipment_id for Order #%order_id" shipment_id=$ship
{{/depend}}
- {{layout handle="sales_email_order_shipment_track" shipment=$shipment order=$order}}
+ {{layout handle="sales_email_order_shipment_track" shipment_id=$shipment_id order_id=$order_id}}
@@ -86,7 +88,7 @@ {{trans "Shipping Method"}}
{{/depend}}
|
- {{layout handle="sales_email_order_shipment_items" shipment=$shipment order=$order}}
+ {{layout handle="sales_email_order_shipment_items" shipment_id=$shipment_id order_id=$order_id}}
diff --git a/app/code/Magento/Sales/view/frontend/email/shipment_new_guest.html b/app/code/Magento/Sales/view/frontend/email/shipment_new_guest.html
index ed2f52ed85066..54c7f08506497 100644
--- a/app/code/Magento/Sales/view/frontend/email/shipment_new_guest.html
+++ b/app/code/Magento/Sales/view/frontend/email/shipment_new_guest.html
@@ -22,7 +22,9 @@
"var store_hours":"Store Hours",
"var order_data.is_not_virtual": "Order Type",
"var shipment": "Shipment",
-"var order": "Order"
+"var order": "Order",
+"var order_id": "Order DB Id",
+"var shipment_id": "Shipment DB Id"
} @-->
{{template config_path="design/email/header_template"}}
@@ -57,7 +59,7 @@ {{trans "Your Shipment #%shipment_id for Order #%order_id" shipment_id=$ship
{{/depend}}
- {{layout handle="sales_email_order_shipment_track" shipment=$shipment order=$order}}
+ {{layout handle="sales_email_order_shipment_track" shipment_id=$shipment_id order_id=$order_id}}
@@ -84,7 +86,7 @@ {{trans "Shipping Method"}}
{{/depend}}
|
- {{layout handle="sales_email_order_shipment_items" shipment=$shipment order=$order}}
+ {{layout handle="sales_email_order_shipment_items" shipment_id=$shipment_id order_id=$order_id}}
diff --git a/app/code/Magento/Sales/view/frontend/layout/sales_email_order_shipment_track.xml b/app/code/Magento/Sales/view/frontend/layout/sales_email_order_shipment_track.xml
index bbc7f04ce94fd..489317cfa65c7 100644
--- a/app/code/Magento/Sales/view/frontend/layout/sales_email_order_shipment_track.xml
+++ b/app/code/Magento/Sales/view/frontend/layout/sales_email_order_shipment_track.xml
@@ -8,10 +8,10 @@
-
+
Magento\Sales\Block\DataProviders\Email\Shipment\TrackingUrl
-
\ No newline at end of file
+
diff --git a/app/code/Magento/SalesRule/view/frontend/web/js/action/select-payment-method-mixin.js b/app/code/Magento/SalesRule/view/frontend/web/js/action/select-payment-method-mixin.js
index 50d54d4e59789..0b8eba270b030 100644
--- a/app/code/Magento/SalesRule/view/frontend/web/js/action/select-payment-method-mixin.js
+++ b/app/code/Magento/SalesRule/view/frontend/web/js/action/select-payment-method-mixin.js
@@ -7,10 +7,10 @@ define([
'mage/utils/wrapper',
'Magento_Checkout/js/model/quote',
'Magento_SalesRule/js/model/payment/discount-messages',
- 'Magento_Checkout/js/action/set-payment-information',
+ 'Magento_Checkout/js/action/set-payment-information-extended',
'Magento_Checkout/js/action/get-totals',
'Magento_SalesRule/js/model/coupon'
-], function ($, wrapper, quote, messageContainer, setPaymentInformationAction, getTotalsAction, coupon) {
+], function ($, wrapper, quote, messageContainer, setPaymentInformationExtended, getTotalsAction, coupon) {
'use strict';
return function (selectPaymentMethodAction) {
@@ -20,11 +20,12 @@ define([
originalSelectPaymentMethodAction(paymentMethod);
$.when(
- setPaymentInformationAction(
+ setPaymentInformationExtended(
messageContainer,
{
method: paymentMethod.method
- }
+ },
+ true
)
).done(
function () {
diff --git a/app/design/frontend/Magento/luma/Magento_Sales/email/creditmemo_new.html b/app/design/frontend/Magento/luma/Magento_Sales/email/creditmemo_new.html
index 86e3cf01e965e..f8e192bafdf29 100644
--- a/app/design/frontend/Magento/luma/Magento_Sales/email/creditmemo_new.html
+++ b/app/design/frontend/Magento/luma/Magento_Sales/email/creditmemo_new.html
@@ -20,6 +20,8 @@
"var store_email":"Store Email",
"var creditmemo":"Credit Memo",
"var order":"Order",
+"var order_id": "Order DB Id",
+"var creditmemo_id": "Credit Memo DB Id",
"var order_data.is_not_virtual":"Order Type"
} @-->
{{template config_path="design/email/header_template"}}
@@ -79,7 +81,7 @@ {{trans "Shipping Method"}}
{{/depend}}
- {{layout handle="sales_email_order_creditmemo_items" creditmemo=$creditmemo order=$order}}
+ {{layout handle="sales_email_order_creditmemo_items" creditmemo_id=$creditmemo_id order_id=$order_id}}
diff --git a/app/design/frontend/Magento/luma/Magento_Sales/email/creditmemo_new_guest.html b/app/design/frontend/Magento/luma/Magento_Sales/email/creditmemo_new_guest.html
index d0310a8e2c7b6..4442c172a08e5 100644
--- a/app/design/frontend/Magento/luma/Magento_Sales/email/creditmemo_new_guest.html
+++ b/app/design/frontend/Magento/luma/Magento_Sales/email/creditmemo_new_guest.html
@@ -19,6 +19,8 @@
"var store_email":"Store Email",
"var creditmemo":"Credit Memo",
"var order":"Order",
+"var order_id": "Order DB Id",
+"var creditmemo_id": "Credit Memo DB Id",
"var order_data.is_not_virtual":"Order Type"
} @-->
{{template config_path="design/email/header_template"}}
@@ -77,7 +79,7 @@ {{trans "Shipping Method"}}
{{/depend}}
- {{layout handle="sales_email_order_creditmemo_items" creditmemo=$creditmemo order=$order}}
+ {{layout handle="sales_email_order_creditmemo_items" creditmemo_id=$creditmemo_id order_id=$order_id}}
diff --git a/app/design/frontend/Magento/luma/Magento_Sales/email/invoice_new.html b/app/design/frontend/Magento/luma/Magento_Sales/email/invoice_new.html
index 636fa9ac5f425..c46f0b03a53f7 100644
--- a/app/design/frontend/Magento/luma/Magento_Sales/email/invoice_new.html
+++ b/app/design/frontend/Magento/luma/Magento_Sales/email/invoice_new.html
@@ -20,6 +20,8 @@
"var store_email":"Store Email",
"var invoice": "Invoice",
"var order": "Order",
+"var order_id": "Order DB Id",
+"var invoice_id": "Invoice DB Id",
"var order_data.is_not_virtual": "Order Type"
} @-->
{{template config_path="design/email/header_template"}}
@@ -79,7 +81,7 @@ {{trans "Shipping Method"}}
{{/depend}}
- {{layout area="frontend" handle="sales_email_order_invoice_items" invoice=$invoice order=$order}}
+ {{layout area="frontend" handle="sales_email_order_invoice_items" invoice_id=$invoice_id order_id=$order_id}}
diff --git a/app/design/frontend/Magento/luma/Magento_Sales/email/invoice_new_guest.html b/app/design/frontend/Magento/luma/Magento_Sales/email/invoice_new_guest.html
index 7df5ffe5f4ab8..6e35fd2609dff 100644
--- a/app/design/frontend/Magento/luma/Magento_Sales/email/invoice_new_guest.html
+++ b/app/design/frontend/Magento/luma/Magento_Sales/email/invoice_new_guest.html
@@ -19,6 +19,8 @@
"var store_email":"Store Email",
"var invoice": "Invoice",
"var order": "Order",
+"var order_id": "Order DB Id",
+"var invoice_id": "Invoice DB Id",
"var order_data.is_not_virtual": "Order Type"
} @-->
{{template config_path="design/email/header_template"}}
@@ -77,7 +79,7 @@ {{trans "Shipping Method"}}
{{/depend}}
- {{layout handle="sales_email_order_invoice_items" invoice=$invoice order=$order}}
+ {{layout handle="sales_email_order_invoice_items" invoice_id=$invoice_id order_id=$order_id}}
diff --git a/app/design/frontend/Magento/luma/Magento_Sales/email/order_new.html b/app/design/frontend/Magento/luma/Magento_Sales/email/order_new.html
index 745bf5c9c2eff..373db99d87d99 100644
--- a/app/design/frontend/Magento/luma/Magento_Sales/email/order_new.html
+++ b/app/design/frontend/Magento/luma/Magento_Sales/email/order_new.html
@@ -20,6 +20,7 @@
"var order":"Order",
"var order_data.is_not_virtual":"Order Type",
"var order_data.customer_name":"Customer Name",
+"var order_id": "Order DB Id",
"var this.getUrl($store,'customer/account/',[_nosid:1])":"Customer Account URL"
} @-->
@@ -85,7 +86,7 @@ {{trans "Shipping Method"}}
{{/depend}}
- {{layout handle="sales_email_order_items" order=$order area="frontend"}}
+ {{layout handle="sales_email_order_items" order_id=$order_id area="frontend"}}
diff --git a/app/design/frontend/Magento/luma/Magento_Sales/email/order_new_guest.html b/app/design/frontend/Magento/luma/Magento_Sales/email/order_new_guest.html
index 907be4d45a6c5..024f6daf76ace 100644
--- a/app/design/frontend/Magento/luma/Magento_Sales/email/order_new_guest.html
+++ b/app/design/frontend/Magento/luma/Magento_Sales/email/order_new_guest.html
@@ -19,6 +19,7 @@
"var store.frontend_name":"Store Frontend Name",
"var store_email":"Store Email",
"var order":"Order",
+"var order_id": "Order DB Id",
"var order_data.is_not_virtual":"Order Type"
} @-->
{{template config_path="design/email/header_template"}}
@@ -82,7 +83,7 @@ {{trans "Shipping Method"}}
{{/depend}}
- {{layout handle="sales_email_order_items" order=$order}}
+ {{layout handle="sales_email_order_items" order_id=$order_id}}
diff --git a/app/design/frontend/Magento/luma/Magento_Sales/email/shipment_new.html b/app/design/frontend/Magento/luma/Magento_Sales/email/shipment_new.html
index 4ff9da3a31b27..d1b1e1e33763c 100644
--- a/app/design/frontend/Magento/luma/Magento_Sales/email/shipment_new.html
+++ b/app/design/frontend/Magento/luma/Magento_Sales/email/shipment_new.html
@@ -21,7 +21,9 @@
"var store_email":"Store Email",
"var order_data.is_not_virtual": "Order Type",
"var shipment": "Shipment",
-"var order": "Order"
+"var order": "Order",
+"var order_id": "Order DB Id",
+"var shipment_id": "Shipment DB Id"
} @-->
{{template config_path="design/email/header_template"}}
@@ -55,7 +57,7 @@ {{trans "Your Shipment #%shipment_id for Order #%order_id" shipment_id=$ship
{{/depend}}
- {{layout handle="sales_email_order_shipment_track" shipment=$shipment order=$order}}
+ {{layout handle="sales_email_order_shipment_track" shipment_id=$shipment_id order_id=$order_id}}
@@ -82,7 +84,7 @@ {{trans "Shipping Method"}}
{{/depend}}
|
- {{layout handle="sales_email_order_shipment_items" shipment=$shipment order=$order}}
+ {{layout handle="sales_email_order_shipment_items" shipment_id=$shipment_id order_id=$order_id}}
diff --git a/app/design/frontend/Magento/luma/Magento_Sales/email/shipment_new_guest.html b/app/design/frontend/Magento/luma/Magento_Sales/email/shipment_new_guest.html
index ac7eaae6b7ff7..18684fb052b4e 100644
--- a/app/design/frontend/Magento/luma/Magento_Sales/email/shipment_new_guest.html
+++ b/app/design/frontend/Magento/luma/Magento_Sales/email/shipment_new_guest.html
@@ -21,6 +21,8 @@
"var order_data.is_not_virtual": "Order Type",
"var shipment": "Shipment",
"var order": "Order",
+"var order_id": "Order DB Id",
+"var shipment_id": "Shipment DB Id",
"var this.getUrl($store,'customer/account/',[_nosid:1])":"Customer Account URL"
} @-->
{{template config_path="design/email/header_template"}}
@@ -54,7 +56,7 @@ {{trans "Your Shipment #%shipment_id for Order #%order_id" shipment_id=$ship
{{/depend}}
- {{layout handle="sales_email_order_shipment_track" shipment=$shipment order=$order}}
+ {{layout handle="sales_email_order_shipment_track" shipment_id=$shipment_id order_id=$order_id}}
@@ -81,7 +83,7 @@ {{trans "Shipping Method"}}
{{/depend}}
|
- {{layout handle="sales_email_order_shipment_items" shipment=$shipment order=$order}}
+ {{layout handle="sales_email_order_shipment_items" shipment_id=$shipment_id order_id=$order_id}}
diff --git a/dev/tests/api-functional/testsuite/Magento/ConfigurableProduct/Api/ProductRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/ConfigurableProduct/Api/ProductRepositoryTest.php
index 1dc7ca1ad44a6..c8ecab9ce54d8 100644
--- a/dev/tests/api-functional/testsuite/Magento/ConfigurableProduct/Api/ProductRepositoryTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/ConfigurableProduct/Api/ProductRepositoryTest.php
@@ -3,11 +3,15 @@
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
-
namespace Magento\ConfigurableProduct\Api;
use Magento\Catalog\Api\Data\ProductInterface;
+use Magento\Catalog\Model\Entity\Attribute;
+use Magento\Eav\Model\Config;
+use Magento\Eav\Model\ResourceModel\Entity\Attribute\Option\Collection;
use Magento\Framework\Api\ExtensibleDataInterface;
+use Magento\Framework\ObjectManagerInterface;
+use Magento\Framework\Webapi\Rest\Request;
use Magento\TestFramework\Helper\Bootstrap;
use Magento\TestFramework\TestCase\WebapiAbstract;
@@ -22,31 +26,31 @@ class ProductRepositoryTest extends WebapiAbstract
const CONFIGURABLE_PRODUCT_SKU = 'configurable-product-sku';
/**
- * @var \Magento\Eav\Model\Config
+ * @var Config
*/
protected $eavConfig;
/**
- * @var \Magento\Framework\ObjectManagerInterface
+ * @var ObjectManagerInterface
*/
protected $objectManager;
/**
- * @var \Magento\Catalog\Model\Entity\Attribute
+ * @var Attribute
*/
protected $configurableAttribute;
/**
- * Execute per test initialization
+ * @inheritdoc
*/
public function setUp()
{
$this->objectManager = Bootstrap::getObjectManager();
- $this->eavConfig = $this->objectManager->get(\Magento\Eav\Model\Config::class);
+ $this->eavConfig = $this->objectManager->get(Config::class);
}
/**
- * Execute per test cleanup
+ * @inheritdoc
*/
public function tearDown()
{
@@ -54,16 +58,26 @@ public function tearDown()
parent::tearDown();
}
+ /**
+ * Retrieve configurable attribute options
+ *
+ * @return array
+ */
protected function getConfigurableAttributeOptions()
{
- /** @var \Magento\Eav\Model\ResourceModel\Entity\Attribute\Option\Collection $optionCollection */
+ /** @var Collection $optionCollection */
$optionCollection = $this->objectManager->create(
- \Magento\Eav\Model\ResourceModel\Entity\Attribute\Option\Collection::class
+ Collection::class
);
$options = $optionCollection->setAttributeFilter($this->configurableAttribute->getId())->getData();
return $options;
}
+ /**
+ * Create configurable product by web api
+ *
+ * @return array
+ */
protected function createConfigurableProduct()
{
$productId1 = 10;
@@ -254,7 +268,6 @@ public function testUpdateConfigurableProductLinks()
$this->assertEquals([$productId1], $resultConfigurableProductLinks);
//adding back the product links, the option value should be restored
- unset($response[ExtensibleDataInterface::EXTENSION_ATTRIBUTES_KEY]['configurable_product_options']);
$response[ExtensibleDataInterface::EXTENSION_ATTRIBUTES_KEY]['configurable_product_links']
= [$productId1, $productId2];
//set the value for required attribute
@@ -286,7 +299,7 @@ public function testUpdateConfigurableProductLinksWithNonExistingProduct()
$productId1, $nonExistingId
];
- $expectedMessage = 'The product was unable to be saved. Please try again.';
+ $expectedMessage = 'The product that was requested doesn\'t exist. Verify the product and try again.';
try {
$this->saveProduct($response);
$this->fail("Expected exception");
@@ -362,7 +375,7 @@ public function testUpdateConfigurableProductLinksWithWithoutVariationAttributes
$productId1, $productId2
];
- $expectedMessage = 'The product was unable to be saved. Please try again.';
+ $expectedMessage = 'The product that was requested doesn\'t exist. Verify the product and try again.';
try {
$this->saveProduct($response);
$this->fail("Expected exception");
@@ -389,7 +402,7 @@ protected function getProduct($productSku)
$serviceInfo = [
'rest' => [
'resourcePath' => self::RESOURCE_PATH . '/' . $productSku,
- 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
+ 'httpMethod' => Request::HTTP_METHOD_GET,
],
'soap' => [
'service' => self::SERVICE_NAME,
@@ -415,7 +428,7 @@ protected function createProduct($product)
$serviceInfo = [
'rest' => [
'resourcePath' => self::RESOURCE_PATH,
- 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST
+ 'httpMethod' => Request::HTTP_METHOD_POST
],
'soap' => [
'service' => self::SERVICE_NAME,
@@ -440,7 +453,7 @@ protected function deleteProductBySku($productSku)
$serviceInfo = [
'rest' => [
'resourcePath' => $resourcePath,
- 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_DELETE
+ 'httpMethod' => Request::HTTP_METHOD_DELETE
],
'soap' => [
'service' => self::SERVICE_NAME,
@@ -475,7 +488,7 @@ protected function saveProduct($product)
$serviceInfo = [
'rest' => [
'resourcePath' => $resourcePath,
- 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_PUT
+ 'httpMethod' => Request::HTTP_METHOD_PUT
],
'soap' => [
'service' => self::SERVICE_NAME,
diff --git a/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/MediaGalleryTest.php b/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/MediaGalleryTest.php
index 86d36c1c767f7..615438d52e764 100644
--- a/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/MediaGalleryTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/MediaGalleryTest.php
@@ -38,6 +38,33 @@ public function testProductSmallImageUrlWithExistingImage()
self::assertTrue($this->checkImageExists($response['products']['items'][0]['small_image']['url']));
}
+ /**
+ * Test for get product image placeholder
+ *
+ * @magentoApiDataFixture Magento/Catalog/_files/product_simple.php
+ */
+ public function testProductSmallImageUrlPlaceholder()
+ {
+ $productSku = 'simple';
+ $query = <<graphQlQuery($query);
+ $responseImage = $response['products']['items'][0]['small_image'];
+
+ self::assertArrayHasKey('url', $responseImage);
+ self::assertContains('placeholder/small_image.jpg', $responseImage['url']);
+ self::assertTrue($this->checkImageExists($responseImage['url']));
+ }
+
/**
* @magentoApiDataFixture Magento/Catalog/_files/product_with_multiple_images.php
*/
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Block/Product/ListProduct/SortingTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Block/Product/ListProduct/SortingTest.php
index 7bebf9c49d14b..31da969540d30 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Block/Product/ListProduct/SortingTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Block/Product/ListProduct/SortingTest.php
@@ -110,16 +110,7 @@ public function testProductListSortOrder(string $sortBy, string $direction, arra
*/
public function testProductListSortOrderWithConfig(string $sortBy, string $direction, array $expectation): void
{
- $this->objectManager->removeSharedInstance(Config::class);
- $this->scopeConfig->setValue(
- Config::XML_PATH_LIST_DEFAULT_SORT_BY,
- $sortBy,
- ScopeInterface::SCOPE_STORE,
- Store::DEFAULT_STORE_ID
- );
- $category = $this->updateCategorySortBy('Category 1', Store::DEFAULT_STORE_ID, null);
- $this->renderBlock($category, $direction);
- $this->assertBlockSorting($sortBy, $expectation);
+ $this->assertProductListSortOrderWithConfig($sortBy, $direction, $expectation);
}
/**
@@ -322,4 +313,89 @@ private function updateCategorySortBy(
return $category;
}
+
+ /**
+ * Test product list ordered by price with out-of-stock configurable product options with elasticsearch engine
+ *
+ * @magentoDataFixture Magento/Catalog/_files/products_with_not_empty_layered_navigation_attribute.php
+ * @magentoDataFixture Magento/Framework/Search/_files/product_configurable_with_out-of-stock_child.php
+ * @magentoConfigFixture current_store cataloginventory/options/show_out_of_stock 1
+ * @magentoConfigFixture default/catalog/search/engine elasticsearch7
+ * @dataProvider productListWithOutOfStockSortOrderDataProvider
+ * @param string $sortBy
+ * @param string $direction
+ * @param array $expected
+ * @return void
+ */
+ public function testProductListOutOfStockSortOrderWithElasticsearch(
+ string $sortBy,
+ string $direction,
+ array $expected
+ ): void {
+ $this->assertProductListSortOrderWithConfig($sortBy, $direction, $expected);
+ }
+
+ /**
+ * Test product list ordered by price with out-of-stock configurable product options with mysql search engine
+ *
+ * @magentoDataFixture Magento/Catalog/_files/products_with_not_empty_layered_navigation_attribute.php
+ * @magentoDataFixture Magento/Framework/Search/_files/product_configurable_with_out-of-stock_child.php
+ * @magentoConfigFixture current_store cataloginventory/options/show_out_of_stock 1
+ * @magentoConfigFixture default/catalog/search/engine mysql
+ * @dataProvider productListWithOutOfStockSortOrderDataProvider
+ * @param string $sortBy
+ * @param string $direction
+ * @param array $expected
+ * @return void
+ */
+ public function testProductListOutOfStockSortOrderWithMysql(
+ string $sortBy,
+ string $direction,
+ array $expected
+ ): void {
+ $this->assertProductListSortOrderWithConfig($sortBy, $direction, $expected);
+ }
+
+ /**
+ * Product list with out-of-stock sort order data provider
+ *
+ * @return array
+ */
+ public function productListWithOutOfStockSortOrderDataProvider(): array
+ {
+ return [
+ 'default_order_price_asc' => [
+ 'sort' => 'price',
+ 'direction' => Collection::SORT_ORDER_ASC,
+ 'expectation' => ['simple1', 'simple2', 'simple3', 'configurable'],
+ ],
+ 'default_order_price_desc' => [
+ 'sort' => 'price',
+ 'direction' => Collection::SORT_ORDER_DESC,
+ 'expectation' => ['simple3', 'simple2', 'simple1', 'configurable'],
+ ],
+ ];
+ }
+
+ /**
+ * Assert product list order
+ *
+ * @param string $sortBy
+ * @param string $direction
+ * @param array $expected
+ * @return void
+ */
+ private function assertProductListSortOrderWithConfig(string $sortBy, string $direction, array $expected): void
+ {
+ $this->objectManager->removeSharedInstance(Config::class);
+ $this->scopeConfig->setValue(
+ Config::XML_PATH_LIST_DEFAULT_SORT_BY,
+ $sortBy,
+ ScopeInterface::SCOPE_STORE,
+ Store::DEFAULT_STORE_ID
+ );
+ $category = $this->updateCategorySortBy('Category 1', Store::DEFAULT_STORE_ID, null);
+ $this->renderBlock($category, $direction);
+ $this->assertBlockSorting($sortBy, $expected);
+ }
}
diff --git a/dev/tests/integration/testsuite/Magento/Framework/Search/_files/product_configurable_with_out-of-stock_child.php b/dev/tests/integration/testsuite/Magento/Framework/Search/_files/product_configurable_with_out-of-stock_child.php
new file mode 100644
index 0000000000000..e46228e52a117
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Framework/Search/_files/product_configurable_with_out-of-stock_child.php
@@ -0,0 +1,43 @@
+create(ProductRepositoryInterface::class);
+
+$product = $productRepository->get('simple_1010');
+$product->setStockData(
+ [
+ 'qty' => 0,
+ ]
+);
+$productRepository->save($product);
+
+$product = $productRepository->get('simple_1020');
+$product->setStockData(
+ [
+ 'qty' => 0,
+ ]
+);
+$productRepository->save($product);
+
+/** @var CategoryLinkManagementInterface $categoryLinkManagement */
+$categoryLinkManagement = $objectManager->create(CategoryLinkManagementInterface::class);
+/** @var DefaultCategory $categoryHelper */
+$categoryHelper = $objectManager->get(DefaultCategory::class);
+
+foreach (['simple_1010', 'simple_1020', 'configurable'] as $sku) {
+ $categoryLinkManagement->assignProductToCategories($sku, [$categoryHelper->getId(), 333]);
+}
diff --git a/dev/tests/integration/testsuite/Magento/Framework/Search/_files/product_configurable_with_out-of-stock_child_rollback.php b/dev/tests/integration/testsuite/Magento/Framework/Search/_files/product_configurable_with_out-of-stock_child_rollback.php
new file mode 100644
index 0000000000000..05b0d8959a5d3
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Framework/Search/_files/product_configurable_with_out-of-stock_child_rollback.php
@@ -0,0 +1,9 @@
+