Browse Source

Support `except` and `only` universally for strategies

Shalvah 1 year ago
parent
commit
9337163270

+ 2 - 3
src/Extracting/Extractor.php

@@ -208,12 +208,11 @@ class Extractor
         $overrides = [];
         foreach ($strategies as $strategyClassOrTuple) {
             if (is_array($strategyClassOrTuple)) {
-                $strategyClass = $strategyClassOrTuple[0];
+                [$strategyClass, $settings] = $strategyClassOrTuple;
                 if ($strategyClass == 'overrides') {
-                    $overrides = $strategyClassOrTuple[1];
+                    $overrides = $settings;
                     continue;
                 }
-                $settings = $strategyClassOrTuple[1];
 
                 $routesToSkip = $settings['except'] ?? [];
                 $routesToInclude = $settings['only'] ?? [];

+ 2 - 2
src/Extracting/Strategies/Strategy.php

@@ -42,7 +42,7 @@ abstract class Strategy
     public static function wrapWithSettings(
         array $only = ['*'],
         array $except = [],
-        ...$settings
+        ...$otherSettings
     ): array
     {
         if (!empty($only) && !empty($except)) {
@@ -53,7 +53,7 @@ abstract class Strategy
 
         return [
             static::class,
-            $settings,
+            ['only' => $only, 'except' => $except, ...$otherSettings],
         ];
     }
 }

+ 0 - 9
tests/Unit/ExtractorStrategiesInvocationTest.php

@@ -33,7 +33,6 @@ class ExtractorStrategiesInvocationTest extends BaseUnitTest
                 'bodyParameters' => [
                     EmptyStrategy1::class,
                 ],
-                'responses' => [], // Making this empty so the Laravel-dependent strategies are not called
             ],
         ];
         $this->processRoute($config);
@@ -56,7 +55,6 @@ class ExtractorStrategiesInvocationTest extends BaseUnitTest
                     ]
                 ],
                 'bodyParameters' => [],
-                'responses' => [], // Making this empty so the Laravel-dependent strategies are not called
             ],
         ];
 
@@ -81,7 +79,6 @@ class ExtractorStrategiesInvocationTest extends BaseUnitTest
                     ]
                 ],
                 'bodyParameters' => [],
-                'responses' => [], // Making this empty so the Laravel-dependent strategies are not called
             ],
         ];
 
@@ -101,7 +98,6 @@ class ExtractorStrategiesInvocationTest extends BaseUnitTest
                 'bodyParameters' => [
                     [EmptyStrategy1::class, ['only' => 'GET /test']]
                 ],
-                'responses' => [],
             ],
         ];
         $this->processRoute($config);
@@ -121,7 +117,6 @@ class ExtractorStrategiesInvocationTest extends BaseUnitTest
                 'bodyParameters' => [
                     [EmptyStrategy1::class, ['except' => 'GET /api*']]
                 ],
-                'responses' => [],
             ],
         ];
         $this->processRoute($config);
@@ -171,8 +166,6 @@ class ExtractorStrategiesInvocationTest extends BaseUnitTest
         $config = [
             'strategies' => [
                 'metadata' => [PartialDummyMetadataStrategy1::class, PartialDummyMetadataStrategy2::class],
-                'bodyParameters' => [],
-                'responses' => [],
             ],
         ];
         $parsed = $this->processRoute($config);
@@ -193,8 +186,6 @@ class ExtractorStrategiesInvocationTest extends BaseUnitTest
         $config = [
             'strategies' => [
                 'metadata' => [PartialDummyMetadataStrategy2::class],
-                'bodyParameters' => [],
-                'responses' => [],
             ],
         ];
         $parsed = $this->processRoute($config);

+ 9 - 0
tests/Unit/RoutePatternMatcherTest.php

@@ -45,4 +45,13 @@ class RoutePatternMatcherTest extends BaseUnitTest
         $this->assertFalse(RoutePatternMatcher::matches($route, ["d*"]));
     }
 
+    /** @test */
+    public function matches_route_with_multiple_methods()
+    {
+        $route = new Route(["GET", "HEAD"], "/abc", ['as' => 'users.show']);
+        $this->assertTrue(RoutePatternMatcher::matches($route, ["HEAD /abc"]));
+        $this->assertTrue(RoutePatternMatcher::matches($route, ["GET abc"]));
+        $this->assertFalse(RoutePatternMatcher::matches($route, ["POST abc"]));
+    }
+
 }