Skip to content
This repository was archived by the owner on Apr 29, 2019. It is now read-only.

Commit f76d80e

Browse files
committed
Merge remote-tracking branch 'origin/MAGETWO-83138' into 2.3-develop-pr5
2 parents d0ffac5 + 8b94c36 commit f76d80e

File tree

5 files changed

+229
-51
lines changed

5 files changed

+229
-51
lines changed
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\Sales\Model\ResourceModel\Provider;
7+
8+
use Magento\Framework\App\ResourceConnection;
9+
use Magento\Framework\DB\Adapter\AdapterInterface;
10+
11+
/**
12+
* Retrieves ID's of not synced by `updated_at` column entities.
13+
* The result should contain list of entities ID's from the main table which have `updated_at` column greater
14+
* than in the grid table.
15+
*/
16+
class UpdatedAtListProvider implements NotSyncedDataProviderInterface
17+
{
18+
/**
19+
* @var ResourceConnection
20+
*/
21+
private $resourceConnection;
22+
23+
/**
24+
* @var AdapterInterface
25+
*/
26+
private $connection;
27+
28+
/**
29+
* @param ResourceConnection $resourceConnection
30+
*/
31+
public function __construct(ResourceConnection $resourceConnection)
32+
{
33+
$this->connection = $resourceConnection->getConnection('sales');
34+
$this->resourceConnection = $resourceConnection;
35+
}
36+
37+
/**
38+
* @inheritdoc
39+
*/
40+
public function getIds($mainTableName, $gridTableName)
41+
{
42+
$mainTableName = $this->resourceConnection->getTableName($mainTableName);
43+
$gridTableName = $this->resourceConnection->getTableName($gridTableName);
44+
$select = $this->connection->select()
45+
->from($mainTableName, [$mainTableName . '.entity_id'])
46+
->joinInner(
47+
[$gridTableName => $gridTableName],
48+
sprintf(
49+
'%s.entity_id = %s.entity_id AND %s.updated_at > %s.updated_at',
50+
$mainTableName,
51+
$gridTableName,
52+
$mainTableName,
53+
$gridTableName
54+
),
55+
[]
56+
);
57+
58+
return $this->connection->fetchAll($select, [], \Zend_Db::FETCH_COLUMN);
59+
}
60+
}

