From 6200a80dc713641120728cc34776f26ed28a59e6 Mon Sep 17 00:00:00 2001 From: soyuka Date: Fri, 13 Nov 2020 13:14:37 +0100 Subject: [PATCH 1/2] Specify AdditionalProperties according to allow_extra_attributes --- src/JsonSchema/SchemaFactory.php | 2 +- tests/JsonSchema/SchemaFactoryTest.php | 4 +- .../DocumentationNormalizerV2Test.php | 48 +++++++++---------- .../DocumentationNormalizerV3Test.php | 42 ++++++++-------- 4 files changed, 49 insertions(+), 47 deletions(-) diff --git a/src/JsonSchema/SchemaFactory.php b/src/JsonSchema/SchemaFactory.php index 902e011ecc2..443c381571e 100644 --- a/src/JsonSchema/SchemaFactory.php +++ b/src/JsonSchema/SchemaFactory.php @@ -109,7 +109,7 @@ public function buildSchema(string $className, string $format = 'json', string $ return $schema; } - $definition = new \ArrayObject(['type' => 'object', 'additionalProperties' => false]); + $definition = new \ArrayObject(['type' => 'object', 'additionalProperties' => $serializerContext[AbstractNormalizer::ALLOW_EXTRA_ATTRIBUTES] ?? true]); $definitions[$definitionName] = $definition; if (null !== $resourceMetadata && null !== $description = $resourceMetadata->getDescription()) { $definition['description'] = $description; diff --git a/tests/JsonSchema/SchemaFactoryTest.php b/tests/JsonSchema/SchemaFactoryTest.php index f4de1de0700..9c25942bf3b 100644 --- a/tests/JsonSchema/SchemaFactoryTest.php +++ b/tests/JsonSchema/SchemaFactoryTest.php @@ -30,6 +30,7 @@ use PHPUnit\Framework\TestCase; use Prophecy\Argument; use Symfony\Component\PropertyInfo\Type; +use Symfony\Component\Serializer\Normalizer\AbstractNormalizer; class SchemaFactoryTest extends TestCase { @@ -73,7 +74,7 @@ public function testBuildSchemaForNonResourceClass(): void $this->assertArrayHasKey($rootDefinitionKey, $definitions); $this->assertArrayHasKey('type', $definitions[$rootDefinitionKey]); $this->assertSame('object', $definitions[$rootDefinitionKey]['type']); - $this->assertFalse($definitions[$rootDefinitionKey]['additionalProperties']); + $this->assertTrue($definitions[$rootDefinitionKey]['additionalProperties']); $this->assertArrayHasKey('properties', $definitions[$rootDefinitionKey]); $this->assertArrayHasKey('foo', $definitions[$rootDefinitionKey]['properties']); $this->assertArrayHasKey('type', $definitions[$rootDefinitionKey]['properties']['foo']); @@ -98,6 +99,7 @@ public function testBuildSchemaForOperationWithOverriddenSerializerGroups(): voi 'put' => [ 'normalization_context' => [ 'groups' => 'overridden_operation_dummy_put', + AbstractNormalizer::ALLOW_EXTRA_ATTRIBUTES => false, ], 'validation_groups' => ['validation_groups_dummy_put'], ], diff --git a/tests/Swagger/Serializer/DocumentationNormalizerV2Test.php b/tests/Swagger/Serializer/DocumentationNormalizerV2Test.php index e6b37bf3240..767860af147 100644 --- a/tests/Swagger/Serializer/DocumentationNormalizerV2Test.php +++ b/tests/Swagger/Serializer/DocumentationNormalizerV2Test.php @@ -128,7 +128,7 @@ private function doTestNormalize(OperationMethodResolverInterface $operationMeth 'custom' => ['method' => 'GET', 'path' => '/foo', 'status' => '202'] + self::OPERATION_FORMATS, 'custom2' => ['method' => 'POST', 'path' => '/foo'] + self::OPERATION_FORMATS, ], - ['pagination_client_items_per_page' => true] + ['pagination_client_items_per_page' => true, 'normalization_context' => [AbstractNormalizer::ALLOW_EXTRA_ATTRIBUTES => false]] ); $resourceMetadataFactoryProphecy = $this->prophesize(ResourceMetadataFactoryInterface::class); $resourceMetadataFactoryProphecy->create(Dummy::class)->willReturn($dummyMetadata); @@ -462,7 +462,7 @@ private function doTestNormalizeWithNameConverter(bool $legacy = false): void 'definitions' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'properties' => [ 'name' => new \ArrayObject([ @@ -575,7 +575,7 @@ public function testNormalizeWithApiKeysEnabled(): void 'definitions' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'properties' => [ 'name' => new \ArrayObject([ @@ -768,7 +768,7 @@ public function testNormalizeWithOnlyNormalizationGroups(): void 'definitions' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -780,7 +780,7 @@ public function testNormalizeWithOnlyNormalizationGroups(): void ]), $ref => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -968,7 +968,7 @@ public function testNormalizeNotAddExtraBodyParameters(): void 'definitions' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -980,7 +980,7 @@ public function testNormalizeNotAddExtraBodyParameters(): void ]), $ref => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -1069,7 +1069,7 @@ public function testNormalizeWithSwaggerDefinitionName(): void 'definitions' => new \ArrayObject([ 'Dummy-Read' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -1243,7 +1243,7 @@ public function testNormalizeWithOnlyDenormalizationGroups(): void 'definitions' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -1255,7 +1255,7 @@ public function testNormalizeWithOnlyDenormalizationGroups(): void ]), 'Dummy-dummy' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -1431,7 +1431,7 @@ public function testNormalizeWithNormalizationAndDenormalizationGroups(): void 'definitions' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -1443,7 +1443,7 @@ public function testNormalizeWithNormalizationAndDenormalizationGroups(): void ]), 'Dummy-dummy' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -1620,7 +1620,7 @@ public function testNormalizeSkipsNotReadableAndNotWritableProperties(): void 'definitions' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -2014,7 +2014,7 @@ public function testNormalizeWithNestedNormalizationGroups(): void 'definitions' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -2026,7 +2026,7 @@ public function testNormalizeWithNestedNormalizationGroups(): void ]), $ref => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -2042,7 +2042,7 @@ public function testNormalizeWithNestedNormalizationGroups(): void ]), $relatedDummyRef => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a related dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/RelatedDummy'], 'properties' => [ @@ -2152,7 +2152,7 @@ private function doTestNormalizeWithFilters($filterLocator): void 'definitions' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'properties' => [ 'name' => new \ArrayObject([ @@ -2312,7 +2312,7 @@ private function doTestNormalizeWithSubResource(OperationAwareFormatsProviderInt 'definitions' => new \ArrayObject([ 'Question' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a question.', 'externalDocs' => ['url' => 'http://schema.example.com/Question'], 'properties' => [ @@ -2325,7 +2325,7 @@ private function doTestNormalizeWithSubResource(OperationAwareFormatsProviderInt ]), 'Answer' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is an answer.', 'externalDocs' => ['url' => 'http://schema.example.com/Answer'], 'properties' => [ @@ -2409,7 +2409,7 @@ public function testNormalizeWithPropertySwaggerContext(): void 'definitions' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -2510,7 +2510,7 @@ public function testNormalizeWithPaginationClientEnabled(): void 'definitions' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -2706,7 +2706,7 @@ private function doTestNormalizeWithCustomFormatsDefinedAtOperationLevel(Operati 'definitions' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -2915,7 +2915,7 @@ private function doTestNormalizeWithInputAndOutputClass(): void 'definitions' => new \ArrayObject([ 'Dummy:300dcd476cef011532fb0ca7683395d7' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'externalDocs' => [ 'url' => 'http://schema.example.com/Dummy', @@ -2934,7 +2934,7 @@ private function doTestNormalizeWithInputAndOutputClass(): void ]), 'Dummy:b4f76c1a44965bd401aa23bb37618acc' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'externalDocs' => [ 'url' => 'http://schema.example.com/Dummy', diff --git a/tests/Swagger/Serializer/DocumentationNormalizerV3Test.php b/tests/Swagger/Serializer/DocumentationNormalizerV3Test.php index b2e74261ff0..f84946e68fa 100644 --- a/tests/Swagger/Serializer/DocumentationNormalizerV3Test.php +++ b/tests/Swagger/Serializer/DocumentationNormalizerV3Test.php @@ -107,7 +107,7 @@ private function doTestNormalize(OperationMethodResolverInterface $operationMeth 'custom' => ['method' => 'GET', 'path' => '/foo'] + self::OPERATION_FORMATS, 'custom2' => ['method' => 'POST', 'path' => '/foo'] + self::OPERATION_FORMATS, ], - ['pagination_client_items_per_page' => true] + ['pagination_client_items_per_page' => true, 'normalization_context' => [AbstractNormalizer::ALLOW_EXTRA_ATTRIBUTES => false]] ); $resourceMetadataFactoryProphecy = $this->prophesize(ResourceMetadataFactoryInterface::class); $resourceMetadataFactoryProphecy->create(Dummy::class)->willReturn($dummyMetadata); @@ -541,7 +541,7 @@ private function doTestNormalizeWithNameConverter(bool $legacy = false): void 'schemas' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'properties' => [ 'name' => new \ArrayObject([ @@ -676,7 +676,7 @@ public function testNormalizeWithApiKeysEnabled(): void 'schemas' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'properties' => [ 'name' => new \ArrayObject([ @@ -908,7 +908,7 @@ public function testNormalizeWithOnlyNormalizationGroups(): void 'schemas' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -920,7 +920,7 @@ public function testNormalizeWithOnlyNormalizationGroups(): void ]), $ref => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -1032,7 +1032,7 @@ public function testNormalizeWithOpenApiDefinitionName(): void 'schemas' => new \ArrayObject([ 'Dummy-Read' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -1244,7 +1244,7 @@ public function testNormalizeWithOnlyDenormalizationGroups(): void 'schemas' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -1256,7 +1256,7 @@ public function testNormalizeWithOnlyDenormalizationGroups(): void ]), 'Dummy-dummy' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -1469,7 +1469,7 @@ public function testNormalizeWithNormalizationAndDenormalizationGroups(): void 'schemas' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -1481,7 +1481,7 @@ public function testNormalizeWithNormalizationAndDenormalizationGroups(): void ]), 'Dummy-dummy' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -2001,7 +2001,7 @@ public function testNormalizeWithNestedNormalizationGroups(): void 'schemas' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -2013,7 +2013,7 @@ public function testNormalizeWithNestedNormalizationGroups(): void ]), $ref => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -2032,7 +2032,7 @@ public function testNormalizeWithNestedNormalizationGroups(): void ]), $relatedDummyRef => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a related dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/RelatedDummy'], 'properties' => [ @@ -2178,7 +2178,7 @@ private function doTestNormalizeWithFilters($filterLocator): void 'schemas' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'properties' => [ 'name' => new \ArrayObject([ @@ -2351,7 +2351,7 @@ private function doTestNormalizeWithSubResource(OperationAwareFormatsProviderInt 'schemas' => new \ArrayObject([ 'Question' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a question.', 'externalDocs' => ['url' => 'http://schema.example.com/Question'], 'properties' => [ @@ -2364,7 +2364,7 @@ private function doTestNormalizeWithSubResource(OperationAwareFormatsProviderInt ]), 'Answer' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is an answer.', 'externalDocs' => ['url' => 'http://schema.example.com/Answer'], 'properties' => [ @@ -2472,7 +2472,7 @@ public function testNormalizeWithPropertyOpenApiContext(): void 'schemas' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -2600,7 +2600,7 @@ public function testNormalizeWithPaginationClientEnabled(): void 'schemas' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -2734,7 +2734,7 @@ public function testNormalizeWithPaginationCustomDefaultAndMaxItemsPerPage(): vo 'schemas' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -2872,7 +2872,7 @@ public function testLegacyNormalizeWithPaginationCustomDefaultAndMaxItemsPerPage 'schemas' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -3110,7 +3110,7 @@ private function doTestNormalizeWithCustomFormatsDefinedAtOperationLevel(Operati 'schemas' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', - 'additionalProperties' => false, + 'additionalProperties' => true, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ From 90396ead51d7c5cddeeb06bb5ee8b5c02d37f8bc Mon Sep 17 00:00:00 2001 From: soyuka Date: Fri, 13 Nov 2020 13:21:39 +0100 Subject: [PATCH 2/2] fix phpstan --- phpstan.neon.dist | 4 ---- 1 file changed, 4 deletions(-) diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 86461c1a5d0..e371c5b3e98 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -92,10 +92,6 @@ parameters: - message: '#Service "test" is not registered in the container\.#' path: tests/GraphQl/Type/TypesContainerTest.php - # https://github.com/phpstan/phpstan/issues/2999 - - - message: '#ArrayObject does not accept array\.#' - path: src/JsonSchema/SchemaFactory.php # Expected, due to optional interfaces - '#Method ApiPlatform\\Core\\Bridge\\Doctrine\\Orm\\Extension\\QueryCollectionExtensionInterface::applyToCollection\(\) invoked with 5 parameters, 3-4 required\.#'