init
This commit is contained in:
+366
@@ -0,0 +1,366 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright © Magento, Inc. All rights reserved.
|
||||
* See COPYING.txt for license details.
|
||||
*/
|
||||
|
||||
namespace Magento\Webapi;
|
||||
|
||||
use Magento\TestFramework\Helper\Bootstrap;
|
||||
use Magento\Framework\App\ProductMetadataInterface;
|
||||
use Magento\Store\Model\StoreManagerInterface;
|
||||
|
||||
/**
|
||||
* Test REST schema generation mechanisms.
|
||||
*/
|
||||
class JsonGenerationFromDataObjectTest extends \Magento\TestFramework\TestCase\WebapiAbstract
|
||||
{
|
||||
/** @var string */
|
||||
protected $baseUrl = TESTS_BASE_URL;
|
||||
|
||||
/** @var string */
|
||||
protected $storeCode;
|
||||
|
||||
/** @var bool */
|
||||
protected $isSingleService;
|
||||
|
||||
/**
|
||||
* @var ProductMetadataInterface
|
||||
*/
|
||||
protected $productMetadata;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
$this->_markTestAsRestOnly("JSON generation tests are intended to be executed for REST adapter only.");
|
||||
|
||||
$this->storeCode = Bootstrap::getObjectManager()->get(StoreManagerInterface::class)
|
||||
->getStore()->getCode();
|
||||
|
||||
$this->productMetadata = Bootstrap::getObjectManager()->get(ProductMetadataInterface::class);
|
||||
|
||||
parent::setUp();
|
||||
}
|
||||
|
||||
public function testMultiServiceRetrieval()
|
||||
{
|
||||
$this->isSingleService = false;
|
||||
|
||||
$resourcePath = '/schema?services=testModule5AllSoapAndRestV1,testModule5AllSoapAndRestV2';
|
||||
|
||||
$serviceInfo = [
|
||||
'rest' => [
|
||||
'resourcePath' => $resourcePath,
|
||||
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
|
||||
],
|
||||
];
|
||||
|
||||
$schemaContent = $this->_webApiCall($serviceInfo);
|
||||
$this->checkActualData($this->getExpectedMultiServiceData(), $schemaContent);
|
||||
}
|
||||
|
||||
public function testSingleServiceRetrieval()
|
||||
{
|
||||
$this->isSingleService = false;
|
||||
|
||||
$resourcePath = '/schema?services=testModule5AllSoapAndRestV2';
|
||||
|
||||
$serviceInfo = [
|
||||
'rest' => [
|
||||
'resourcePath' => $resourcePath,
|
||||
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
|
||||
],
|
||||
];
|
||||
|
||||
$schemaContent = $this->_webApiCall($serviceInfo);
|
||||
|
||||
$this->checkActualData($this->getExpectedSingleServiceData(), $schemaContent);
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
public function testInvalidRestUrlNoServices()
|
||||
{
|
||||
$this->expectException(\Exception::class);
|
||||
$this->expectExceptionMessage('Specified request cannot be processed.');
|
||||
|
||||
$resourcePath = '';
|
||||
|
||||
$serviceInfo = [
|
||||
'rest' => [
|
||||
'resourcePath' => $resourcePath,
|
||||
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
|
||||
],
|
||||
];
|
||||
|
||||
$this->_webApiCall($serviceInfo);
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
public function testInvalidRestUrlInvalidServiceName()
|
||||
{
|
||||
$this->expectException(\Exception::class);
|
||||
$this->expectExceptionMessage('Incorrect format of request URI or Requested services are missing.');
|
||||
|
||||
$this->isSingleService = false;
|
||||
|
||||
$resourcePath = '/schema?services=invalidServiceName';
|
||||
|
||||
$serviceInfo = [
|
||||
'rest' => [
|
||||
'resourcePath' => $resourcePath,
|
||||
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
|
||||
],
|
||||
];
|
||||
|
||||
$this->_webApiCall($serviceInfo);
|
||||
}
|
||||
|
||||
private function assertRecursiveArray($expected, $actual, $checkVal)
|
||||
{
|
||||
ksort($expected);
|
||||
ksort($actual);
|
||||
foreach ($expected as $expKey => $expVal) {
|
||||
$this->assertArrayHasKey($expKey, $actual, 'Schema does not contain \'' . $expKey . '\' section.');
|
||||
if (is_array($expVal)) {
|
||||
$this->assertIsArray($actual[$expKey]);
|
||||
$this->assertRecursiveArray($expVal, $actual[$expKey], $checkVal);
|
||||
} elseif ($checkVal) {
|
||||
$this->assertEquals($expVal, $actual[$expKey], '\'' . $expKey . '\' section content is invalid.');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function checkActualData($expected, $actual)
|
||||
{
|
||||
$this->assertRecursiveArray($expected, $actual, true);
|
||||
}
|
||||
|
||||
public function getExpectedCommonData()
|
||||
{
|
||||
$versionParts = explode('.', $this->productMetadata->getVersion());
|
||||
if (!isset($versionParts[0]) || !isset($versionParts[1])) {
|
||||
return []; // Major and minor version are not set - return empty response
|
||||
}
|
||||
$majorMinorVersion = $versionParts[0] . '.' . $versionParts[1];
|
||||
$url = str_replace('://', '', strstr($this->baseUrl, '://'));
|
||||
$host = strpos($url, '/') ? strstr($url, '/', true) : $url;
|
||||
$basePath = strstr(rtrim($url, '/'), '/');
|
||||
$basePath = $basePath ? trim($basePath, '/') . '/' : '';
|
||||
$basePath = '/' . $basePath . 'rest/' . $this->storeCode;
|
||||
return [
|
||||
'swagger' => '2.0',
|
||||
'info' => [
|
||||
'version' => $majorMinorVersion,
|
||||
'title' => $this->productMetadata->getName() . ' ' .$this->productMetadata->getEdition(),
|
||||
],
|
||||
'host' => $host,
|
||||
'basePath' => $basePath,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
|
||||
*/
|
||||
public function getExpectedMultiServiceData()
|
||||
{
|
||||
$expected = [
|
||||
'tags' => [
|
||||
[
|
||||
'name' => 'testModule5AllSoapAndRestV1',
|
||||
'description' => 'Both SOAP and REST Version ONE',
|
||||
],
|
||||
[
|
||||
'name' => 'testModule5AllSoapAndRestV2',
|
||||
'description' => 'Both SOAP and REST Version TWO',
|
||||
],
|
||||
],
|
||||
'paths' => [
|
||||
'/V1/TestModule5/{parentId}/nestedResource/{entityId}' => [
|
||||
'put' => [
|
||||
'tags' => [
|
||||
'testModule5AllSoapAndRestV1',
|
||||
],
|
||||
'description' => 'Update existing item.',
|
||||
'operationId' => 'PutV1TestModule5ParentIdNestedResourceEntityId',
|
||||
'parameters' => [
|
||||
[
|
||||
'name' => 'parentId',
|
||||
'in' => 'path',
|
||||
'type' => 'string',
|
||||
'required' => true
|
||||
],
|
||||
[
|
||||
'name' => 'entityId',
|
||||
'in' => 'path',
|
||||
'type' => 'string',
|
||||
'required' => true
|
||||
],
|
||||
[
|
||||
'name' => 'PutV1TestModule5ParentIdNestedResourceEntityIdBody',
|
||||
'in' => 'body',
|
||||
'schema' => [
|
||||
'required' => [
|
||||
'entityItem',
|
||||
],
|
||||
'properties' => [
|
||||
'entityItem' => [
|
||||
'$ref' => '#/definitions/test-module5-v1-entity-all-soap-and-rest',
|
||||
],
|
||||
],
|
||||
'type' => 'object'
|
||||
],
|
||||
]
|
||||
],
|
||||
'responses' => [
|
||||
200 => [
|
||||
'description' => '200 Success.',
|
||||
'schema' => [
|
||||
'$ref' => '#/definitions/test-module5-v1-entity-all-soap-and-rest',
|
||||
],
|
||||
],
|
||||
401 => [
|
||||
'description' => '401 Unauthorized',
|
||||
'schema' => [
|
||||
'$ref' => '#/definitions/error-response',
|
||||
],
|
||||
],
|
||||
'default' => [
|
||||
'description' => 'Unexpected error',
|
||||
'schema' => [
|
||||
'$ref' => '#/definitions/error-response',
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
'definitions' => [
|
||||
'framework-attribute-interface' => [
|
||||
'type' => 'object',
|
||||
'description' => 'Interface for custom attribute value.',
|
||||
'properties' => [
|
||||
'attribute_code' => [
|
||||
'type' => 'string',
|
||||
'description' => 'Attribute code',
|
||||
],
|
||||
'value' => [
|
||||
'type' => 'string',
|
||||
'description' => 'Attribute value',
|
||||
],
|
||||
],
|
||||
'required' => [
|
||||
'attribute_code',
|
||||
'value',
|
||||
],
|
||||
],
|
||||
'test-module5-v1-entity-all-soap-and-rest' => [
|
||||
'type' => 'object',
|
||||
'description' => 'Some Data Object short description. Data Object long multi line description.',
|
||||
'properties' => [
|
||||
'entity_id' => [
|
||||
'type' => 'integer',
|
||||
'description' => 'Item ID',
|
||||
],
|
||||
'name' => [
|
||||
'type' => 'string',
|
||||
'description' => 'Item name',
|
||||
],
|
||||
'enabled' => [
|
||||
'type' => 'boolean',
|
||||
'description' => 'If entity is enabled',
|
||||
],
|
||||
'orders' => [
|
||||
'type' => 'boolean',
|
||||
'description' => 'If current entity has a property defined',
|
||||
],
|
||||
'custom_attributes' => [
|
||||
'type' => 'array',
|
||||
'description' => 'Custom attributes values.',
|
||||
'items' => [
|
||||
'$ref' => '#/definitions/framework-attribute-interface',
|
||||
],
|
||||
],
|
||||
],
|
||||
'required' => [
|
||||
'entity_id',
|
||||
'enabled',
|
||||
'orders',
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
return array_merge_recursive($expected, $this->getExpectedCommonData());
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
|
||||
*/
|
||||
public function getExpectedSingleServiceData()
|
||||
{
|
||||
$expected = [
|
||||
'tags' => [
|
||||
[
|
||||
'name' => 'testModule5AllSoapAndRestV2',
|
||||
'description' => 'Both SOAP and REST Version TWO',
|
||||
],
|
||||
],
|
||||
'paths' => [
|
||||
'/V2/TestModule5/{id}' => [
|
||||
'delete' => [
|
||||
'tags' => [
|
||||
'testModule5AllSoapAndRestV2',
|
||||
],
|
||||
'description' => 'Delete existing item.',
|
||||
'operationId' => 'DeleteV2TestModule5Id',
|
||||
'parameters' => [
|
||||
[
|
||||
'name' => 'id',
|
||||
'in' => 'path',
|
||||
'type' => 'string',
|
||||
'required' => true
|
||||
],
|
||||
],
|
||||
'responses' => [
|
||||
200 => [
|
||||
'description' => '200 Success.',
|
||||
'schema' => [
|
||||
'$ref' => '#/definitions/test-module5-v2-entity-all-soap-and-rest',
|
||||
],
|
||||
],
|
||||
401 => [
|
||||
'description' => '401 Unauthorized',
|
||||
'schema' => [
|
||||
'$ref' => '#/definitions/error-response',
|
||||
],
|
||||
],
|
||||
'default' => [
|
||||
'description' => 'Unexpected error',
|
||||
'schema' => [
|
||||
'$ref' => '#/definitions/error-response',
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
'definitions' => [
|
||||
'test-module5-v2-entity-all-soap-and-rest' => [
|
||||
'type' => 'object',
|
||||
'description' => 'Some Data Object short description. Data Object long multi line description.',
|
||||
'properties' => [
|
||||
'price' => [
|
||||
'type' => 'integer',
|
||||
],
|
||||
],
|
||||
'required' => [
|
||||
'price',
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
return array_merge($expected, $this->getExpectedCommonData());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user