307 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			307 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?php declare(strict_types=1); | ||
|  | 
 | ||
|  | /** | ||
|  |  * @license Apache 2.0 | ||
|  |  */ | ||
|  | 
 | ||
|  | namespace OpenApi\Tests\Processors; | ||
|  | 
 | ||
|  | use OpenApi\Annotations\Property; | ||
|  | use OpenApi\Generator; | ||
|  | use OpenApi\Processors\AugmentProperties; | ||
|  | use OpenApi\Processors\AugmentSchemas; | ||
|  | use OpenApi\Processors\MergeIntoComponents; | ||
|  | use OpenApi\Processors\MergeIntoOpenApi; | ||
|  | use OpenApi\Tests\OpenApiTestCase; | ||
|  | 
 | ||
|  | /** | ||
|  |  * @group Properties | ||
|  |  */ | ||
|  | class AugmentPropertiesTest extends OpenApiTestCase | ||
|  | { | ||
|  |     public function testAugmentProperties() | ||
|  |     { | ||
|  |         $analysis = $this->analysisFromFixtures('Customer.php'); | ||
|  |         $analysis->process(new MergeIntoOpenApi()); | ||
|  |         $analysis->process(new MergeIntoComponents()); | ||
|  |         $analysis->process(new AugmentSchemas()); | ||
|  |         $customer = $analysis->openapi->components->schemas[0]; | ||
|  |         $firstName = $customer->properties[0]; | ||
|  |         $secondName = $customer->properties[1]; | ||
|  |         $thirdName = $customer->properties[2]; | ||
|  |         $fourthName = $customer->properties[3]; | ||
|  |         $lastName = $customer->properties[4]; | ||
|  |         $tags = $customer->properties[5]; | ||
|  |         $submittedBy = $customer->properties[6]; | ||
|  |         $friends = $customer->properties[7]; | ||
|  |         $bestFriend = $customer->properties[8]; | ||
|  | 
 | ||
|  |         // Verify no values where defined in the annotation.
 | ||
|  |         $this->assertSame(Generator::UNDEFINED, $firstName->property); | ||
|  |         $this->assertSame(Generator::UNDEFINED, $firstName->description); | ||
|  |         $this->assertSame(Generator::UNDEFINED, $firstName->type); | ||
|  | 
 | ||
|  |         $this->assertSame(Generator::UNDEFINED, $lastName->property); | ||
|  |         $this->assertSame(Generator::UNDEFINED, $lastName->description); | ||
|  |         $this->assertSame(Generator::UNDEFINED, $lastName->type); | ||
|  | 
 | ||
|  |         $this->assertSame(Generator::UNDEFINED, $tags->property); | ||
|  |         $this->assertSame(Generator::UNDEFINED, $tags->type); | ||
|  |         $this->assertSame(Generator::UNDEFINED, $tags->items); | ||
|  | 
 | ||
|  |         $this->assertSame(Generator::UNDEFINED, $submittedBy->property); | ||
|  |         $this->assertSame(Generator::UNDEFINED, $submittedBy->ref); | ||
|  | 
 | ||
|  |         $this->assertSame(Generator::UNDEFINED, $friends->property); | ||
|  |         $this->assertSame(Generator::UNDEFINED, $friends->type); | ||
|  | 
 | ||
|  |         $this->assertSame(Generator::UNDEFINED, $bestFriend->property); | ||
|  |         $this->assertSame(Generator::UNDEFINED, $bestFriend->nullable); | ||
|  |         $this->assertSame(Generator::UNDEFINED, $bestFriend->allOf); | ||
|  | 
 | ||
|  |         $analysis->process(new AugmentProperties()); | ||
|  | 
 | ||
|  |         $expectedValues = [ | ||
|  |             'property' => 'firstname', | ||
|  |             'example' => 'John', | ||
|  |             'description' => 'The first name of the customer.', | ||
|  |             'type' => 'string', | ||
|  |         ]; | ||
|  |         $this->assertName($firstName, $expectedValues); | ||
|  | 
 | ||
|  |         $expectedValues = [ | ||
|  |             'property' => 'secondname', | ||
|  |             'example' => 'Allan', | ||
|  |             'description' => 'The second name of the customer.', | ||
|  |             'type' => 'string', | ||
|  |             'nullable' => true, | ||
|  |         ]; | ||
|  |         $this->assertName($secondName, $expectedValues); | ||
|  | 
 | ||
|  |         $expectedValues = [ | ||
|  |             'property' => 'thirdname', | ||
|  |             'example' => 'Peter', | ||
|  |             'description' => 'The third name of the customer.', | ||
|  |             'type' => 'string', | ||
|  |             'nullable' => true, | ||
|  |         ]; | ||
|  |         $this->assertName($thirdName, $expectedValues); | ||
|  | 
 | ||
|  |         $expectedValues = [ | ||
|  |             'property' => 'fourthname', | ||
|  |             'example' => 'Unknown', | ||
|  |             'description' => 'The unknown name of the customer.', | ||
|  |             'type' => Generator::UNDEFINED, | ||
|  |             'nullable' => true, | ||
|  |         ]; | ||
|  |         $this->assertName($fourthName, $expectedValues); | ||
|  | 
 | ||
|  |         $expectedValues = [ | ||
|  |             'property' => 'lastname', | ||
|  |             'example' => Generator::UNDEFINED, | ||
|  |             'description' => 'The lastname of the customer.', | ||
|  |             'type' => 'string', | ||
|  |         ]; | ||
|  |         $this->assertName($lastName, $expectedValues); | ||
|  | 
 | ||
|  |         $this->assertSame('tags', $tags->property); | ||
|  |         $this->assertSame('array', $tags->type, 'Detect array notation: @var string[]'); | ||
|  |         $this->assertSame('string', $tags->items->type); | ||
|  | 
 | ||
|  |         $this->assertSame('submittedBy', $submittedBy->property); | ||
|  |         $this->assertSame('#/components/schemas/Customer', $submittedBy->ref); | ||
|  | 
 | ||
|  |         $this->assertSame('friends', $friends->property); | ||
|  |         $this->assertSame('array', $friends->type); | ||
|  |         $this->assertSame('#/components/schemas/Customer', $friends->items->ref); | ||
|  | 
 | ||
|  |         $this->assertSame('bestFriend', $bestFriend->property); | ||
|  |         $this->assertTrue($bestFriend->nullable); | ||
|  |         $this->assertSame('#/components/schemas/Customer', $bestFriend->oneOf[0]->ref); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testTypedProperties() | ||
|  |     { | ||
|  |         $analysis = $this->analysisFromFixtures('TypedProperties.php'); | ||
|  |         $analysis->process(new MergeIntoOpenApi()); | ||
|  |         $analysis->process(new MergeIntoComponents()); | ||
|  |         $analysis->process(new AugmentSchemas()); | ||
|  |         [ | ||
|  |             $stringType, | ||
|  |             $intType, | ||
|  |             $nullableString, | ||
|  |             $arrayType, | ||
|  |             $dateTime, | ||
|  |             $qualified, | ||
|  |             $namespaced, | ||
|  |             $importedNamespace, | ||
|  |             $nativeTrumpsVar, | ||
|  |             $annotationTrumpsNative, | ||
|  |             $annotationTrumpsAll, | ||
|  |             $undefined, | ||
|  |             $onlyAnnotated, | ||
|  |             $onlyVar, | ||
|  |             $staticUndefined, | ||
|  |             $staticString, | ||
|  |             $staticNullableString, | ||
|  |         ] = $analysis->openapi->components->schemas[0]->properties; | ||
|  | 
 | ||
|  |         $this->assertName($stringType, [ | ||
|  |             'property' => Generator::UNDEFINED, | ||
|  |             'type' => Generator::UNDEFINED, | ||
|  |         ]); | ||
|  |         $this->assertName($intType, [ | ||
|  |             'property' => Generator::UNDEFINED, | ||
|  |             'type' => Generator::UNDEFINED, | ||
|  |         ]); | ||
|  |         $this->assertName($nullableString, [ | ||
|  |             'property' => Generator::UNDEFINED, | ||
|  |             'type' => Generator::UNDEFINED, | ||
|  |         ]); | ||
|  |         $this->assertName($arrayType, [ | ||
|  |             'property' => Generator::UNDEFINED, | ||
|  |             'type' => Generator::UNDEFINED, | ||
|  |         ]); | ||
|  |         $this->assertName($dateTime, [ | ||
|  |             'property' => Generator::UNDEFINED, | ||
|  |             'type' => Generator::UNDEFINED, | ||
|  |         ]); | ||
|  |         $this->assertName($qualified, [ | ||
|  |             'property' => Generator::UNDEFINED, | ||
|  |             'type' => Generator::UNDEFINED, | ||
|  |         ]); | ||
|  |         $this->assertName($namespaced, [ | ||
|  |             'property' => Generator::UNDEFINED, | ||
|  |             'type' => Generator::UNDEFINED, | ||
|  |         ]); | ||
|  |         $this->assertName($importedNamespace, [ | ||
|  |             'property' => Generator::UNDEFINED, | ||
|  |             'type' => Generator::UNDEFINED, | ||
|  |         ]); | ||
|  |         $this->assertName($nativeTrumpsVar, [ | ||
|  |             'property' => Generator::UNDEFINED, | ||
|  |             'type' => Generator::UNDEFINED, | ||
|  |         ]); | ||
|  |         $this->assertName($annotationTrumpsNative, [ | ||
|  |             'property' => Generator::UNDEFINED, | ||
|  |             'type' => 'integer', | ||
|  |         ]); | ||
|  |         $this->assertName($annotationTrumpsAll, [ | ||
|  |             'property' => Generator::UNDEFINED, | ||
|  |             'type' => 'integer', | ||
|  |         ]); | ||
|  |         $this->assertName($undefined, [ | ||
|  |             'property' => Generator::UNDEFINED, | ||
|  |             'type' => Generator::UNDEFINED, | ||
|  |         ]); | ||
|  |         $this->assertName($onlyAnnotated, [ | ||
|  |             'property' => Generator::UNDEFINED, | ||
|  |             'type' => 'integer', | ||
|  |         ]); | ||
|  |         $this->assertName($onlyVar, [ | ||
|  |             'property' => Generator::UNDEFINED, | ||
|  |             'type' => Generator::UNDEFINED, | ||
|  |         ]); | ||
|  |         $this->assertName($staticUndefined, [ | ||
|  |             'property' => Generator::UNDEFINED, | ||
|  |             'type' => Generator::UNDEFINED, | ||
|  |         ]); | ||
|  |         $this->assertName($staticString, [ | ||
|  |             'property' => Generator::UNDEFINED, | ||
|  |             'type' => Generator::UNDEFINED, | ||
|  |         ]); | ||
|  |         $this->assertName($staticNullableString, [ | ||
|  |             'property' => Generator::UNDEFINED, | ||
|  |             'type' => Generator::UNDEFINED, | ||
|  |         ]); | ||
|  | 
 | ||
|  |         $analysis->process(new AugmentProperties()); | ||
|  | 
 | ||
|  |         $this->assertName($stringType, [ | ||
|  |             'property' => 'stringType', | ||
|  |             'type' => 'string', | ||
|  |         ]); | ||
|  |         $this->assertName($intType, [ | ||
|  |             'property' => 'intType', | ||
|  |             'type' => 'integer', | ||
|  |         ]); | ||
|  |         $this->assertName($nullableString, [ | ||
|  |             'property' => 'nullableString', | ||
|  |             'type' => 'string', | ||
|  |         ]); | ||
|  |         $this->assertName($arrayType, [ | ||
|  |             'property' => 'arrayType', | ||
|  |             'type' => 'array', | ||
|  |         ]); | ||
|  |         $this->assertObjectHasAttribute( | ||
|  |             'ref', | ||
|  |             $arrayType->items | ||
|  |         ); | ||
|  |         $this->assertEquals( | ||
|  |             '#/components/schemas/TypedProperties', | ||
|  |             $arrayType->items->ref | ||
|  |         ); | ||
|  |         $this->assertName($dateTime, [ | ||
|  |             'property' => 'dateTime', | ||
|  |             'type' => 'string', | ||
|  |             'format' => 'date-time', | ||
|  |         ]); | ||
|  |         $this->assertName($qualified, [ | ||
|  |             'property' => 'qualified', | ||
|  |             'type' => 'string', | ||
|  |             'format' => 'date-time', | ||
|  |         ]); | ||
|  |         $this->assertName($namespaced, [ | ||
|  |             'property' => 'namespaced', | ||
|  |             'ref' => '#/components/schemas/TypedProperties', | ||
|  |         ]); | ||
|  |         $this->assertName($importedNamespace, [ | ||
|  |             'property' => 'importedNamespace', | ||
|  |             'ref' => '#/components/schemas/TypedProperties', | ||
|  |         ]); | ||
|  |         $this->assertName($nativeTrumpsVar, [ | ||
|  |             'property' => 'nativeTrumpsVar', | ||
|  |             'type' => 'string', | ||
|  |         ]); | ||
|  |         $this->assertName($annotationTrumpsNative, [ | ||
|  |             'property' => 'annotationTrumpsNative', | ||
|  |             'type' => 'integer', | ||
|  |         ]); | ||
|  |         $this->assertName($annotationTrumpsAll, [ | ||
|  |             'property' => 'annotationTrumpsAll', | ||
|  |             'type' => 'integer', | ||
|  |         ]); | ||
|  |         $this->assertName($undefined, [ | ||
|  |             'property' => 'undefined', | ||
|  |             'type' => Generator::UNDEFINED, | ||
|  |         ]); | ||
|  |         $this->assertName($onlyAnnotated, [ | ||
|  |             'property' => 'onlyAnnotated', | ||
|  |             'type' => 'integer', | ||
|  |         ]); | ||
|  |         $this->assertName($onlyVar, [ | ||
|  |             'property' => 'onlyVar', | ||
|  |             'type' => 'integer', | ||
|  |         ]); | ||
|  |         $this->assertName($staticUndefined, [ | ||
|  |             'property' => 'staticUndefined', | ||
|  |             'type' => Generator::UNDEFINED, | ||
|  |         ]); | ||
|  |         $this->assertName($staticString, [ | ||
|  |             'property' => 'staticString', | ||
|  |             'type' => 'string', | ||
|  |         ]); | ||
|  |         $this->assertName($staticNullableString, [ | ||
|  |             'property' => 'staticNullableString', | ||
|  |             'type' => 'string', | ||
|  |         ]); | ||
|  |     } | ||
|  | 
 | ||
|  |     protected function assertName(Property $property, array $expectedValues) | ||
|  |     { | ||
|  |         foreach ($expectedValues as $key => $val) { | ||
|  |             $this->assertSame($val, $property->$key, '@OA\Property()->property based on propertyname'); | ||
|  |         } | ||
|  |     } | ||
|  | } |