Skip to content

Commit 76f3ed4

Browse files
committed
Clean expired quotes - Fix out of memory on huge quotes list
1 parent 4cd55f5 commit 76f3ed4

File tree

3 files changed

+98
-0
lines changed

3 files changed

+98
-0
lines changed

dev/tests/integration/testsuite/Magento/Sales/Cron/CleanExpiredQuotesTest.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
use Magento\Framework\Api\SearchCriteriaBuilder;
1111
use Magento\Quote\Model\QuoteRepository;
12+
use Magento\Quote\Model\ResourceModel\Quote\CollectionFactory as QuoteCollectionFactory;
1213
use Magento\TestFramework\Helper\Bootstrap;
1314

1415
/**
@@ -34,6 +35,11 @@ class CleanExpiredQuotesTest extends \PHPUnit\Framework\TestCase
3435
*/
3536
private $searchCriteriaBuilder;
3637

38+
/**
39+
* @var QuoteCollectionFactory
40+
*/
41+
private $quoteCollectionFactory;
42+
3743
/**
3844
* @inheritdoc
3945
*/
@@ -43,6 +49,7 @@ protected function setUp()
4349
$this->cleanExpiredQuotes = $objectManager->get(CleanExpiredQuotes::class);
4450
$this->quoteRepository = $objectManager->get(QuoteRepository::class);
4551
$this->searchCriteriaBuilder = $objectManager->get(SearchCriteriaBuilder::class);
52+
$this->quoteCollectionFactory = $objectManager->get(QuoteCollectionFactory::class);
4653
}
4754

4855
/**
@@ -66,4 +73,24 @@ public function testExecute()
6673
$totalCount
6774
);
6875
}
76+
77+
/**
78+
* Check if outdated quotes are deleted.
79+
*
80+
* @magentoConfigFixture default_store checkout/cart/delete_quote_after -365
81+
* @magentoDataFixture Magento/Sales/_files/quotes_big_amount.php
82+
*/
83+
public function testExecuteWithBigAmountOfQuotes()
84+
{
85+
//Initial count - should be equal to 1000
86+
//Use collection getSize in order to get quick result
87+
$this->assertEquals(1000, $this->quoteCollectionFactory->create()->getSize());
88+
89+
//Deleting expired quotes
90+
$this->cleanExpiredQuotes->execute();
91+
$totalCount = $this->quoteCollectionFactory->create()->getSize();
92+
93+
//There should be no quotes anymore
94+
$this->assertEquals(0, $totalCount);
95+
}
6996
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
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\App\Config;
9+
use Magento\Quote\Model\Quote;
10+
use Magento\Quote\Model\QuoteFactory;
11+
use Magento\Quote\Model\QuoteRepository;
12+
use Magento\Store\Model\Store;
13+
use Magento\Store\Model\StoreRepository;
14+
use Magento\TestFramework\Helper\Bootstrap;
15+
use Magento\TestFramework\ObjectManager;
16+
17+
/** @var $objectManager ObjectManager */
18+
$objectManager = Bootstrap::getObjectManager();
19+
/** @var QuoteFactory $quoteFactory */
20+
$quoteFactory = $objectManager->get(QuoteFactory::class);
21+
/** @var QuoteRepository $quoteRepository */
22+
$quoteRepository = $objectManager->get(QuoteRepository::class);
23+
/** @var StoreRepository $storeRepository */
24+
$storeRepository = $objectManager->get(StoreRepository::class);
25+
/** @var Config $appConfig */
26+
$appConfig = $objectManager->get(Config::class);
27+
$appConfig->clean();
28+
29+
/** @var Store $defaultStore */
30+
$defaultStore = $storeRepository->getActiveStoreByCode('default');
31+
32+
for ($i = 0; $i < 1000; $i++) {
33+
/** @var Quote $quote */
34+
$quote = $quoteFactory->create();
35+
$quote->setStoreId($defaultStore->getId());
36+
$quoteRepository->save($quote);
37+
}
Lines changed: 34 additions & 0 deletions
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\Api\SearchCriteriaBuilder;
9+
use Magento\Framework\Registry;
10+
use Magento\Quote\Model\QuoteRepository;
11+
use Magento\TestFramework\Helper\Bootstrap;
12+
use Magento\TestFramework\ObjectManager;
13+
14+
/** @var ObjectManager $objectManager */
15+
$objectManager = Bootstrap::getObjectManager();
16+
17+
/** @var Registry $registry */
18+
$registry = $objectManager->get(Registry::class);
19+
$registry->unregister('isSecureArea');
20+
$registry->register('isSecureArea', true);
21+
22+
/** @var QuoteRepository $quoteRepository */
23+
$quoteRepository = $objectManager->get(QuoteRepository::class);
24+
/** @var SearchCriteriaBuilder $searchCriteriaBuilder */
25+
$searchCriteriaBuilder = $objectManager->get(SearchCriteriaBuilder::class);
26+
$searchCriteria = $searchCriteriaBuilder->create();
27+
$items = $quoteRepository->getList($searchCriteria)
28+
->getItems();
29+
foreach ($items as $item) {
30+
$quoteRepository->delete($item);
31+
}
32+
33+
$registry->unregister('isSecureArea');
34+
$registry->register('isSecureArea', false);

0 commit comments

Comments
 (0)