@@ -216,14 +216,20 @@ public void testPetstoreDottedEnumRefQueryParameterUsesShortClassInApiInterface(
216216 Assert .assertTrue (
217217 apiContent .contains ("use Org\\ OpenAPITools\\ Petstore\\ Model\\ PetModelPetStatus;" ),
218218 "Expected enum model import" );
219- // Optional enum ref may carry an OpenAPI default: php-symfony api.mustache omits leading "?" / "|null" when
220- // defaultValue is set (handler always receives the enum after the controller applies the default) .
219+ // This spec sets default: available on the enum $ ref; the handler must be non-nullable (no leading "?" /
220+ // "|null") because the controller always supplies a value after applying the OpenAPI default.
221221 Assert .assertTrue (
222- Pattern .compile ("public function listPets\\ (\\ s*\\ ??PetModelPetStatus\\ s+\\ $status," ).matcher (apiContent ).find (),
223- "Expected enum ref query param to use short class in type hint" );
222+ Pattern .compile ("public function listPets\\ (\\ s*PetModelPetStatus\\ s+\\ $status," ).matcher (apiContent ).find (),
223+ "Expected defaulted enum-ref query param to use short non-nullable class in type hint" );
224+ Assert .assertFalse (
225+ Pattern .compile ("public function listPets\\ (\\ s*\\ ?PetModelPetStatus\\ s+\\ $status" ).matcher (apiContent ).find (),
226+ "Defaulted enum-ref query param must not use nullable type hint (?PetModelPetStatus)" );
224227 Assert .assertTrue (
225- Pattern .compile ("@param\\ s+PetModelPetStatus(\\ |null)?\\ s+\\ $status\\ b" ).matcher (apiContent ).find (),
226- "PHPDoc @param should use short PetModelPetStatus (optional |null when no default in spec)" );
228+ Pattern .compile ("@param\\ s+PetModelPetStatus\\ s+\\ $status\\ b" ).matcher (apiContent ).find (),
229+ "PHPDoc @param should use short PetModelPetStatus without |null when OpenAPI default is set" );
230+ Assert .assertFalse (
231+ Pattern .compile ("@param\\ s+PetModelPetStatus\\ |null\\ s+\\ $status\\ b" ).matcher (apiContent ).find (),
232+ "PHPDoc must not document |null for enum ref when OpenAPI default is set" );
227233 Assert .assertFalse (
228234 apiContent .contains ("?\\ Org\\ OpenAPITools\\ Petstore\\ Model\\ PetModelPetStatus $status" ),
229235 "Signature must not use leading-backslash FQCN when a matching use import exists" );
@@ -275,6 +281,25 @@ public void testOptionalEnumRefQueryParameterWithDefaultAppliesOpenApiSemantics(
275281 DefaultGenerator generator = new DefaultGenerator ();
276282 List <File > files = generator .opts (clientOptInput ).generate ();
277283
284+ File apiInterfaceFile = files .stream ()
285+ .filter (f -> "DefaultApiInterface.php" .equals (f .getName ()) && f .getPath ().contains ("Api" + File .separator ))
286+ .findFirst ()
287+ .orElseThrow (() -> new AssertionError ("DefaultApiInterface.php not generated" ));
288+ String apiContent = Files .readString (apiInterfaceFile .toPath (), StandardCharsets .UTF_8 );
289+ Assert .assertTrue (
290+ Pattern .compile ("public function listFeedHints\\ (\\ s*PetAnnouncementTone\\ s+\\ $tone," ).matcher (apiContent ).find (),
291+ "Expected defaulted enum-ref query param to use short non-nullable class in API interface type hint" );
292+ Assert .assertFalse (
293+ Pattern .compile ("public function listFeedHints\\ (\\ s*\\ ?PetAnnouncementTone\\ s+\\ $tone" ).matcher (apiContent ).find (),
294+ "Defaulted enum-ref query param must not use nullable type hint (?PetAnnouncementTone)" );
295+ Assert .assertTrue (
296+ Pattern .compile ("@param\\ s+PetAnnouncementTone\\ s+\\ $tone\\ b" ).matcher (apiContent ).find (),
297+ "PHPDoc @param should use PetAnnouncementTone without |null when OpenAPI default is set" );
298+ Assert .assertFalse (
299+ Pattern .compile ("@param\\ s+PetAnnouncementTone\\ |null\\ s+\\ $tone\\ b" ).matcher (apiContent ).find (),
300+ "PHPDoc must not document |null for enum ref when OpenAPI default is set" );
301+ assertGeneratedPhpSyntaxValid (apiInterfaceFile );
302+
278303 File controllerFile = files .stream ()
279304 .filter (f -> "DefaultController.php" .equals (f .getName ()) && f .getPath ().contains ("Controller" + File .separator ))
280305 .findFirst ()
0 commit comments