162 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			162 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
<?php
 | 
						|
/**
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
namespace Magento\MysqlMq\Model;
 | 
						|
 | 
						|
class ObserverTest extends \PHPUnit\Framework\TestCase
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * @var \Magento\Framework\ObjectManagerInterface
 | 
						|
     */
 | 
						|
    protected $objectManager;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var \Magento\MysqlMq\Model\Observer
 | 
						|
     */
 | 
						|
    private $observer;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var \Magento\MysqlMq\Model\QueueManagement
 | 
						|
     */
 | 
						|
    private $queueManagement;
 | 
						|
 | 
						|
    protected function setUp(): void
 | 
						|
    {
 | 
						|
        $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
 | 
						|
        $this->observer = $this->objectManager->get(\Magento\MysqlMq\Model\Observer::class);
 | 
						|
        $this->queueManagement = $this->objectManager->get(\Magento\MysqlMq\Model\QueueManagement::class);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/MysqlMq/_files/queues.php
 | 
						|
     * @magentoDataFixture Magento/MysqlMq/_files/messages.php
 | 
						|
     * @magentoDataFixture Magento/MysqlMq/_files/messages_done_old.php
 | 
						|
     */
 | 
						|
    public function testCleanUpOld()
 | 
						|
    {
 | 
						|
        /** @var \Magento\MysqlMq\Model\ResourceModel\MessageStatusCollectionFactory $messageStatusCollectionFactory */
 | 
						|
        $messageStatusCollectionFactory = $this->objectManager
 | 
						|
            ->create(\Magento\MysqlMq\Model\ResourceModel\MessageStatusCollectionFactory::class);
 | 
						|
 | 
						|
        /** @var \Magento\MysqlMq\Model\ResourceModel\MessageCollectionFactory $messageStatusCollectionFactory */
 | 
						|
        $messageCollectionFactory = $this->objectManager
 | 
						|
            ->create(\Magento\MysqlMq\Model\ResourceModel\MessageCollectionFactory::class);
 | 
						|
 | 
						|
        //Check how many messages in collection by the beginning of tests
 | 
						|
        $messageCollection = $messageCollectionFactory->create()
 | 
						|
            ->addFieldToFilter('topic_name', 'topic.updated.use.just.in.tests');
 | 
						|
        $this->assertEquals(1, $messageCollection->getSize());
 | 
						|
        $messageId = $messageCollection->getFirstItem()->getId();
 | 
						|
 | 
						|
        $messageStatusCollection = $messageStatusCollectionFactory->create()
 | 
						|
            ->addFieldToFilter('message_id', $messageId);
 | 
						|
        $this->assertEquals(3, $messageStatusCollection->getSize());
 | 
						|
 | 
						|
        //Run clean up once. It should move 3 out of 4 statuses to TO BE DELETED status
 | 
						|
        $this->observer->cleanupMessages();
 | 
						|
 | 
						|
        $messageCollection = $messageCollectionFactory->create()
 | 
						|
            ->addFieldToFilter('topic_name', 'topic.updated.use.just.in.tests');
 | 
						|
        $this->assertEquals(0, $messageCollection->getSize());
 | 
						|
        $messageStatusCollection = $messageStatusCollectionFactory->create()
 | 
						|
            ->addFieldToFilter('message_id', $messageId);
 | 
						|
        $this->assertEquals(0, $messageStatusCollection->getSize());
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/MysqlMq/_files/queues.php
 | 
						|
     * @magentoDataFixture Magento/MysqlMq/_files/messages.php
 | 
						|
     * @magentoDataFixture Magento/MysqlMq/_files/messages_done_old.php
 | 
						|
     * @magentoDataFixture Magento/MysqlMq/_files/messages_done_recent.php
 | 
						|
     */
 | 
						|
    public function testCleanupMessages()
 | 
						|
    {
 | 
						|
        /** @var \Magento\MysqlMq\Model\ResourceModel\MessageStatusCollectionFactory $messageStatusCollectionFactory */
 | 
						|
        $messageStatusCollectionFactory = $this->objectManager
 | 
						|
            ->create(\Magento\MysqlMq\Model\ResourceModel\MessageStatusCollectionFactory::class);
 | 
						|
 | 
						|
        /** @var \Magento\MysqlMq\Model\ResourceModel\MessageCollectionFactory $messageStatusCollectionFactory */
 | 
						|
        $messageCollectionFactory = $this->objectManager
 | 
						|
            ->create(\Magento\MysqlMq\Model\ResourceModel\MessageCollectionFactory::class);
 | 
						|
 | 
						|
        //Check how many messages in collection by the beginning of tests
 | 
						|
        $messageCollection = $messageCollectionFactory->create()
 | 
						|
            ->addFieldToFilter('topic_name', 'topic.updated.use.just.in.tests');
 | 
						|
        $this->assertEquals(1, $messageCollection->getSize());
 | 
						|
        $messageId = $messageCollection->getFirstItem()->getId();
 | 
						|
 | 
						|
        $messageStatusCollection = $messageStatusCollectionFactory->create()
 | 
						|
            ->addFieldToFilter('message_id', $messageId);
 | 
						|
        $this->assertEquals(4, $messageStatusCollection->getSize());
 | 
						|
 | 
						|
        //Run clean up once. It should move 3 out of 4 statuses to TO BE DELETED status
 | 
						|
        $this->observer->cleanupMessages();
 | 
						|
 | 
						|
        $messageCollection = $messageCollectionFactory->create()
 | 
						|
            ->addFieldToFilter('topic_name', 'topic.updated.use.just.in.tests');
 | 
						|
        $this->assertEquals(1, $messageCollection->getSize());
 | 
						|
 | 
						|
        $messageStatusCollection = $messageStatusCollectionFactory->create()
 | 
						|
            ->addFieldToFilter('message_id', $messageId)
 | 
						|
            ->addFieldToFilter('status', \Magento\MysqlMq\Model\QueueManagement::MESSAGE_STATUS_TO_BE_DELETED);
 | 
						|
 | 
						|
        $this->assertEquals(3, $messageStatusCollection->getSize());
 | 
						|
 | 
						|
        // Change the Updated At in order to make job visible
 | 
						|
        $lastMessageStatus = $messageStatusCollectionFactory->create()
 | 
						|
            ->addFieldToFilter('message_id', $messageId)
 | 
						|
            ->addFieldToFilter('status', \Magento\MysqlMq\Model\QueueManagement::MESSAGE_STATUS_COMPLETE)
 | 
						|
            ->getFirstItem();
 | 
						|
        $lastMessageStatus->setUpdatedAt(time() - 1 - 24 * 7 * 60 * 60)
 | 
						|
            ->save();
 | 
						|
 | 
						|
        $this->observer->cleanupMessages();
 | 
						|
 | 
						|
        $messageCollection = $messageCollectionFactory->create()
 | 
						|
            ->addFieldToFilter('topic_name', 'topic.updated.use.just.in.tests');
 | 
						|
        $this->assertEquals(0, $messageCollection->getSize());
 | 
						|
        $messageStatusCollection = $messageStatusCollectionFactory->create()
 | 
						|
            ->addFieldToFilter('message_id', $messageId);
 | 
						|
        $this->assertEquals(0, $messageStatusCollection->getSize());
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/MysqlMq/_files/queues.php
 | 
						|
     * @magentoDataFixture Magento/MysqlMq/_files/messages.php
 | 
						|
     * @magentoDataFixture Magento/MysqlMq/_files/messages_in_progress.php
 | 
						|
     */
 | 
						|
    public function testCleanupInProgressMessages()
 | 
						|
    {
 | 
						|
        /** @var \Magento\MysqlMq\Model\ResourceModel\MessageStatusCollectionFactory $messageStatusCollectionFactory */
 | 
						|
        $messageStatusCollectionFactory = $this->objectManager
 | 
						|
            ->create(\Magento\MysqlMq\Model\ResourceModel\MessageStatusCollectionFactory::class);
 | 
						|
 | 
						|
        /** @var \Magento\MysqlMq\Model\ResourceModel\MessageCollectionFactory $messageStatusCollectionFactory */
 | 
						|
        $messageCollectionFactory = $this->objectManager
 | 
						|
            ->create(\Magento\MysqlMq\Model\ResourceModel\MessageCollectionFactory::class);
 | 
						|
 | 
						|
        //Check how many messages in collection by the beginning of tests
 | 
						|
        $messageCollection = $messageCollectionFactory->create()
 | 
						|
            ->addFieldToFilter('topic_name', 'topic_second.updated.use.just.in.tests');
 | 
						|
        $this->assertEquals(1, $messageCollection->getSize());
 | 
						|
        $messageId = $messageCollection->getFirstItem()->getId();
 | 
						|
 | 
						|
        $messageStatusCollection = $messageStatusCollectionFactory->create()
 | 
						|
            ->addFieldToFilter('message_id', $messageId);
 | 
						|
        $this->assertEquals(2, $messageStatusCollection->getSize());
 | 
						|
 | 
						|
        $this->observer->cleanupMessages();
 | 
						|
 | 
						|
        $messageCollection = $messageCollectionFactory->create()
 | 
						|
            ->addFieldToFilter('topic_name', 'topic_second.updated.use.just.in.tests');
 | 
						|
        $this->assertEquals(1, $messageCollection->getSize());
 | 
						|
        $messageStatusCollection = $messageStatusCollectionFactory->create()
 | 
						|
            ->addFieldToFilter('message_id', $messageId)
 | 
						|
            ->addFieldToFilter('status', \Magento\MysqlMq\Model\QueueManagement::MESSAGE_STATUS_RETRY_REQUIRED);
 | 
						|
        $this->assertEquals(1, $messageStatusCollection->getSize());
 | 
						|
        $this->assertEquals(1, $messageStatusCollection->getFirstItem()->getNumberOfTrials());
 | 
						|
    }
 | 
						|
}
 |