From 78aff1ed72ab28afb7b4e0060c6ce82fbe50415c Mon Sep 17 00:00:00 2001 From: SBNTT Date: Mon, 4 May 2026 15:10:42 +0200 Subject: [PATCH 1/2] nullable enum value --- src/Capability/Discovery/SchemaGenerator.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Capability/Discovery/SchemaGenerator.php b/src/Capability/Discovery/SchemaGenerator.php index 6366fd49..8ca222e3 100644 --- a/src/Capability/Discovery/SchemaGenerator.php +++ b/src/Capability/Discovery/SchemaGenerator.php @@ -375,6 +375,7 @@ private function applyEnumConstraints(array $paramSchema, array $paramInfo): arr if ($jsonBackingType) { if (isset($paramSchema['type']) && \is_array($paramSchema['type']) && \in_array('null', $paramSchema['type'])) { $paramSchema['type'] = ['null', $jsonBackingType]; + $paramSchema['enum'][] = null; } else { $paramSchema['type'] = $jsonBackingType; } @@ -384,6 +385,7 @@ private function applyEnumConstraints(array $paramSchema, array $paramInfo): arr $paramSchema['enum'] = array_column($enumClass::cases(), 'name'); if (isset($paramSchema['type']) && \is_array($paramSchema['type']) && \in_array('null', $paramSchema['type'])) { $paramSchema['type'] = ['null', 'string']; + $paramSchema['enum'][] = null; } else { $paramSchema['type'] = 'string'; } From d1c38a1b47f59f80f638061862d2a63480511777 Mon Sep 17 00:00:00 2001 From: SBNTT Date: Mon, 4 May 2026 15:22:07 +0200 Subject: [PATCH 2/2] fix tests --- src/Capability/Discovery/SchemaGenerator.php | 4 ++-- tests/Unit/Capability/Discovery/SchemaGeneratorTest.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Capability/Discovery/SchemaGenerator.php b/src/Capability/Discovery/SchemaGenerator.php index 8ca222e3..04ee08f6 100644 --- a/src/Capability/Discovery/SchemaGenerator.php +++ b/src/Capability/Discovery/SchemaGenerator.php @@ -374,7 +374,7 @@ private function applyEnumConstraints(array $paramSchema, array $paramInfo): arr if ($jsonBackingType) { if (isset($paramSchema['type']) && \is_array($paramSchema['type']) && \in_array('null', $paramSchema['type'])) { - $paramSchema['type'] = ['null', $jsonBackingType]; + $paramSchema['type'] = [$jsonBackingType, 'null']; $paramSchema['enum'][] = null; } else { $paramSchema['type'] = $jsonBackingType; @@ -384,7 +384,7 @@ private function applyEnumConstraints(array $paramSchema, array $paramInfo): arr // Non-backed enum - use names as enum values $paramSchema['enum'] = array_column($enumClass::cases(), 'name'); if (isset($paramSchema['type']) && \is_array($paramSchema['type']) && \in_array('null', $paramSchema['type'])) { - $paramSchema['type'] = ['null', 'string']; + $paramSchema['type'] = ['string', 'null']; $paramSchema['enum'][] = null; } else { $paramSchema['type'] = 'string'; diff --git a/tests/Unit/Capability/Discovery/SchemaGeneratorTest.php b/tests/Unit/Capability/Discovery/SchemaGeneratorTest.php index 299e9854..c92121e6 100644 --- a/tests/Unit/Capability/Discovery/SchemaGeneratorTest.php +++ b/tests/Unit/Capability/Discovery/SchemaGeneratorTest.php @@ -197,7 +197,7 @@ public function testGeneratesCorrectSchemaForEnumParameters(): void $this->assertEquals(['type' => 'string', 'description' => 'Backed string enum', 'enum' => ['A', 'B']], $schema['properties']['stringEnum']); $this->assertEquals(['type' => 'integer', 'description' => 'Backed int enum', 'enum' => [1, 2]], $schema['properties']['intEnum']); $this->assertEquals(['type' => 'string', 'description' => 'Unit enum', 'enum' => ['Yes', 'No']], $schema['properties']['unitEnum']); - $this->assertEquals(['type' => ['null', 'string'], 'enum' => ['A', 'B'], 'default' => null], $schema['properties']['nullableEnum']); + $this->assertEquals(['type' => ['string', 'null'], 'enum' => ['A', 'B', null], 'default' => null], $schema['properties']['nullableEnum']); $this->assertEquals(['type' => 'integer', 'enum' => [1, 2], 'default' => 1], $schema['properties']['enumWithDefault']); $this->assertEqualsCanonicalizing(['stringEnum', 'intEnum', 'unitEnum'], $schema['required']); }