GridAsyncInsertTest.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Sales\Model;
  7. use Magento\Framework\Api\SearchCriteria;
  8. use Magento\Framework\Api\SearchCriteriaBuilder;
  9. use Magento\Framework\App\ResourceConnection;
  10. use Magento\Framework\DB\Adapter\AdapterInterface;
  11. use Magento\Sales\Api\Data\OrderInterface;
  12. use Magento\Sales\Api\OrderRepositoryInterface;
  13. use Magento\Sales\Model\ResourceModel\Grid as AbstractGrid;
  14. use Magento\Sales\Model\ResourceModel\Order\Grid;
  15. use Magento\TestFramework\Helper\Bootstrap;
  16. use Magento\TestFramework\ObjectManager;
  17. /**
  18. * Class for testing asynchronous inserts into grid.
  19. */
  20. class GridAsyncInsertTest extends \PHPUnit\Framework\TestCase
  21. {
  22. /**
  23. * @var ObjectManager
  24. */
  25. private $objectManager;
  26. /**
  27. * @var GridAsyncInsert
  28. */
  29. private $gridAsyncInsert;
  30. /**
  31. * @var AdapterInterface
  32. */
  33. private $connection;
  34. /**
  35. * @var OrderRepositoryInterface
  36. */
  37. private $orderRepository;
  38. /**
  39. * @var AbstractGrid
  40. */
  41. private $grid;
  42. protected function setUp()
  43. {
  44. $this->objectManager = Bootstrap::getObjectManager();
  45. /** @var ResourceConnection $resourceConnection */
  46. $resourceConnection = $this->objectManager->get(ResourceConnection::class);
  47. $this->connection = $resourceConnection->getConnection('sales');
  48. $this->orderRepository = $this->objectManager->get(OrderRepositoryInterface::class);
  49. $this->grid = $this->objectManager->get(Grid::class);
  50. $this->gridAsyncInsert = $this->objectManager->create(
  51. GridAsyncInsert::class,
  52. [
  53. 'entityGrid' => $this->grid,
  54. ]
  55. );
  56. }
  57. /**
  58. * Checks a case when order's grid should be updated asynchronously.
  59. *
  60. * @magentoConfigFixture default/dev/grid/async_indexing 1
  61. * @magentoDataFixture Magento/Sales/_files/order.php
  62. * @return void
  63. */
  64. public function testExecuteAsyncUpdateOrderGrid()
  65. {
  66. $order = $this->getOrder('100000001');
  67. $this->performUpdateAssertions($order);
  68. // to un-sync main table and grid table need to wait at least one second
  69. sleep(1);
  70. $order->setStatus('complete');
  71. $this->orderRepository->save($order);
  72. $gridRow = $this->getGridRow($order->getEntityId());
  73. self::assertNotEquals($order->getStatus(), $gridRow['status']);
  74. $this->gridAsyncInsert->asyncInsert();
  75. $this->performUpdateAssertions($order);
  76. }
  77. /**
  78. * Loads order entity by provided order increment ID.
  79. *
  80. * @param string $incrementId
  81. * @return OrderInterface
  82. */
  83. private function getOrder(string $incrementId) : OrderInterface
  84. {
  85. /** @var SearchCriteria $searchCriteria */
  86. $searchCriteria = $this->objectManager->get(SearchCriteriaBuilder::class)
  87. ->addFilter('increment_id', $incrementId)
  88. ->create();
  89. $items = $this->orderRepository->getList($searchCriteria)
  90. ->getItems();
  91. return array_pop($items);
  92. }
  93. /**
  94. * Gets row from `sales_order_grid` table by order's ID.
  95. *
  96. * @param int $entityId
  97. * @return array
  98. */
  99. private function getGridRow(int $entityId) : array
  100. {
  101. $tableName = $this->grid->getGridTable();
  102. $select = $this->connection->select()
  103. ->from($tableName)
  104. ->where($tableName . '.entity_id = ?', $entityId);
  105. return $this->connection->fetchRow($select);
  106. }
  107. /**
  108. * Perform assertions for updating grid test.
  109. *
  110. * @param OrderInterface $order
  111. * @return void
  112. */
  113. private function performUpdateAssertions(OrderInterface $order)
  114. {
  115. $gridRow = $this->getGridRow($order->getEntityId());
  116. self::assertEquals($order->getStatus(), $gridRow['status']);
  117. self::assertEquals($order->getUpdatedAt(), $gridRow['updated_at']);
  118. }
  119. }