Browse Source

Better tests + fixes for route rules vs strategy config

Shalvah 10 months ago
parent
commit
b856570df1

+ 7 - 1
config/scribe.php

@@ -241,7 +241,13 @@ INTRO
             Strategies\Responses\UseResponseFileTag::class,
             [
                 Strategies\Responses\ResponseCalls::class,
-                ['only' => ['GET *']]
+                [
+                    'only' => ['GET *'],
+                    // Disable debug mode when generating response calls to avoid error stack traces in responses
+                    'config' => [
+                        'app.debug' => false,
+                    ],
+                ]
             ]
         ],
         'responseFields' => [

+ 4 - 5
src/Extracting/DatabaseTransactionHelpers.php

@@ -15,9 +15,9 @@ trait DatabaseTransactionHelpers
 
     private function startDbTransaction()
     {
-        $database = app('db');
-
         foreach ($this->connectionsToTransact() as $connection) {
+            $database ??= app('db');
+
             $driver = $database->connection($connection);
 
             if (self::driverSupportsTransactions($driver)) {
@@ -30,7 +30,6 @@ trait DatabaseTransactionHelpers
                         " If you aren't using this database, remove it from the `database_connections_to_transact` config array."
                     );
                 }
-                continue;
             } else {
                 $driverClassName = get_class($driver);
                 throw DatabaseTransactionsNotSupported::create($connection, $driverClassName);
@@ -43,9 +42,9 @@ trait DatabaseTransactionHelpers
      */
     private function endDbTransaction()
     {
-        $database = app('db');
-
         foreach ($this->connectionsToTransact() as $connection) {
+            $database ??= app('db');
+
             $driver = $database->connection($connection);
             try {
                 $driver->rollback();

+ 13 - 12
src/Extracting/Extractor.php

@@ -215,23 +215,24 @@ class Extractor
                 }
 
                 $settings = self::transformOldRouteRulesIntoNewSettings($stage, $rulesToApply, $strategyClass, $settings);
-                $routesToSkip = $settings["except"] ?? [];
-                $routesToInclude = $settings["only"] ?? [];
-
-                if (!empty($routesToSkip)) {
-                    if (RoutePatternMatcher::matches($endpointData->route, $routesToSkip)) {
-                        continue;
-                    }
-                } elseif (!empty($routesToInclude)) {
-                    if (!RoutePatternMatcher::matches($endpointData->route, $routesToInclude)) {
-                        continue;
-                    }
-                }
             } else {
                 $strategyClass = $strategyClassOrTuple;
                 $settings = self::transformOldRouteRulesIntoNewSettings($stage, $rulesToApply, $strategyClass);
             }
 
+            $routesToSkip = $settings["except"] ?? [];
+            $routesToInclude = $settings["only"] ?? [];
+
+            if (!empty($routesToSkip)) {
+                if (RoutePatternMatcher::matches($endpointData->route, $routesToSkip)) {
+                    continue;
+                }
+            } elseif (!empty($routesToInclude)) {
+                if (!RoutePatternMatcher::matches($endpointData->route, $routesToInclude)) {
+                    continue;
+                }
+            }
+
             $strategy = new $strategyClass($this->config);
             $results = $strategy($endpointData, $settings);
             if (is_array($results)) {

+ 52 - 4
tests/Unit/ExtractorTest.php

@@ -7,11 +7,12 @@ use Knuckles\Camel\Extraction\ExtractedEndpointData;
 use Knuckles\Camel\Extraction\Parameter;
 use Knuckles\Scribe\Extracting\Extractor;
 use Knuckles\Scribe\Extracting\Strategies;
+use Knuckles\Scribe\Tests\BaseLaravelTest;
 use Knuckles\Scribe\Tests\BaseUnitTest;
 use Knuckles\Scribe\Tests\Fixtures\TestController;
 use Knuckles\Scribe\Tools\DocumentationConfig;
 
-class ExtractorTest extends BaseUnitTest
+class ExtractorTest extends BaseLaravelTest
 {
     protected Extractor $extractor;
 
@@ -52,7 +53,7 @@ class ExtractorTest extends BaseUnitTest
     {
         parent::setUp();
 
-        $this->extractor = new Extractor(new DocumentationConfig($this->config));
+        $this->extractor = $this->makeExtractor($this->config);
     }
 
     /** @test */
@@ -181,6 +182,48 @@ class ExtractorTest extends BaseUnitTest
         $this->assertEquals(['DELETE'], $parsed->httpMethods);
     }
 
+    /** @test */
+    public function invokes_strategy_based_on_deprecated_route_apply_rules()
+    {
+        $config = $this->config;
+        $config['strategies']['responses'] = [Strategies\Responses\ResponseCalls::class];
+
+        $extractor = $this->makeExtractor($config);
+        $route = $this->createRoute('GET', '/get', 'shouldFetchRouteResponse');
+        $parsed = $extractor->processRoute($route, ['response_calls' => ['methods' => ['POST']]]);
+        $this->assertEmpty($parsed->responses);
+
+        $parsed = $extractor->processRoute($route, ['response_calls' => ['methods' => ['GET']]]);
+        $this->assertNotEmpty($parsed->responses);
+    }
+
+    /** @test */
+    public function invokes_strategy_based_on_new_strategy_configs()
+    {
+        $route = $this->createRoute('GET', '/get', 'shouldFetchRouteResponse');
+        $config = $this->config;
+        $config['strategies']['responses'] = [
+            [
+                Strategies\Responses\ResponseCalls::class,
+                ['only' => 'POST *']
+            ]
+        ];
+        $extractor = $this->makeExtractor($config);
+
+        $parsed = $extractor->processRoute($route);
+        $this->assertEmpty($parsed->responses);
+
+        $config['strategies']['responses'] = [
+            [
+                Strategies\Responses\ResponseCalls::class,
+                ['only' => 'GET *']
+            ]
+        ];
+        $extractor = $this->makeExtractor($config);
+        $parsed = $extractor->processRoute($route);
+        $this->assertNotEmpty($parsed->responses);
+    }
+
     /**
      * @test
      * @dataProvider authRules
@@ -188,7 +231,7 @@ class ExtractorTest extends BaseUnitTest
     public function adds_appropriate_field_based_on_configured_auth_type($config, $expected)
     {
         $route = $this->createRouteOldSyntax('POST', '/withAuthenticatedTag', 'withAuthenticatedTag');
-        $generator = new Extractor(new DocumentationConfig(array_merge($this->config, $config)));
+        $generator = $this->makeExtractor(array_merge($this->config, $config));
         $parsed = $generator->processRoute($route, [])->toArray();
         $this->assertNotNull($parsed[$expected['where']][$expected['name']]);
         $this->assertEquals($expected['where'], $parsed['auth'][0]);
@@ -210,7 +253,7 @@ class ExtractorTest extends BaseUnitTest
         // Examples should have different values
         $this->assertNotEquals(1, count($results));
 
-        $generator = new Extractor(new DocumentationConfig($this->config + ['examples' => ['faker_seed' => 12345]]));
+        $generator = $this->makeExtractor($this->config + ['examples' => ['faker_seed' => 12345]]);
         $results = [];
         $results[$generator->processRoute($route)->cleanBodyParameters[$paramName]] = true;
         $results[$generator->processRoute($route)->cleanBodyParameters[$paramName]] = true;
@@ -374,6 +417,11 @@ class ExtractorTest extends BaseUnitTest
             ],
         ];
     }
+
+    protected function makeExtractor(mixed $config): Extractor
+    {
+        return new Extractor(new DocumentationConfig($config));
+    }
 }