Browse Source

Fix dingo tests

shalvah 5 years ago
parent
commit
6b57d4766d

+ 15 - 7
src/Extracting/Strategies/Responses/ResponseCalls.php

@@ -8,6 +8,7 @@ use Illuminate\Contracts\Http\Kernel;
 use Illuminate\Http\Request;
 use Illuminate\Http\Response;
 use Illuminate\Routing\Route;
+use Dingo\Api\Routing\Route as DingoRoute;
 use Illuminate\Support\Str;
 use Knuckles\Scribe\Extracting\DatabaseTransactionHelpers;
 use Knuckles\Scribe\Extracting\ParamHelpers;
@@ -60,7 +61,7 @@ class ResponseCalls extends Strategy
         $request = $this->prepareRequest($route, $rulesToApply, $urlParameters, $bodyParameters, $queryParameters, $context['headers'] ?? []);
 
         try {
-            $response = $this->makeApiCall($request);
+            $response = $this->makeApiCall($request, $route);
             $response = [
                 [
                     'status' => $response->getStatusCode(),
@@ -154,11 +155,13 @@ class ResponseCalls extends Strategy
      *
      * @return \Illuminate\Http\JsonResponse|mixed
      */
-    public function callDingoRoute(Request $request)
+    public function callDingoRoute(Request $request, Route $route)
     {
         /** @var Dispatcher $dispatcher */
         $dispatcher = app(\Dingo\Api\Dispatcher::class);
 
+        /** @var DingoRoute $route */
+        $dispatcher->version($route->versions()[0]);
         foreach ($request->headers as $header => $value) {
             $dispatcher->header($header, $value);
         }
@@ -173,7 +176,11 @@ class ResponseCalls extends Strategy
         if (! empty($query)) {
             $uri .= "?$query";
         }
-        $response = call_user_func_array([$dispatcher, strtolower($request->method())], [$uri]);
+
+        $response = call_user_func_array(
+            [$dispatcher, strtolower($request->method())],
+            [$uri]
+        );
 
         // the response from the Dingo dispatcher is the 'raw' response from the controller,
         // so we have to ensure it's JSON first
@@ -271,14 +278,15 @@ class ResponseCalls extends Strategy
     /**
      * @param Request $request
      *
-     * @throws Exception
+     * @param Route $route
      *
      * @return \Illuminate\Http\JsonResponse|mixed|\Symfony\Component\HttpFoundation\Response
+     * @throws Exception
      */
-    protected function makeApiCall(Request $request)
+    protected function makeApiCall(Request $request, Route $route)
     {
-        if (config('scribe.router') == 'dingo') {
-            $response = $this->callDingoRoute($request);
+        if ($this->config->get('router') == 'dingo') {
+            $response = $this->callDingoRoute($request, $route);
         } else {
             $response = $this->callLaravelRoute($request);
         }

+ 5 - 1
tests/Extracting/Strategies/BodyParameters/GetFromFormRequestTest.php

@@ -17,9 +17,13 @@ class GetFromFormRequestTest extends TestCase
 
     protected function getPackageProviders($app)
     {
-        return [
+        $providers = [
             ScribeServiceProvider::class,
         ];
+        if (class_exists(\Dingo\Api\Provider\LaravelServiceProvider::class)) {
+            $providers[] = \Dingo\Api\Provider\LaravelServiceProvider::class;
+        }
+        return $providers;
     }
 
     /** @test */

+ 25 - 11
tests/Extracting/Strategies/Responses/ResponseCallsTest.php

@@ -2,11 +2,14 @@
 
 namespace Knuckles\Scribe\Tests\Extracting\Strategies\Responses;
 
+use Dingo\Api\Routing\Router;
+use Illuminate\Routing\Route;
 use Knuckles\Scribe\Extracting\Strategies\Responses\ResponseCalls;
 use Knuckles\Scribe\ScribeServiceProvider;
 use Knuckles\Scribe\Tests\Fixtures\TestController;
 use Knuckles\Scribe\Tools\DocumentationConfig;
 use DMS\PHPUnitExtensions\ArraySubset\ArraySubsetAsserts;
+use Knuckles\Scribe\Tools\Flags;
 use Orchestra\Testbench\TestCase;
 use Illuminate\Support\Facades\Route as LaravelRouteFacade;
 use Dingo\Api\Routing\Router as DingoRouter;
@@ -17,9 +20,13 @@ class ResponseCallsTest extends TestCase
 
     protected function getPackageProviders($app)
     {
-        return [
+        $providers = [
             ScribeServiceProvider::class,
         ];
+        if (class_exists(\Dingo\Api\Provider\LaravelServiceProvider::class)) {
+            $providers[] = \Dingo\Api\Provider\LaravelServiceProvider::class;
+        }
+        return $providers;
     }
 
     /** @test */
@@ -136,7 +143,7 @@ class ResponseCallsTest extends TestCase
             ],
         ];
 
-        $strategy = new ResponseCalls(new DocumentationConfig([]));
+        $strategy = new ResponseCalls(new DocumentationConfig(['router' => 'dingo']));
         $results = $strategy->makeResponseCallIfEnabledAndNoSuccessResponses($route, $rules, []);
 
         $this->assertEquals(200, $results[0]['status']);
@@ -176,7 +183,7 @@ class ResponseCallsTest extends TestCase
             ],
         ];
 
-        $strategy = new ResponseCalls(new DocumentationConfig([]));
+        $strategy = new ResponseCalls(new DocumentationConfig(['router' => 'dingo']));
         $results = $strategy->makeResponseCallIfEnabledAndNoSuccessResponses($route, $rules, $context);
 
         $this->assertEquals(200, $results[0]['status']);
@@ -201,7 +208,7 @@ class ResponseCallsTest extends TestCase
             ],
         ];
 
-        $strategy = new ResponseCalls(new DocumentationConfig([]));
+        $strategy = new ResponseCalls(new DocumentationConfig(['router' => 'dingo']));
         $results = $strategy->makeResponseCallIfEnabledAndNoSuccessResponses($route, $rules, []);
         $originalValue = json_decode($results[0]['content'], true)['app.env'];
 
@@ -251,13 +258,20 @@ class ResponseCallsTest extends TestCase
 
     public function registerDingoRoute(string $httpMethod, string $path, string $controllerMethod)
     {
-        $route = null;
-        /** @var DingoRouter $api */
-        $api = app(DingoRouter::class);
-        $api->version('v1', function (DingoRouter $api) use ($controllerMethod, $path, $httpMethod, &$route) {
-            $route = $api->$httpMethod($path, [TestController::class . $controllerMethod]);
+        $desiredRoute = null;
+        /** @var Router $api */
+        $api = app(Router::class);
+        $api->version('v1', function (Router $api) use ($controllerMethod, $path, $httpMethod, &$desiredRoute) {
+            $desiredRoute = $api->$httpMethod($path, [TestController::class, $controllerMethod]);
         });
-
-        return $route;
+        $routes = app(\Dingo\Api\Routing\Router::class)->getRoutes('v1');
+
+        /*
+         * Doing this bc we want an instance of Dingo\Api\Routing\Route, not Illuminate\Routing\Route, which the method above returns
+         */
+        return collect($routes)
+            ->first(function (Route $route) use ($desiredRoute) {
+                return $route->uri() === $desiredRoute->uri();
+            });
     }
 }

+ 5 - 1
tests/Extracting/Strategies/Responses/UseApiResourceTagsTest.php

@@ -18,9 +18,13 @@ class UseApiResourceTagsTest extends TestCase
 
     protected function getPackageProviders($app)
     {
-        return [
+        $providers = [
             ScribeServiceProvider::class,
         ];
+        if (class_exists(\Dingo\Api\Provider\LaravelServiceProvider::class)) {
+            $providers[] = \Dingo\Api\Provider\LaravelServiceProvider::class;
+        }
+        return $providers;
     }
 
     public function setUp(): void

+ 5 - 1
tests/Extracting/Strategies/Responses/UseResponseFileTagTest.php

@@ -15,9 +15,13 @@ class UseResponseFileTagTest extends TestCase
 
     protected function getPackageProviders($app)
     {
-        return [
+        $providers = [
             ScribeServiceProvider::class,
         ];
+        if (class_exists(\Dingo\Api\Provider\LaravelServiceProvider::class)) {
+            $providers[] = \Dingo\Api\Provider\LaravelServiceProvider::class;
+        }
+        return $providers;
     }
 
     /**

+ 5 - 1
tests/Extracting/Strategies/Responses/UseTransformerTagsTest.php

@@ -17,9 +17,13 @@ class UseTransformerTagsTest extends TestCase
 
     protected function getPackageProviders($app)
     {
-        return [
+        $providers = [
             ScribeServiceProvider::class,
         ];
+        if (class_exists(\Dingo\Api\Provider\LaravelServiceProvider::class)) {
+            $providers[] = \Dingo\Api\Provider\LaravelServiceProvider::class;
+        }
+        return $providers;
     }
 
     /**

+ 7 - 3
tests/GenerateDocumentationTest.php

@@ -48,9 +48,13 @@ class GenerateDocumentationTest extends TestCase
      */
     protected function getPackageProviders($app)
     {
-        return [
+        $providers = [
             ScribeServiceProvider::class,
         ];
+        if (class_exists(\Dingo\Api\Provider\LaravelServiceProvider::class)) {
+            $providers[] = \Dingo\Api\Provider\LaravelServiceProvider::class;
+        }
+        return $providers;
     }
 
     /** @test */
@@ -163,7 +167,7 @@ class GenerateDocumentationTest extends TestCase
     public function can_parse_partial_resource_routes()
     {
         RouteFacade::resource('/api/users', TestResourceController::class)
-                ->only(['index', 'store']);
+            ->only(['index', 'store']);
 
         config(['scribe.routes.0.match.prefixes' => ['api/*']]);
         config([
@@ -181,7 +185,7 @@ class GenerateDocumentationTest extends TestCase
         $this->assertStringNotContainsString('Processed route: [DELETE] api/users/{user}', $output);
 
         RouteFacade::apiResource('/api/users', TestResourceController::class)
-                ->only(['index', 'store']);
+            ->only(['index', 'store']);
         $output = $this->artisan('scribe:generate');
 
         $this->assertStringContainsString('Processed route: [GET] api/users', $output);

+ 18 - 5
tests/Unit/DingoGeneratorTest.php

@@ -2,9 +2,13 @@
 
 namespace Knuckles\Scribe\Tests\Unit;
 
+use Dingo\Api\Routing\RouteCollection;
 use Dingo\Api\Routing\Router;
+use Illuminate\Routing\Route;
+use Knuckles\Scribe\Extracting\Generator;
 use Knuckles\Scribe\ScribeServiceProvider;
 use Knuckles\Scribe\Tests\Fixtures\TestController;
+use Knuckles\Scribe\Tools\DocumentationConfig;
 
 /**
  * @group dingo
@@ -23,19 +27,28 @@ class DingoGeneratorTest extends GeneratorTestCase
     {
         parent::setUp();
 
-        config(['scribe.router' => 'dingo']);
+        $config = $this->config;
+        $config['router'] = 'dingo';
+        $this->generator = new Generator(new DocumentationConfig($config));
     }
 
     public function createRoute(string $httpMethod, string $path, string $controllerMethod, $register = false, $class = TestController::class)
     {
-        $route = null;
+        $desiredRoute = null;
         /** @var Router $api */
         $api = app(Router::class);
-        $api->version('v1', function (Router $api) use ($class, $controllerMethod, $path, $httpMethod, &$route) {
-            $route = $api->$httpMethod($path, $class . "@$controllerMethod");
+        $api->version('v1', function (Router $api) use ($class, $controllerMethod, $path, $httpMethod, &$desiredRoute) {
+            $desiredRoute = $api->$httpMethod($path, $class . "@$controllerMethod");
         });
+        $routes = app(\Dingo\Api\Routing\Router::class)->getRoutes('v1');
 
-        return $route;
+        /*
+         * Doing this bc we want an instance of Dingo\Api\Routing\Route, not Illuminate\Routing\Route, which the method above returns
+         */
+        return collect($routes)
+            ->first(function (Route $route) use ($desiredRoute) {
+                return $route->uri() === $desiredRoute->uri();
+            });
     }
 
     public function createRouteUsesArray(string $httpMethod, string $path, string $controllerMethod, $register = false, $class = TestController::class)

+ 5 - 1
tests/Unit/GeneratorPluginSystemTestCase.php

@@ -23,9 +23,13 @@ class GeneratorPluginSystemTestCase extends LaravelGeneratorTest
 
     protected function getPackageProviders($app)
     {
-        return [
+        $providers = [
             ScribeServiceProvider::class,
         ];
+        if (class_exists(\Dingo\Api\Provider\LaravelServiceProvider::class)) {
+            $providers[] = \Dingo\Api\Provider\LaravelServiceProvider::class;
+        }
+        return $providers;
     }
 
     /** @test */

+ 7 - 2
tests/Unit/GeneratorTestCase.php

@@ -8,6 +8,7 @@ use Knuckles\Scribe\ScribeServiceProvider;
 use Knuckles\Scribe\Extracting\Generator;
 use Knuckles\Scribe\Tests\Fixtures\TestController;
 use Knuckles\Scribe\Tools\DocumentationConfig;
+use Knuckles\Scribe\Tools\Flags;
 use Orchestra\Testbench\TestCase;
 
 abstract class GeneratorTestCase extends TestCase
@@ -18,7 +19,7 @@ abstract class GeneratorTestCase extends TestCase
      * @var \Knuckles\Scribe\Extracting\Generator
      */
     protected $generator;
-    private $config = [
+    protected $config = [
         'strategies' => [
             'metadata' => [
                 \Knuckles\Scribe\Extracting\Strategies\Metadata\GetFromDocBlocks::class,
@@ -53,9 +54,13 @@ abstract class GeneratorTestCase extends TestCase
 
     protected function getPackageProviders($app)
     {
-        return [
+        $providers = [
             ScribeServiceProvider::class,
         ];
+        if (class_exists(\Dingo\Api\Provider\LaravelServiceProvider::class)) {
+            $providers[] = \Dingo\Api\Provider\LaravelServiceProvider::class;
+        }
+        return $providers;
     }
 
     /**

+ 5 - 1
tests/Unit/LaravelGeneratorTest.php

@@ -11,9 +11,13 @@ class LaravelGeneratorTest extends GeneratorTestCase
 {
     protected function getPackageProviders($app)
     {
-        return [
+        $providers = [
             ScribeServiceProvider::class,
         ];
+        if (class_exists(\Dingo\Api\Provider\LaravelServiceProvider::class)) {
+            $providers[] = \Dingo\Api\Provider\LaravelServiceProvider::class;
+        }
+        return $providers;
     }
 
     public function createRoute(string $httpMethod, string $path, string $controllerMethod, $register = false, $class = TestController::class)

+ 1 - 1
tests/Unit/RouteMatcherDingoTest.php

@@ -15,7 +15,7 @@ class RouteMatcherDingoTest extends TestCase
     protected function getPackageProviders($app)
     {
         return [
-            "\Dingo\Api\Provider\LaravelServiceProvider",
+            \Dingo\Api\Provider\LaravelServiceProvider::class,
         ];
     }