소스 검색

Mix in documented paramters with anually specified ones when making requests

shalvah 6 년 전
부모
커밋
cd804a3f4c

+ 16 - 4
src/Tools/Generator.php

@@ -46,7 +46,13 @@ class Generator
 
         $routeGroup = $this->getRouteGroup($controller, $method);
         $docBlock = $this->parseDocBlock($method);
-        $content = ResponseResolver::getResponse($route, $docBlock['tags'], $rulesToApply);
+        $bodyParameters = $this->getBodyParametersFromDocBlock($docBlock['tags']);
+        $queryParameters = $this->getQueryParametersFromDocBlock($docBlock['tags']);
+        $content = ResponseResolver::getResponse($route, $docBlock['tags'], [
+            'rules' => $rulesToApply,
+            'body' => $bodyParameters,
+            'query' => $queryParameters,
+        ]);
 
         $parsedRoute = [
             'id' => md5($this->getUri($route).':'.implode($this->getMethods($route))),
@@ -55,8 +61,8 @@ class Generator
             'description' => $docBlock['long'],
             'methods' => $this->getMethods($route),
             'uri' => $this->getUri($route),
-            'bodyParameters' => $this->getBodyParametersFromDocBlock($docBlock['tags']),
-            'queryParameters' => $this->getQueryParametersFromDocBlock($docBlock['tags']),
+            'bodyParameters' => $bodyParameters,
+            'queryParameters' => $queryParameters,
             'authenticated' => $this->getAuthStatusFromDocBlock($docBlock['tags']),
             'response' => $content,
             'showresponse' => ! empty($content),
@@ -131,7 +137,13 @@ class Generator
                     $required = trim($required) == 'required' ? true : false;
                 }
 
-                return [$name => compact('description', 'required')];
+                if (str_contains($description, ['number', 'count', 'page'])) {
+                    $value = $this->generateDummyValue('integer');
+                } else {
+                    $value = $this->generateDummyValue('string');
+                }
+
+                return [$name => compact('description', 'required', 'value')];
             })->toArray();
 
         return $parameters;

+ 4 - 4
src/Tools/ResponseResolver.php

@@ -25,21 +25,21 @@ class ResponseResolver
         $this->route = $route;
     }
 
-    private function resolve(array $tags, array $rulesToApply)
+    private function resolve(array $tags, array $routeProps)
     {
         $response = null;
         foreach (static::$strategies as $strategy) {
             $strategy = new $strategy();
-            $response = $strategy($this->route, $tags, $rulesToApply);
+            $response = $strategy($this->route, $tags, $routeProps);
             if (! is_null($response)) {
                 return $this->getResponseContent($response);
             }
         }
     }
 
-    public static function getResponse($route, $tags, $rulesToApply)
+    public static function getResponse($route, $tags, $routeProps)
     {
-        return (new static($route))->resolve($tags, $rulesToApply);
+        return (new static($route))->resolve($tags, $routeProps);
     }
 
     /**

+ 12 - 7
src/Tools/ResponseStrategies/ResponseCallStrategy.php

@@ -12,15 +12,15 @@ use Illuminate\Routing\Route;
  */
 class ResponseCallStrategy
 {
-    public function __invoke(Route $route, array $tags, array $rulesToApply)
+    public function __invoke(Route $route, array $tags, array $routeProps)
     {
-        $rulesToApply = $rulesToApply['response_calls'] ?? [];
+        $rulesToApply = $routeProps['rules']['response_calls'] ?? [];
         if (! $this->shouldMakeApiCall($route, $rulesToApply)) {
             return;
         }
 
         $this->configureEnvironment($rulesToApply);
-        $request = $this->prepareRequest($route, $rulesToApply);
+        $request = $this->prepareRequest($route, $rulesToApply, $routeProps['body'], $routeProps['query']);
         try {
             $response = $this->makeApiCall($request);
         } catch (\Exception $e) {
@@ -38,15 +38,20 @@ class ResponseCallStrategy
         $this->setEnvironmentVariables($rulesToApply['env'] ?? []);
     }
 
-    private function prepareRequest(Route $route, array $rulesToApply)
+    private function prepareRequest(Route $route, array $rulesToApply, array $bodyParams, array $queryParams)
     {
         $uri = $this->replaceUrlParameterBindings($route, $rulesToApply['bindings'] ?? []);
         $routeMethods = $this->getMethods($route);
         $method = array_shift($routeMethods);
         $request = Request::create($uri, $method, [], [], [], $this->transformHeadersToServerVars($rulesToApply['headers'] ?? []));
         $request = $this->addHeaders($request, $route, $rulesToApply['headers'] ?? []);
-        $request = $this->addQueryParameters($request, $rulesToApply['query'] ?? []);
-        $request = $this->addBodyParameters($request, $rulesToApply['body'] ?? []);
+
+        // Mix in parsed parameters with manually specified parameters.
+        $queryParams = collect($queryParams)->map->value->merge($rulesToApply['query'] ?? [])->toArray();
+        $bodyParams = collect($bodyParams)->map->value->merge($rulesToApply['body'] ?? [])->toArray();
+
+        $request = $this->addQueryParameters($request, $queryParams);
+        $request = $this->addBodyParameters($request, $bodyParams);
 
         return $request;
     }
@@ -188,7 +193,7 @@ class ResponseCallStrategy
      *
      * @return \Symfony\Component\HttpFoundation\Response
      */
-    private function callLaravelRoute($request): \Symfony\Component\HttpFoundation\Response
+    private function callLaravelRoute(Request $request): \Symfony\Component\HttpFoundation\Response
     {
         $kernel = app(\Illuminate\Contracts\Http\Kernel::class);
         $response = $kernel->handle($request);

+ 1 - 1
src/Tools/ResponseStrategies/ResponseTagStrategy.php

@@ -10,7 +10,7 @@ use Mpociot\Reflection\DocBlock\Tag;
  */
 class ResponseTagStrategy
 {
-    public function __invoke(Route $route, array $tags, array $rulesToApply)
+    public function __invoke(Route $route, array $tags, array $routeProps)
     {
         return $this->getDocBlockResponse($tags);
     }

+ 1 - 1
src/Tools/ResponseStrategies/TransformerTagsStrategy.php

@@ -15,7 +15,7 @@ use League\Fractal\Resource\Collection;
  */
 class TransformerTagsStrategy
 {
-    public function __invoke(Route $route, array $tags, array $rulesToApply)
+    public function __invoke(Route $route, array $tags, array $routeProps)
     {
         return $this->getTransformerResponse($tags);
     }

+ 1 - 1
tests/Unit/GeneratorTestCase.php

@@ -228,7 +228,7 @@ abstract class GeneratorTestCase extends TestCase
     /** @test */
     public function can_call_route_and_generate_response()
     {
-        $route = $this->createRoute('PUT', '/shouldFetchRouteResponse', 'shouldFetchRouteResponse', true);
+        $route = $this->createRoute('POST', '/shouldFetchRouteResponse', 'shouldFetchRouteResponse', true);
 
         $rules = [
             'response_calls' => [