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