app/code/Magento/Sales/Model/ResourceModel/Provider/UpdatedIdListProvider.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,12 @@ public function __construct(
3838
*/
3939
public function getIds($mainTableName, $gridTableName)
4040
{
41+
$mainTableName = $this->resourceConnection->getTableName($mainTableName);
42+
$gridTableName = $this->resourceConnection->getTableName($gridTableName);
4143
$select = $this->getConnection()->select()
42-
->from($this->getConnection()->getTableName($mainTableName), [$mainTableName . '.entity_id'])
44+
->from($mainTableName, [$mainTableName . '.entity_id'])
4345
->joinLeft(
44-
[$gridTableName => $this->getConnection()->getTableName($gridTableName)],
46+
[$gridTableName => $gridTableName],
4547
sprintf(
4648
'%s.%s = %s.%s',
4749
$mainTableName,

app/code/Magento/Sales/Test/Unit/Model/ResourceModel/Provider/NotSyncedDataProviderTest.php

Lines changed: 17 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,13 @@
55
*/
66
namespace Magento\Sales\Test\Unit\Model\ResourceModel\Provider;
77

8-
use Magento\Framework\ObjectManager\TMap;
98
use Magento\Framework\ObjectManager\TMapFactory;
109
use Magento\Sales\Model\ResourceModel\Provider\NotSyncedDataProvider;
1110
use Magento\Sales\Model\ResourceModel\Provider\NotSyncedDataProviderInterface;
1211
use PHPUnit_Framework_MockObject_MockObject as MockObject;
1312

1413
/**
15-
* Class NotSyncedDataProviderTest
14+
* Class for testing not synchronized DataProvider.
1615
*/
1716
class NotSyncedDataProviderTest extends \PHPUnit\Framework\TestCase
1817
{
@@ -23,77 +22,46 @@ public function testGetIdsEmpty()
2322
->disableOriginalConstructor()
2423
->setMethods(['create'])
2524
->getMock();
26-
$tMap = $this->getMockBuilder(TMap::class)
27-
->disableOriginalConstructor()
28-
->getMock();
2925

30-
$tMapFactory->expects(static::once())
31-
->method('create')
32-
->with(
33-
[
34-
'array' => [],
35-
'type' => NotSyncedDataProviderInterface::class
36-
]
37-
)
38-
->willReturn($tMap);
39-
$tMap->expects(static::once())
40-
->method('getIterator')
41-
->willReturn(new \ArrayIterator([]));
26+
$tMapFactory->method('create')
27+
->willReturn([]);
4228

43-
$provider = new NotSyncedDataProvider($tMapFactory, []);
44-
static::assertEquals([], $provider->getIds('main_table', 'grid_table'));
29+
$provider = new NotSyncedDataProvider($tMapFactory);
30+
self::assertEquals([], $provider->getIds('main_table', 'grid_table'));
4531
}
4632

47-
/**
48-
* @covers \Magento\Sales\Model\ResourceModel\Provider\NotSyncedDataProvider::getIds
49-
*/
5033
public function testGetIds()
5134
{
5235
/** @var TMapFactory|MockObject $tMapFactory */
5336
$tMapFactory = $this->getMockBuilder(TMapFactory::class)
5437
->disableOriginalConstructor()
5538
->setMethods(['create'])
5639
->getMock();
57-
$tMap = $this->getMockBuilder(TMap::class)
58-
->disableOriginalConstructor()
59-
->getMock();
6040

6141
$provider1 = $this->getMockBuilder(NotSyncedDataProviderInterface::class)
6242
->getMockForAbstractClass();
63-
$provider1->expects(static::once())
64-
->method('getIds')
43+
$provider1->method('getIds')
6544
->willReturn([1, 2]);
6645

6746
$provider2 = $this->getMockBuilder(NotSyncedDataProviderInterface::class)
6847
->getMockForAbstractClass();
69-
$provider2->expects(static::once())
70-
->method('getIds')
48+
$provider2->method('getIds')
7149
->willReturn([2, 3, 4]);
7250

73-
$tMapFactory->expects(static::once())
74-
->method('create')
75-
->with(
51+
$tMapFactory->method('create')
52+
->with(self::equalTo(
7653
[
77-
'array' => [
78-
'provider1' => NotSyncedDataProviderInterface::class,
79-
'provider2' => NotSyncedDataProviderInterface::class
80-
],
54+
'array' => [$provider1, $provider2],
8155
'type' => NotSyncedDataProviderInterface::class
8256
]
83-
)
84-
->willReturn($tMap);
85-
$tMap->expects(static::once())
86-
->method('getIterator')
87-
->willReturn(new \ArrayIterator([$provider1, $provider2]));
57+
))
58+
->willReturn([$provider1, $provider2]);
8859

89-
$provider = new NotSyncedDataProvider(
90-
$tMapFactory,
91-
[
92-
'provider1' => NotSyncedDataProviderInterface::class,
93-
'provider2' => NotSyncedDataProviderInterface::class,
94-
]
95-
);
60+
$provider = new NotSyncedDataProvider($tMapFactory, [$provider1, $provider2]);
9661

97-
static::assertEquals([1, 2, 3, 4], array_values($provider->getIds('main_table', 'grid_table')));
62+
self::assertEquals(
63+
[1, 2, 3, 4],
64+
array_values($provider->getIds('main_table', 'grid_table'))
65+
);
9866
}
9967
}

app/code/Magento/Sales/etc/di.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,14 @@
470470
<argument name="entityRelationComposite" xsi:type="object">CreditmemoRelationsComposite</argument>
471471
</arguments>
472472
</type>
473+
<virtualType name="Magento\Sales\Model\ResourceModel\Provider\NotSyncedOrderDataProvider" type="Magento\Sales\Model\ResourceModel\Provider\NotSyncedDataProvider">
474+
<arguments>
475+
<argument name="providers" xsi:type="array">
476+
<item name="default" xsi:type="string">Magento\Sales\Model\ResourceModel\Provider\UpdatedIdListProvider</item>
477+
<item name="updated_at" xsi:type="string">Magento\Sales\Model\ResourceModel\Provider\UpdatedAtListProvider</item>
478+
</argument>
479+
</arguments>
480+
</virtualType>
473481
<virtualType name="Magento\Sales\Model\ResourceModel\Order\Grid" type="Magento\Sales\Model\ResourceModel\Grid">
474482
<arguments>
475483
<argument name="mainTableName" xsi:type="string">sales_order</argument>
@@ -520,6 +528,7 @@
520528
<item name="payment_method" xsi:type="string">sales_order_payment.method</item>
521529
<item name="total_refunded" xsi:type="string">sales_order.total_refunded</item>
522530
</argument>
531+
<argument name="notSyncedDataProvider" xsi:type="object">Magento\Sales\Model\ResourceModel\Provider\NotSyncedOrderDataProvider</argument>
523532
</arguments>
524533
</virtualType>
525534
<virtualType name="ShipmentGridAggregator" type="Magento\Sales\Model\ResourceModel\Grid">
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\Sales\Model;
7+
8+
use Magento\Framework\Api\SearchCriteria;
9+
use Magento\Framework\Api\SearchCriteriaBuilder;
10+
use Magento\Framework\App\ResourceConnection;
11+
use Magento\Framework\DB\Adapter\AdapterInterface;
12+
use Magento\Sales\Api\Data\OrderInterface;
13+
use Magento\Sales\Api\OrderRepositoryInterface;
14+
use Magento\Sales\Model\ResourceModel\Grid as AbstractGrid;
15+
use Magento\Sales\Model\ResourceModel\Order\Grid;
16+
use Magento\TestFramework\Helper\Bootstrap;
17+
use Magento\TestFramework\ObjectManager;
18+
19+
/**
20+
* Class for testing asynchronous inserts into grid.
21+
*/
22+
class GridAsyncInsertTest extends \PHPUnit\Framework\TestCase
23+
{
24+
/**
25+
* @var ObjectManager
26+
*/
27+
private $objectManager;
28+
29+
/**
30+
* @var GridAsyncInsert
31+
*/
32+
private $gridAsyncInsert;
33+
34+
/**
35+
* @var AdapterInterface
36+
*/
37+
private $connection;
38+
39+
/**
40+
* @var OrderRepositoryInterface
41+
*/
42+
private $orderRepository;
43+
44+
/**
45+
* @var AbstractGrid
46+
*/
47+
private $grid;
48+
49+
protected function setUp()
50+
{
51+
$this->objectManager = Bootstrap::getObjectManager();
52+
53+
/** @var ResourceConnection $resourceConnection */
54+
$resourceConnection = $this->objectManager->get(ResourceConnection::class);
55+
$this->connection = $resourceConnection->getConnection('sales');
56+
$this->orderRepository = $this->objectManager->get(OrderRepositoryInterface::class);
57+
$this->grid = $this->objectManager->get(Grid::class);
58+
59+
$this->gridAsyncInsert = $this->objectManager->create(
60+
GridAsyncInsert::class,
61+
[
62+
'entityGrid' => $this->grid,
63+
]
64+
);
65+
}
66+
67+
/**
68+
* Checks a case when order's grid should be updated asynchronously.
69+
*
70+
* @magentoConfigFixture default/dev/grid/async_indexing 1
71+
* @magentoDataFixture Magento/Sales/_files/order.php
72+
* @return void
73+
*/
74+
public function testExecuteAsyncUpdateOrderGrid()
75+
{
76+
$order = $this->getOrder('100000001');
77+
$this->performUpdateAssertions($order);
78+
79+
// to un-sync main table and grid table need to wait at least one second
80+
sleep(1);
81+
$order->setStatus('complete');
82+
$this->orderRepository->save($order);
83+
84+
$gridRow = $this->getGridRow($order->getEntityId());
85+
self::assertNotEquals($order->getStatus(), $gridRow['status']);
86+
87+
$this->gridAsyncInsert->asyncInsert();
88+
$this->performUpdateAssertions($order);
89+
}
90+
91+
/**
92+
* Loads order entity by provided order increment ID.
93+
*
94+
* @param string $incrementId
95+
* @return OrderInterface
96+
*/
97+
private function getOrder(string $incrementId) : OrderInterface
98+
{
99+
/** @var SearchCriteria $searchCriteria */
100+
$searchCriteria = $this->objectManager->get(SearchCriteriaBuilder::class)
101+
->addFilter('increment_id', $incrementId)
102+
->create();
103+
104+
$items = $this->orderRepository->getList($searchCriteria)
105+
->getItems();
106+
107+
return array_pop($items);
108+
}
109+
110+
/**
111+
* Gets row from `sales_order_grid` table by order's ID.
112+
*
113+
* @param int $entityId
114+
* @return array
115+
*/
116+
private function getGridRow(int $entityId) : array
117+
{
118+
$tableName = $this->grid->getGridTable();
119+
$select = $this->connection->select()
120+
->from($tableName)
121+
->where($tableName . '.entity_id = ?', $entityId);
122+
123+
return $this->connection->fetchRow($select);
124+
}
125+
126+
/**
127+
* Perform assertions for updating grid test.
128+
*
129+
* @param OrderInterface $order
130+
* @return void
131+
*/
132+
private function performUpdateAssertions(OrderInterface $order)
133+
{
134+
$gridRow = $this->getGridRow($order->getEntityId());
135+
136+
self::assertEquals($order->getStatus(), $gridRow['status']);
137+
self::assertEquals($order->getUpdatedAt(), $gridRow['updated_at']);
138+
}
139+
}

0 commit comments

Comments
 (0)