175 lines
5.8 KiB
PHP
Executable File
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']);
|
|
}
|
|
}
|