123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519 |
- <?php
- namespace Mpociot\ApiDoc\Tests\Unit;
- use Dingo\Api\Routing\Router;
- use Illuminate\Support\Facades\Route as RouteFacade;
- use Illuminate\Support\Str;
- use Mpociot\ApiDoc\Matching\RouteMatcher;
- use Orchestra\Testbench\TestCase;
- class RouteMatcherTest extends TestCase
- {
- protected function getPackageProviders($app)
- {
- return [
- \Dingo\Api\Provider\LaravelServiceProvider::class,
- ];
- }
- public function testRespectsDomainsRuleForLaravelRouter()
- {
- $this->registerLaravelRoutes();
- $routeRules[0]['match']['prefixes'] = ['*'];
- $routeRules[0]['match']['domains'] = ['*'];
- $matcher = new RouteMatcher();
- $routes = $matcher->getRoutes($routeRules);
- $this->assertCount(12, $routes);
- $routeRules[0]['match']['domains'] = ['domain1.*', 'domain2.*'];
- $matcher = new RouteMatcher();
- $routes = $matcher->getRoutes($routeRules);
- $this->assertCount(12, $routes);
- $routeRules[0]['match']['domains'] = ['domain1.*'];
- $matcher = new RouteMatcher();
- $routes = $matcher->getRoutes($routeRules);
- $this->assertCount(6, $routes);
- foreach ($routes as $route) {
- $this->assertStringContainsString('domain1', $route['route']->getDomain());
- }
- $routeRules[0]['match']['domains'] = ['domain2.*'];
- $matcher = new RouteMatcher();
- $routes = $matcher->getRoutes($routeRules);
- $this->assertCount(6, $routes);
- foreach ($routes as $route) {
- $this->assertStringContainsString('domain2', $route['route']->getDomain());
- }
- }
- public function testRespectsDomainsRuleForDingoRouter()
- {
- $this->registerDingoRoutes();
- $routeRules[0]['match']['versions'] = ['v1'];
- $routeRules[0]['match']['prefixes'] = ['*'];
- $routeRules[0]['match']['domains'] = ['*'];
- $matcher = new RouteMatcher();
- $routes = $matcher->getRoutes($routeRules, 'dingo');
- $this->assertCount(12, $routes);
- $routeRules[0]['match']['domains'] = ['domain1.*', 'domain2.*'];
- $matcher = new RouteMatcher();
- $routes = $matcher->getRoutes($routeRules, 'dingo');
- $this->assertCount(12, $routes);
- $routeRules[0]['match']['domains'] = ['domain1.*'];
- $matcher = new RouteMatcher();
- $routes = $matcher->getRoutes($routeRules, 'dingo');
- $this->assertCount(6, $routes);
- foreach ($routes as $route) {
- $this->assertStringContainsString('domain1', $route['route']->getDomain());
- }
- $routeRules[0]['match']['domains'] = ['domain2.*'];
- $matcher = new RouteMatcher();
- $routes = $matcher->getRoutes($routeRules, 'dingo');
- $this->assertCount(6, $routes);
- foreach ($routes as $route) {
- $this->assertStringContainsString('domain2', $route['route']->getDomain());
- }
- }
- public function testRespectsPrefixesRuleForLaravelRouter()
- {
- $this->registerLaravelRoutes();
- $routeRules[0]['match']['domains'] = ['*'];
- $routeRules[0]['match']['prefixes'] = ['*'];
- $matcher = new RouteMatcher();
- $routes = $matcher->getRoutes($routeRules);
- $this->assertCount(12, $routes);
- $routeRules[0]['match']['prefixes'] = ['prefix1/*', 'prefix2/*'];
- $matcher = new RouteMatcher();
- $routes = $matcher->getRoutes($routeRules);
- $this->assertCount(8, $routes);
- $routeRules[0]['match']['prefixes'] = ['prefix1/*'];
- $matcher = new RouteMatcher();
- $routes = $matcher->getRoutes($routeRules);
- $this->assertCount(4, $routes);
- foreach ($routes as $route) {
- $this->assertTrue(Str::is('prefix1/*', $route['route']->uri()));
- }
- $routeRules[0]['match']['prefixes'] = ['prefix2/*'];
- $matcher = new RouteMatcher();
- $routes = $matcher->getRoutes($routeRules);
- $this->assertCount(4, $routes);
- foreach ($routes as $route) {
- $this->assertTrue(Str::is('prefix2/*', $route['route']->uri()));
- }
- }
- public function testRespectsPrefixesRuleForDingoRouter()
- {
- $this->registerDingoRoutes();
- $routeRules[0]['match']['versions'] = ['v1'];
- $routeRules[0]['match']['domains'] = ['*'];
- $routeRules[0]['match']['prefixes'] = ['*'];
- $matcher = new RouteMatcher();
- $routes = $matcher->getRoutes($routeRules, 'dingo');
- $this->assertCount(12, $routes);
- $routeRules[0]['match']['prefixes'] = ['prefix1/*', 'prefix2/*'];
- $matcher = new RouteMatcher();
- $routes = $matcher->getRoutes($routeRules, 'dingo');
- $this->assertCount(8, $routes);
- $routeRules[0]['match']['prefixes'] = ['prefix1/*'];
- $matcher = new RouteMatcher();
- $routes = $matcher->getRoutes($routeRules, 'dingo');
- $this->assertCount(4, $routes);
- foreach ($routes as $route) {
- $this->assertTrue(Str::is('prefix1/*', $route['route']->uri()));
- }
- $routeRules[0]['match']['prefixes'] = ['prefix2/*'];
- $matcher = new RouteMatcher();
- $routes = $matcher->getRoutes($routeRules, 'dingo');
- $this->assertCount(4, $routes);
- foreach ($routes as $route) {
- $this->assertTrue(Str::is('prefix2/*', $route['route']->uri()));
- }
- }
- public function testRespectsVersionsRuleForDingoRouter()
- {
- $this->registerDingoRoutes();
- $routeRules[0]['match']['versions'] = ['v2'];
- $routeRules[0]['match']['domains'] = ['*'];
- $routeRules[0]['match']['prefixes'] = ['*'];
- $matcher = new RouteMatcher();
- $routes = $matcher->getRoutes($routeRules, 'dingo');
- $this->assertCount(6, $routes);
- foreach ($routes as $route) {
- $this->assertNotEmpty(array_intersect($route['route']->versions(), ['v2']));
- }
- $routeRules[0]['match']['versions'] = ['v1', 'v2'];
- $routeRules[0]['match']['domains'] = ['*'];
- $routeRules[0]['match']['prefixes'] = ['*'];
- $matcher = new RouteMatcher();
- $routes = $matcher->getRoutes($routeRules, 'dingo');
- $this->assertCount(18, $routes);
- }
- public function testWillIncludeRouteIfListedExplicitlyForLaravelRouter()
- {
- $this->registerLaravelRoutes();
- $mustInclude = 'domain1-1';
- $routeRules[0]['include'] = [$mustInclude];
- $routeRules[0]['match']['domains'] = ['domain1.*'];
- $routeRules[0]['match']['prefixes'] = ['prefix1/*'];
- $matcher = new RouteMatcher();
- $routes = $matcher->getRoutes($routeRules);
- $oddRuleOut = collect($routes)->filter(function ($route) use ($mustInclude) {
- return $route['route']->getName() === $mustInclude;
- });
- $this->assertCount(1, $oddRuleOut);
- }
- public function testWillIncludeRouteIfListedExplicitlyForDingoRouter()
- {
- $this->registerDingoRoutes();
- $mustInclude = 'v2.domain2';
- $routeRules = [
- [
- 'match' => [
- 'domains' => ['domain1.*'],
- 'prefixes' => ['prefix1/*'],
- 'versions' => ['v1'],
- ],
- 'include' => [$mustInclude],
- ],
- ];
- $matcher = new RouteMatcher();
- $routes = $matcher->getRoutes($routeRules, 'dingo');
- $oddRuleOut = collect($routes)->filter(function ($route) use ($mustInclude) {
- return $route['route']->getName() === $mustInclude;
- });
- $this->assertCount(1, $oddRuleOut);
- }
- public function testWillIncludeRouteIfMatchForAnIncludePatternForLaravelRouter()
- {
- $this->registerLaravelRoutes();
- $mustInclude = ['domain1-1', 'domain1-2'];
- $includePattern = 'domain1-*';
- $routeRules[0]['include'] = [$includePattern];
- $routeRules[0]['match']['domains'] = ['domain1.*'];
- $routeRules[0]['match']['prefixes'] = ['prefix1/*'];
- $matcher = new RouteMatcher();
- $routes = $matcher->getRoutes($routeRules);
- $oddRuleOut = collect($routes)->filter(function ($route) use ($mustInclude) {
- return in_array($route['route']->getName(), $mustInclude);
- });
- $this->assertCount(count($mustInclude), $oddRuleOut);
- }
- public function testWillIncludeRouteIfMatchForAnIncludePatternForDingoRouter()
- {
- $this->registerDingoRoutes();
- $mustInclude = ['v2.domain1', 'v2.domain2'];
- $includePattern = 'v2.domain*';
- $routeRules = [
- [
- 'match' => [
- 'domains' => ['domain1.*'],
- 'prefixes' => ['prefix1/*'],
- 'versions' => ['v1'],
- ],
- 'include' => [$includePattern],
- ],
- ];
- $matcher = new RouteMatcher();
- $routes = $matcher->getRoutes($routeRules, 'dingo');
- $oddRuleOut = collect($routes)->filter(function ($route) use ($mustInclude) {
- return in_array($route['route']->getName(), $mustInclude);
- });
- $this->assertCount(count($mustInclude), $oddRuleOut);
- }
- public function testWillExcludeRouteIfListedExplicitlyForLaravelRouter()
- {
- $this->registerLaravelRoutes();
- $mustNotInclude = 'prefix1.domain1-1';
- $routeRules[0]['exclude'] = [$mustNotInclude];
- $routeRules[0]['match']['domains'] = ['domain1.*'];
- $routeRules[0]['match']['prefixes'] = ['prefix1/*'];
- $matcher = new RouteMatcher();
- $routes = $matcher->getRoutes($routeRules);
- $oddRuleOut = collect($routes)->filter(function ($route) use ($mustNotInclude) {
- return $route['route']->getName() === $mustNotInclude;
- });
- $this->assertCount(0, $oddRuleOut);
- }
- public function testWillExcludeRouteIfListedExplicitlyForDingoRouter()
- {
- $this->registerDingoRoutes();
- $mustNotInclude = 'v2.domain2';
- $routeRules = [
- [
- 'match' => [
- 'domains' => ['domain2.*'],
- 'prefixes' => ['*'],
- 'versions' => ['v2'],
- ],
- 'exclude' => [$mustNotInclude],
- ],
- ];
- $matcher = new RouteMatcher();
- $routes = $matcher->getRoutes($routeRules, 'dingo');
- $oddRuleOut = collect($routes)->filter(function ($route) use ($mustNotInclude) {
- return $route['route']->getName() === $mustNotInclude;
- });
- $this->assertCount(0, $oddRuleOut);
- }
- public function testWillExcludeRouteIfMatchForAnExcludePatternForLaravelRouter()
- {
- $this->registerLaravelRoutes();
- $mustNotInclude = ['prefix1.domain1-1', 'prefix1.domain1-2'];
- $excludePattern = 'prefix1.domain1-*';
- $routeRules[0]['exclude'] = [$excludePattern];
- $routeRules[0]['match']['domains'] = ['domain1.*'];
- $routeRules[0]['match']['prefixes'] = ['prefix1/*'];
- $matcher = new RouteMatcher();
- $routes = $matcher->getRoutes($routeRules);
- $oddRuleOut = collect($routes)->filter(function ($route) use ($mustNotInclude) {
- return in_array($route['route']->getName(), $mustNotInclude);
- });
- $this->assertCount(0, $oddRuleOut);
- }
- public function testWillExcludeRouteIfMatchForAnExcludePatterForDingoRouter()
- {
- $this->registerDingoRoutes();
- $mustNotInclude = ['v2.prefix1.domain2', 'v2.prefix2.domain2'];
- $excludePattern = 'v2.*.domain2';
- $routeRules = [
- [
- 'match' => [
- 'domains' => ['domain2.*'],
- 'prefixes' => ['*'],
- 'versions' => ['v2'],
- ],
- 'exclude' => [$excludePattern],
- ],
- ];
- $matcher = new RouteMatcher();
- $routes = $matcher->getRoutes($routeRules, 'dingo');
- $oddRuleOut = collect($routes)->filter(function ($route) use ($mustNotInclude) {
- return in_array($route['route']->getName(), $mustNotInclude);
- });
- $this->assertCount(0, $oddRuleOut);
- }
- public function testMergesRoutesFromDifferentRuleGroupsForLaravelRouter()
- {
- $this->registerLaravelRoutes();
- $routeRules = [
- [
- 'match' => [
- 'domains' => ['domain1.*'],
- 'prefixes' => ['prefix1/*'],
- ],
- ],
- [
- 'match' => [
- 'domains' => ['domain2.*'],
- 'prefixes' => ['prefix2*'],
- ],
- ],
- ];
- $matcher = new RouteMatcher();
- $routes = $matcher->getRoutes($routeRules);
- $this->assertCount(4, $routes);
- $routes = collect($routes);
- $firstRuleGroup = $routes->filter(function ($route) {
- return Str::is('prefix1/*', $route['route']->uri())
- && Str::is('domain1.*', $route['route']->getDomain());
- });
- $this->assertCount(2, $firstRuleGroup);
- $secondRuleGroup = $routes->filter(function ($route) {
- return Str::is('prefix2/*', $route['route']->uri())
- && Str::is('domain2.*', $route['route']->getDomain());
- });
- $this->assertCount(2, $secondRuleGroup);
- }
- public function testMergesRoutesFromDifferentRuleGroupsForDingoRouter()
- {
- $this->registerDingoRoutes();
- $routeRules = [
- [
- 'match' => [
- 'domains' => ['*'],
- 'prefixes' => ['*'],
- 'versions' => ['v1'],
- ],
- ],
- [
- 'match' => [
- 'domains' => ['*'],
- 'prefixes' => ['*'],
- 'versions' => ['v2'],
- ],
- ],
- ];
- $matcher = new RouteMatcher();
- $routes = $matcher->getRoutes($routeRules, 'dingo');
- $this->assertCount(18, $routes);
- $routes = collect($routes);
- $firstRuleGroup = $routes->filter(function ($route) {
- return ! empty(array_intersect($route['route']->versions(), ['v1']));
- });
- $this->assertCount(12, $firstRuleGroup);
- $secondRuleGroup = $routes->filter(function ($route) {
- return ! empty(array_intersect($route['route']->versions(), ['v2']));
- });
- $this->assertCount(6, $secondRuleGroup);
- }
- private function registerLaravelRoutes()
- {
- RouteFacade::group(['domain' => 'domain1.app.test'], function () {
- RouteFacade::post('/domain1-1', function () {
- return 'hi';
- })->name('domain1-1');
- RouteFacade::get('domain1-2', function () {
- return 'hi';
- })->name('domain1-2');
- RouteFacade::get('/prefix1/domain1-1', function () {
- return 'hi';
- })->name('prefix1.domain1-1');
- RouteFacade::get('prefix1/domain1-2', function () {
- return 'hi';
- })->name('prefix1.domain1-2');
- RouteFacade::get('/prefix2/domain1-1', function () {
- return 'hi';
- })->name('prefix2.domain1-1');
- RouteFacade::get('prefix2/domain1-2', function () {
- return 'hi';
- })->name('prefix2.domain1-2');
- });
- RouteFacade::group(['domain' => 'domain2.app.test'], function () {
- RouteFacade::post('/domain2-1', function () {
- return 'hi';
- })->name('domain2-1');
- RouteFacade::get('domain2-2', function () {
- return 'hi';
- })->name('domain2-2');
- RouteFacade::get('/prefix1/domain2-1', function () {
- return 'hi';
- })->name('prefix1.domain2-1');
- RouteFacade::get('prefix1/domain2-2', function () {
- return 'hi';
- })->name('prefix1.domain2-2');
- RouteFacade::get('/prefix2/domain2-1', function () {
- return 'hi';
- })->name('prefix2.domain2-1');
- RouteFacade::get('prefix2/domain2-2', function () {
- return 'hi';
- })->name('prefix2.domain2-2');
- });
- }
- private function registerDingoRoutes()
- {
- $api = app('api.router');
- $api->version('v1', function (Router $api) {
- $api->group(['domain' => 'domain1.app.test'], function (Router $api) {
- $api->post('/domain1-1', function () {
- return 'hi';
- })->name('v1.domain1-1');
- $api->get('domain1-2', function () {
- return 'hi';
- })->name('v1.domain1-2');
- $api->get('/prefix1/domain1-1', function () {
- return 'hi';
- })->name('v1.prefix1.domain1-1');
- $api->get('prefix1/domain1-2', function () {
- return 'hi';
- })->name('v1.prefix1.domain1-2');
- $api->get('/prefix2/domain1-1', function () {
- return 'hi';
- })->name('v1.prefix2.domain1-1');
- $api->get('prefix2/domain1-2', function () {
- return 'hi';
- })->name('v1.prefix2.domain1-2');
- });
- $api->group(['domain' => 'domain2.app.test'], function (Router $api) {
- $api->post('/domain2-1', function () {
- return 'hi';
- })->name('v1.domain2-1');
- $api->get('domain2-2', function () {
- return 'hi';
- })->name('v1.domain2-2');
- $api->get('/prefix1/domain2-1', function () {
- return 'hi';
- })->name('v1.prefix1.domain2-1');
- $api->get('prefix1/domain2-2', function () {
- return 'hi';
- })->name('v1.prefix1.domain2-2');
- $api->get('/prefix2/domain2-1', function () {
- return 'hi';
- })->name('v1.prefix2.domain2-1');
- $api->get('prefix2/domain2-2', function () {
- return 'hi';
- })->name('v1.prefix2.domain2-2');
- });
- });
- $api->version('v2', function (Router $api) {
- $api->group(['domain' => 'domain1.app.test'], function (Router $api) {
- $api->post('/domain1', function () {
- return 'hi';
- })->name('v2.domain1');
- $api->get('/prefix1/domain1', function () {
- return 'hi';
- })->name('v2.prefix1.domain1');
- $api->get('/prefix2/domain1', function () {
- return 'hi';
- })->name('v2.prefix2.domain1');
- });
- $api->group(['domain' => 'domain2.app.test'], function (Router $api) {
- $api->post('/domain2', function () {
- return 'hi';
- })->name('v2.domain2');
- $api->get('/prefix1/domain2', function () {
- return 'hi';
- })->name('v2.prefix1.domain2');
- $api->get('/prefix2/domain2', function () {
- return 'hi';
- })->name('v2.prefix2.domain2');
- });
- });
- }
- }
|