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