214 lines
6.0 KiB
PHP
214 lines
6.0 KiB
PHP
<?php declare(strict_types=1);
|
|
|
|
/**
|
|
* @license Apache 2.0
|
|
*/
|
|
|
|
namespace OpenApi\Tests;
|
|
|
|
use OpenApi\Annotations;
|
|
use OpenApi\Annotations\OpenApi;
|
|
use OpenApi\Generator;
|
|
use OpenApi\Serializer;
|
|
|
|
class SerializerTest extends OpenApiTestCase
|
|
{
|
|
private function getExpected()
|
|
{
|
|
$path = new Annotations\PathItem([]);
|
|
$path->path = '/products';
|
|
$path->post = new Annotations\Post([]);
|
|
$path->post->tags = ['products'];
|
|
$path->post->summary = 's1';
|
|
$path->post->description = 'd1';
|
|
$path->post->requestBody = new Annotations\RequestBody([]);
|
|
$mediaType = new Annotations\MediaType([]);
|
|
$mediaType->mediaType = 'application/json';
|
|
$mediaType->schema = new Annotations\Schema([]);
|
|
$mediaType->schema->type = 'object';
|
|
$mediaType->schema->additionalProperties = true;
|
|
$path->post->requestBody->content = [$mediaType];
|
|
$path->post->requestBody->description = 'data in body';
|
|
$path->post->requestBody->x = [];
|
|
$path->post->requestBody->x['repository'] = 'def';
|
|
|
|
$resp = new Annotations\Response([]);
|
|
$resp->response = '200';
|
|
$resp->description = 'Success';
|
|
$content = new Annotations\MediaType([]);
|
|
$content->mediaType = 'application/json';
|
|
$content->schema = new Annotations\Schema([]);
|
|
$content->schema->ref = '#/components/schemas/Pet';
|
|
$resp->content = [$content];
|
|
$resp->x = [];
|
|
$resp->x['repository'] = 'def';
|
|
|
|
$respRange = new Annotations\Response([]);
|
|
$respRange->response = '4XX';
|
|
$respRange->description = 'Client error response';
|
|
|
|
$path->post->responses = [$resp, $respRange];
|
|
|
|
$expected = new Annotations\OpenApi([]);
|
|
$expected->openapi = '3.0.0';
|
|
$expected->paths = [
|
|
$path,
|
|
];
|
|
|
|
$info = new Annotations\Info([]);
|
|
$info->title = 'Pet store';
|
|
$info->version = '1.0';
|
|
$expected->info = $info;
|
|
|
|
$schema = new Annotations\Schema([]);
|
|
$schema->schema = 'Pet';
|
|
$schema->required = ['name', 'photoUrls'];
|
|
|
|
$expected->components = new Annotations\Components([]);
|
|
$expected->components->schemas = [$schema];
|
|
|
|
return $expected;
|
|
}
|
|
|
|
public function testDeserializeAnnotation()
|
|
{
|
|
$serializer = new Serializer();
|
|
|
|
$json = <<<JSON
|
|
{
|
|
"openapi": "3.0.0",
|
|
"info": {
|
|
"title": "Pet store",
|
|
"version": "1.0"
|
|
},
|
|
"paths": {
|
|
"/products": {
|
|
"post": {
|
|
"tags": [
|
|
"products"
|
|
],
|
|
"summary": "s1",
|
|
"description": "d1",
|
|
"requestBody": {
|
|
"description": "data in body",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"additionalProperties": true
|
|
}
|
|
}
|
|
},
|
|
"x-repository": "def"
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"\$ref": "#/components/schemas/Pet"
|
|
}
|
|
}
|
|
},
|
|
"x-repository": "def"
|
|
},
|
|
"4XX": {
|
|
"description": "Client error response"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"components": {
|
|
"schemas": {
|
|
"Pet": {
|
|
"required": [
|
|
"name",
|
|
"photoUrls"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
JSON;
|
|
|
|
/** @var Annotations\OpenApi $annotation */
|
|
$annotation = $serializer->deserialize($json, 'OpenApi\Annotations\OpenApi');
|
|
|
|
$this->assertInstanceOf('OpenApi\Annotations\OpenApi', $annotation);
|
|
$this->assertJsonStringEqualsJsonString(
|
|
$annotation->toJson(),
|
|
$this->getExpected()->toJson()
|
|
);
|
|
|
|
$schema = $annotation->paths['/products']->post->requestBody->content['application/json']->schema;
|
|
$this->assertTrue($schema->additionalProperties);
|
|
}
|
|
|
|
public function testPetstoreExample()
|
|
{
|
|
$serializer = new Serializer();
|
|
$spec = __DIR__ . '/../Examples/petstore.swagger.io/petstore.swagger.io.json';
|
|
$openapi = $serializer->deserializeFile($spec);
|
|
$this->assertInstanceOf(OpenApi::class, $openapi);
|
|
$this->assertJsonStringEqualsJsonString(file_get_contents($spec), $openapi->toJson());
|
|
}
|
|
|
|
/**
|
|
* Test for correct deserialize schemas 'allOf' property.
|
|
*
|
|
* @throws \Exception
|
|
*/
|
|
public function testDeserializeAllOfProperty()
|
|
{
|
|
$serializer = new Serializer();
|
|
$json = <<<JSON
|
|
{
|
|
"openapi": "3.0.0",
|
|
"info": {
|
|
"title": "Pet store",
|
|
"version": "1.0"
|
|
},
|
|
"components": {
|
|
"schemas": {
|
|
"Dog": {
|
|
"allOf": [{
|
|
"\$ref": "#/components/schemas/SomeSchema"
|
|
}]
|
|
},
|
|
"Cat": {
|
|
"allOf": [{
|
|
"\$ref": "#/components/schemas/SomeSchema"
|
|
}]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
JSON;
|
|
/* @var $annotation Annotations\OpenApi */
|
|
$annotation = $serializer->deserialize($json, Annotations\OpenApi::class);
|
|
|
|
foreach ($annotation->components->schemas as $schemaObject) {
|
|
$this->assertObjectHasAttribute('allOf', $schemaObject);
|
|
$this->assertNotSame($schemaObject->allOf, Generator::UNDEFINED);
|
|
$this->assertIsArray($schemaObject->allOf);
|
|
$allOfItem = current($schemaObject->allOf);
|
|
$this->assertIsObject($allOfItem);
|
|
$this->assertInstanceOf(Annotations\Schema::class, $allOfItem);
|
|
$this->assertObjectHasAttribute('ref', $allOfItem);
|
|
$this->assertNotSame($allOfItem->ref, Generator::UNDEFINED);
|
|
$this->assertSame('#/components/schemas/SomeSchema', $allOfItem->ref);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @dataProvider allAnnotationClasses
|
|
*/
|
|
public function testValidAnnotationsListComplete($annotation)
|
|
{
|
|
$staticProperties = (new \ReflectionClass((Serializer::class)))->getStaticProperties();
|
|
$this->assertArrayHasKey($annotation, array_flip($staticProperties['VALID_ANNOTATIONS']));
|
|
}
|
|
}
|