diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper.php
index 49559ba330b6e..3e45111fb6982 100644
--- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper.php
+++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper.php
@@ -3,8 +3,12 @@
* Copyright © 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
+
namespace Magento\Catalog\Controller\Adminhtml\Product\Initialization;
+/**
+ * Product initialization helper class
+ */
class Helper
{
/**
@@ -71,7 +75,7 @@ public function __construct(
*/
public function initialize(\Magento\Catalog\Model\Product $product)
{
- $productData = $this->request->getPost('product');
+ $productData = $this->request->getPost('product', []);
unset($productData['custom_attributes']);
unset($productData['extension_attributes']);
@@ -144,6 +148,13 @@ public function initialize(\Magento\Catalog\Model\Product $product)
$productData['options'],
$this->request->getPost('options_use_default')
);
+ foreach ($options as &$customOptionData) {
+ if (isset($customOptionData['values'])) {
+ $customOptionData['values'] = array_filter($customOptionData['values'], function ($valueData) {
+ return !($valueData['option_type_id'] == '-1' && !empty($valueData['is_delete']));
+ });
+ }
+ }
$product->setProductOptions($options);
}
diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/NewAction.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/NewAction.php
index 110029cdda0a8..cc671cfd8d2f9 100644
--- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/NewAction.php
+++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/NewAction.php
@@ -9,6 +9,9 @@
use Magento\Backend\App\Action;
use Magento\Catalog\Controller\Adminhtml\Product;
+/**
+ * Class that handle new product creation
+ */
class NewAction extends \Magento\Catalog\Controller\Adminhtml\Product
{
/**
diff --git a/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/Initialization/HelperTest.php b/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/Initialization/HelperTest.php
index 2a407a67fd428..dc6ee45b79f25 100644
--- a/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/Initialization/HelperTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/Initialization/HelperTest.php
@@ -3,34 +3,59 @@
* Copyright © 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
+
namespace Magento\Catalog\Test\Unit\Controller\Adminhtml\Product\Initialization;
-use \Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper;
+use Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper;
+use Magento\Catalog\Controller\Adminhtml\Product\Initialization\StockDataFilter;
+use Magento\Catalog\Model\Product;
+use Magento\Catalog\Model\Product\Option;
+use Magento\Framework\App\RequestInterface;
+use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
+use Magento\Store\Model\StoreManagerInterface;
+use Magento\Catalog\Model\Product\Initialization\Helper\ProductLinks;
+/**
+ * Class HelperTest
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ * @SuppressWarnings(PHPMD.ExcessivePublicCount)
+ * @SuppressWarnings(PHPMD.ExcessiveClassComplexity)
+ * @SuppressWarnings(PHPMD.TooManyFields)
+ */
class HelperTest extends \PHPUnit_Framework_TestCase
{
+ /**
+ * @var ObjectManager
+ */
+ protected $objectManager;
+
+ /**
+ * @var Helper
+ */
+ protected $helper;
+
/**
* @var \PHPUnit_Framework_MockObject_MockObject
*/
protected $requestMock;
/**
- * @var \PHPUnit_Framework_MockObject_MockObject
+ * @var StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject
*/
protected $storeManagerMock;
/**
- * @var \PHPUnit_Framework_MockObject_MockObject
+ * @var StockDataFilter|\PHPUnit_Framework_MockObject_MockObject
*/
protected $stockFilterMock;
/**
- * @var \PHPUnit_Framework_MockObject_MockObject
+ * @var ProductLinks|\PHPUnit_Framework_MockObject_MockObject
*/
protected $productLinksMock;
/**
- * @var \PHPUnit_Framework_MockObject_MockObject
+ * @var Product|\PHPUnit_Framework_MockObject_MockObject
*/
protected $productMock;
@@ -55,33 +80,36 @@ class HelperTest extends \PHPUnit_Framework_TestCase
protected $websiteId = 1;
/**
- * @var \Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper
- */
- protected $helper;
-
- /**
- * @var \PHPUnit_Framework_MockObject_MockObject
+ * @var \Magento\Backend\Helper\Js|\PHPUnit_Framework_MockObject_MockObject
*/
protected $jsHelperMock;
protected function setUp()
{
- $this->requestMock = $this->getMock('Magento\Framework\App\Request\Http', [], [], '', false);
- $this->jsHelperMock = $this->getMock('Magento\Backend\Helper\Js', [], [], '', false);
- $this->storeMock = $this->getMock('Magento\Store\Model\Store', [], [], '', false);
- $this->websiteMock = $this->getMock('Magento\Store\Model\Website', [], [], '', false);
- $this->storeManagerMock = $this->getMock('Magento\Store\Model\StoreManagerInterface');
- $this->dateFilterMock = $this->getMock('\Magento\Framework\Stdlib\DateTime\Filter\Date', [], [], '', false);
-
- $this->stockFilterMock = $this->getMock(
- 'Magento\Catalog\Controller\Adminhtml\Product\Initialization\StockDataFilter',
+ $this->objectManager = new ObjectManager($this);
+ $this->requestMock = $this->getMockBuilder(RequestInterface::class)
+ ->setMethods(['getPost'])
+ ->getMockForAbstractClass();
+
+ $this->jsHelperMock = $this->getMock(\Magento\Backend\Helper\Js::class, [], [], '', false);
+ $this->storeMock = $this->getMock(\Magento\Store\Model\Store::class, [], [], '', false);
+ $this->websiteMock = $this->getMock(\Magento\Store\Model\Website::class, [], [], '', false);
+ $this->storeManagerMock = $this->getMockBuilder(StoreManagerInterface::class)
+ ->getMockForAbstractClass();
+ $this->dateFilterMock = $this->getMock(
+ \Magento\Framework\Stdlib\DateTime\Filter\Date::class,
[],
[],
'',
false
);
+
+ $this->stockFilterMock = $this->getMockBuilder(StockDataFilter::class)
+ ->disableOriginalConstructor()
+ ->getMock();
+
$this->productLinksMock = $this->getMock(
- 'Magento\Catalog\Model\Product\Initialization\Helper\ProductLinks',
+ \Magento\Catalog\Model\Product\Initialization\Helper\ProductLinks::class,
[],
[],
'',
@@ -89,9 +117,8 @@ protected function setUp()
);
$this->productMock = $this->getMock(
- 'Magento\Catalog\Model\Product',
+ \Magento\Catalog\Model\Product::class,
[
- 'setData',
'addData',
'getId',
'setWebsiteIds',
@@ -100,7 +127,6 @@ protected function setUp()
'getAttributes',
'unlockAttribute',
'getOptionsReadOnly',
- 'setProductOptions',
'setCanSaveCustomOptions',
'__sleep',
'__wakeup'
@@ -109,6 +135,15 @@ protected function setUp()
'',
false
);
+
+ $this->helper = $this->objectManager->getObject(Helper::class, [
+ 'request' => $this->requestMock,
+ 'storeManager' => $this->storeManagerMock,
+ 'stockFilter' => $this->stockFilterMock,
+ 'productLinks' => $this->productLinksMock,
+ 'jsHelper' => $this->jsHelperMock,
+ 'dateFilter' => $this->dateFilterMock,
+ ]);
}
/**
@@ -117,6 +152,20 @@ protected function setUp()
*/
public function testInitialize()
{
+ $optionsData = [
+ 'option1' => ['is_delete' => false, 'name' => 'name1', 'price' => 'price1', 'option_id' => '13'],
+ 'option2' => ['is_delete' => false, 'name' => 'name1', 'price' => 'price1', 'option_id' => '14',
+ 'values' => [
+ 'value1' => ['option_type_id' => 1, 'is_delete' =>''],
+ 'value2' => ['option_type_id' => '-1', 'is_delete' =>'1']
+ ]
+ ],
+ ];
+ $productData = [
+ 'stock_data' => ['stock_data'],
+ 'options' => $optionsData,
+ ];
+
$this->websiteMock->expects($this->once())
->method('getId')
->will($this->returnValue($this->websiteId));
@@ -130,28 +179,20 @@ public function testInitialize()
->with(true)
->will($this->returnValue($this->storeMock));
- $this->jsHelperMock = $this->getMock('\Magento\Backend\Helper\Js', [], [], '', false);
- $this->helper = new Helper(
- $this->requestMock,
- $this->storeManagerMock,
- $this->stockFilterMock,
- $this->productLinksMock,
- $this->jsHelperMock,
- $this->dateFilterMock
- );
-
- $productData = [
- 'stock_data' => ['stock_data'],
- 'options' => ['option1', 'option2']
- ];
-
- $attributeNonDate = $this->getMock('Magento\Catalog\Model\ResourceModel\Eav\Attribute', [], [], '', false);
- $attributeDate = $this->getMock('Magento\Catalog\Model\ResourceModel\Eav\Attribute', [], [], '', false);
+ $attributeNonDate = $this->getMockBuilder(\Magento\Catalog\Model\ResourceModel\Eav\Attribute::class)
+ ->disableOriginalConstructor()
+ ->getMock();
+ $attributeDate = $this->getMockBuilder(\Magento\Catalog\Model\ResourceModel\Eav\Attribute::class)
+ ->disableOriginalConstructor()
+ ->getMock();
$attributeNonDateBackEnd =
- $this->getMock('Magento\Eav\Model\Entity\Attribute\Backend\DefaultBackend', [], [], '', false);
- $attributeDateBackEnd =
- $this->getMock('Magento\Eav\Model\Entity\Attribute\Backend\Datetime', [], [], '', false);
+ $this->getMockBuilder(\Magento\Eav\Model\Entity\Attribute\Backend\DefaultBackend::class)
+ ->disableOriginalConstructor()
+ ->getMock();
+ $attributeDateBackEnd = $this->getMockBuilder(\Magento\Eav\Model\Entity\Attribute\Backend\Datetime::class)
+ ->disableOriginalConstructor()
+ ->getMock();
$attributeNonDate->expects($this->any())
->method('getBackend')
@@ -177,6 +218,13 @@ public function testInitialize()
$useDefaults = ['attributeCode1', 'attributeCode2'];
+ $this->requestMock->expects($this->any())->method('getPost')->willReturnMap(
+ [
+ ['product', [], $productData],
+ ['use_default', null, $useDefaults]
+ ]
+ );
+
$this->requestMock->expects($this->at(0))
->method('getPost')
->with('product')
@@ -230,6 +278,7 @@ public function testInitialize()
$productData['category_ids'] = [];
$productData['website_ids'] = [];
+
$this->productMock->expects($this->once())
->method('addData')
->with($productData);
@@ -242,15 +291,11 @@ public function testInitialize()
->method('getOptionsReadOnly')
->will($this->returnValue(false));
- $this->productMock->expects($this->once())
- ->method('setProductOptions')
- ->with($productData['options']);
-
- $this->productMock->expects($this->once())
- ->method('setCanSaveCustomOptions')
- ->with(true);
-
$this->assertEquals($this->productMock, $this->helper->initialize($this->productMock));
+
+ $productOptions = $this->productMock->getProductOptions();
+ $this->assertTrue(2 == count($productOptions));
+ $this->assertTrue(1 == count($productOptions['option2']['values']));
}
/**
@@ -292,15 +337,6 @@ public function mergeProductOptionsDataProvider()
*/
public function testMergeProductOptions($productOptions, $defaultOptions, $expectedResults)
{
- $this->jsHelperMock = $this->getMock('\Magento\Backend\Helper\Js', [], [], '', false);
- $this->helper = new Helper(
- $this->requestMock,
- $this->storeManagerMock,
- $this->stockFilterMock,
- $this->productLinksMock,
- $this->jsHelperMock,
- $this->dateFilterMock
- );
$result = $this->helper->mergeProductOptions($productOptions, $defaultOptions);
$this->assertEquals($expectedResults, $result);
}
diff --git a/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/NewActionTest.php b/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/NewActionTest.php
index 187c4e6bba0ff..d887b33f17ef6 100644
--- a/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/NewActionTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/NewActionTest.php
@@ -4,8 +4,12 @@
* Copyright © 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
+
namespace Magento\Catalog\Test\Unit\Controller\Adminhtml\Product;
+/**
+ * Class to test new product creation
+ */
class NewActionTest extends \Magento\Catalog\Test\Unit\Controller\Adminhtml\ProductTest
{
/** @var \Magento\Catalog\Controller\Adminhtml\Product\NewAction */
@@ -22,23 +26,24 @@ class NewActionTest extends \Magento\Catalog\Test\Unit\Controller\Adminhtml\Prod
protected function setUp()
{
$this->productBuilder = $this->getMock(
- 'Magento\Catalog\Controller\Adminhtml\Product\Builder',
+ \Magento\Catalog\Controller\Adminhtml\Product\Builder::class,
['build'],
[],
'',
false
);
- $this->product = $this->getMockBuilder('Magento\Catalog\Model\Product')->disableOriginalConstructor()
+ $this->product = $this->getMockBuilder(\Magento\Catalog\Model\Product::class)
+ ->disableOriginalConstructor()
->setMethods(['addData', 'getTypeId', 'getStoreId', '__sleep', '__wakeup'])->getMock();
$this->product->expects($this->any())->method('getTypeId')->will($this->returnValue('simple'));
$this->product->expects($this->any())->method('getStoreId')->will($this->returnValue('1'));
$this->productBuilder->expects($this->any())->method('build')->will($this->returnValue($this->product));
- $this->resultPage = $this->getMockBuilder('Magento\Backend\Model\View\Result\Page')
+ $this->resultPage = $this->getMockBuilder(\Magento\Backend\Model\View\Result\Page::class)
->disableOriginalConstructor()
->getMock();
- $resultPageFactory = $this->getMockBuilder('Magento\Framework\View\Result\PageFactory')
+ $resultPageFactory = $this->getMockBuilder(\Magento\Framework\View\Result\PageFactory::class)
->disableOriginalConstructor()
->setMethods(['create'])
->getMock();
@@ -46,10 +51,10 @@ protected function setUp()
->method('create')
->willReturn($this->resultPage);
- $this->resultForward = $this->getMockBuilder('Magento\Backend\Model\View\Result\Forward')
+ $this->resultForward = $this->getMockBuilder(\Magento\Backend\Model\View\Result\Forward::class)
->disableOriginalConstructor()
->getMock();
- $resultForwardFactory = $this->getMockBuilder('Magento\Backend\Model\View\Result\ForwardFactory')
+ $resultForwardFactory = $this->getMockBuilder(\Magento\Backend\Model\View\Result\ForwardFactory::class)
->disableOriginalConstructor()
->setMethods(['create'])
->getMock();
@@ -57,11 +62,14 @@ protected function setUp()
->method('create')
->willReturn($this->resultForward);
+ $stockFilter = $this->getMockBuilder(
+ \Magento\Catalog\Controller\Adminhtml\Product\Initialization\StockDataFilter::class
+ )->disableOriginalConstructor()->getMock();
+
$this->action = new \Magento\Catalog\Controller\Adminhtml\Product\NewAction(
$this->initContext(),
$this->productBuilder,
- $this->getMockBuilder('Magento\Catalog\Controller\Adminhtml\Product\Initialization\StockDataFilter')
- ->disableOriginalConstructor()->getMock(),
+ $stockFilter,
$resultPageFactory,
$resultForwardFactory
);
diff --git a/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/ValidateTest.php b/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/ValidateTest.php
index b24546b9e87da..d98b115f56608 100644
--- a/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/ValidateTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/ValidateTest.php
@@ -3,11 +3,15 @@
* Copyright © 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
+
namespace Magento\Catalog\Test\Unit\Controller\Adminhtml\Product;
use Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper;
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
+/**
+ * Class to test product validation before save
+ */
class ValidateTest extends \Magento\Catalog\Test\Unit\Controller\Adminhtml\ProductTest
{
/** @var \Magento\Catalog\Controller\Adminhtml\Product\Validate */
@@ -32,17 +36,21 @@ class ValidateTest extends \Magento\Catalog\Test\Unit\Controller\Adminhtml\Produ
protected $resultJson;
/** @var \Magento\Framework\Controller\Result\JsonFactory|\PHPUnit_Framework_MockObject_MockObject */
protected $resultJsonFactory;
+ /** @var ObjectManagerHelper */
+ protected $objectManagerHelper;
protected function setUp()
{
+ $this->objectManagerHelper = new ObjectManagerHelper($this);
$this->productBuilder = $this->getMock(
- 'Magento\Catalog\Controller\Adminhtml\Product\Builder',
+ \Magento\Catalog\Controller\Adminhtml\Product\Builder::class,
['build'],
[],
'',
false
);
- $this->product = $this->getMockBuilder('Magento\Catalog\Model\Product')->disableOriginalConstructor()
+ $this->product = $this->getMockBuilder(\Magento\Catalog\Model\Product::class)
+ ->disableOriginalConstructor()
->setMethods([
'addData', 'getSku', 'getTypeId', 'getStoreId', '__sleep', '__wakeup', 'getAttributes',
'setAttributeSetId',
@@ -53,20 +61,20 @@ protected function setUp()
$this->product->expects($this->any())->method('getAttributes')->will($this->returnValue([]));
$this->productBuilder->expects($this->any())->method('build')->will($this->returnValue($this->product));
- $this->resultPage = $this->getMockBuilder('Magento\Backend\Model\View\Result\Page')
+ $this->resultPage = $this->getMockBuilder(\Magento\Backend\Model\View\Result\Page::class)
->disableOriginalConstructor()
->getMock();
- $resultPageFactory = $this->getMockBuilder('Magento\Framework\View\Result\PageFactory')
+ $resultPageFactory = $this->getMockBuilder(\Magento\Framework\View\Result\PageFactory::class)
->disableOriginalConstructor()
->setMethods(['create'])
->getMock();
$resultPageFactory->expects($this->any())->method('create')->willReturn($this->resultPage);
- $this->resultForward = $this->getMockBuilder('Magento\Backend\Model\View\Result\Forward')
+ $this->resultForward = $this->getMockBuilder(\Magento\Backend\Model\View\Result\Forward::class)
->disableOriginalConstructor()
->getMock();
- $resultForwardFactory = $this->getMockBuilder('Magento\Backend\Model\View\Result\ForwardFactory')
+ $resultForwardFactory = $this->getMockBuilder(\Magento\Backend\Model\View\Result\ForwardFactory::class)
->disableOriginalConstructor()
->setMethods(['create'])
->getMock();
@@ -75,14 +83,14 @@ protected function setUp()
->willReturn($this->resultForward);
$this->resultPage->expects($this->any())->method('getLayout')->willReturn($this->layout);
$this->resultRedirectFactory = $this->getMock(
- 'Magento\Backend\Model\View\Result\RedirectFactory',
+ \Magento\Backend\Model\View\Result\RedirectFactory::class,
['create'],
[],
'',
false
);
$this->resultRedirect = $this->getMock(
- 'Magento\Backend\Model\View\Result\Redirect',
+ \Magento\Backend\Model\View\Result\Redirect::class,
[],
[],
'',
@@ -91,29 +99,29 @@ protected function setUp()
$this->resultRedirectFactory->expects($this->any())->method('create')->willReturn($this->resultRedirect);
$this->initializationHelper = $this->getMock(
- 'Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper',
+ \Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper::class,
[],
[],
'',
false
);
- $this->productFactory = $this->getMockBuilder('Magento\Catalog\Model\ProductFactory')
+ $this->productFactory = $this->getMockBuilder(\Magento\Catalog\Model\ProductFactory::class)
->disableOriginalConstructor()
->setMethods(['create'])
->getMock();
$this->productFactory->expects($this->any())->method('create')->willReturn($this->product);
- $this->resultJson = $this->getMock('Magento\Framework\Controller\Result\Json', [], [], '', false);
- $this->resultJsonFactory = $this->getMockBuilder('Magento\Framework\Controller\Result\JsonFactory')
+ $this->resultJson = $this->getMock(\Magento\Framework\Controller\Result\Json::class, [], [], '', false);
+ $this->resultJsonFactory = $this->getMockBuilder(\Magento\Framework\Controller\Result\JsonFactory::class)
->disableOriginalConstructor()
->setMethods(['create'])
->getMock();
$this->resultJsonFactory->expects($this->any())->method('create')->willReturn($this->resultJson);
$additionalParams = ['resultRedirectFactory' => $this->resultRedirectFactory];
- $this->action = (new ObjectManagerHelper($this))->getObject(
- 'Magento\Catalog\Controller\Adminhtml\Product\Validate',
+ $this->action = $this->objectManagerHelper->getObject(
+ \Magento\Catalog\Controller\Adminhtml\Product\Validate::class,
[
'context' => $this->initContext($additionalParams),
'productBuilder' => $this->productBuilder,
diff --git a/app/code/Magento/Sales/Model/ResourceModel/Order/Creditmemo/Grid/Collection.php b/app/code/Magento/Sales/Model/ResourceModel/Order/Creditmemo/Grid/Collection.php
new file mode 100644
index 0000000000000..9c68b48319713
--- /dev/null
+++ b/app/code/Magento/Sales/Model/ResourceModel/Order/Creditmemo/Grid/Collection.php
@@ -0,0 +1,36 @@
+Magento\Framework\App\State\Proxy
-
-
- sales_invoice_grid
- Magento\Sales\Model\ResourceModel\Order\Invoice
-
-
-
-
- sales_shipment_grid
- Magento\Sales\Model\ResourceModel\Order\Shipment
-
-
-
-
- sales_creditmemo_grid
- Magento\Sales\Model\ResourceModel\Order\Creditmemo
-
-
-
-
- sales_invoice_grid
- Magento\Sales\Model\ResourceModel\Order\Invoice
-
-
-
-
- sales_shipment_grid
- Magento\Sales\Model\ResourceModel\Order\Shipment
-
-
-
-
- sales_creditmemo_grid
- Magento\Sales\Model\ResourceModel\Order\Creditmemo
-
-
Magento\Sales\Model\ResourceModel\Order
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/ProductTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/ProductTest.php
index 4242163acd5b9..65016818c0780 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/ProductTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/ProductTest.php
@@ -109,4 +109,74 @@ public function testEditAction()
'"Save & Duplicate" button isn\'t present on Edit Product page'
);
}
+
+ /**
+ * @dataProvider saveWithInvalidCustomOptionDataProvider
+ * @magentoDataFixture Magento/Catalog/_files/product_without_options.php
+ */
+ public function testSaveWithInvalidCustomOption($postData)
+ {
+ $this->getRequest()->setPostValue($postData);
+ $this->dispatch('backend/catalog/product/save/id/1');
+
+ $this->assertSessionMessages(
+ $this->contains('You saved the product.'),
+ \Magento\Framework\Message\MessageInterface::TYPE_SUCCESS
+ );
+ }
+
+ /**
+ * Data Provider for save
+ *
+ * @return array
+ */
+ public function saveWithInvalidCustomOptionDataProvider()
+ {
+ return [
+ [
+ [
+ 'product' => [
+ 'options' => [
+ [
+ 'title' => 'drop_down option',
+ 'type' => 'drop_down',
+ 'is_require' => true,
+ 'sort_order' => 0,
+ 'values' => [
+ [
+ 'title' => 'drop_down option 1',
+ 'price' => 10,
+ 'price_type' => 'fixed',
+ 'sku' => 'drop_down option 1 sku',
+ 'option_type_id' => '-1',
+ 'is_delete' => '',
+ 'sort_order' => 0,
+ ],
+ [
+ 'title' => 'drop_down option 2',
+ 'price' => 20,
+ 'price_type' => 'fixed',
+ 'sku' => 'drop_down option 2 sku',
+ 'option_type_id' => '-1',
+ 'is_delete' => '',
+ 'sort_order' => 1,
+ ],
+ [
+ 'title' => '',
+ 'price' => '',
+ 'price_type' => 'fixed',
+ 'sku' => '',
+ 'option_type_id' => '-1',
+ 'is_delete' => '1',
+ 'sort_order' => 2,
+ ]
+ ],
+ ]
+ ],
+ ],
+ 'affect_product_custom_options' => 1,
+ ]
+ ],
+ ];
+ }
}
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple.php
index 66766153dcf31..d382506222bd2 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple.php
@@ -6,7 +6,7 @@
/** @var $product \Magento\Catalog\Model\Product */
$product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
- ->create('Magento\Catalog\Model\Product');
+ ->create(\Magento\Catalog\Model\Product::class);
$product->isObjectNew(true);
$product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE)
->setId(1)
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple_multiwebsite.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple_multiwebsite.php
new file mode 100644
index 0000000000000..27b5a6f7fba31
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple_multiwebsite.php
@@ -0,0 +1,34 @@
+create(\Magento\Catalog\Model\Product::class);
+$product->isObjectNew(true);
+$product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE)
+ ->setAttributeSetId(4)
+ ->setWebsiteIds([1,2])
+ ->setName('Simple Product Two')
+ ->setSku('simple_two')
+ ->setPrice(10)
+ ->setWeight(2)
+ ->setStockData(
+ [
+ 'use_config_manage_stock' => 1,
+ 'qty' => 100,
+ 'is_qty_decimal' => 0,
+ 'is_in_stock' => 1,
+ ]
+ )
+ ->setCategoryIds([2])
+ ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
+ ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
+ ->save();
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/order.php b/dev/tests/integration/testsuite/Magento/Sales/_files/order.php
index 4ac29374ef55f..c62b44106c938 100644
--- a/dev/tests/integration/testsuite/Magento/Sales/_files/order.php
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/order.php
@@ -14,17 +14,17 @@
$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
-$billingAddress = $objectManager->create('Magento\Sales\Model\Order\Address', ['data' => $addressData]);
+$billingAddress = $objectManager->create(\Magento\Sales\Model\Order\Address::class, ['data' => $addressData]);
$billingAddress->setAddressType('billing');
$shippingAddress = clone $billingAddress;
$shippingAddress->setId(null)->setAddressType('shipping');
-$payment = $objectManager->create('Magento\Sales\Model\Order\Payment');
+$payment = $objectManager->create(\Magento\Sales\Model\Order\Payment::class);
$payment->setMethod('checkmo');
/** @var \Magento\Sales\Model\Order\Item $orderItem */
-$orderItem = $objectManager->create('Magento\Sales\Model\Order\Item');
+$orderItem = $objectManager->create(\Magento\Sales\Model\Order\Item::class);
$orderItem->setProductId($product->getId())->setQtyOrdered(2);
$orderItem->setBasePrice($product->getPrice());
$orderItem->setPrice($product->getPrice());
@@ -32,7 +32,7 @@
$orderItem->setProductType('simple');
/** @var \Magento\Sales\Model\Order $order */
-$order = $objectManager->create('Magento\Sales\Model\Order');
+$order = $objectManager->create(\Magento\Sales\Model\Order::class);
$order->setIncrementId(
'100000001'
)->setState(
@@ -56,7 +56,7 @@
)->setShippingAddress(
$shippingAddress
)->setStoreId(
- $objectManager->get('Magento\Store\Model\StoreManagerInterface')->getStore()->getId()
+ $objectManager->get(\Magento\Store\Model\StoreManagerInterface::class)->getStore()->getId()
)->addItem(
$orderItem
)->setPayment(
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/order_fixture_second_store.php b/dev/tests/integration/testsuite/Magento/Sales/_files/order_fixture_second_store.php
new file mode 100644
index 0000000000000..a19a9b47bb290
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/order_fixture_second_store.php
@@ -0,0 +1,66 @@
+create(\Magento\Sales\Model\Order\Address::class, ['data' => $addressData]);
+$billingAddress->setAddressType('billing');
+
+/** @var \Magento\Sales\Model\Order\Address $shippingAddress */
+$shippingAddress = clone $billingAddress;
+$shippingAddress->setId(null)->setAddressType('shipping');
+
+/** @var \Magento\Sales\Model\Order\Payment $payment */
+$payment = $objectManager->create(\Magento\Sales\Model\Order\Payment::class);
+$payment->setMethod('checkmo');
+
+/** @var \Magento\Sales\Model\Order\Item $orderItem */
+$orderItem = $objectManager->create(\Magento\Sales\Model\Order\Item::class);
+$orderItem->setProductId($product->getId())->setQtyOrdered(2);
+$orderItem->setBasePrice($product->getPrice());
+$orderItem->setPrice($product->getPrice());
+$orderItem->setRowTotal($product->getPrice());
+$orderItem->setProductType('simple');
+
+$storeId = $store->getStoreId();
+$incrementId = $storeId . '00000001';
+/** @var \Magento\Sales\Model\Order $order */
+$order = $objectManager->create(\Magento\Sales\Model\Order::class);
+$order->setIncrementId(
+ $incrementId
+)->setState(
+ \Magento\Sales\Model\Order::STATE_PROCESSING
+)->setStatus(
+ $order->getConfig()->getStateDefaultStatus(\Magento\Sales\Model\Order::STATE_PROCESSING)
+)->setSubtotal(
+ 100
+)->setBaseSubtotal(
+ 100
+)->setCustomerIsGuest(
+ true
+)->setCustomerEmail(
+ 'customer@null.com'
+)->setBillingAddress(
+ $billingAddress
+)->setShippingAddress(
+ $shippingAddress
+)->setStoreId(
+ $storeId
+)->addItem(
+ $orderItem
+)->setPayment(
+ $payment
+);
+$order->save();
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/order_invoice_shipment_creditmemo_for_two_stores.php b/dev/tests/integration/testsuite/Magento/Sales/_files/order_invoice_shipment_creditmemo_for_two_stores.php
new file mode 100644
index 0000000000000..53b651724106e
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/order_invoice_shipment_creditmemo_for_two_stores.php
@@ -0,0 +1,59 @@
+create(
+ \Magento\Sales\Api\InvoiceManagementInterface::class
+ );
+ $orderIncrementId = $order->getIncrementId();
+ /** @var \Magento\Sales\Model\Order\Invoice $invoice */
+ $invoice = $orderService->prepareInvoice($order);
+ $invoice->register();
+ $order->setIsInProcess(true);
+ /** @var \Magento\Framework\DB\Transaction $transactionSave */
+ $transactionSave = $objectManager
+ ->create(\Magento\Framework\DB\Transaction::class);
+ $transactionSave->addObject($invoice)->addObject($order)->save();
+
+ /** @var Magento\Sales\Model\Order\Payment $payment */
+ $payment = $order->getPayment();
+ $paymentInfoBlock = $objectManager
+ ->get(\Magento\Payment\Helper\Data::class)
+ ->getInfoBlock($payment);
+ $payment->setBlockMock($paymentInfoBlock);
+
+ /** @var \Magento\Sales\Model\Order\Shipment $shipment */
+ $shipment = $objectManager->create(\Magento\Sales\Model\Order\Shipment::class);
+ $shipment->setOrder($order);
+
+ /** @var \Magento\Sales\Model\Order\Shipment\Item $shipmentItem */
+ $shipmentItem = $objectManager->create(\Magento\Sales\Model\Order\Shipment\Item::class);
+ $shipmentItem->setOrderItem($orderItem);
+ $shipment->addItem($shipmentItem);
+ $shipment->setPackages([['1'], ['2']]);
+ $shipment->setShipmentStatus(\Magento\Sales\Model\Order\Shipment::STATUS_NEW);
+
+ $shipment->save();
+
+ /** @var \Magento\Sales\Model\Order\CreditmemoFactory $creditmemoFactory */
+ $creditmemoFactory = $objectManager->get(\Magento\Sales\Model\Order\CreditmemoFactory::class);
+ /** @var Magento\Sales\Model\Order\Creditmemo $creditmemo */
+ $creditmemo = $creditmemoFactory->createByOrder($order, $order->getData());
+ $creditmemo->setOrder($order);
+ $creditmemo->setState(Magento\Sales\Model\Order\Creditmemo::STATE_OPEN);
+ $creditmemo->setIncrementId($orderIncrementId);
+ $creditmemo->save();
+}
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/order_invoice_shipment_creditmemo_for_two_stores_rollback.php b/dev/tests/integration/testsuite/Magento/Sales/_files/order_invoice_shipment_creditmemo_for_two_stores_rollback.php
new file mode 100644
index 0000000000000..03e9cd9428167
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/order_invoice_shipment_creditmemo_for_two_stores_rollback.php
@@ -0,0 +1,28 @@
+get('Magento\Framework\Registry');
+$registry->unregister('isSecureArea');
+$registry->register('isSecureArea', true);
+
+/** @var \Magento\Sales\Model\ResourceModel\Order\Invoice\Grid\Collection $invoiceGridCollection */
+$invoiceGridCollection = $objectManager->create(\Magento\Sales\Model\ResourceModel\Order\Invoice\Grid\Collection::class);
+$invoiceGridCollection->getConnection()->truncateTable($invoiceGridCollection->getMainTable());
+
+/** @var \Magento\Sales\Model\ResourceModel\Order\Shipment\Grid\Collection $shipmentCollection */
+$shipmentCollection = $objectManager->create(\Magento\Sales\Model\ResourceModel\Order\Shipment\Grid\Collection::class);
+$shipmentCollection->getConnection()->truncateTable($shipmentCollection->getMainTable());
+
+/** @var \Magento\Sales\Model\ResourceModel\Order\Creditmemo\Grid\Collection $creditmemoCollection */
+$creditmemoCollection = $objectManager->create(\Magento\Sales\Model\ResourceModel\Order\Creditmemo\Grid\Collection::class);
+$creditmemoCollection->getConnection()->truncateTable($creditmemoCollection->getMainTable());
+
+$registry->unregister('isSecureArea');
+$registry->register('isSecureArea', false);
\ No newline at end of file
diff --git a/dev/tests/integration/testsuite/Magento/Store/_files/second_website_store.php b/dev/tests/integration/testsuite/Magento/Store/_files/second_website_store.php
new file mode 100644
index 0000000000000..23a8af03d8760
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Store/_files/second_website_store.php
@@ -0,0 +1,55 @@
+create(\Magento\Store\Model\Website::class);
+
+if (!$website->load('second_website', 'code')->getId()) {
+ $website->setData(['code' => 'second_website', 'name' => 'Second Website', 'is_default' => '0']);
+ $website->save();
+}
+
+$websiteId = $website->getId();
+
+$group = $objectManager->create(\Magento\Store\Model\Group::class);
+
+if (!$group->load('Second Group', 'name')->getId()) {
+ $group->setData(['website_id' => $websiteId, 'name' => 'Second Group', 'root_category_id' => '2']);
+ $group->save();
+}
+
+$groupId = $group->getId();
+
+$store = $objectManager->create(\Magento\Store\Model\Store::class);
+$storeId = $store->load('fixture_second_store', 'code')->getId();
+
+if (!$storeId) {
+ $store->setCode(
+ 'fixture_second_store'
+ )->setWebsiteId(
+ $websiteId
+ )->setGroupId(
+ $groupId
+ )->setName(
+ 'Fixture Store'
+ )->setSortOrder(
+ 10
+ )->setIsActive(
+ 1
+ );
+ $store->save();
+
+ $eventManager = $objectManager->create(\Magento\Framework\Event\ManagerInterface::class);
+ $eventName = 'store_add';
+ $eventManager->dispatch($eventName, ['store' => $store]);
+
+ /* Refresh stores memory cache */
+ $objectManager->get(\Magento\Store\Model\StoreManagerInterface::class)->reinitStores();
+}
diff --git a/dev/tests/integration/testsuite/Magento/Store/_files/second_website_store_rollback.php b/dev/tests/integration/testsuite/Magento/Store/_files/second_website_store_rollback.php
new file mode 100644
index 0000000000000..2e252c34481f9
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Store/_files/second_website_store_rollback.php
@@ -0,0 +1,22 @@
+get('Magento\Framework\Registry');
+
+$registry->unregister('isSecureArea');
+$registry->register('isSecureArea', true);
+
+/** @var \Magento\Store\Model\Website $website */
+$website = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\Store\Model\Website');
+$website->load('second_website');
+
+if ($website->getId()) {
+ $website->delete();
+}
+
+$registry->unregister('isSecureArea');
+$registry->register('isSecureArea', false);