Browse Source

Switch to Pest test runner, improve coverage

shalvah 3 years ago
parent
commit
f4e89ae0ee

+ 7 - 3
composer.json

@@ -44,6 +44,7 @@
     "league/fractal": "^0.19.0",
     "nikic/fast-route": "^1.3",
     "orchestra/testbench": "^4.0|^5.0|^6.0|^7.0",
+    "pestphp/pest": "^1.21",
     "phpstan/phpstan": "^1.0",
     "phpunit/phpunit": "^9.0|^10.0",
     "symfony/css-selector": "^5.3|^6.0",
@@ -62,8 +63,8 @@
   },
   "scripts": {
     "lint": "phpstan analyse -c ./phpstan.neon src camel --memory-limit 1G",
-    "test": "phpunit --stop-on-failure --exclude-group dingo",
-    "test-ci": "phpunit --exclude-group dingo",
+    "test": "pest --stop-on-failure --exclude-group dingo --coverage --colors",
+    "test-ci": "pest --exclude-group dingo --coverage --min=80",
     "test-parallel": "paratest -p16 --stop-on-failure --exclude-group dingo",
     "test-parallel-ci": "paratest -p16 --exclude-group dingo"
   },
@@ -77,7 +78,10 @@
   "config": {
     "preferred-install": "dist",
     "sort-packages": true,
-    "process-timeout": 600
+    "process-timeout": 600,
+    "allow-plugins": {
+      "pestphp/pest-plugin": true
+    }
   },
   "replace": {
     "mpociot/laravel-apidoc-generator": "*"

+ 1 - 1
phpunit.xml

@@ -14,10 +14,10 @@
     <coverage>
         <include>
             <directory suffix=".php">src/</directory>
+            <directory suffix=".php">camel/</directory>
         </include>
         <exclude>
             <file>src/ScribeServiceProvider.php</file>
-            <directory>resources/views/</directory>
         </exclude>
     </coverage>
     <testsuites>

+ 2 - 1
src/Scribe.php

@@ -18,6 +18,7 @@ class Scribe
     {
         Globals::$beforeResponseCall = $callable;
     }
+
     /**
      * Specify a callback that will be executed when Scribe is done generating your docs.
      * This callback will receive a map of all the output paths generated, that looks like this:
@@ -37,7 +38,7 @@ class Scribe
      *
      * If you disabled `postman` or `openapi`, their values will be null.
      *
-     * @param callable $callable
+     * @param callable(array): mixed $callable
      */
     public static function afterGenerating(callable $callable)
     {

+ 2 - 2
tests/Fixtures/TestController.php

@@ -270,9 +270,9 @@ class TestController extends Controller
 
     /**
      * @authenticated
-     * @urlparam $id Example: 3
+     * @urlparam id Example: 3
      */
-    public function shouldFetchRouteResponseWithEchoedSettings($id)
+    public function echoesRequestValues($id)
     {
         return [
             '{id}' => $id,

+ 29 - 0
tests/GenerateDocumentationTest.php

@@ -3,6 +3,7 @@
 namespace Knuckles\Scribe\Tests;
 
 use Illuminate\Support\Facades\Route as RouteFacade;
+use Knuckles\Scribe\Scribe;
 use Knuckles\Scribe\Tests\Fixtures\TestController;
 use Knuckles\Scribe\Tests\Fixtures\TestGroupController;
 use Knuckles\Scribe\Tests\Fixtures\TestIgnoreThisController;
@@ -114,6 +115,34 @@ class GenerateDocumentationTest extends BaseLaravelTest
         $this->assertStringContainsString('Processed route: [GET] api/array/test', $output);
     }
 
+    /** @test */
+    public function calls_afterGenerating_hook()
+    {
+        Scribe::afterGenerating(function (array $paths) {
+            $this->assertEquals(
+                [
+                    'html' => realpath('public/docs/index.html'),
+                    'blade' => null,
+                    'postman' => realpath('public/docs/collection.json') ?: null,
+                    'openapi' => realpath('public/docs/openapi.yaml') ?: null,
+                    'assets' => [
+                        'js' => realpath('public/docs/js'),
+                        'css' => realpath('public/docs/css'),
+                        'images' => realpath('public/docs/images'),
+                    ]
+                ], $paths);
+        });
+
+        RouteFacade::get('/api/array/test', [TestController::class, 'withEndpointDescription']);
+
+        config(['scribe.routes.0.match.prefixes' => ['api/*']]);
+        $output = $this->artisan('scribe:generate');
+
+        $this->assertStringContainsString('Processed route: [GET] api/array/test', $output);
+
+        Scribe::afterGenerating(fn() => null);
+    }
+
     /** @test */
     public function can_skip_methods_and_classes_with_hidefromapidocumentation_tag()
     {

+ 65 - 31
tests/Strategies/Responses/ResponseCallsTest.php

@@ -9,12 +9,13 @@ use Knuckles\Camel\Extraction\ExtractedEndpointData;
 use Knuckles\Camel\Extraction\ResponseCollection;
 use Knuckles\Scribe\Extracting\Extractor;
 use Knuckles\Scribe\Extracting\Strategies\Responses\ResponseCalls;
-use Knuckles\Scribe\ScribeServiceProvider;
+use Knuckles\Scribe\Scribe;
 use Knuckles\Scribe\Tests\BaseLaravelTest;
 use Knuckles\Scribe\Tests\Fixtures\TestController;
 use Knuckles\Scribe\Tools\DocumentationConfig;
 use DMS\PHPUnitExtensions\ArraySubset\ArraySubsetAsserts;
 use Illuminate\Support\Facades\Route as LaravelRouteFacade;
+use Symfony\Component\HttpFoundation\Request;
 
 class ResponseCallsTest extends BaseLaravelTest
 {
@@ -42,9 +43,7 @@ class ResponseCallsTest extends BaseLaravelTest
         ];
 
         $strategy = new ResponseCalls(new DocumentationConfig([]));
-        $results = $strategy->makeResponseCallIfConditionsPass(
-            ExtractedEndpointData::fromRoute($route), $rules
-        );
+        $results = $strategy(ExtractedEndpointData::fromRoute($route), $rules);
 
         $this->assertEquals(200, $results[0]['status']);
         $this->assertArraySubset([
@@ -76,7 +75,7 @@ class ResponseCallsTest extends BaseLaravelTest
     /** @test */
     public function uses_configured_settings_when_calling_route()
     {
-        $route = LaravelRouteFacade::post('/echo/{id}', [TestController::class, 'shouldFetchRouteResponseWithEchoedSettings']);
+        $route = LaravelRouteFacade::post('/echo/{id}', [TestController::class, 'echoesRequestValues']);
 
         $rules = [
             'response_calls' => [
@@ -95,19 +94,19 @@ class ResponseCallsTest extends BaseLaravelTest
             'headers' => [
                 'Content-Type' => 'application/json',
                 'Accept' => 'application/json',
-                'header' => 'value',
+                'header' => 'headerValue',
             ],
         ]);
 
         $strategy = new ResponseCalls(new DocumentationConfig([]));
-        $results = $strategy->makeResponseCallIfConditionsPass($endpointData, $rules);
+        $results = $strategy($endpointData, $rules);
 
         $this->assertEquals(200, $results[0]['status']);
 
         $responseContent = json_decode($results[0]['content'], true);
         $this->assertEquals('queryValue', $responseContent['queryParam']);
         $this->assertEquals('bodyValue', $responseContent['bodyParam']);
-        $this->assertEquals('value', $responseContent['header']);
+        $this->assertEquals('headerValue', $responseContent['header']);
         $this->assertEquals('Bearer bearerToken', $responseContent['auth']);
     }
 
@@ -123,9 +122,7 @@ class ResponseCallsTest extends BaseLaravelTest
         ];
 
         $strategy = new ResponseCalls(new DocumentationConfig([]));
-        $results = $strategy->makeResponseCallIfConditionsPass(
-            ExtractedEndpointData::fromRoute($route), $rules
-        );
+        $results = $strategy(ExtractedEndpointData::fromRoute($route), $rules);
         $originalValue = json_decode($results[0]['content'], true)['app.env'];
 
         $now = time();
@@ -138,14 +135,59 @@ class ResponseCallsTest extends BaseLaravelTest
             ],
         ];
 
-        $results = $strategy->makeResponseCallIfConditionsPass(
-            ExtractedEndpointData::fromRoute($route), $rules
-        );
+        $results = $strategy(ExtractedEndpointData::fromRoute($route), $rules);
         $newValue = json_decode($results[0]['content'], true)['app.env'];
         $this->assertEquals($now, $newValue);
         $this->assertNotEquals($originalValue, $newValue);
     }
 
+    /** @test */
+    public function calls_beforeResponseCall_hook()
+    {
+        Scribe::beforeResponseCall(function (Request $request, ExtractedEndpointData $endpointData) {
+            $request->headers->set("header", "overridden_".$request->headers->get("header"));
+            $request->headers->set("Authorization", "overridden_".$request->headers->get("Authorization"));
+            $request->query->set("queryParam", "overridden_".$request->query->get("queryParam"));
+            $request->request->set("bodyParam", "overridden_".$endpointData->uri.$request->request->get("bodyParam"));
+        });
+
+        $route = LaravelRouteFacade::post('/echo/{id}', [TestController::class, 'echoesRequestValues']);
+
+        $rules = [
+            'response_calls' => [
+                'methods' => ['*'],
+                'queryParams' => [
+                    'queryParam' => 'queryValue',
+                ],
+                'bodyParams' => [
+                    'bodyParam' => 'bodyValue',
+                ],
+            ],
+        ];
+
+        $endpointData = ExtractedEndpointData::fromRoute($route, [
+            'auth' => ['headers', 'Authorization', 'Bearer bearerToken'],
+            'headers' => [
+                'Content-Type' => 'application/json',
+                'Accept' => 'application/json',
+                'header' => 'headerValue',
+            ],
+        ]);
+
+        $strategy = new ResponseCalls(new DocumentationConfig([]));
+        $results = $strategy($endpointData, $rules);
+
+        $this->assertEquals(200, $results[0]['status']);
+
+        $responseContent = json_decode($results[0]['content'], true);
+        $this->assertEquals('overridden_queryValue', $responseContent['queryParam']);
+        $this->assertEquals('overridden_headerValue', $responseContent['header']);
+        $this->assertEquals('overridden_Bearer bearerToken', $responseContent['auth']);
+        $this->assertEquals('overridden_echo/{id}bodyValue', $responseContent['bodyParam']);
+
+        Scribe::beforeResponseCall(fn() => null);
+    }
+
     /**
      * @test
      * @group dingo
@@ -165,9 +207,7 @@ class ResponseCallsTest extends BaseLaravelTest
         ];
 
         $strategy = new ResponseCalls(new DocumentationConfig());
-        $results = $strategy->makeResponseCallIfConditionsPass(
-            ExtractedEndpointData::fromRoute($route), $rules
-        );
+        $results = $strategy(ExtractedEndpointData::fromRoute($route), $rules);
 
         $this->assertEquals(200, $results[0]['status']);
         $this->assertArraySubset([
@@ -185,7 +225,7 @@ class ResponseCallsTest extends BaseLaravelTest
      */
     public function uses_configured_settings_when_calling_route_with_dingo()
     {
-        $route = $this->registerDingoRoute('post', '/echo/{id}', 'shouldFetchRouteResponseWithEchoedSettings');
+        $route = $this->registerDingoRoute('post', '/echo/{id}', 'echoesRequestValues');
 
         $rules = [
             'response_calls' => [
@@ -203,18 +243,18 @@ class ResponseCallsTest extends BaseLaravelTest
             'headers' => [
                 'Content-Type' => 'application/json',
                 'Accept' => 'application/json',
-                'header' => 'value',
+                'header' => 'headerValue',
             ],
         ]);
         $strategy = new ResponseCalls(new DocumentationConfig());
-        $results = $strategy->makeResponseCallIfConditionsPass($endpointData, $rules);
+        $results = $strategy($endpointData, $rules);
 
         $this->assertEquals(200, $results[0]['status']);
 
         $responseContent = json_decode($results[0]['content'], true);
         $this->assertEquals('queryValue', $responseContent['queryParam']);
         $this->assertEquals('bodyValue', $responseContent['bodyParam']);
-        $this->assertEquals('value', $responseContent['header']);
+        $this->assertEquals('headerValue', $responseContent['header']);
     }
 
     /**
@@ -232,9 +272,7 @@ class ResponseCallsTest extends BaseLaravelTest
         ];
 
         $strategy = new ResponseCalls(new DocumentationConfig());
-        $results = $strategy->makeResponseCallIfConditionsPass(
-            ExtractedEndpointData::fromRoute($route), $rules
-        );
+        $results = $strategy(ExtractedEndpointData::fromRoute($route), $rules);
         $originalValue = json_decode($results[0]['content'], true)['app.env'];
 
         $now = time();
@@ -247,9 +285,7 @@ class ResponseCallsTest extends BaseLaravelTest
             ],
         ];
 
-        $results = $strategy->makeResponseCallIfConditionsPass(
-            ExtractedEndpointData::fromRoute($route), $rules
-        );
+        $results = $strategy(ExtractedEndpointData::fromRoute($route), $rules);
         $newValue = json_decode($results[0]['content'], true)['app.env'];
         $this->assertEquals($now, $newValue);
         $this->assertNotEquals($originalValue, $newValue);
@@ -279,7 +315,7 @@ class ResponseCallsTest extends BaseLaravelTest
             ]),
         ]);
         $strategy = new ResponseCalls(new DocumentationConfig([]));
-        $results = $strategy->makeResponseCallIfConditionsPass($endpointData, $rules);
+        $results = $strategy($endpointData, $rules);
 
         $this->assertNull($results);
     }
@@ -295,9 +331,7 @@ class ResponseCallsTest extends BaseLaravelTest
             ],
         ];
         $strategy = new ResponseCalls(new DocumentationConfig([]));
-        $results = $strategy->makeResponseCallIfConditionsPass(
-            ExtractedEndpointData::fromRoute($route), $rules
-        );
+        $results = $strategy(ExtractedEndpointData::fromRoute($route), $rules);
 
         $this->assertNull($results);
     }