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']));
 | 
						|
    }
 | 
						|
}
 |