diff --git a/src/OpenApiRouteLoader.php b/src/OpenApiRouteLoader.php index 97c8475..d51de8e 100644 --- a/src/OpenApiRouteLoader.php +++ b/src/OpenApiRouteLoader.php @@ -4,9 +4,6 @@ namespace Tobion\OpenApiSymfonyRouting; -use OpenApi\Analysers\AttributeAnnotationFactory; -use OpenApi\Analysers\DocBlockAnnotationFactory; -use OpenApi\Analysers\ReflectionAnalyser; use OpenApi\Analysis; use OpenApi\Annotations\OpenApi; use OpenApi\Annotations\Operation; @@ -30,6 +27,11 @@ class OpenApiRouteLoader implements RouteLoaderInterface */ private $routeNames = []; + /** + * @var null|Generator + */ + private $generator = null; + /** * @var string */ @@ -89,16 +91,33 @@ private function createOpenApi(): OpenApi return \OpenApi\scan($this->finder); } + if (null !== $this->generator) { + return $this->generator->generate($this>finder); + } + if (method_exists(Analysis::class, 'processors')) { $processors = array_filter(Analysis::processors(), static function ($processor): bool { // remove OperationId processor which would hash the controller starting in 3.2.2 breaking the default route name logic return !$processor instanceof OperationId && !$processor instanceof DocBlockDescriptions; }); - return (new Generator())->setProcessors($processors)->generate($this->finder); + $this->generator = (new Generator())->setProcessors($processors); + + return $this->generator->generate($this->finder); } - return (new Generator())->generate($this->finder); + $this->generator = new Generator(); + $processors = $this->generator->getProcessors(); + + foreach ($processors as $key => $processor) { + if ($processor instanceof OperationId) { + unset($processors[$key]); + } + } + + $this->generator->setProcessors($processors); + + return $this->generator->generate($this->finder); } /** diff --git a/tests/Annotations/OpenApiRouteLoaderAnnotationsTest.php b/tests/Annotations/OpenApiRouteLoaderAnnotationsTest.php index e75a448..0680c30 100644 --- a/tests/Annotations/OpenApiRouteLoaderAnnotationsTest.php +++ b/tests/Annotations/OpenApiRouteLoaderAnnotationsTest.php @@ -22,7 +22,7 @@ class OpenApiRouteLoaderAnnotationsTest extends TestCase { - private const FIXTURES_ROUTE_NAME_PREFIX = 'tobion_openapisymfonyrouting_tests_fixtures_annotations_'; + private const FIXTURES_ROUTE_NAME_PREFIX = 'tobion_openapisymfonyrouting_tests_annotations_fixtures_'; public function testBasic(): void { @@ -30,14 +30,13 @@ public function testBasic(): void $routes = $routeLoader->__invoke(); - foreach ($routes as $route) { - $this->assertEquals( - $route, - (new Route('/foobar')) - ->setMethods('GET') - ->setDefault('_controller', BasicController::class.'::__invoke') - ); - } + $expectedRoutes = new RouteCollection(); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'basic__invoke', + (new Route('/foobar'))->setMethods('GET')->setDefault('_controller', BasicController::class.'::__invoke') + ); + + self::assertEquals($expectedRoutes, $routes); } public function testFormatSuffix(): void @@ -46,24 +45,21 @@ public function testFormatSuffix(): void $routes = $routeLoader->__invoke(); - $expectedRoutes = []; - $expectedRoutes[] = (new Route('/a.{_format}')) - ->setDefault('_format', null) - ->setMethods('GET') - ->setDefault('_controller', FormatSuffixController::class.'::inheritEnabledFormatSuffix'); - $expectedRoutes[] = (new Route('/b.{_format}')) - ->setDefault('_format', null) - ->setRequirement('_format', 'json|xml') - ->setMethods('GET') - ->setDefault('_controller', FormatSuffixController::class.'::defineFormatPattern'); - $expectedRoutes[] = (new Route('/c')) - ->setMethods('GET') - ->setDefault('_controller', FormatSuffixController::class.'::disableFormatSuffix'); - - $index = 0; - foreach ($routes as $route) { - $this->assertEquals($route, $expectedRoutes[$index++]); - } + $expectedRoutes = new RouteCollection(); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'formatsuffix_inheritenabledformatsuffix', + (new Route('/a.{_format}'))->setDefault('_format', null)->setMethods('GET')->setDefault('_controller', FormatSuffixController::class.'::inheritEnabledFormatSuffix') + ); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'formatsuffix_defineformatpattern', + (new Route('/b.{_format}'))->setDefault('_format', null)->setRequirement('_format', 'json|xml')->setMethods('GET')->setDefault('_controller', FormatSuffixController::class.'::defineFormatPattern') + ); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'formatsuffix_disableformatsuffix', + (new Route('/c'))->setMethods('GET')->setDefault('_controller', FormatSuffixController::class.'::disableFormatSuffix') + ); + + self::assertEquals($expectedRoutes, $routes); } public function testOperationId(): void @@ -87,22 +83,22 @@ public function testPathParameterPattern(): void $routes = $routeLoader->__invoke(); - $expectedRoutes = []; - $expectedRoutes[] = (new Route('/foo/{id}')) - ->setMethods('GET') - ->setDefault('_controller', PathParameterPatternController::class.'::noPattern'); - $expectedRoutes[] = (new Route('/baz/{id}')) - ->setMethods('GET') - ->setDefault('_controller', PathParameterPatternController::class.'::noSchema'); - $expectedRoutes[] = (new Route('/bar/{id}')) - ->setRequirement('id', '^[a-zA-Z0-9]+$') - ->setMethods('GET') - ->setDefault('_controller', PathParameterPatternController::class.'::withPattern'); - - $index = 0; - foreach ($routes as $route) { - $this->assertEquals($route, $expectedRoutes[$index++]); - } + $expectedRoutes = new RouteCollection(); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'pathparameterpattern_nopattern', + (new Route('/foo/{id}'))->setMethods('GET')->setDefault('_controller', PathParameterPatternController::class.'::noPattern') + ); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'pathparameterpattern_noschema', + (new Route('/baz/{id}'))->setMethods('GET')->setDefault('_controller', PathParameterPatternController::class.'::noSchema') + ); + // OpenAPI needs the param pattern to be anchored (^$) to have the desired effect. Symfony automatically trims those to get a valid full path regex. + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'pathparameterpattern_withpattern', + (new Route('/bar/{id}'))->setRequirement('id', '^[a-zA-Z0-9]+$')->setMethods('GET')->setDefault('_controller', PathParameterPatternController::class.'::withPattern') + ); + + self::assertEquals($expectedRoutes, $routes); } public function testPriority(): void @@ -111,21 +107,23 @@ public function testPriority(): void $routes = $routeLoader->__invoke(); - $expectedRoutes = []; - $expectedRoutes['/bar'] = (new Route('/bar')) - ->setMethods('GET') - ->setDefault('_controller', PriorityController::class.'::bar'); - $expectedRoutes['/foo'] = (new Route('/foo')) - ->setMethods('GET') - ->setDefault('_controller', PriorityController::class.'::foo'); - $expectedRoutes['/{catchall}'] = (new Route('/{catchall}')) - ->setMethods('GET') - ->setDefault('_controller', PriorityController::class.'::catchall'); - - foreach ($routes as $route) { - $this->assertArrayHasKey($route->getPath(), $expectedRoutes); - $this->assertEquals($route, $expectedRoutes[$route->getPath()]); - } + $expectedRoutes = new RouteCollection(); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'priority_foo', + (new Route('/foo'))->setMethods('GET')->setDefault('_controller', PriorityController::class.'::foo') + ); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'priority_catchall', + (new Route('/{catchall}'))->setMethods('GET')->setDefault('_controller', PriorityController::class.'::catchall'), + -100 + ); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'priority_bar', + (new Route('/bar'))->setMethods('GET')->setDefault('_controller', PriorityController::class.'::bar'), + 10 + ); + + self::assertEquals($expectedRoutes, $routes); } public function testSeveralClasses(): void @@ -134,21 +132,21 @@ public function testSeveralClasses(): void $routes = $routeLoader->__invoke(); - $expectedRoutes = []; - $expectedRoutes[] = (new Route('/bar')) - ->setMethods('GET') - ->setDefault('_controller', BarController::class.'::__invoke'); - $expectedRoutes[] = (new Route('/foo')) - ->setMethods('GET') - ->setDefault('_controller', FooController::class.'::__invoke'); - $expectedRoutes[] = (new Route('/sub')) - ->setMethods('GET') - ->setDefault('_controller', SubController::class.'::__invoke'); - - $index = 0; - foreach ($routes as $route) { - $this->assertEquals($route, $expectedRoutes[$index++]); - } + $expectedRoutes = new RouteCollection(); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'severalclasses_bar__invoke', + (new Route('/bar'))->setMethods('GET')->setDefault('_controller', BarController::class.'::__invoke') + ); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'severalclasses_foo__invoke', + (new Route('/foo'))->setMethods('GET')->setDefault('_controller', FooController::class.'::__invoke') + ); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'severalclasses_subnamespace_sub__invoke', + (new Route('/sub'))->setMethods('GET')->setDefault('_controller', SubController::class.'::__invoke') + ); + + self::assertEquals($expectedRoutes, $routes); } public function testSeveralHttpMethods(): void @@ -157,24 +155,25 @@ public function testSeveralHttpMethods(): void $routes = $routeLoader->__invoke(); - $expectedRoutes = []; - $expectedRoutes[] = (new Route('/foobar')) - ->setMethods('GET') - ->setDefault('_controller', SeveralHttpMethodsController::class.'::get'); - $expectedRoutes[] = (new Route('/foobar')) - ->setMethods('PUT') - ->setDefault('_controller', SeveralHttpMethodsController::class.'::put'); - $expectedRoutes[] = (new Route('/foobar')) - ->setMethods('POST') - ->setDefault('_controller', SeveralHttpMethodsController::class.'::post'); - $expectedRoutes[] = (new Route('/foobar')) - ->setMethods('DELETE') - ->setDefault('_controller', SeveralHttpMethodsController::class.'::delete'); - - $index = 0; - foreach ($routes as $route) { - $this->assertEquals($route, $expectedRoutes[$index++]); - } + $expectedRoutes = new RouteCollection(); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'severalhttpmethods_get', + (new Route('/foobar'))->setMethods('GET')->setDefault('_controller', SeveralHttpMethodsController::class.'::get') + ); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'severalhttpmethods_put', + (new Route('/foobar'))->setMethods('PUT')->setDefault('_controller', SeveralHttpMethodsController::class.'::put') + ); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'severalhttpmethods_post', + (new Route('/foobar'))->setMethods('POST')->setDefault('_controller', SeveralHttpMethodsController::class.'::post') + ); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'severalhttpmethods_delete', + (new Route('/foobar'))->setMethods('DELETE')->setDefault('_controller', SeveralHttpMethodsController::class.'::delete') + ); + + self::assertEquals($expectedRoutes, $routes); } public function testSeveralRoutesOnOneAction(): void @@ -183,44 +182,40 @@ public function testSeveralRoutesOnOneAction(): void $routes = $routeLoader->__invoke(); - $expectedRoutes = []; - $expectedRoutes[] = (new Route('/foobar')) - ->setMethods('GET') - ->setDefault('_controller', SeveralRoutesOnOneActionController::class.'::__invoke'); - $expectedRoutes[] = (new Route('/foobar')) - ->setMethods('POST') - ->setDefault('_controller', SeveralRoutesOnOneActionController::class.'::__invoke'); - $expectedRoutes[] = (new Route('/foo-bar')) - ->setMethods('GET') - ->setDefault('_controller', SeveralRoutesOnOneActionController::class.'::__invoke'); - - $index = 0; - foreach ($routes as $route) { - $this->assertEquals($route, $expectedRoutes[$index++]); - } + $expectedRoutes = new RouteCollection(); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'severalroutesononeaction__invoke', + (new Route('/foobar'))->setMethods('GET')->setDefault('_controller', SeveralRoutesOnOneActionController::class.'::__invoke') + ); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'severalroutesononeaction__invoke_1', + (new Route('/foobar'))->setMethods('POST')->setDefault('_controller', SeveralRoutesOnOneActionController::class.'::__invoke') + ); + $expectedRoutes->add( + 'my-name', + (new Route('/foo-bar'))->setMethods('GET')->setDefault('_controller', SeveralRoutesOnOneActionController::class.'::__invoke') + ); + + self::assertEquals($expectedRoutes, $routes); } public function testSeveralDirectories(): void { - $routeLoader = OpenApiRouteLoader::fromDirectories( - __DIR__.'/Fixtures/Basic', - __DIR__.'/Fixtures/SeveralClasses/SubNamespace' - ); + $routeLoader = OpenApiRouteLoader::fromDirectories(__DIR__.'/Fixtures/Basic', __DIR__.'/Fixtures/SeveralClasses/SubNamespace'); $routes = $routeLoader->__invoke(); - $expectedRoutes = []; - $expectedRoutes[] = (new Route('/foobar')) - ->setMethods('GET') - ->setDefault('_controller', BasicController::class.'::__invoke'); - $expectedRoutes[] = (new Route('/sub')) - ->setMethods('GET') - ->setDefault('_controller', SubController::class.'::__invoke'); - - $index = 0; - foreach ($routes as $route) { - $this->assertEquals($route, $expectedRoutes[$index++]); - } + $expectedRoutes = new RouteCollection(); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'basic__invoke', + (new Route('/foobar'))->setMethods('GET')->setDefault('_controller', BasicController::class.'::__invoke') + ); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'severalclasses_subnamespace_sub__invoke', + (new Route('/sub'))->setMethods('GET')->setDefault('_controller', SubController::class.'::__invoke') + ); + + self::assertEquals($expectedRoutes, $routes); } public function testSrcDirectoryDoesNotExist(): void diff --git a/tests/Attributes/OpenApiRouteLoaderAttributesTest.php b/tests/Attributes/OpenApiRouteLoaderAttributesTest.php index 0cfdcf4..cc5c6fb 100644 --- a/tests/Attributes/OpenApiRouteLoaderAttributesTest.php +++ b/tests/Attributes/OpenApiRouteLoaderAttributesTest.php @@ -25,20 +25,21 @@ */ class OpenApiRouteLoaderAttributesTest extends TestCase { + private const FIXTURES_ROUTE_NAME_PREFIX = 'tobion_openapisymfonyrouting_tests_attributes_fixtures_'; + public function testBasic(): void { $routeLoader = OpenApiRouteLoader::fromDirectories(__DIR__.'/Fixtures/Basic'); $routes = $routeLoader->__invoke(); - foreach ($routes as $route) { - $this->assertEquals( - $route, - (new Route('/foobar')) - ->setMethods('GET') - ->setDefault('_controller', BasicController::class.'::__invoke') - ); - } + $expectedRoutes = new RouteCollection(); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'basic__invoke', + (new Route('/foobar'))->setMethods('GET')->setDefault('_controller', BasicController::class.'::__invoke') + ); + + self::assertEquals($expectedRoutes, $routes); } public function testFormatSuffix(): void @@ -47,24 +48,21 @@ public function testFormatSuffix(): void $routes = $routeLoader->__invoke(); - $expectedRoutes = []; - $expectedRoutes[] = (new Route('/a.{_format}')) - ->setDefault('_format', null) - ->setMethods('GET') - ->setDefault('_controller', FormatSuffixController::class.'::inheritEnabledFormatSuffix'); - $expectedRoutes[] = (new Route('/b.{_format}')) - ->setDefault('_format', null) - ->setRequirement('_format', 'json|xml') - ->setMethods('GET') - ->setDefault('_controller', FormatSuffixController::class.'::defineFormatPattern'); - $expectedRoutes[] = (new Route('/c')) - ->setMethods('GET') - ->setDefault('_controller', FormatSuffixController::class.'::disableFormatSuffix'); - - $index = 0; - foreach ($routes as $route) { - $this->assertEquals($route, $expectedRoutes[$index++]); - } + $expectedRoutes = new RouteCollection(); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'formatsuffix_inheritenabledformatsuffix', + (new Route('/a.{_format}'))->setDefault('_format', null)->setMethods('GET')->setDefault('_controller', FormatSuffixController::class.'::inheritEnabledFormatSuffix') + ); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'formatsuffix_defineformatpattern', + (new Route('/b.{_format}'))->setDefault('_format', null)->setRequirement('_format', 'json|xml')->setMethods('GET')->setDefault('_controller', FormatSuffixController::class.'::defineFormatPattern') + ); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'formatsuffix_disableformatsuffix', + (new Route('/c'))->setMethods('GET')->setDefault('_controller', FormatSuffixController::class.'::disableFormatSuffix') + ); + + self::assertEquals($expectedRoutes, $routes); } public function testOperationId(): void @@ -88,22 +86,22 @@ public function testPathParameterPattern(): void $routes = $routeLoader->__invoke(); - $expectedRoutes = []; - $expectedRoutes[] = (new Route('/foo/{id}')) - ->setMethods('GET') - ->setDefault('_controller', PathParameterPatternController::class.'::noPattern'); - $expectedRoutes[] = (new Route('/baz/{id}')) - ->setMethods('GET') - ->setDefault('_controller', PathParameterPatternController::class.'::noSchema'); - $expectedRoutes[] = (new Route('/bar/{id}')) - ->setRequirement('id', '^[a-zA-Z0-9]+$') - ->setMethods('GET') - ->setDefault('_controller', PathParameterPatternController::class.'::withPattern'); - - $index = 0; - foreach ($routes as $route) { - $this->assertEquals($route, $expectedRoutes[$index++]); - } + $expectedRoutes = new RouteCollection(); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'pathparameterpattern_nopattern', + (new Route('/foo/{id}'))->setMethods('GET')->setDefault('_controller', PathParameterPatternController::class.'::noPattern') + ); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'pathparameterpattern_noschema', + (new Route('/baz/{id}'))->setMethods('GET')->setDefault('_controller', PathParameterPatternController::class.'::noSchema') + ); + // OpenAPI needs the param pattern to be anchored (^$) to have the desired effect. Symfony automatically trims those to get a valid full path regex. + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'pathparameterpattern_withpattern', + (new Route('/bar/{id}'))->setRequirement('id', '^[a-zA-Z0-9]+$')->setMethods('GET')->setDefault('_controller', PathParameterPatternController::class.'::withPattern') + ); + + self::assertEquals($expectedRoutes, $routes); } public function testPriority(): void @@ -112,21 +110,23 @@ public function testPriority(): void $routes = $routeLoader->__invoke(); - $expectedRoutes = []; - $expectedRoutes[] = (new Route('/bar')) - ->setMethods('GET') - ->setDefault('_controller', PriorityController::class.'::bar'); - $expectedRoutes[] = (new Route('/foo')) - ->setMethods('GET') - ->setDefault('_controller', PriorityController::class.'::foo'); - $expectedRoutes[] = (new Route('/{catchall}')) - ->setMethods('GET') - ->setDefault('_controller', PriorityController::class.'::catchall'); - - $index = 0; - foreach ($routes as $route) { - $this->assertEquals($route, $expectedRoutes[$index++]); - } + $expectedRoutes = new RouteCollection(); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'priority_foo', + (new Route('/foo'))->setMethods('GET')->setDefault('_controller', PriorityController::class.'::foo') + ); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'priority_catchall', + (new Route('/{catchall}'))->setMethods('GET')->setDefault('_controller', PriorityController::class.'::catchall'), + -100 + ); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'priority_bar', + (new Route('/bar'))->setMethods('GET')->setDefault('_controller', PriorityController::class.'::bar'), + 10 + ); + + self::assertEquals($expectedRoutes, $routes); } public function testSeveralClasses(): void @@ -135,21 +135,21 @@ public function testSeveralClasses(): void $routes = $routeLoader->__invoke(); - $expectedRoutes = []; - $expectedRoutes[] = (new Route('/bar')) - ->setMethods('GET') - ->setDefault('_controller', BarController::class.'::__invoke'); - $expectedRoutes[] = (new Route('/foo')) - ->setMethods('GET') - ->setDefault('_controller', FooController::class.'::__invoke'); - $expectedRoutes[] = (new Route('/sub')) - ->setMethods('GET') - ->setDefault('_controller', SubController::class.'::__invoke'); - - $index = 0; - foreach ($routes as $route) { - $this->assertEquals($route, $expectedRoutes[$index++]); - } + $expectedRoutes = new RouteCollection(); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'severalclasses_bar__invoke', + (new Route('/bar'))->setMethods('GET')->setDefault('_controller', BarController::class.'::__invoke') + ); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'severalclasses_foo__invoke', + (new Route('/foo'))->setMethods('GET')->setDefault('_controller', FooController::class.'::__invoke') + ); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'severalclasses_subnamespace_sub__invoke', + (new Route('/sub'))->setMethods('GET')->setDefault('_controller', SubController::class.'::__invoke') + ); + + self::assertEquals($expectedRoutes, $routes); } public function testSeveralHttpMethods(): void @@ -158,24 +158,25 @@ public function testSeveralHttpMethods(): void $routes = $routeLoader->__invoke(); - $expectedRoutes = []; - $expectedRoutes[] = (new Route('/foobar')) - ->setMethods('GET') - ->setDefault('_controller', SeveralHttpMethodsController::class.'::get'); - $expectedRoutes[] = (new Route('/foobar')) - ->setMethods('PUT') - ->setDefault('_controller', SeveralHttpMethodsController::class.'::put'); - $expectedRoutes[] = (new Route('/foobar')) - ->setMethods('POST') - ->setDefault('_controller', SeveralHttpMethodsController::class.'::post'); - $expectedRoutes[] = (new Route('/foobar')) - ->setMethods('DELETE') - ->setDefault('_controller', SeveralHttpMethodsController::class.'::delete'); - - $index = 0; - foreach ($routes as $route) { - $this->assertEquals($route, $expectedRoutes[$index++]); - } + $expectedRoutes = new RouteCollection(); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'severalhttpmethods_get', + (new Route('/foobar'))->setMethods('GET')->setDefault('_controller', SeveralHttpMethodsController::class.'::get') + ); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'severalhttpmethods_put', + (new Route('/foobar'))->setMethods('PUT')->setDefault('_controller', SeveralHttpMethodsController::class.'::put') + ); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'severalhttpmethods_post', + (new Route('/foobar'))->setMethods('POST')->setDefault('_controller', SeveralHttpMethodsController::class.'::post') + ); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'severalhttpmethods_delete', + (new Route('/foobar'))->setMethods('DELETE')->setDefault('_controller', SeveralHttpMethodsController::class.'::delete') + ); + + self::assertEquals($expectedRoutes, $routes); } public function testSeveralRoutesOnOneAction(): void @@ -184,44 +185,40 @@ public function testSeveralRoutesOnOneAction(): void $routes = $routeLoader->__invoke(); - $expectedRoutes = []; - $expectedRoutes[] = (new Route('/foobar')) - ->setMethods('GET') - ->setDefault('_controller', SeveralRoutesOnOneActionController::class.'::__invoke'); - $expectedRoutes[] = (new Route('/foobar')) - ->setMethods('POST') - ->setDefault('_controller', SeveralRoutesOnOneActionController::class.'::__invoke'); - $expectedRoutes[] = (new Route('/foo-bar')) - ->setMethods('GET') - ->setDefault('_controller', SeveralRoutesOnOneActionController::class.'::__invoke'); - - $index = 0; - foreach ($routes as $route) { - $this->assertEquals($route, $expectedRoutes[$index++]); - } + $expectedRoutes = new RouteCollection(); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'severalroutesononeaction__invoke', + (new Route('/foobar'))->setMethods('GET')->setDefault('_controller', SeveralRoutesOnOneActionController::class.'::__invoke') + ); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'severalroutesononeaction__invoke_1', + (new Route('/foobar'))->setMethods('POST')->setDefault('_controller', SeveralRoutesOnOneActionController::class.'::__invoke') + ); + $expectedRoutes->add( + 'my-name', + (new Route('/foo-bar'))->setMethods('GET')->setDefault('_controller', SeveralRoutesOnOneActionController::class.'::__invoke') + ); + + self::assertEquals($expectedRoutes, $routes); } public function testSeveralDirectories(): void { - $routeLoader = OpenApiRouteLoader::fromDirectories( - __DIR__.'/Fixtures/Basic', - __DIR__.'/Fixtures/SeveralClasses/SubNamespace' - ); + $routeLoader = OpenApiRouteLoader::fromDirectories(__DIR__.'/Fixtures/Basic', __DIR__.'/Fixtures/SeveralClasses/SubNamespace'); $routes = $routeLoader->__invoke(); - $expectedRoutes = []; - $expectedRoutes[] = (new Route('/foobar')) - ->setMethods('GET') - ->setDefault('_controller', BasicController::class.'::__invoke'); - $expectedRoutes[] = (new Route('/sub')) - ->setMethods('GET') - ->setDefault('_controller', SubController::class.'::__invoke'); - - $index = 0; - foreach ($routes as $route) { - $this->assertEquals($route, $expectedRoutes[$index++]); - } + $expectedRoutes = new RouteCollection(); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'basic__invoke', + (new Route('/foobar'))->setMethods('GET')->setDefault('_controller', BasicController::class.'::__invoke') + ); + $expectedRoutes->add( + self::FIXTURES_ROUTE_NAME_PREFIX.'severalclasses_subnamespace_sub__invoke', + (new Route('/sub'))->setMethods('GET')->setDefault('_controller', SubController::class.'::__invoke') + ); + + self::assertEquals($expectedRoutes, $routes); } public function testSrcDirectoryDoesNotExist(): void