Skip to content

Commit 817f944

Browse files
committed
MC-34611: Admin: View and edit customer shopping cart
1 parent 6b3b90b commit 817f944

21 files changed

+1655
-225
lines changed

dev/tests/integration/testsuite/Magento/Catalog/Helper/Product/CompositeTest.php

Lines changed: 95 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,34 +3,51 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
declare(strict_types=1);
67

78
namespace Magento\Catalog\Helper\Product;
89

10+
use Magento\Catalog\Api\ProductRepositoryInterface;
11+
use Magento\Catalog\Model\Product;
912
use Magento\Customer\Controller\RegistryConstants;
13+
use Magento\Framework\DataObject;
14+
use Magento\Framework\ObjectManagerInterface;
1015
use Magento\Framework\Registry;
1116
use Magento\TestFramework\Helper\Bootstrap;
17+
use PHPUnit\Framework\TestCase;
1218

1319
/**
1420
* Test Composite
1521
*/
16-
class CompositeTest extends \PHPUnit\Framework\TestCase
22+
class CompositeTest extends TestCase
1723
{
18-
/**
19-
* @var Composite
20-
*/
21-
protected $helper;
24+
/** @var ObjectManagerInterface */
25+
private $objectManager;
26+
27+
/** @var Composite */
28+
private $helper;
29+
30+
/** @var Registry */
31+
private $registry;
32+
33+
/** @var ProductRepositoryInterface */
34+
private $productRepository;
2235

2336
/**
24-
* @var Registry
37+
* @inheritdoc
2538
*/
26-
protected $registry;
27-
2839
protected function setUp(): void
2940
{
30-
$this->helper = Bootstrap::getObjectManager()->get(\Magento\Catalog\Helper\Product\Composite::class);
31-
$this->registry = Bootstrap::getObjectManager()->get(\Magento\Framework\Registry::class);
41+
$this->objectManager = Bootstrap::getObjectManager();
42+
$this->helper = $this->objectManager->get(Composite::class);
43+
$this->registry = $this->objectManager->get(Registry::class);
44+
$this->productRepository = $this->objectManager->get(ProductRepositoryInterface::class);
45+
$this->productRepository->cleanCache();
3246
}
3347

48+
/**
49+
* @inheritdoc
50+
*/
3451
protected function tearDown(): void
3552
{
3653
$this->registry->unregister('composite_configure_result_error_message');
@@ -42,40 +59,85 @@ protected function tearDown(): void
4259
/**
4360
* @magentoDataFixture Magento/Catalog/_files/product_simple.php
4461
* @magentoDataFixture Magento/Customer/_files/customer.php
62+
* @return void
4563
*/
46-
public function testRenderConfigureResult()
64+
public function testRenderConfigureResult(): void
4765
{
48-
/** @var \Magento\Catalog\Api\ProductRepositoryInterface $productRepository */
49-
$productRepository = Bootstrap::getObjectManager()->create(
50-
\Magento\Catalog\Api\ProductRepositoryInterface::class
51-
);
52-
/** @var $product \Magento\Catalog\Model\Product */
53-
$product = $productRepository->get('simple');
54-
55-
$configureResult = new \Magento\Framework\DataObject();
66+
$product = $this->productRepository->get('simple');
67+
/** @var DataObject $buyRequest */
68+
$buyRequest = $this->objectManager->create(DataObject::class);
69+
$buyRequest->setData(['qty' => 1]);
70+
/** @var DataObject $configureResult */
71+
$configureResult = $this->objectManager->create(DataObject::class);
5672
$configureResult->setOk(true)
5773
->setProductId($product->getId())
74+
->setBuyRequest($buyRequest)
5875
->setCurrentCustomerId(1);
5976

60-
$this->helper->renderConfigureResult($configureResult);
77+
$resultLayout = $this->helper->renderConfigureResult($configureResult);
6178

62-
$customerId = $this->registry->registry(RegistryConstants::CURRENT_CUSTOMER_ID);
63-
$this->assertEquals(1, $customerId);
64-
$errorMessage = $this->registry->registry('composite_configure_result_error_message');
65-
$this->assertNull($errorMessage);
79+
/** @var Product $preparedProduct */
80+
$preparedProduct = $this->registry->registry('product');
81+
$preparedCurrentProduct = $this->registry->registry('current_product');
82+
$this->assertTrue($preparedProduct && $preparedCurrentProduct);
83+
$this->assertEquals(1, $this->registry->registry(RegistryConstants::CURRENT_CUSTOMER_ID));
84+
$this->assertNotNull($preparedProduct->getPreconfiguredValues());
85+
$this->assertContains(
86+
'CATALOG_PRODUCT_COMPOSITE_CONFIGURE',
87+
$resultLayout->getLayout()->getUpdate()->getHandles()
88+
);
89+
$this->assertContains(
90+
'catalog_product_view_type_' . $product->getTypeId(),
91+
$resultLayout->getLayout()->getUpdate()->getHandles()
92+
);
6693
}
6794

68-
public function testRenderConfigureResultNotOK()
95+
/**
96+
* @dataProvider renderConfigureResultExceptionProvider
97+
* @param array $data
98+
* @param string $expectedErrorMessage
99+
* @return void
100+
*/
101+
public function testRenderConfigureResultException(array $data, string $expectedErrorMessage): void
69102
{
70-
$configureResult = new \Magento\Framework\DataObject();
71-
$configureResult->setError(true)
72-
->setMessage('Test Message');
103+
/** @var DataObject $configureResult */
104+
$configureResult = $this->objectManager->create(DataObject::class);
105+
$configureResult->setData($data);
73106

74-
$this->helper->renderConfigureResult($configureResult);
107+
$resultLayout = $this->helper->renderConfigureResult($configureResult);
108+
109+
$this->assertEquals(
110+
$expectedErrorMessage,
111+
$this->registry->registry('composite_configure_result_error_message')
112+
);
113+
$this->assertContains(
114+
'CATALOG_PRODUCT_COMPOSITE_CONFIGURE_ERROR',
115+
$resultLayout->getLayout()->getUpdate()->getHandles()
116+
);
117+
}
75118

76-
$customerId = $this->registry->registry(RegistryConstants::CURRENT_CUSTOMER_ID);
77-
$this->assertNull($customerId);
78-
$errorMessage = $this->registry->registry('composite_configure_result_error_message');
79-
$this->assertEquals('Test Message', $errorMessage);
119+
/**
120+
* Create render configure result exception provider
121+
*
122+
* @return array
123+
*/
124+
public function renderConfigureResultExceptionProvider(): array
125+
{
126+
return [
127+
'error_true' => [
128+
'data' => [
129+
'error' => true,
130+
'message' => 'Test Message'
131+
],
132+
'expected_error_message' => 'Test Message',
133+
],
134+
'without_product' => [
135+
'data' => [
136+
'ok' => true,
137+
],
138+
'expected_error_message' => 'The product that was requested doesn\'t exist.'
139+
. ' Verify the product and try again.',
140+
],
141+
];
80142
}
81143
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
use Magento\Catalog\Api\Data\ProductCustomOptionInterface;
9+
use Magento\Catalog\Api\ProductRepositoryInterface;
10+
use Magento\Catalog\Model\Product\Option;
11+
use Magento\Catalog\Model\Product\Option\Type\File\ValidatorFile;
12+
use Magento\Catalog\Model\Product\Option\Value;
13+
use Magento\Checkout\_files\ValidatorFileMock;
14+
use Magento\Customer\Api\CustomerRepositoryInterface;
15+
use Magento\Framework\DataObject;
16+
use Magento\Quote\Api\CartRepositoryInterface;
17+
use Magento\Quote\Model\Quote;
18+
use Magento\Quote\Model\QuoteFactory;
19+
use Magento\Store\Model\StoreManagerInterface;
20+
use Magento\TestFramework\Helper\Bootstrap;
21+
use Magento\TestFramework\ObjectManager;
22+
use Magento\TestFramework\Workaround\Override\Fixture\Resolver;
23+
24+
Resolver::getInstance()->requireDataFixture('Magento/Catalog/_files/product_with_options.php');
25+
Resolver::getInstance()->requireDataFixture('Magento/Customer/_files/customer_with_uk_address.php');
26+
27+
/** @var ObjectManager $objectManager */
28+
$objectManager = Bootstrap::getObjectManager();
29+
/** @var StoreManagerInterface $storeManager */
30+
$storeManager = $objectManager->get(StoreManagerInterface::class);
31+
/** @var ProductRepositoryInterface $productRepository */
32+
$productRepository = $objectManager->get(ProductRepositoryInterface::class);
33+
$productRepository->cleanCache();
34+
/** @var CustomerRepositoryInterface $customerRepository */
35+
$customerRepository = $objectManager->get(CustomerRepositoryInterface::class);
36+
/** @var Quote $quote */
37+
$quote = $objectManager->get(QuoteFactory::class)->create();
38+
/** @var CartRepositoryInterface $quoteRepository */
39+
$quoteRepository = $objectManager->get(CartRepositoryInterface::class);
40+
41+
$customer = $customerRepository->get('customer_uk_address@test.com');
42+
$product = $productRepository->get('simple');
43+
$options = [];
44+
$dropDownValues = [];
45+
$iDate = 1;
46+
/** @var Option $option */
47+
foreach ($product->getOptions() as $option) {
48+
switch ($option->getGroupByType()) {
49+
case ProductCustomOptionInterface::OPTION_GROUP_SELECT:
50+
if ($option->getType() == ProductCustomOptionInterface::OPTION_TYPE_DROP_DOWN) {
51+
$dropDownValues = $option->getValues();
52+
$value = null;
53+
} elseif ($option->getType() == ProductCustomOptionInterface::OPTION_TYPE_CHECKBOX) {
54+
$value = array_keys($option->getValues());
55+
} else {
56+
$value = (string)key($option->getValues());
57+
}
58+
break;
59+
case ProductCustomOptionInterface::OPTION_GROUP_DATE:
60+
$value = [
61+
'year' => 2013 + $iDate,
62+
'month' => 1 + $iDate,
63+
'day' => 1 + $iDate,
64+
'hour' => 10 + $iDate,
65+
'minute' => 30 + $iDate,
66+
];
67+
$iDate++;
68+
break;
69+
case ProductCustomOptionInterface::OPTION_GROUP_FILE:
70+
$value = 'test.jpg';
71+
break;
72+
default:
73+
$value = 'test';
74+
break;
75+
}
76+
$options[$option->getId()] = $value;
77+
}
78+
79+
$itemsOptions = [];
80+
/** @var Value $dropDownValue */
81+
foreach ($dropDownValues as $dropDownId => $dropDownValue) {
82+
$options[$dropDownValue->getOption()->getId()] = $dropDownId;
83+
$itemsOptions[$dropDownValue->getTitle()] = $options;
84+
}
85+
86+
$validatorFileMock = (new ValidatorFileMock())->getInstance();
87+
$objectManager->addSharedInstance($validatorFileMock, ValidatorFile::class);
88+
89+
$quote->setStoreId($storeManager->getStore()->getId())
90+
->assignCustomer($customer)
91+
->setReservedOrderId('customer_quote_product_custom_options');
92+
93+
/** @var DataObject $request */
94+
$requestInfo = $objectManager->create(DataObject::class);
95+
96+
foreach ($itemsOptions as $itemOptions) {
97+
$requestInfo->setData(['qty' => 1, 'options' => $itemOptions]);
98+
$product = clone $product;
99+
$quote->addProduct($product, $requestInfo);
100+
}
101+
102+
$quoteRepository->save($quote);
103+
$objectManager->removeSharedInstance(ValidatorFile::class);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
use Magento\Framework\ObjectManagerInterface;
9+
use Magento\Framework\Registry;
10+
use Magento\Quote\Api\CartRepositoryInterface;
11+
use Magento\TestFramework\Helper\Bootstrap;
12+
use Magento\TestFramework\Quote\Model\GetQuoteByReservedOrderId;
13+
use Magento\TestFramework\Workaround\Override\Fixture\Resolver;
14+
15+
/** @var ObjectManagerInterface $objectManager */
16+
$objectManager = Bootstrap::getObjectManager();
17+
/** @var Registry $registry */
18+
$registry = $objectManager->get(Registry::class);
19+
20+
$registry->unregister('isSecureArea');
21+
$registry->register('isSecureArea', true);
22+
23+
$quote = $objectManager->get(GetQuoteByReservedOrderId::class)->execute('customer_quote_product_custom_options');
24+
if ($quote !== null) {
25+
/** @var CartRepositoryInterface $quoteRepository */
26+
$quoteRepository = $objectManager->get(CartRepositoryInterface::class);
27+
$quoteRepository->delete($quote);
28+
}
29+
30+
$registry->unregister('isSecureArea');
31+
$registry->register('isSecureArea', false);
32+
33+
Resolver::getInstance()->requireDataFixture('Magento/Customer/_files/customer_with_uk_address_rollback.php');
34+
Resolver::getInstance()->requireDataFixture('Magento/Catalog/_files/product_with_options_rollback.php');
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
use Magento\Catalog\Api\Data\ProductAttributeInterface;
9+
use Magento\Catalog\Api\ProductRepositoryInterface;
10+
use Magento\Catalog\Model\ResourceModel\Eav\Attribute as ProductAttribute;
11+
use Magento\Customer\Api\CustomerRepositoryInterface;
12+
use Magento\Eav\Model\Config;
13+
use Magento\Framework\DataObject;
14+
use Magento\Quote\Api\CartRepositoryInterface;
15+
use Magento\Quote\Model\Quote;
16+
use Magento\Quote\Model\QuoteFactory;
17+
use Magento\Store\Model\StoreManagerInterface;
18+
use Magento\TestFramework\Helper\Bootstrap;
19+
use Magento\TestFramework\ObjectManager;
20+
use Magento\TestFramework\Workaround\Override\Fixture\Resolver;
21+
22+
Resolver::getInstance()->requireDataFixture('Magento/ConfigurableProduct/_files/configurable_products.php');
23+
Resolver::getInstance()->requireDataFixture('Magento/Customer/_files/customer_with_uk_address.php');
24+
25+
/** @var ObjectManager $objectManager */
26+
$objectManager = Bootstrap::getObjectManager();
27+
/** @var StoreManagerInterface $storeManager */
28+
$storeManager = $objectManager->get(StoreManagerInterface::class);
29+
/** @var ProductRepositoryInterface $productRepository */
30+
$productRepository = $objectManager->get(ProductRepositoryInterface::class);
31+
$productRepository->cleanCache();
32+
/** @var CustomerRepositoryInterface $customerRepository */
33+
$customerRepository = $objectManager->get(CustomerRepositoryInterface::class);
34+
/** @var Quote $quote */
35+
$quote = $objectManager->get(QuoteFactory::class)->create();
36+
/** @var CartRepositoryInterface $quoteRepository */
37+
$quoteRepository = $objectManager->get(CartRepositoryInterface::class);
38+
/** @var Config $eavConfig */
39+
$eavConfig = $objectManager->get(Config::class);
40+
/** @var ProductAttribute $attribute */
41+
$attribute = $eavConfig->getAttribute(ProductAttributeInterface::ENTITY_TYPE_CODE, 'test_configurable');
42+
43+
$customer = $customerRepository->get('customer_uk_address@test.com');
44+
$quote->setStoreId($storeManager->getStore()->getId())
45+
->setIsActive(true)
46+
->setIsMultiShipping(false)
47+
->setReservedOrderId('customer_quote_configurable_products')
48+
->assignCustomer($customer);
49+
50+
$attributeOptions = $attribute->getOptions();
51+
unset($attributeOptions[0]);
52+
$productConfigurable = $productRepository->get('configurable');
53+
/** @var DataObject $request */
54+
$request = $objectManager->create(DataObject::class);
55+
56+
foreach ($attributeOptions as $attributeOption) {
57+
$productConfigurable = clone $productConfigurable;
58+
$request->setData(
59+
[
60+
'product_id' => $productConfigurable->getId(),
61+
'super_attribute' => [
62+
$attribute->getAttributeId() => $attributeOption->getValue()
63+
],
64+
'qty' => 1
65+
]
66+
);
67+
$quote->addProduct($productConfigurable, $request);
68+
}
69+
$quoteRepository->save($quote);

0 commit comments

Comments
 (0)