1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace Magento\Quote\Model;
use Magento\Catalog\Api\ProductRepositoryInterface;
use Magento\Catalog\Model\Product\Type;
use Magento\Framework\Api\SearchCriteriaBuilder;
use Magento\Quote\Api\CartManagementInterface;
use Magento\Quote\Api\CartRepositoryInterface;
use Magento\Sales\Api\OrderRepositoryInterface;
use Magento\TestFramework\Helper\Bootstrap;
use Magento\TestFramework\ObjectManager;
/**
* Class for testing QuoteManagement model
*/
class QuoteManagementTest extends \PHPUnit\Framework\TestCase
{
/**
* @var ObjectManager
*/
private $objectManager;
/**
* @var CartManagementInterface
*/
private $cartManagement;
/**
* @inheritdoc
*/
protected function setUp()
{
$this->objectManager = Bootstrap::getObjectManager();
$this->cartManagement = $this->objectManager->create(CartManagementInterface::class);
}
/**
* Creates order with product that has child items.
*
* @magentoAppIsolation enabled
* @magentoDataFixture Magento/Sales/_files/quote_with_bundle.php
*/
public function testSubmit()
{
$quote = $this->getQuote('test01');
$orderId = $this->cartManagement->placeOrder($quote->getId());
/** @var OrderRepositoryInterface $orderRepository */
$orderRepository = $this->objectManager->create(OrderRepositoryInterface::class);
$order = $orderRepository->get($orderId);
$orderItems = $order->getItems();
self::assertCount(3, $orderItems);
foreach ($orderItems as $orderItem) {
if ($orderItem->getProductType() == Type::TYPE_SIMPLE) {
self::assertNotEmpty($orderItem->getParentItem(), 'Parent is not set for child product');
self::assertNotEmpty($orderItem->getParentItemId(), 'Parent is not set for child product');
}
}
}
/**
* Tries to create order with product that has child items and one of them was deleted.
*
* @magentoAppArea adminhtml
* @magentoAppIsolation enabled
* @magentoDataFixture Magento/Sales/_files/quote_with_bundle.php
* @expectedException \Magento\Framework\Exception\LocalizedException
* @expectedExceptionMessage Some of the products below do not have all the required options.
*/
public function testSubmitWithDeletedItem()
{
/** @var ProductRepositoryInterface $productRepository */
$productRepository = $this->objectManager->get(ProductRepositoryInterface::class);
$product = $productRepository->get('simple-2');
$productRepository->delete($product);
$quote = $this->getQuote('test01');
$this->cartManagement->placeOrder($quote->getId());
}
/**
* Tries to create order with item of stock during checkout.
*
* @magentoDataFixture Magento/Sales/_files/quote.php
* @expectedException \Magento\Framework\Exception\LocalizedException
* @expectedExceptionMessage Some of the products are out of stock.
* @magentoDbIsolation enabled
*/
public function testSubmitWithItemOutOfStock()
{
$this->makeProductOutOfStock('simple');
$quote = $this->getQuote('test01');
$this->cartManagement->placeOrder($quote->getId());
}
/**
* Gets quote by reserved order ID.
*
* @param string $reservedOrderId
* @return Quote
*/
private function getQuote(string $reservedOrderId): Quote
{
/** @var SearchCriteriaBuilder $searchCriteriaBuilder */
$searchCriteriaBuilder = $this->objectManager->get(SearchCriteriaBuilder::class);
$searchCriteria = $searchCriteriaBuilder->addFilter('reserved_order_id', $reservedOrderId)
->create();
/** @var CartRepositoryInterface $quoteRepository */
$quoteRepository = $this->objectManager->get(CartRepositoryInterface::class);
$items = $quoteRepository->getList($searchCriteria)
->getItems();
return array_pop($items);
}
/**
* Makes provided product as out of stock.
*
* @param string $sku
* @return void
*/
private function makeProductOutOfStock(string $sku)
{
/** @var ProductRepositoryInterface $productRepository */
$productRepository = $this->objectManager->get(ProductRepositoryInterface::class);
$product = $productRepository->get($sku);
$extensionAttributes = $product->getExtensionAttributes();
$stockItem = $extensionAttributes->getStockItem();
$stockItem->setIsInStock(false);
$productRepository->save($product);
}
}