ObserverTest.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\MysqlMq\Model;
  7. class ObserverTest extends \PHPUnit\Framework\TestCase
  8. {
  9. /**
  10. * @var \Magento\Framework\ObjectManagerInterface
  11. */
  12. protected $objectManager;
  13. /**
  14. * @var \Magento\MysqlMq\Model\Observer
  15. */
  16. private $observer;
  17. /**
  18. * @var \Magento\MysqlMq\Model\QueueManagement
  19. */
  20. private $queueManagement;
  21. protected function setUp()
  22. {
  23. $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
  24. $this->observer = $this->objectManager->get(\Magento\MysqlMq\Model\Observer::class);
  25. $this->queueManagement = $this->objectManager->get(\Magento\MysqlMq\Model\QueueManagement::class);
  26. }
  27. /**
  28. * @magentoDataFixture Magento/MysqlMq/_files/queues.php
  29. * @magentoDataFixture Magento/MysqlMq/_files/messages.php
  30. * @magentoDataFixture Magento/MysqlMq/_files/messages_done_old.php
  31. */
  32. public function testCleanUpOld()
  33. {
  34. /** @var \Magento\MysqlMq\Model\ResourceModel\MessageStatusCollectionFactory $messageStatusCollectionFactory */
  35. $messageStatusCollectionFactory = $this->objectManager
  36. ->create(\Magento\MysqlMq\Model\ResourceModel\MessageStatusCollectionFactory::class);
  37. /** @var \Magento\MysqlMq\Model\ResourceModel\MessageCollectionFactory $messageStatusCollectionFactory */
  38. $messageCollectionFactory = $this->objectManager
  39. ->create(\Magento\MysqlMq\Model\ResourceModel\MessageCollectionFactory::class);
  40. //Check how many messages in collection by the beginning of tests
  41. $messageCollection = $messageCollectionFactory->create()
  42. ->addFieldToFilter('topic_name', 'topic.updated.use.just.in.tests');
  43. $this->assertEquals(1, $messageCollection->getSize());
  44. $messageId = $messageCollection->getFirstItem()->getId();
  45. $messageStatusCollection = $messageStatusCollectionFactory->create()
  46. ->addFieldToFilter('message_id', $messageId);
  47. $this->assertEquals(3, $messageStatusCollection->getSize());
  48. //Run clean up once. It should move 3 out of 4 statuses to TO BE DELETED status
  49. $this->observer->cleanupMessages();
  50. $messageCollection = $messageCollectionFactory->create()
  51. ->addFieldToFilter('topic_name', 'topic.updated.use.just.in.tests');
  52. $this->assertEquals(0, $messageCollection->getSize());
  53. $messageStatusCollection = $messageStatusCollectionFactory->create()
  54. ->addFieldToFilter('message_id', $messageId);
  55. $this->assertEquals(0, $messageStatusCollection->getSize());
  56. }
  57. /**
  58. * @magentoDataFixture Magento/MysqlMq/_files/queues.php
  59. * @magentoDataFixture Magento/MysqlMq/_files/messages.php
  60. * @magentoDataFixture Magento/MysqlMq/_files/messages_done_old.php
  61. * @magentoDataFixture Magento/MysqlMq/_files/messages_done_recent.php
  62. */
  63. public function testCleanupMessages()
  64. {
  65. /** @var \Magento\MysqlMq\Model\ResourceModel\MessageStatusCollectionFactory $messageStatusCollectionFactory */
  66. $messageStatusCollectionFactory = $this->objectManager
  67. ->create(\Magento\MysqlMq\Model\ResourceModel\MessageStatusCollectionFactory::class);
  68. /** @var \Magento\MysqlMq\Model\ResourceModel\MessageCollectionFactory $messageStatusCollectionFactory */
  69. $messageCollectionFactory = $this->objectManager
  70. ->create(\Magento\MysqlMq\Model\ResourceModel\MessageCollectionFactory::class);
  71. //Check how many messages in collection by the beginning of tests
  72. $messageCollection = $messageCollectionFactory->create()
  73. ->addFieldToFilter('topic_name', 'topic.updated.use.just.in.tests');
  74. $this->assertEquals(1, $messageCollection->getSize());
  75. $messageId = $messageCollection->getFirstItem()->getId();
  76. $messageStatusCollection = $messageStatusCollectionFactory->create()
  77. ->addFieldToFilter('message_id', $messageId);
  78. $this->assertEquals(4, $messageStatusCollection->getSize());
  79. //Run clean up once. It should move 3 out of 4 statuses to TO BE DELETED status
  80. $this->observer->cleanupMessages();
  81. $messageCollection = $messageCollectionFactory->create()
  82. ->addFieldToFilter('topic_name', 'topic.updated.use.just.in.tests');
  83. $this->assertEquals(1, $messageCollection->getSize());
  84. $messageStatusCollection = $messageStatusCollectionFactory->create()
  85. ->addFieldToFilter('message_id', $messageId)
  86. ->addFieldToFilter('status', \Magento\MysqlMq\Model\QueueManagement::MESSAGE_STATUS_TO_BE_DELETED);
  87. $this->assertEquals(3, $messageStatusCollection->getSize());
  88. // Change the Updated At in order to make job visible
  89. $lastMessageStatus = $messageStatusCollectionFactory->create()
  90. ->addFieldToFilter('message_id', $messageId)
  91. ->addFieldToFilter('status', \Magento\MysqlMq\Model\QueueManagement::MESSAGE_STATUS_COMPLETE)
  92. ->getFirstItem();
  93. $lastMessageStatus->setUpdatedAt(time() - 1 - 24 * 7 * 60 * 60)
  94. ->save();
  95. $this->observer->cleanupMessages();
  96. $messageCollection = $messageCollectionFactory->create()
  97. ->addFieldToFilter('topic_name', 'topic.updated.use.just.in.tests');
  98. $this->assertEquals(0, $messageCollection->getSize());
  99. $messageStatusCollection = $messageStatusCollectionFactory->create()
  100. ->addFieldToFilter('message_id', $messageId);
  101. $this->assertEquals(0, $messageStatusCollection->getSize());
  102. }
  103. /**
  104. * @magentoDataFixture Magento/MysqlMq/_files/queues.php
  105. * @magentoDataFixture Magento/MysqlMq/_files/messages.php
  106. * @magentoDataFixture Magento/MysqlMq/_files/messages_in_progress.php
  107. */
  108. public function testCleanupInProgressMessages()
  109. {
  110. /** @var \Magento\MysqlMq\Model\ResourceModel\MessageStatusCollectionFactory $messageStatusCollectionFactory */
  111. $messageStatusCollectionFactory = $this->objectManager
  112. ->create(\Magento\MysqlMq\Model\ResourceModel\MessageStatusCollectionFactory::class);
  113. /** @var \Magento\MysqlMq\Model\ResourceModel\MessageCollectionFactory $messageStatusCollectionFactory */
  114. $messageCollectionFactory = $this->objectManager
  115. ->create(\Magento\MysqlMq\Model\ResourceModel\MessageCollectionFactory::class);
  116. //Check how many messages in collection by the beginning of tests
  117. $messageCollection = $messageCollectionFactory->create()
  118. ->addFieldToFilter('topic_name', 'topic_second.updated.use.just.in.tests');
  119. $this->assertEquals(1, $messageCollection->getSize());
  120. $messageId = $messageCollection->getFirstItem()->getId();
  121. $messageStatusCollection = $messageStatusCollectionFactory->create()
  122. ->addFieldToFilter('message_id', $messageId);
  123. $this->assertEquals(2, $messageStatusCollection->getSize());
  124. $this->observer->cleanupMessages();
  125. $messageCollection = $messageCollectionFactory->create()
  126. ->addFieldToFilter('topic_name', 'topic_second.updated.use.just.in.tests');
  127. $this->assertEquals(1, $messageCollection->getSize());
  128. $messageStatusCollection = $messageStatusCollectionFactory->create()
  129. ->addFieldToFilter('message_id', $messageId)
  130. ->addFieldToFilter('status', \Magento\MysqlMq\Model\QueueManagement::MESSAGE_STATUS_RETRY_REQUIRED);
  131. $this->assertEquals(1, $messageStatusCollection->getSize());
  132. $this->assertEquals(1, $messageStatusCollection->getFirstItem()->getNumberOfTrials());
  133. }
  134. }