magento2-docker/dev/tests/api-functional/testsuite/Magento/WebapiAsync/Model/OrderRepositoryInterfaceTes...

175 lines
5.8 KiB
PHP
Executable File

<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace Magento\WebapiAsync\Model;
use Magento\Framework\ObjectManagerInterface;
use Magento\Framework\Webapi\Rest\Request;
use Magento\Sales\Api\Data\OrderInterface;
use Magento\Sales\Model\Order;
use Magento\TestFramework\Helper\Bootstrap;
use Magento\TestFramework\MessageQueue\EnvironmentPreconditionException;
use Magento\TestFramework\MessageQueue\PreconditionFailedException;
use Magento\TestFramework\MessageQueue\PublisherConsumerController;
use Magento\TestFramework\TestCase\WebapiAbstract;
/**
* Test order repository interface via async webapi
*/
class OrderRepositoryInterfaceTest extends WebapiAbstract
{
private const ASYNC_BULK_SAVE_ORDER = '/async/bulk/V1/orders';
private const ASYNC_SAVE_ORDER = '/async/V1/orders';
/**
* @var ObjectManagerInterface
*/
private $objectManager;
/**
* @var PublisherConsumerController
*/
private $publisherConsumerController;
/**
* @inheritDoc
*/
protected function setUp(): void
{
parent::setUp();
$this->objectManager = Bootstrap::getObjectManager();
$params = array_merge_recursive(
Bootstrap::getInstance()->getAppInitParams(),
['MAGE_DIRS' => ['cache' => ['path' => TESTS_TEMP_DIR . '/cache']]]
);
/** @var PublisherConsumerController publisherConsumerController */
$this->publisherConsumerController = $this->objectManager->create(
PublisherConsumerController::class,
[
'consumers' => ['async.operations.all'],
'logFilePath' => TESTS_TEMP_DIR . "/MessageQueueTestLog.txt",
'appInitParams' => $params,
]
);
try {
$this->publisherConsumerController->initialize();
} catch (EnvironmentPreconditionException $e) {
$this->markTestSkipped($e->getMessage());
} catch (PreconditionFailedException $e) {
$this->fail(
$e->getMessage()
);
}
}
/**
* @inheritDoc
*/
protected function tearDown(): void
{
$this->publisherConsumerController->stopConsumers();
parent::tearDown();
}
/**
* Check that order is updated successfuly via async webapi
*
* @magentoApiDataFixture Magento/Sales/_files/order.php
* @dataProvider saveDataProvider
* @param array $data
* @param bool $isBulk
* @return void
*/
public function testSave(array $data, bool $isBulk = true): void
{
$this->_markTestAsRestOnly();
/** @var Order $beforeUpdateOrder */
$beforeUpdateOrder = $this->objectManager->get(Order::class)->loadByIncrementId('100000001');
$requestData = [
'entity' => array_merge($data, [OrderInterface::ENTITY_ID => $beforeUpdateOrder->getEntityId()])
];
if ($isBulk) {
$requestData = [$requestData];
}
$serviceInfo = [
'rest' => [
'resourcePath' => $isBulk ? self::ASYNC_BULK_SAVE_ORDER : self::ASYNC_SAVE_ORDER,
'httpMethod' => Request::HTTP_METHOD_POST,
]
];
$this->makeAsyncRequest($serviceInfo, $requestData);
try {
$this->publisherConsumerController->waitForAsynchronousResult(
function (Order $beforeUpdateOrder, array $data) {
/** @var Order $afterUpdateOrder */
$afterUpdateOrder = $this->objectManager->get(Order::class)->load($beforeUpdateOrder->getId());
foreach ($data as $attribute => $value) {
$getter = 'get' . str_replace(' ', '', ucwords(str_replace('_', ' ', $attribute)));
if ($value !== $afterUpdateOrder->$getter()) {
return false;
}
}
//check that base_grand_total and grand_total are not overwritten
$this->assertEquals(
$beforeUpdateOrder->getBaseGrandTotal(),
$afterUpdateOrder->getBaseGrandTotal()
);
$this->assertEquals(
$beforeUpdateOrder->getGrandTotal(),
$afterUpdateOrder->getGrandTotal()
);
return true;
},
[$beforeUpdateOrder, $data]
);
} catch (PreconditionFailedException $e) {
$this->fail("Order update via async webapi failed");
}
}
/**
* Data provider for tesSave()
*
* @return array
*/
public function saveDataProvider(): array
{
return [
'update order in bulk mode' => [
[
OrderInterface::CUSTOMER_EMAIL => 'customer.email.modified@magento.test'
],
true
],
'update order in single mode' => [
[
OrderInterface::CUSTOMER_EMAIL => 'customer.email.modified@magento.test'
],
false
]
];
}
/**
* Make async webapi request
*
* @param array $serviceInfo
* @param array $requestData
* @return void
*/
private function makeAsyncRequest(array $serviceInfo, array $requestData): void
{
$response = $this->_webApiCall($serviceInfo, $requestData);
$this->assertNotEmpty($response['request_items']);
foreach ($response['request_items'] as $requestItem) {
$this->assertEquals('accepted', $requestItem['status']);
}
$this->assertFalse($response['errors']);
}
}