diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 69217f5e5bd..aefdb545835 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -96,13 +96,7 @@ parameters: path: tests/GraphQl/Type/TypesContainerTest.php # https://github.com/phpstan/phpstan/issues/2999 - - message: '#ArrayObject does not accept true\.#' - path: src/JsonSchema/SchemaFactory.php - - - message: '#ArrayObject does not accept array\.#' - path: src/JsonSchema/SchemaFactory.php - - - message: '#Cannot assign new offset to string\.#' + message: '#ArrayObject does not accept array\.#' path: src/JsonSchema/SchemaFactory.php # Expected, due to optional interfaces diff --git a/src/JsonSchema/SchemaFactory.php b/src/JsonSchema/SchemaFactory.php index 9594361fc7a..8e4320300cb 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']); + $definition = new \ArrayObject(['type' => 'object', 'additionalProperties' => false]); $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 dac6a5340e6..be01a6a3b83 100644 --- a/tests/JsonSchema/SchemaFactoryTest.php +++ b/tests/JsonSchema/SchemaFactoryTest.php @@ -73,6 +73,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->assertArrayHasKey('properties', $definitions[$rootDefinitionKey]); $this->assertArrayHasKey('foo', $definitions[$rootDefinitionKey]['properties']); $this->assertArrayHasKey('type', $definitions[$rootDefinitionKey]['properties']['foo']); @@ -136,6 +137,7 @@ public function testBuildSchemaForOperationWithOverriddenSerializerGroups(): voi $this->assertArrayHasKey($rootDefinitionKey, $definitions); $this->assertArrayHasKey('type', $definitions[$rootDefinitionKey]); $this->assertSame('object', $definitions[$rootDefinitionKey]['type']); + $this->assertFalse($definitions[$rootDefinitionKey]['additionalProperties']); $this->assertArrayHasKey('properties', $definitions[$rootDefinitionKey]); $this->assertArrayHasKey('alias', $definitions[$rootDefinitionKey]['properties']); $this->assertArrayHasKey('type', $definitions[$rootDefinitionKey]['properties']['alias']); diff --git a/tests/Swagger/Serializer/DocumentationNormalizerV2Test.php b/tests/Swagger/Serializer/DocumentationNormalizerV2Test.php index d8cf191e1d1..e6b37bf3240 100644 --- a/tests/Swagger/Serializer/DocumentationNormalizerV2Test.php +++ b/tests/Swagger/Serializer/DocumentationNormalizerV2Test.php @@ -327,6 +327,7 @@ private function doTestNormalize(OperationMethodResolverInterface $operationMeth 'definitions' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -461,6 +462,7 @@ private function doTestNormalizeWithNameConverter(bool $legacy = false): void 'definitions' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'properties' => [ 'name' => new \ArrayObject([ @@ -573,6 +575,7 @@ public function testNormalizeWithApiKeysEnabled(): void 'definitions' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'properties' => [ 'name' => new \ArrayObject([ @@ -765,6 +768,7 @@ public function testNormalizeWithOnlyNormalizationGroups(): void 'definitions' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -776,6 +780,7 @@ public function testNormalizeWithOnlyNormalizationGroups(): void ]), $ref => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -963,6 +968,7 @@ public function testNormalizeNotAddExtraBodyParameters(): void 'definitions' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -974,6 +980,7 @@ public function testNormalizeNotAddExtraBodyParameters(): void ]), $ref => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -1062,6 +1069,7 @@ public function testNormalizeWithSwaggerDefinitionName(): void 'definitions' => new \ArrayObject([ 'Dummy-Read' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -1235,6 +1243,7 @@ public function testNormalizeWithOnlyDenormalizationGroups(): void 'definitions' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -1246,6 +1255,7 @@ public function testNormalizeWithOnlyDenormalizationGroups(): void ]), 'Dummy-dummy' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -1421,6 +1431,7 @@ public function testNormalizeWithNormalizationAndDenormalizationGroups(): void 'definitions' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -1432,6 +1443,7 @@ public function testNormalizeWithNormalizationAndDenormalizationGroups(): void ]), 'Dummy-dummy' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -1608,6 +1620,7 @@ public function testNormalizeSkipsNotReadableAndNotWritableProperties(): void 'definitions' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -2001,6 +2014,7 @@ public function testNormalizeWithNestedNormalizationGroups(): void 'definitions' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -2012,6 +2026,7 @@ public function testNormalizeWithNestedNormalizationGroups(): void ]), $ref => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -2027,6 +2042,7 @@ public function testNormalizeWithNestedNormalizationGroups(): void ]), $relatedDummyRef => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a related dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/RelatedDummy'], 'properties' => [ @@ -2136,6 +2152,7 @@ private function doTestNormalizeWithFilters($filterLocator): void 'definitions' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'properties' => [ 'name' => new \ArrayObject([ @@ -2295,6 +2312,7 @@ private function doTestNormalizeWithSubResource(OperationAwareFormatsProviderInt 'definitions' => new \ArrayObject([ 'Question' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a question.', 'externalDocs' => ['url' => 'http://schema.example.com/Question'], 'properties' => [ @@ -2307,6 +2325,7 @@ private function doTestNormalizeWithSubResource(OperationAwareFormatsProviderInt ]), 'Answer' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is an answer.', 'externalDocs' => ['url' => 'http://schema.example.com/Answer'], 'properties' => [ @@ -2390,6 +2409,7 @@ public function testNormalizeWithPropertySwaggerContext(): void 'definitions' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -2490,6 +2510,7 @@ public function testNormalizeWithPaginationClientEnabled(): void 'definitions' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -2685,6 +2706,7 @@ private function doTestNormalizeWithCustomFormatsDefinedAtOperationLevel(Operati 'definitions' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -2893,6 +2915,7 @@ private function doTestNormalizeWithInputAndOutputClass(): void 'definitions' => new \ArrayObject([ 'Dummy:300dcd476cef011532fb0ca7683395d7' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'externalDocs' => [ 'url' => 'http://schema.example.com/Dummy', @@ -2911,6 +2934,7 @@ private function doTestNormalizeWithInputAndOutputClass(): void ]), 'Dummy:b4f76c1a44965bd401aa23bb37618acc' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, '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 be1c76e45f1..b2e74261ff0 100644 --- a/tests/Swagger/Serializer/DocumentationNormalizerV3Test.php +++ b/tests/Swagger/Serializer/DocumentationNormalizerV3Test.php @@ -370,6 +370,7 @@ private function doTestNormalize(OperationMethodResolverInterface $operationMeth 'schemas' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -540,6 +541,7 @@ private function doTestNormalizeWithNameConverter(bool $legacy = false): void 'schemas' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'properties' => [ 'name' => new \ArrayObject([ @@ -674,6 +676,7 @@ public function testNormalizeWithApiKeysEnabled(): void 'schemas' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'properties' => [ 'name' => new \ArrayObject([ @@ -905,6 +908,7 @@ public function testNormalizeWithOnlyNormalizationGroups(): void 'schemas' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -916,6 +920,7 @@ public function testNormalizeWithOnlyNormalizationGroups(): void ]), $ref => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -1027,6 +1032,7 @@ public function testNormalizeWithOpenApiDefinitionName(): void 'schemas' => new \ArrayObject([ 'Dummy-Read' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -1238,6 +1244,7 @@ public function testNormalizeWithOnlyDenormalizationGroups(): void 'schemas' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -1249,6 +1256,7 @@ public function testNormalizeWithOnlyDenormalizationGroups(): void ]), 'Dummy-dummy' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -1461,6 +1469,7 @@ public function testNormalizeWithNormalizationAndDenormalizationGroups(): void 'schemas' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -1472,6 +1481,7 @@ public function testNormalizeWithNormalizationAndDenormalizationGroups(): void ]), 'Dummy-dummy' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -1991,6 +2001,7 @@ public function testNormalizeWithNestedNormalizationGroups(): void 'schemas' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -2002,6 +2013,7 @@ public function testNormalizeWithNestedNormalizationGroups(): void ]), $ref => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -2020,6 +2032,7 @@ public function testNormalizeWithNestedNormalizationGroups(): void ]), $relatedDummyRef => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a related dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/RelatedDummy'], 'properties' => [ @@ -2165,6 +2178,7 @@ private function doTestNormalizeWithFilters($filterLocator): void 'schemas' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'properties' => [ 'name' => new \ArrayObject([ @@ -2337,6 +2351,7 @@ private function doTestNormalizeWithSubResource(OperationAwareFormatsProviderInt 'schemas' => new \ArrayObject([ 'Question' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a question.', 'externalDocs' => ['url' => 'http://schema.example.com/Question'], 'properties' => [ @@ -2349,6 +2364,7 @@ private function doTestNormalizeWithSubResource(OperationAwareFormatsProviderInt ]), 'Answer' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is an answer.', 'externalDocs' => ['url' => 'http://schema.example.com/Answer'], 'properties' => [ @@ -2456,6 +2472,7 @@ public function testNormalizeWithPropertyOpenApiContext(): void 'schemas' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -2583,6 +2600,7 @@ public function testNormalizeWithPaginationClientEnabled(): void 'schemas' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -2716,6 +2734,7 @@ public function testNormalizeWithPaginationCustomDefaultAndMaxItemsPerPage(): vo 'schemas' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -2853,6 +2872,7 @@ public function testLegacyNormalizeWithPaginationCustomDefaultAndMaxItemsPerPage 'schemas' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [ @@ -3090,6 +3110,7 @@ private function doTestNormalizeWithCustomFormatsDefinedAtOperationLevel(Operati 'schemas' => new \ArrayObject([ 'Dummy' => new \ArrayObject([ 'type' => 'object', + 'additionalProperties' => false, 'description' => 'This is a dummy.', 'externalDocs' => ['url' => 'http://schema.example.com/Dummy'], 'properties' => [