RouteMatcherTest.php 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. <?php
  2. namespace Knuckles\Scribe\Tests\Unit;
  3. use Illuminate\Support\Facades\Route as RouteFacade;
  4. use Illuminate\Support\Str;
  5. use Knuckles\Scribe\Matching\RouteMatcher;
  6. use Knuckles\Scribe\Tests\BaseLaravelTest;
  7. class RouteMatcherTest extends BaseLaravelTest
  8. {
  9. public function testRespectsDomainsRuleForLaravelRouter()
  10. {
  11. $this->registerLaravelRoutes();
  12. $routeRules[0]['match']['prefixes'] = ['*'];
  13. $routeRules[0]['match']['domains'] = ['*'];
  14. $matcher = new RouteMatcher();
  15. $routes = $matcher->getRoutes($routeRules);
  16. $this->assertCount(12, $routes);
  17. $routeRules[0]['match']['domains'] = ['domain1.*', 'domain2.*'];
  18. $matcher = new RouteMatcher();
  19. $routes = $matcher->getRoutes($routeRules);
  20. $this->assertCount(12, $routes);
  21. $routeRules[0]['match']['domains'] = ['domain1.*'];
  22. $matcher = new RouteMatcher();
  23. $routes = $matcher->getRoutes($routeRules);
  24. $this->assertCount(6, $routes);
  25. foreach ($routes as $route) {
  26. $this->assertStringContainsString('domain1', $route['route']->getDomain());
  27. }
  28. $routeRules[0]['match']['domains'] = ['domain2.*'];
  29. $matcher = new RouteMatcher();
  30. $routes = $matcher->getRoutes($routeRules);
  31. $this->assertCount(6, $routes);
  32. foreach ($routes as $route) {
  33. $this->assertStringContainsString('domain2', $route['route']->getDomain());
  34. }
  35. }
  36. public function testRespectsPrefixesRuleForLaravelRouter()
  37. {
  38. $this->registerLaravelRoutes();
  39. $routeRules[0]['match']['domains'] = ['*'];
  40. $routeRules[0]['match']['prefixes'] = ['*'];
  41. $matcher = new RouteMatcher();
  42. $routes = $matcher->getRoutes($routeRules);
  43. $this->assertCount(12, $routes);
  44. $routeRules[0]['match']['prefixes'] = ['prefix1/*', 'prefix2/*'];
  45. $matcher = new RouteMatcher();
  46. $routes = $matcher->getRoutes($routeRules);
  47. $this->assertCount(8, $routes);
  48. $routeRules[0]['match']['prefixes'] = ['prefix1/*'];
  49. $matcher = new RouteMatcher();
  50. $routes = $matcher->getRoutes($routeRules);
  51. $this->assertCount(4, $routes);
  52. foreach ($routes as $route) {
  53. $this->assertTrue(Str::is('prefix1/*', $route['route']->uri()));
  54. }
  55. $routeRules[0]['match']['prefixes'] = ['prefix2/*'];
  56. $matcher = new RouteMatcher();
  57. $routes = $matcher->getRoutes($routeRules);
  58. $this->assertCount(4, $routes);
  59. foreach ($routes as $route) {
  60. $this->assertTrue(Str::is('prefix2/*', $route['route']->uri()));
  61. }
  62. }
  63. public function testWillIncludeRouteIfListedExplicitlyForLaravelRouter()
  64. {
  65. $this->registerLaravelRoutes();
  66. $mustInclude = 'domain1-1';
  67. $routeRules[0]['include'] = [$mustInclude];
  68. $routeRules[0]['match']['domains'] = ['domain1.*'];
  69. $routeRules[0]['match']['prefixes'] = ['prefix1/*'];
  70. $matcher = new RouteMatcher();
  71. $routes = $matcher->getRoutes($routeRules);
  72. $oddRuleOut = collect($routes)->filter(function ($route) use ($mustInclude) {
  73. return $route['route']->getName() === $mustInclude;
  74. });
  75. $this->assertCount(1, $oddRuleOut);
  76. }
  77. public function testWillIncludeRouteIfMatchForAnIncludePatternForLaravelRouter()
  78. {
  79. $this->registerLaravelRoutes();
  80. $mustInclude = ['domain1-1', 'domain1-2'];
  81. $includePattern = 'domain1-*';
  82. $routeRules[0]['include'] = [$includePattern];
  83. $routeRules[0]['match']['domains'] = ['domain1.*'];
  84. $routeRules[0]['match']['prefixes'] = ['prefix1/*'];
  85. $matcher = new RouteMatcher();
  86. $routes = $matcher->getRoutes($routeRules);
  87. $oddRuleOut = collect($routes)->filter(function ($route) use ($mustInclude) {
  88. return in_array($route['route']->getName(), $mustInclude);
  89. });
  90. $this->assertCount(count($mustInclude), $oddRuleOut);
  91. }
  92. public function testWillExcludeRouteIfListedExplicitlyForLaravelRouter()
  93. {
  94. $this->registerLaravelRoutes();
  95. $mustNotInclude = 'prefix1.domain1-1';
  96. $routeRules[0]['exclude'] = [$mustNotInclude];
  97. $routeRules[0]['match']['domains'] = ['domain1.*'];
  98. $routeRules[0]['match']['prefixes'] = ['prefix1/*'];
  99. $matcher = new RouteMatcher();
  100. $routes = $matcher->getRoutes($routeRules);
  101. $oddRuleOut = collect($routes)->filter(function ($route) use ($mustNotInclude) {
  102. return $route['route']->getName() === $mustNotInclude;
  103. });
  104. $this->assertCount(0, $oddRuleOut);
  105. }
  106. public function testWillExcludeRouteIfMatchForAnExcludePatternForLaravelRouter()
  107. {
  108. $this->registerLaravelRoutes();
  109. $mustNotInclude = ['prefix1.domain1-1', 'prefix1.domain1-2'];
  110. $excludePattern = 'prefix1.domain1-*';
  111. $routeRules[0]['exclude'] = [$excludePattern];
  112. $routeRules[0]['match']['domains'] = ['domain1.*'];
  113. $routeRules[0]['match']['prefixes'] = ['prefix1/*'];
  114. $matcher = new RouteMatcher();
  115. $routes = $matcher->getRoutes($routeRules);
  116. $oddRuleOut = collect($routes)->filter(function ($route) use ($mustNotInclude) {
  117. return in_array($route['route']->getName(), $mustNotInclude);
  118. });
  119. $this->assertCount(0, $oddRuleOut);
  120. }
  121. public function testMergesRoutesFromDifferentRuleGroupsForLaravelRouter()
  122. {
  123. $this->registerLaravelRoutes();
  124. $routeRules = [
  125. [
  126. 'match' => [
  127. 'domains' => ['domain1.*'],
  128. 'prefixes' => ['prefix1/*'],
  129. ],
  130. ],
  131. [
  132. 'match' => [
  133. 'domains' => ['domain2.*'],
  134. 'prefixes' => ['prefix2*'],
  135. ],
  136. ],
  137. ];
  138. $matcher = new RouteMatcher();
  139. $routes = $matcher->getRoutes($routeRules);
  140. $this->assertCount(4, $routes);
  141. $routes = collect($routes);
  142. $firstRuleGroup = $routes->filter(function ($route) {
  143. return Str::is('prefix1/*', $route['route']->uri())
  144. && Str::is('domain1.*', $route['route']->getDomain());
  145. });
  146. $this->assertCount(2, $firstRuleGroup);
  147. $secondRuleGroup = $routes->filter(function ($route) {
  148. return Str::is('prefix2/*', $route['route']->uri())
  149. && Str::is('domain2.*', $route['route']->getDomain());
  150. });
  151. $this->assertCount(2, $secondRuleGroup);
  152. }
  153. private function registerLaravelRoutes()
  154. {
  155. RouteFacade::group(['domain' => 'domain1.app.test'], function () {
  156. RouteFacade::post('/domain1-1', function () {
  157. return 'hi';
  158. })->name('domain1-1');
  159. RouteFacade::get('domain1-2', function () {
  160. return 'hi';
  161. })->name('domain1-2');
  162. RouteFacade::get('/prefix1/domain1-1', function () {
  163. return 'hi';
  164. })->name('prefix1.domain1-1');
  165. RouteFacade::get('prefix1/domain1-2', function () {
  166. return 'hi';
  167. })->name('prefix1.domain1-2');
  168. RouteFacade::get('/prefix2/domain1-1', function () {
  169. return 'hi';
  170. })->name('prefix2.domain1-1');
  171. RouteFacade::get('prefix2/domain1-2', function () {
  172. return 'hi';
  173. })->name('prefix2.domain1-2');
  174. });
  175. RouteFacade::group(['domain' => 'domain2.app.test'], function () {
  176. RouteFacade::post('/domain2-1', function () {
  177. return 'hi';
  178. })->name('domain2-1');
  179. RouteFacade::get('domain2-2', function () {
  180. return 'hi';
  181. })->name('domain2-2');
  182. RouteFacade::get('/prefix1/domain2-1', function () {
  183. return 'hi';
  184. })->name('prefix1.domain2-1');
  185. RouteFacade::get('prefix1/domain2-2', function () {
  186. return 'hi';
  187. })->name('prefix1.domain2-2');
  188. RouteFacade::get('/prefix2/domain2-1', function () {
  189. return 'hi';
  190. })->name('prefix2.domain2-1');
  191. RouteFacade::get('prefix2/domain2-2', function () {
  192. return 'hi';
  193. })->name('prefix2.domain2-2');
  194. });
  195. }
  196. }