Skip to content

Commit 3a3c2ef

Browse files
committed
fix: add additionalProperties (false) to the generated JSON schema
1 parent f07b2f6 commit 3a3c2ef

File tree

5 files changed

+49
-8
lines changed

5 files changed

+49
-8
lines changed

phpstan.neon.dist

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -96,13 +96,7 @@ parameters:
9696
path: tests/GraphQl/Type/TypesContainerTest.php
9797
# https://github.com/phpstan/phpstan/issues/2999
9898
-
99-
message: '#ArrayObject<string, string> does not accept true\.#'
100-
path: src/JsonSchema/SchemaFactory.php
101-
-
102-
message: '#ArrayObject<string, string> does not accept array<string, mixed>\.#'
103-
path: src/JsonSchema/SchemaFactory.php
104-
-
105-
message: '#Cannot assign new offset to string\.#'
99+
message: '#ArrayObject<string, bool\|string> does not accept array<string, mixed>\.#'
106100
path: src/JsonSchema/SchemaFactory.php
107101

108102
# Expected, due to optional interfaces

src/JsonSchema/SchemaFactory.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ public function buildSchema(string $className, string $format = 'json', string $
109109
return $schema;
110110
}
111111

112-
$definition = new \ArrayObject(['type' => 'object']);
112+
$definition = new \ArrayObject(['type' => 'object', 'additionalProperties' => false]);
113113
$definitions[$definitionName] = $definition;
114114
if (null !== $resourceMetadata && null !== $description = $resourceMetadata->getDescription()) {
115115
$definition['description'] = $description;

tests/JsonSchema/SchemaFactoryTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ public function testBuildSchemaForNonResourceClass(): void
7373
$this->assertArrayHasKey($rootDefinitionKey, $definitions);
7474
$this->assertArrayHasKey('type', $definitions[$rootDefinitionKey]);
7575
$this->assertSame('object', $definitions[$rootDefinitionKey]['type']);
76+
$this->assertFalse($definitions[$rootDefinitionKey]['additionalProperties']);
7677
$this->assertArrayHasKey('properties', $definitions[$rootDefinitionKey]);
7778
$this->assertArrayHasKey('foo', $definitions[$rootDefinitionKey]['properties']);
7879
$this->assertArrayHasKey('type', $definitions[$rootDefinitionKey]['properties']['foo']);
@@ -136,6 +137,7 @@ public function testBuildSchemaForOperationWithOverriddenSerializerGroups(): voi
136137
$this->assertArrayHasKey($rootDefinitionKey, $definitions);
137138
$this->assertArrayHasKey('type', $definitions[$rootDefinitionKey]);
138139
$this->assertSame('object', $definitions[$rootDefinitionKey]['type']);
140+
$this->assertFalse($definitions[$rootDefinitionKey]['additionalProperties']);
139141
$this->assertArrayHasKey('properties', $definitions[$rootDefinitionKey]);
140142
$this->assertArrayHasKey('alias', $definitions[$rootDefinitionKey]['properties']);
141143
$this->assertArrayHasKey('type', $definitions[$rootDefinitionKey]['properties']['alias']);

tests/Swagger/Serializer/DocumentationNormalizerV2Test.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,7 @@ private function doTestNormalize(OperationMethodResolverInterface $operationMeth
327327
'definitions' => new \ArrayObject([
328328
'Dummy' => new \ArrayObject([
329329
'type' => 'object',
330+
'additionalProperties' => false,
330331
'description' => 'This is a dummy.',
331332
'externalDocs' => ['url' => 'http://schema.example.com/Dummy'],
332333
'properties' => [
@@ -461,6 +462,7 @@ private function doTestNormalizeWithNameConverter(bool $legacy = false): void
461462
'definitions' => new \ArrayObject([
462463
'Dummy' => new \ArrayObject([
463464
'type' => 'object',
465+
'additionalProperties' => false,
464466
'description' => 'This is a dummy.',
465467
'properties' => [
466468
'name' => new \ArrayObject([
@@ -573,6 +575,7 @@ public function testNormalizeWithApiKeysEnabled(): void
573575
'definitions' => new \ArrayObject([
574576
'Dummy' => new \ArrayObject([
575577
'type' => 'object',
578+
'additionalProperties' => false,
576579
'description' => 'This is a dummy.',
577580
'properties' => [
578581
'name' => new \ArrayObject([
@@ -765,6 +768,7 @@ public function testNormalizeWithOnlyNormalizationGroups(): void
765768
'definitions' => new \ArrayObject([
766769
'Dummy' => new \ArrayObject([
767770
'type' => 'object',
771+
'additionalProperties' => false,
768772
'description' => 'This is a dummy.',
769773
'externalDocs' => ['url' => 'http://schema.example.com/Dummy'],
770774
'properties' => [
@@ -776,6 +780,7 @@ public function testNormalizeWithOnlyNormalizationGroups(): void
776780
]),
777781
$ref => new \ArrayObject([
778782
'type' => 'object',
783+
'additionalProperties' => false,
779784
'description' => 'This is a dummy.',
780785
'externalDocs' => ['url' => 'http://schema.example.com/Dummy'],
781786
'properties' => [
@@ -963,6 +968,7 @@ public function testNormalizeNotAddExtraBodyParameters(): void
963968
'definitions' => new \ArrayObject([
964969
'Dummy' => new \ArrayObject([
965970
'type' => 'object',
971+
'additionalProperties' => false,
966972
'description' => 'This is a dummy.',
967973
'externalDocs' => ['url' => 'http://schema.example.com/Dummy'],
968974
'properties' => [
@@ -974,6 +980,7 @@ public function testNormalizeNotAddExtraBodyParameters(): void
974980
]),
975981
$ref => new \ArrayObject([
976982
'type' => 'object',
983+
'additionalProperties' => false,
977984
'description' => 'This is a dummy.',
978985
'externalDocs' => ['url' => 'http://schema.example.com/Dummy'],
979986
'properties' => [
@@ -1062,6 +1069,7 @@ public function testNormalizeWithSwaggerDefinitionName(): void
10621069
'definitions' => new \ArrayObject([
10631070
'Dummy-Read' => new \ArrayObject([
10641071
'type' => 'object',
1072+
'additionalProperties' => false,
10651073
'description' => 'This is a dummy.',
10661074
'externalDocs' => ['url' => 'http://schema.example.com/Dummy'],
10671075
'properties' => [
@@ -1235,6 +1243,7 @@ public function testNormalizeWithOnlyDenormalizationGroups(): void
12351243
'definitions' => new \ArrayObject([
12361244
'Dummy' => new \ArrayObject([
12371245
'type' => 'object',
1246+
'additionalProperties' => false,
12381247
'description' => 'This is a dummy.',
12391248
'externalDocs' => ['url' => 'http://schema.example.com/Dummy'],
12401249
'properties' => [
@@ -1246,6 +1255,7 @@ public function testNormalizeWithOnlyDenormalizationGroups(): void
12461255
]),
12471256
'Dummy-dummy' => new \ArrayObject([
12481257
'type' => 'object',
1258+
'additionalProperties' => false,
12491259
'description' => 'This is a dummy.',
12501260
'externalDocs' => ['url' => 'http://schema.example.com/Dummy'],
12511261
'properties' => [
@@ -1421,6 +1431,7 @@ public function testNormalizeWithNormalizationAndDenormalizationGroups(): void
14211431
'definitions' => new \ArrayObject([
14221432
'Dummy' => new \ArrayObject([
14231433
'type' => 'object',
1434+
'additionalProperties' => false,
14241435
'description' => 'This is a dummy.',
14251436
'externalDocs' => ['url' => 'http://schema.example.com/Dummy'],
14261437
'properties' => [
@@ -1432,6 +1443,7 @@ public function testNormalizeWithNormalizationAndDenormalizationGroups(): void
14321443
]),
14331444
'Dummy-dummy' => new \ArrayObject([
14341445
'type' => 'object',
1446+
'additionalProperties' => false,
14351447
'description' => 'This is a dummy.',
14361448
'externalDocs' => ['url' => 'http://schema.example.com/Dummy'],
14371449
'properties' => [
@@ -1608,6 +1620,7 @@ public function testNormalizeSkipsNotReadableAndNotWritableProperties(): void
16081620
'definitions' => new \ArrayObject([
16091621
'Dummy' => new \ArrayObject([
16101622
'type' => 'object',
1623+
'additionalProperties' => false,
16111624
'description' => 'This is a dummy.',
16121625
'externalDocs' => ['url' => 'http://schema.example.com/Dummy'],
16131626
'properties' => [
@@ -2001,6 +2014,7 @@ public function testNormalizeWithNestedNormalizationGroups(): void
20012014
'definitions' => new \ArrayObject([
20022015
'Dummy' => new \ArrayObject([
20032016
'type' => 'object',
2017+
'additionalProperties' => false,
20042018
'description' => 'This is a dummy.',
20052019
'externalDocs' => ['url' => 'http://schema.example.com/Dummy'],
20062020
'properties' => [
@@ -2012,6 +2026,7 @@ public function testNormalizeWithNestedNormalizationGroups(): void
20122026
]),
20132027
$ref => new \ArrayObject([
20142028
'type' => 'object',
2029+
'additionalProperties' => false,
20152030
'description' => 'This is a dummy.',
20162031
'externalDocs' => ['url' => 'http://schema.example.com/Dummy'],
20172032
'properties' => [
@@ -2027,6 +2042,7 @@ public function testNormalizeWithNestedNormalizationGroups(): void
20272042
]),
20282043
$relatedDummyRef => new \ArrayObject([
20292044
'type' => 'object',
2045+
'additionalProperties' => false,
20302046
'description' => 'This is a related dummy.',
20312047
'externalDocs' => ['url' => 'http://schema.example.com/RelatedDummy'],
20322048
'properties' => [
@@ -2136,6 +2152,7 @@ private function doTestNormalizeWithFilters($filterLocator): void
21362152
'definitions' => new \ArrayObject([
21372153
'Dummy' => new \ArrayObject([
21382154
'type' => 'object',
2155+
'additionalProperties' => false,
21392156
'description' => 'This is a dummy.',
21402157
'properties' => [
21412158
'name' => new \ArrayObject([
@@ -2295,6 +2312,7 @@ private function doTestNormalizeWithSubResource(OperationAwareFormatsProviderInt
22952312
'definitions' => new \ArrayObject([
22962313
'Question' => new \ArrayObject([
22972314
'type' => 'object',
2315+
'additionalProperties' => false,
22982316
'description' => 'This is a question.',
22992317
'externalDocs' => ['url' => 'http://schema.example.com/Question'],
23002318
'properties' => [
@@ -2307,6 +2325,7 @@ private function doTestNormalizeWithSubResource(OperationAwareFormatsProviderInt
23072325
]),
23082326
'Answer' => new \ArrayObject([
23092327
'type' => 'object',
2328+
'additionalProperties' => false,
23102329
'description' => 'This is an answer.',
23112330
'externalDocs' => ['url' => 'http://schema.example.com/Answer'],
23122331
'properties' => [
@@ -2390,6 +2409,7 @@ public function testNormalizeWithPropertySwaggerContext(): void
23902409
'definitions' => new \ArrayObject([
23912410
'Dummy' => new \ArrayObject([
23922411
'type' => 'object',
2412+
'additionalProperties' => false,
23932413
'description' => 'This is a dummy.',
23942414
'externalDocs' => ['url' => 'http://schema.example.com/Dummy'],
23952415
'properties' => [
@@ -2490,6 +2510,7 @@ public function testNormalizeWithPaginationClientEnabled(): void
24902510
'definitions' => new \ArrayObject([
24912511
'Dummy' => new \ArrayObject([
24922512
'type' => 'object',
2513+
'additionalProperties' => false,
24932514
'description' => 'This is a dummy.',
24942515
'externalDocs' => ['url' => 'http://schema.example.com/Dummy'],
24952516
'properties' => [
@@ -2685,6 +2706,7 @@ private function doTestNormalizeWithCustomFormatsDefinedAtOperationLevel(Operati
26852706
'definitions' => new \ArrayObject([
26862707
'Dummy' => new \ArrayObject([
26872708
'type' => 'object',
2709+
'additionalProperties' => false,
26882710
'description' => 'This is a dummy.',
26892711
'externalDocs' => ['url' => 'http://schema.example.com/Dummy'],
26902712
'properties' => [
@@ -2893,6 +2915,7 @@ private function doTestNormalizeWithInputAndOutputClass(): void
28932915
'definitions' => new \ArrayObject([
28942916
'Dummy:300dcd476cef011532fb0ca7683395d7' => new \ArrayObject([
28952917
'type' => 'object',
2918+
'additionalProperties' => false,
28962919
'description' => 'This is a dummy.',
28972920
'externalDocs' => [
28982921
'url' => 'http://schema.example.com/Dummy',
@@ -2911,6 +2934,7 @@ private function doTestNormalizeWithInputAndOutputClass(): void
29112934
]),
29122935
'Dummy:b4f76c1a44965bd401aa23bb37618acc' => new \ArrayObject([
29132936
'type' => 'object',
2937+
'additionalProperties' => false,
29142938
'description' => 'This is a dummy.',
29152939
'externalDocs' => [
29162940
'url' => 'http://schema.example.com/Dummy',

0 commit comments

Comments
 (0)