diff --git a/src/OpenApi/Factory/OpenApiFactory.php b/src/OpenApi/Factory/OpenApiFactory.php index 351b9d68193..5fc35811c59 100644 --- a/src/OpenApi/Factory/OpenApiFactory.php +++ b/src/OpenApi/Factory/OpenApiFactory.php @@ -62,11 +62,12 @@ use Symfony\Component\Routing\RouterInterface; use Symfony\Component\TypeInfo\Type; use Symfony\Component\TypeInfo\TypeIdentifier; +use Symfony\Contracts\Service\ResetInterface; /** * Generates an Open API v3 specification. */ -final class OpenApiFactory implements OpenApiFactoryInterface +final class OpenApiFactory implements OpenApiFactoryInterface, ResetInterface { use NormalizeOperationNameTrait; use StateOptionsTrait; @@ -1065,4 +1066,10 @@ private function getErrorResource(string $error, ?int $status = null, ?string $d return $this->localErrorResourceCache[$error] = $errorResource; } + + public function reset(): void + { + $this->routeCollection = null; + $this->localErrorResourceCache = []; + } } diff --git a/src/OpenApi/Tests/Factory/OpenApiFactoryTest.php b/src/OpenApi/Tests/Factory/OpenApiFactoryTest.php index d8773f8c7a6..9c26b8e971c 100644 --- a/src/OpenApi/Tests/Factory/OpenApiFactoryTest.php +++ b/src/OpenApi/Tests/Factory/OpenApiFactoryTest.php @@ -1438,4 +1438,40 @@ public function testGetExtensionPropertiesWithFalseValue(): void $openApi = $factory->__invoke(); } + + public function testReset(): void + { + $resourceNameCollectionFactory = $this->createMock(ResourceNameCollectionFactoryInterface::class); + $resourceCollectionMetadataFactory = $this->createMock(ResourceMetadataCollectionFactoryInterface::class); + $propertyNameCollectionFactory = $this->createMock(PropertyNameCollectionFactoryInterface::class); + $propertyMetadataFactory = $this->createMock(PropertyMetadataFactoryInterface::class); + $schemaFactory = $this->createMock(\ApiPlatform\JsonSchema\SchemaFactoryInterface::class); + + $factory = new OpenApiFactory( + $resourceNameCollectionFactory, + $resourceCollectionMetadataFactory, + $propertyNameCollectionFactory, + $propertyMetadataFactory, + $schemaFactory + ); + + $refl = new \ReflectionClass($factory); + $routeCollection = $refl->getProperty('routeCollection'); + $routeCollection->setAccessible(true); + if (class_exists(\Symfony\Component\Routing\RouteCollection::class)) { + $routeCollection->setValue($factory, $this->createMock(\Symfony\Component\Routing\RouteCollection::class)); + } + + $localErrorResourceCache = $refl->getProperty('localErrorResourceCache'); + $localErrorResourceCache->setAccessible(true); + $localErrorResourceCache->setValue($factory, ['foo' => 'bar']); + + $this->assertNotNull($routeCollection->getValue($factory)); + $this->assertNotEmpty($localErrorResourceCache->getValue($factory)); + + $factory->reset(); + + $this->assertNull($routeCollection->getValue($factory)); + $this->assertEmpty($localErrorResourceCache->getValue($factory)); + } }