Browse Source

Move Responses to strategies

shalvah 5 years ago
parent
commit
d209dff999

+ 4 - 0
config/apidoc.php

@@ -190,6 +190,10 @@ return [
             \Mpociot\ApiDoc\Strategies\QueryParameters\GetFromDocBlocks::class,
         ],
         'responses' => [
+            \Mpociot\ApiDoc\Strategies\Responses\UseResponseTag::class,
+            \Mpociot\ApiDoc\Strategies\Responses\UseResponseFileTag::class,
+            \Mpociot\ApiDoc\Strategies\Responses\UseTransformerTags::class,
+            \Mpociot\ApiDoc\Strategies\Responses\ResponseCalls::class,
         ],
     ],
 

+ 14 - 11
src/Tools/ResponseStrategies/ResponseCallStrategy.php → src/Strategies/Responses/ResponseCalls.php

@@ -1,6 +1,6 @@
 <?php
 
-namespace Mpociot\ApiDoc\Tools\ResponseStrategies;
+namespace Mpociot\ApiDoc\Strategies\Responses;
 
 use Dingo\Api\Dispatcher;
 use Illuminate\Http\Request;
@@ -8,31 +8,38 @@ use Illuminate\Http\Response;
 use Illuminate\Routing\Route;
 use Mpociot\ApiDoc\Tools\Flags;
 use Mpociot\ApiDoc\Tools\Utils;
+use Mpociot\ApiDoc\Strategies\Strategy;
 use Mpociot\ApiDoc\Tools\Traits\ParamHelpers;
 
 /**
  * Make a call to the route and retrieve its response.
  */
