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