Skip to content

Commit

Permalink
update tests, remove OperationID process from openApi generator
Browse files Browse the repository at this point in the history
  • Loading branch information
sonrac committed Apr 20, 2022
1 parent aa3eb36 commit 27b14de
Show file tree
Hide file tree
Showing 3 changed files with 261 additions and 250 deletions.
29 changes: 24 additions & 5 deletions src/OpenApiRouteLoader.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -30,6 +27,11 @@ class OpenApiRouteLoader implements RouteLoaderInterface
*/
private $routeNames = [];

/**
* @var null|Generator
*/
private $generator = null;

/**
* @var string
*/
Expand Down Expand Up @@ -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);
}

/**
Expand Down
241 changes: 118 additions & 123 deletions tests/Annotations/OpenApiRouteLoaderAnnotationsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,24 +20,23 @@
use Tobion\OpenApiSymfonyRouting\Tests\Annotations\Fixtures\SeveralHttpMethods\Controller as SeveralHttpMethodsController;
use Tobion\OpenApiSymfonyRouting\Tests\Annotations\Fixtures\SeveralRoutesOnOneAction\Controller as SeveralRoutesOnOneActionController;

class OpenApiRouteLoaderAnnotationsTest extends TestCase
final 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
{
$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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down
Loading

0 comments on commit 27b14de

Please sign in to comment.