-class ResponseCallStrategy
+class ResponseCalls extends Strategy
 {
     use ParamHelpers;
 
     /**
      * @param Route $route
-     * @param array $tags
-     * @param array $routeProps
+     * @param \ReflectionClass $controller
+     * @param \ReflectionMethod $method
+     * @param array $routeRules
+     * @param array $context
      *
      * @return array|null
      */
-    public function __invoke(Route $route, array $tags, array $routeProps)
+    public function __invoke(Route $route, \ReflectionClass $controller, \ReflectionMethod $method, array $routeRules, array $context = [])
     {
-        $rulesToApply = $routeProps['rules']['response_calls'] ?? [];
+        $rulesToApply = $routeRules['response_calls'] ?? [];
         if (! $this->shouldMakeApiCall($route, $rulesToApply)) {
             return null;
         }
 
         $this->configureEnvironment($rulesToApply);
-        $request = $this->prepareRequest($route, $rulesToApply, $routeProps['body'], $routeProps['query']);
+
+        // Mix in parsed parameters with manually specified parameters.
+        $bodyParameters = array_merge($context['cleanBodyParameters'], $rulesToApply['body'] ?? []);
+        $queryParameters = array_merge($context['cleanQueryParameters'], $rulesToApply['query'] ?? []);
+        $request = $this->prepareRequest($route, $rulesToApply, $bodyParameters, $queryParameters);
 
         try {
             $response = [$this->makeApiCall($request)];
@@ -80,10 +87,6 @@ class ResponseCallStrategy
         $request = Request::create($uri, $method, [], $cookies, [], $this->transformHeadersToServerVars($rulesToApply['headers'] ?? []));
         $request = $this->addHeaders($request, $route, $rulesToApply['headers'] ?? []);
 
-        // Mix in parsed parameters with manually specified parameters.
-        $queryParams = collect($this->cleanParams($queryParams))->merge($rulesToApply['query'] ?? [])->toArray();
-        $bodyParams = collect($this->cleanParams($bodyParams))->merge($rulesToApply['body'] ?? [])->toArray();
-
         $request = $this->addQueryParameters($request, $queryParams);
         $request = $this->addBodyParameters($request, $bodyParams);
 

+ 15 - 6
src/Tools/ResponseStrategies/ResponseFileStrategy.php → src/Strategies/Responses/UseResponseFileTag.php

@@ -1,26 +1,35 @@
 <?php
 
-namespace Mpociot\ApiDoc\Tools\ResponseStrategies;
+namespace Mpociot\ApiDoc\Strategies\Responses;
 
 use Illuminate\Routing\Route;
+use Mpociot\Reflection\DocBlock;
 use Illuminate\Http\JsonResponse;
 use Mpociot\Reflection\DocBlock\Tag;
+use Mpociot\ApiDoc\Strategies\Strategy;
+use Mpociot\ApiDoc\Tools\RouteDocBlocker;
 
 /**
  * Get a response from from a file in the docblock ( @responseFile ).
  */
-class ResponseFileStrategy
+class UseResponseFileTag extends Strategy
 {
     /**
      * @param Route $route
-     * @param array $tags
-     * @param array $routeProps
+     * @param \ReflectionClass $controller
+     * @param \ReflectionMethod $method
+     * @param array $routeRules
+     * @param array $context
      *
      * @return array|null
+     * @throws \Exception
      */
-    public function __invoke(Route $route, array $tags, array $routeProps)
+    public function __invoke(Route $route, \ReflectionClass $controller, \ReflectionMethod $method, array $routeRules, array $context = [])
     {
-        return $this->getFileResponses($tags);
+        $docBlocks = RouteDocBlocker::getDocBlocksFromRoute($route);
+        /** @var DocBlock $methodDocBlock */
+        $methodDocBlock = $docBlocks['method'];
+        return $this->getFileResponses($methodDocBlock->getTags());
     }
 
     /**

+ 15 - 6
src/Tools/ResponseStrategies/ResponseTagStrategy.php → src/Strategies/Responses/UseResponseTag.php

@@ -1,26 +1,35 @@
 <?php
 
-namespace Mpociot\ApiDoc\Tools\ResponseStrategies;
+namespace Mpociot\ApiDoc\Strategies\Responses;
 
 use Illuminate\Routing\Route;
+use Mpociot\Reflection\DocBlock;
 use Illuminate\Http\JsonResponse;
 use Mpociot\Reflection\DocBlock\Tag;
+use Mpociot\ApiDoc\Strategies\Strategy;
+use Mpociot\ApiDoc\Tools\RouteDocBlocker;
 
 /**
  * Get a response from the docblock ( @response ).
  */
-class ResponseTagStrategy
+class UseResponseTag extends Strategy
 {
     /**
      * @param Route $route
-     * @param array $tags
-     * @param array $routeProps
+     * @param \ReflectionClass $controller
+     * @param \ReflectionMethod $method
+     * @param array $routeRules
+     * @param array $context
      *
      * @return array|null
+     * @throws \Exception
      */
-    public function __invoke(Route $route, array $tags, array $routeProps)
+    public function __invoke(Route $route, \ReflectionClass $controller, \ReflectionMethod $method, array $routeRules, array $context = [])
     {
-        return $this->getDocBlockResponses($tags);
+        $docBlocks = RouteDocBlocker::getDocBlocksFromRoute($route);
+        /** @var DocBlock $methodDocBlock */
+        $methodDocBlock = $docBlocks['method'];
+        return $this->getDocBlockResponses($methodDocBlock->getTags());
     }
 
     /**

+ 15 - 6
src/Tools/ResponseStrategies/TransformerTagsStrategy.php → src/Strategies/Responses/UseTransformerTags.php

@@ -1,31 +1,40 @@
 <?php
 
-namespace Mpociot\ApiDoc\Tools\ResponseStrategies;
+namespace Mpociot\ApiDoc\Strategies\Responses;
 
 use ReflectionClass;
 use ReflectionMethod;
 use League\Fractal\Manager;
 use Illuminate\Routing\Route;
 use Mpociot\ApiDoc\Tools\Flags;
+use Mpociot\Reflection\DocBlock;
 use League\Fractal\Resource\Item;
 use Mpociot\Reflection\DocBlock\Tag;
+use Mpociot\ApiDoc\Strategies\Strategy;
 use League\Fractal\Resource\Collection;
+use Mpociot\ApiDoc\Tools\RouteDocBlocker;
 
 /**
  * Parse a transformer response from the docblock ( @transformer || @transformercollection ).
  */
-class TransformerTagsStrategy
+class UseTransformerTags extends Strategy
 {
     /**
      * @param Route $route
-     * @param array $tags
-     * @param array $routeProps
+     * @param ReflectionClass $controller
+     * @param ReflectionMethod $method
+     * @param array $rulesToApply
+     * @param array $context
      *
      * @return array|null
+     * @throws \Exception
      */
-    public function __invoke(Route $route, array $tags, array $routeProps)
+    public function __invoke(Route $route, \ReflectionClass $controller, \ReflectionMethod $method, array $rulesToApply, array $context = [])
     {
-        return $this->getTransformerResponse($tags);
+        $docBlocks = RouteDocBlocker::getDocBlocksFromRoute($route);
+        /** @var DocBlock $methodDocBlock */
+        $methodDocBlock = $docBlocks['method'];
+        return $this->getTransformerResponse($methodDocBlock->getTags());
     }
 
     /**

+ 47 - 55
src/Tools/Generator.php

@@ -7,8 +7,8 @@ use ReflectionClass;
 use ReflectionMethod;
 use Illuminate\Routing\Route;
 use Mpociot\Reflection\DocBlock;
-use Mpociot\Reflection\DocBlock\Tag;
 use Mpociot\ApiDoc\Tools\Traits\ParamHelpers;
+use Symfony\Component\HttpFoundation\Response;
 
 class Generator
 {
@@ -57,80 +57,72 @@ class Generator
         $controller = new ReflectionClass($controllerName);
         $method = $controller->getMethod($methodName);
 
-        $metadata = $this->fetchMetadata($controller, $method, $route, $rulesToApply);
-        $bodyParameters = $this->fetchBodyParameters($controller, $method, $route, $rulesToApply);
-        $queryParameters = $this->fetchQueryParameters($controller, $method, $route, $rulesToApply);
-        // $this->fetchResponse();
-
-        $docBlocks = RouteDocBlocker::getDocBlocksFromRoute($route);
-        /** @var DocBlock $methodDocBlock */
-        $methodDocBlock = $docBlocks['method'];
-        $content = ResponseResolver::getResponse($route, $methodDocBlock->getTags(), [
-            'rules' => $rulesToApply,
-            'body' => $bodyParameters,
-            'query' => $queryParameters,
-        ]);
-
         $parsedRoute = [
             'id' => md5($this->getUri($route).':'.implode($this->getMethods($route))),
             'methods' => $this->getMethods($route),
             'uri' => $this->getUri($route),
             'boundUri' => Utils::getFullUrl($route, $rulesToApply['bindings'] ?? ($rulesToApply['response_calls']['bindings'] ?? [])),
-            'queryParameters' => $queryParameters,
-            'bodyParameters' => $bodyParameters,
-            'cleanBodyParameters' => $this->cleanParams($bodyParameters),
-            'cleanQueryParameters' => $this->cleanParams($queryParameters),
-            'response' => $content,
-            'showresponse' => ! empty($content),
         ];
-        $parsedRoute['headers'] = $rulesToApply['headers'] ?? [];
+        $metadata = $this->fetchMetadata($controller, $method, $route, $rulesToApply);
         $parsedRoute += $metadata;
+        $bodyParameters = $this->fetchBodyParameters($controller, $method, $route, $rulesToApply, $parsedRoute);
+        $parsedRoute['bodyParameters'] = $bodyParameters;
+        $parsedRoute['cleanBodyParameters'] = $this->cleanParams($bodyParameters);
+
+        $queryParameters = $this->fetchQueryParameters($controller, $method, $route, $rulesToApply, $parsedRoute);
+        $parsedRoute['queryParameters'] = $queryParameters;
+        $parsedRoute['cleanQueryParameters'] = $this->cleanParams($queryParameters);
+
+        $responses = $this->fetchResponses($controller, $method, $route, $rulesToApply, $parsedRoute);
+        $parsedRoute['response'] = $responses;
+        $parsedRoute['showresponse'] = ! empty($responses);
+
+        $parsedRoute['headers'] = $rulesToApply['headers'] ?? [];
 
         return $parsedRoute;
     }
 
     protected function fetchMetadata(ReflectionClass $controller, ReflectionMethod $method, Route $route, array $rulesToApply)
     {
-        $metadataStrategies = $this->config->get('strategies.metadata', []);
-        $results = [];
-
-        foreach ($metadataStrategies as $strategyClass) {
-            $strategy = new $strategyClass($this->config);
-            $results = $strategy($route, $controller, $method, $rulesToApply);
-            if (count($results)) {
-                break;
-            }
-        }
-        return count($results) ? $results : [];
+        return $this->iterateThroughStrategies('metadata', [$route, $controller, $method, $rulesToApply]);
+    }
+
+    protected function fetchBodyParameters(ReflectionClass $controller, ReflectionMethod $method, Route $route, array $rulesToApply, array $context = [])
+    {
+        return $this->iterateThroughStrategies('bodyParameters', [$route, $controller, $method, $rulesToApply]);
     }
 
-    protected function fetchBodyParameters(ReflectionClass $controller, ReflectionMethod $method, Route $route, array $rulesToApply)
+    protected function fetchQueryParameters(ReflectionClass $controller, ReflectionMethod $method, Route $route, array $rulesToApply, array $context = [])
     {
-        $bodyParametersStrategies = $this->config->get('strategies.bodyParameters', []);
-        $results = [];
-
-        foreach ($bodyParametersStrategies as $strategyClass) {
-            $strategy = new $strategyClass($this->config);
-            $results = $strategy($route, $controller, $method, $rulesToApply);
-            if (count($results)) {
-                break;
-            }
+        return $this->iterateThroughStrategies('queryParameters', [$route, $controller, $method, $rulesToApply]);
+    }
+
+    protected function fetchResponses(ReflectionClass $controller, ReflectionMethod $method, Route $route, array $rulesToApply, array $context = [])
+    {
+        $responses = $this->iterateThroughStrategies('responses', [$route, $controller, $method, $rulesToApply, $context]);
+        if (count($responses)) {
+            return array_map(function (Response $response) {
+                return [
+                    'status' => $response->getStatusCode(),
+                    'content' => $response->getContent()
+                ];
+            }, $responses);
         }
-        return count($results) ? $results : [];
+        return null;
     }
 
-    protected function fetchQueryParameters(ReflectionClass $controller, ReflectionMethod $method, Route $route, array $rulesToApply)
+    protected function iterateThroughStrategies(string $key, array $arguments)
     {
-        $queryParametersStrategies = $this->config->get('strategies.queryParameters', []);
-        $results = [];
-
-        foreach ($queryParametersStrategies as $strategyClass) {
-            $strategy = new $strategyClass($this->config);
-            $results = $strategy($route, $controller, $method, $rulesToApply);
-            if (count($results)) {
-                break;
-            }
+    $strategies = $this->config->get("strategies.$key", []);
+    $results = [];
+
+    foreach ($strategies as $strategyClass) {
+        $strategy = new $strategyClass($this->config);
+        $results = $strategy(...$arguments);
+        if (! is_null($results)) {
+            break;
         }
-        return count($results) ? $results : [];
     }
+    return is_null($results) ? [] : $results;
+}
 }

+ 0 - 80
src/Tools/ResponseResolver.php

@@ -1,80 +0,0 @@
-<?php
-
-namespace Mpociot\ApiDoc\Tools;
-
-use Illuminate\Routing\Route;
-use Symfony\Component\HttpFoundation\Response;
-use Mpociot\ApiDoc\Tools\ResponseStrategies\ResponseTagStrategy;
-use Mpociot\ApiDoc\Tools\ResponseStrategies\ResponseCallStrategy;
-use Mpociot\ApiDoc\Tools\ResponseStrategies\ResponseFileStrategy;
-use Mpociot\ApiDoc\Tools\ResponseStrategies\TransformerTagsStrategy;
-
-class ResponseResolver
-{
-    /**
-     * @var array
-     */
-    public static $strategies = [
-        ResponseTagStrategy::class,
-        TransformerTagsStrategy::class,
-        ResponseFileStrategy::class,
-        ResponseCallStrategy::class,
-    ];
-
-    /**
-     * @var Route
-     */
-    private $route;
-
-    /**
-     * @param Route $route
-     */
-    public function __construct(Route $route)
-    {
-        $this->route = $route;
-    }
-
-    /**
-     * @param array $tags
-     * @param array $routeProps
-     *
-     * @return array|null
-     */
-    private function resolve(array $tags, array $routeProps)
-    {
-        foreach (static::$strategies as $strategy) {
-            $strategy = new $strategy();
-
-            /** @var Response[]|null $response */
-            $responses = $strategy($this->route, $tags, $routeProps);
-
-            if (! is_null($responses)) {
-                return array_map(function (Response $response) {
-                    return ['status' => $response->getStatusCode(), 'content' => $this->getResponseContent($response)];
-                }, $responses);
-            }
-        }
-    }
-
-    /**
-     * @param Route $route
-     * @param array $tags
-     * @param array $routeProps
-     *
-     * @return array
-     */
-    public static function getResponse(Route $route, array $tags, array $routeProps)
-    {
-        return (new static($route))->resolve($tags, $routeProps);
-    }
-
-    /**
-     * @param Response $response
-     *
-     * @return string
-     */
-    private function getResponseContent(Response $response)
-    {
-        return $response->getContent() ?: '';
-    }
-}

+ 8 - 3
tests/Fixtures/TestController.php

@@ -30,7 +30,7 @@ class TestController extends Controller
      */
     public function withGroupOverride()
     {
-        return '';
+        return "Group B, baby!";
     }
 
     /**
@@ -66,6 +66,8 @@ class TestController extends Controller
     }
 
     /**
+     * Endpoint with body parameters
+     *
      * @bodyParam user_id int required The id of the user. Example: 9
      * @bodyParam room_id string The id of the room.
      * @bodyParam forever boolean Whether to ban the user forever. Example: false
@@ -152,6 +154,7 @@ class TestController extends Controller
             'color' => strtolower($fruit->color),
             'weight' => $fruit->weight.' kg',
             'delicious' => $fruit->delicious,
+            'responseCall' => true,
         ];
     }
 
@@ -203,7 +206,8 @@ class TestController extends Controller
      *   "name": "banana",
      *   "color": "red",
      *   "weight": "1 kg",
-     *   "delicious": true
+     *   "delicious": true,
+     *   "responseTag": true
      * }
      */
     public function withResponseTag()
@@ -227,7 +231,8 @@ class TestController extends Controller
      *   "name": "banana",
      *   "color": "red",
      *   "weight": "1 kg",
-     *   "delicious": true
+     *   "delicious": true,
+     *   "multipleResponseTagsAndStatusCodes": true
      * }
      * @response 401 {
      *   "message": "Unauthorized"

+ 2 - 2
tests/Fixtures/TestResourceController.php

@@ -64,7 +64,7 @@ class TestResourceController extends Controller
     public function show($id)
     {
         return [
-            'show_resource' => $id,
+            'show_resource' => true,
         ];
     }
 
@@ -82,7 +82,7 @@ class TestResourceController extends Controller
     public function edit($id)
     {
         return [
-            'edit_resource' => $id,
+            'edit_resource' => true,
         ];
     }
 

+ 203 - 6
tests/Fixtures/collection.json

@@ -14,12 +14,20 @@
                 {
                     "name": "Example title.",
                     "request": {
-                        "url": "http:\/\/localhost\/api\/test",
+                        "url": "http:\/\/localhost\/api\/withDescription",
                         "method": "GET",
                         "header": [
+                            {
+                                "key": "Authorization",
+                                "value": "customAuthToken"
+                            },
+                            {
+                                "key": "Custom-Header",
+                                "value": "NotSoCustom"
+                            },
                             {
                                 "key": "Accept",
-                                "value": "application/json"
+                                "value": "application\/json"
                             }
                         ],
                         "body": {
@@ -31,14 +39,203 @@
                     }
                 },
                 {
-                    "name": "http:\/\/localhost\/api\/responseTag",
+                    "name": "http:\/\/localhost\/api\/withResponseTag",
+                    "request": {
+                        "url": "http:\/\/localhost\/api\/withResponseTag",
+                        "method": "GET",
+                        "header": [
+                            {
+                                "key": "Authorization",
+                                "value": "customAuthToken"
+                            },
+                            {
+                                "key": "Custom-Header",
+                                "value": "NotSoCustom"
+                            },
+                            {
+                                "key": "Accept",
+                                "value": "application\/json"
+                            }
+                        ],
+                        "body": {
+                            "mode": "formdata",
+                            "formdata": []
+                        },
+                        "description": "",
+                        "response": []
+                    }
+                },
+                {
+                    "name": "Endpoint with body parameters",
                     "request": {
-                        "url": "http:\/\/localhost\/api\/responseTag",
+                        "url": "http:\/\/localhost\/api\/withBodyParameters",
+                        "method": "GET",
+                        "header": [
+                            {
+                                "key": "Authorization",
+                                "value": "customAuthToken"
+                            },
+                            {
+                                "key": "Custom-Header",
+                                "value": "NotSoCustom"
+                            },
+                            {
+                                "key": "Accept",
+                                "value": "application\/json"
+                            }
+                        ],
+                        "body": {
+                            "mode": "formdata",
+                            "formdata": [
+                                {
+                                    "key": "user_id",
+                                    "value": 9,
+                                    "type": "text",
+                                    "enabled": true
+                                },
+                                {
+                                    "key": "room_id",
+                                    "value": "consequatur",
+                                    "type": "text",
+                                    "enabled": true
+                                },
+                                {
+                                    "key": "forever",
+                                    "value": false,
+                                    "type": "text",
+                                    "enabled": true
+                                },
+                                {
+                                    "key": "another_one",
+                                    "value": 11613.31890586,
+                                    "type": "text",
+                                    "enabled": true
+                                },
+                                {
+                                    "key": "yet_another_param",
+                                    "value": {},
+                                    "type": "text",
+                                    "enabled": true
+                                },
+                                {
+                                    "key": "even_more_param",
+                                    "value": [],
+                                    "type": "text",
+                                    "enabled": true
+                                },
+                                {
+                                    "key": "book.name",
+                                    "value": "consequatur",
+                                    "type": "text",
+                                    "enabled": true
+                                },
+                                {
+                                    "key": "book.author_id",
+                                    "value": 17,
+                                    "type": "text",
+                                    "enabled": true
+                                },
+                                {
+                                    "key": "book[pages_count]",
+                                    "value": 17,
+                                    "type": "text",
+                                    "enabled": true
+                                },
+                                {
+                                    "key": "ids.*",
+                                    "value": 17,
+                                    "type": "text",
+                                    "enabled": true
+                                },
+                                {
+                                    "key": "users.*.first_name",
+                                    "value": "John",
+                                    "type": "text",
+                                    "enabled": true
+                                },
+                                {
+                                    "key": "users.*.last_name",
+                                    "value": "Doe",
+                                    "type": "text",
+                                    "enabled": true
+                                }
+                            ]
+                        },
+                        "description": "",
+                        "response": []
+                    }
+                },
+                {
+                    "name": "http:\/\/localhost\/api\/withQueryParameters",
+                    "request": {
+                        "url": "http:\/\/localhost\/api\/withQueryParameters?location_id=consequatur&user_id=me&page=4&filters=consequatur&url_encoded=%2B+%5B%5D%26%3D",
+                        "method": "GET",
+                        "header": [
+                            {
+                                "key": "Authorization",
+                                "value": "customAuthToken"
+                            },
+                            {
+                                "key": "Custom-Header",
+                                "value": "NotSoCustom"
+                            },
+                            {
+                                "key": "Accept",
+                                "value": "application\/json"
+                            }
+                        ],
+                        "body": {
+                            "mode": "formdata",
+                            "formdata": []
+                        },
+                        "description": "",
+                        "response": []
+                    }
+                },
+                {
+                    "name": "http:\/\/localhost\/api\/withAuthTag",
+                    "request": {
+                        "url": "http:\/\/localhost\/api\/withAuthTag",
+                        "method": "GET",
+                        "header": [
+                            {
+                                "key": "Authorization",
+                                "value": "customAuthToken"
+                            },
+                            {
+                                "key": "Custom-Header",
+                                "value": "NotSoCustom"
+                            },
+                            {
+                                "key": "Accept",
+                                "value": "application\/json"
+                            }
+                        ],
+                        "body": {
+                            "mode": "formdata",
+                            "formdata": []
+                        },
+                        "description": "",
+                        "response": []
+                    }
+                },
+                {
+                    "name": "http:\/\/localhost\/api\/withMultipleResponseTagsAndStatusCode",
+                    "request": {
+                        "url": "http:\/\/localhost\/api\/withMultipleResponseTagsAndStatusCode",
                         "method": "POST",
                         "header": [
+                            {
+                                "key": "Authorization",
+                                "value": "customAuthToken"
+                            },
+                            {
+                                "key": "Custom-Header",
+                                "value": "NotSoCustom"
+                            },
                             {
                                 "key": "Accept",
-                                "value": "application/json"
+                                "value": "application\/json"
                             }
                         ],
                         "body": {
@@ -52,4 +249,4 @@
             ]
         }
     ]
-}
+}

+ 2 - 2
tests/Fixtures/collection_with_body_parameters.json

@@ -12,7 +12,7 @@
             "description": "",
             "item": [
                 {
-                    "name": "http://localhost/api/withBodyParameters",
+                    "name": "Endpoint with body parameters",
                     "request": {
                         "url": "http:\/\/localhost\/api\/withBodyParameters",
                         "method": "GET",
@@ -106,4 +106,4 @@
             ]
         }
     ]
-}
+}

+ 59 - 2
tests/Fixtures/index.md

@@ -105,7 +105,8 @@ fetch(url, {
     "name": "banana",
     "color": "red",
     "weight": "1 kg",
-    "delicious": true
+    "delicious": true,
+    "responseTag": true
 }
 ```
 
@@ -116,7 +117,8 @@ fetch(url, {
 <!-- END_9cedd363be06f5512f9e844b100fcc9d -->
 
 <!-- START_a25cb3b490fa579d7d77b386bbb7ec03 -->
-## api/withBodyParameters
+## Endpoint with body parameters
+
 > Example request:
 
 ```bash
@@ -300,4 +302,59 @@ null
 
 <!-- END_5c08cc4d72b6e5830f6814c64086e197 -->
 
+<!-- START_55f321056bfc0de7269ac70e24eb84be -->
+## api/withMultipleResponseTagsAndStatusCode
+> Example request:
+
+```bash
+curl -X POST "http://localhost/api/withMultipleResponseTagsAndStatusCode" \
+    -H "Authorization: customAuthToken" \
+    -H "Custom-Header: NotSoCustom"
+```
+
+```javascript
+const url = new URL("http://localhost/api/withMultipleResponseTagsAndStatusCode");
+
+let headers = {
+    "Authorization": "customAuthToken",
+    "Custom-Header": "NotSoCustom",
+    "Accept": "application/json",
+    "Content-Type": "application/json",
+}
+
+fetch(url, {
+    method: "POST",
+    headers: headers,
+})
+    .then(response => response.json())
+    .then(json => console.log(json));
+```
+
+
+> Example response (200):
+
+```json
+{
+    "id": 4,
+    "name": "banana",
+    "color": "red",
+    "weight": "1 kg",
+    "delicious": true,
+    "multipleResponseTagsAndStatusCodes": true
+}
+```
+> Example response (401):
+
+```json
+{
+    "message": "Unauthorized"
+}
+```
+
+### HTTP Request
+`POST api/withMultipleResponseTagsAndStatusCode`
+
+
+<!-- END_55f321056bfc0de7269ac70e24eb84be -->
+
 

+ 17 - 3
tests/GenerateDocumentationTest.php

@@ -29,7 +29,7 @@ class GenerateDocumentationTest extends TestCase
 
     public function tearDown()
     {
-        Utils::deleteDirectoryAndContents('/public/docs');
+       Utils::deleteDirectoryAndContents('/public/docs');
     }
 
     /**
@@ -176,6 +176,7 @@ class GenerateDocumentationTest extends TestCase
         RouteFacade::get('/api/withBodyParameters', TestController::class.'@withBodyParameters');
         RouteFacade::get('/api/withQueryParameters', TestController::class.'@withQueryParameters');
         RouteFacade::get('/api/withAuthTag', TestController::class.'@withAuthenticatedTag');
+        RouteFacade::post('/api/withMultipleResponseTagsAndStatusCode', [TestController::class, 'withMultipleResponseTagsAndStatusCode']);
 
         // We want to have the same values for params each time
         config(['apidoc.faker_seed' => 1234]);
@@ -220,10 +221,23 @@ class GenerateDocumentationTest extends TestCase
     /** @test */
     public function generated_postman_collection_file_is_correct()
     {
-        RouteFacade::get('/api/test', TestController::class.'@withEndpointDescription');
-        RouteFacade::post('/api/responseTag', TestController::class.'@withResponseTag');
+        RouteFacade::get('/api/withDescription', TestController::class.'@withEndpointDescription');
+        RouteFacade::get('/api/withResponseTag', TestController::class.'@withResponseTag');
+        RouteFacade::get('/api/withBodyParameters', TestController::class.'@withBodyParameters');
+        RouteFacade::get('/api/withQueryParameters', TestController::class.'@withQueryParameters');
+        RouteFacade::get('/api/withAuthTag', TestController::class.'@withAuthenticatedTag');
+        RouteFacade::post('/api/withMultipleResponseTagsAndStatusCode', [TestController::class, 'withMultipleResponseTagsAndStatusCode']);
 
+        // We want to have the same values for params each time
+        config(['apidoc.faker_seed' => 1234]);
         config(['apidoc.routes.0.match.prefixes' => ['api/*']]);
+        config([
+            'apidoc.routes.0.apply.headers' => [
+                'Authorization' => 'customAuthToken',
+                'Custom-Header' => 'NotSoCustom',
+            ],
+        ]);
+
         $this->artisan('apidoc:generate');
 
         $generatedCollection = json_decode(file_get_contents(__DIR__.'/../public/docs/collection.json'), true);

+ 4 - 1
tests/Unit/GeneratorTestCase.php

@@ -25,7 +25,10 @@ abstract class GeneratorTestCase extends TestCase
                 \Mpociot\ApiDoc\Strategies\QueryParameters\GetFromDocBlocks::class,
             ],
             'responses' => [
-
+                \Mpociot\ApiDoc\Strategies\Responses\UseResponseTag::class,
+                \Mpociot\ApiDoc\Strategies\Responses\UseResponseFileTag::class,
+                \Mpociot\ApiDoc\Strategies\Responses\UseTransformerTags::class,
+                \Mpociot\ApiDoc\Strategies\Responses\ResponseCalls::class,
             ],
         ],
         'default_group' => 'general',