magento2-docker/dev/tests/integration/testsuite/Magento/AsynchronousOperations/Model/MassConsumerEnvelopeCallbac...

155 lines
5.4 KiB
PHP

<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace Magento\AsynchronousOperations\Model;
use Magento\AsynchronousOperations\Api\Data\OperationInterface;
use Magento\AsynchronousOperations\Api\SaveMultipleOperationsInterface;
use Magento\AsynchronousOperations\Model\ConfigInterface as AsyncConfig;
use Magento\AsynchronousOperations\Model\ResourceModel\Operation\Collection;
use Magento\AsynchronousOperations\Model\ResourceModel\Operation\CollectionFactory;
use Magento\Catalog\Model\Product;
use Magento\Framework\Bulk\BulkManagementInterface;
use Magento\Framework\MessageQueue\ConsumerConfigurationInterface;
use Magento\Framework\MessageQueue\EnvelopeInterface;
use Magento\Framework\MessageQueue\Lock\ReaderInterface;
use Magento\Framework\MessageQueue\LockInterfaceFactory;
use Magento\Framework\MessageQueue\MessageEncoder;
use Magento\Framework\MessageQueue\QueueInterface;
use Magento\TestFramework\Helper\Bootstrap;
use Monolog\Test\TestCase;
use PHPUnit\Framework\MockObject\MockObject;
/**
* Test for MassConsumerEnvelopeCallback
*
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class MassConsumerEnvelopeCallbackTest extends TestCase
{
/**
* @var MassConsumerEnvelopeCallback
*/
private $model;
/**
* @var QueueInterface|MockObject
*/
private $queue;
/**
* @var ConsumerConfigurationInterface|MockObject
*/
private $configuration;
/**
* @var MessageEncoder
*/
private $messageEncoder;
/**
* @var OperationRepositoryInterface
*/
private $operationRepository;
/**
* @var BulkManagementInterface
*/
private $bulkManagement;
/**
* @var SaveMultipleOperationsInterface
*/
private $saveMultipleOperations;
/**
* @var CollectionFactory
*/
private $operationCollectionFactory;
/**
* @inheritdoc
*/
protected function setUp(): void
{
parent::setUp();
$objectManager = Bootstrap::getObjectManager();
$this->queue = $this->createMock(QueueInterface::class);
$this->configuration = $this->createMock(ConsumerConfigurationInterface::class);
$this->messageEncoder = $objectManager->get(MessageEncoder::class);
$this->operationRepository = $objectManager->get(OperationRepositoryInterface::class);
$operationProcessor = $this->createMock(OperationProcessor::class);
$this->operationCollectionFactory = $objectManager->get(CollectionFactory::class);
$this->bulkManagement = $objectManager->get(BulkManagementInterface::class);
$this->saveMultipleOperations = $objectManager->get(SaveMultipleOperationsInterface::class);
$operationProcessorFactory = $this->createMock(OperationProcessorFactory::class);
$operationProcessorFactory->method('create')
->willReturn($operationProcessor);
$this->model = Bootstrap::getObjectManager()->create(
MassConsumerEnvelopeCallback::class,
[
'queue' => $this->queue,
'configuration' => $this->configuration,
'operationProcessorFactory' => $operationProcessorFactory
]
);
}
/**
* @magentoDbIsolation enabled
*/
public function testMessageLock(): void
{
$objectManager = Bootstrap::getObjectManager();
$product = $objectManager->create(Product::class);
$product->setSku('simple');
$product->setName('random name update');
$message = [
'product' => $product
];
$topicName = 'async.magento.catalog.api.productrepositoryinterface.save.post';
$buuid = uniqid('bulk-');
$messageProps = [
'message_id' => uniqid('msg-'),
'topic_name' => $topicName
];
$consumerName = 'async.operations.all';
$this->bulkManagement->scheduleBulk($buuid, [], 'test bulk');
$operation = $this->operationRepository->create($topicName, $message, $buuid, 0);
$this->saveMultipleOperations->execute([$operation]);
$envelope = $this->createMock(EnvelopeInterface::class);
$envelope->method('getBody')
->willReturn($this->messageEncoder->encode(AsyncConfig::SYSTEM_TOPIC_NAME, $operation));
$envelope->method('getProperties')
->willReturn($messageProps);
$this->configuration
->method('getConsumerName')
->willReturn($consumerName);
$this->configuration
->method('getTopicNames')
->willReturn([$topicName]);
$this->model->execute($envelope);
/** @var Collection $collection */
$collection = $this->operationCollectionFactory->create();
$collection->addFieldToFilter(OperationInterface::BULK_ID, ['eq' => $buuid]);
$this->assertEquals(1, $collection->count());
$operation = $collection->getFirstItem();
$this->assertNotEmpty($operation->getData('started_at'));
// md5() here is not for cryptographic use.
// phpcs:ignore Magento2.Security.InsecureFunction
$code = md5($consumerName . '-' . $messageProps['message_id']);
$lockFactory = $objectManager->get(LockInterfaceFactory::class);
$lockReader = $objectManager->get(ReaderInterface::class);
$lock = $lockFactory->create();
$lockReader->read($lock, $code);
$this->assertNotEmpty($lock->getId());
}
}