Browse Source

Include responses in generated Postman collection

shalvah 4 years ago
parent
commit
359462eda8
2 changed files with 316 additions and 248 deletions
  1. 22 2
      src/Writing/PostmanCollectionWriter.php
  2. 294 246
      tests/Fixtures/collection.json

+ 22 - 2
src/Writing/PostmanCollectionWriter.php

@@ -3,6 +3,7 @@
 namespace Knuckles\Scribe\Writing;
 namespace Knuckles\Scribe\Writing;
 
 
 use Illuminate\Support\Str;
 use Illuminate\Support\Str;
+use Knuckles\Camel\Extraction\Response;
 use Knuckles\Camel\Output\OutputEndpointData;
 use Knuckles\Camel\Output\OutputEndpointData;
 use Knuckles\Camel\Output\Parameter;
 use Knuckles\Camel\Output\Parameter;
 use Knuckles\Scribe\Tools\DocumentationConfig;
 use Knuckles\Scribe\Tools\DocumentationConfig;
@@ -12,6 +13,7 @@ class PostmanCollectionWriter
 {
 {
     /**
     /**
      * Postman collection schema version
      * Postman collection schema version
+     * https://schema.getpostman.com/json/collection/v2.1.0/collection.json
      */
      */
     const VERSION = '2.1.0';
     const VERSION = '2.1.0';
 
 
@@ -110,7 +112,7 @@ class PostmanCollectionWriter
                 'body' => empty($endpoint->bodyParameters) ? null : $this->getBodyData($endpoint),
                 'body' => empty($endpoint->bodyParameters) ? null : $this->getBodyData($endpoint),
                 'description' => $endpoint->metadata->description,
                 'description' => $endpoint->metadata->description,
             ],
             ],
-            'response' => [],
+            'response' => $this->getResponses($endpoint),
         ];
         ];
 
 
 
 
@@ -209,7 +211,8 @@ class PostmanCollectionWriter
         [$where, $authParam] = $this->getAuthParamToExclude();
         [$where, $authParam] = $this->getAuthParamToExclude();
         /**
         /**
          * @var string $name
          * @var string $name
-         * @var Parameter $parameterData */
+         * @var Parameter $parameterData
+         */
         foreach ($endpointData->queryParameters as $name => $parameterData) {
         foreach ($endpointData->queryParameters as $name => $parameterData) {
             if ($where === 'query' && $authParam === $name) {
             if ($where === 'query' && $authParam === $name) {
                 continue;
                 continue;
@@ -279,4 +282,21 @@ class PostmanCollectionWriter
             return [$this->config->get('auth.in'), $this->config->get('auth.name')];
             return [$this->config->get('auth.in'), $this->config->get('auth.name')];
         }
         }
     }
     }
+
+    private function getResponses(OutputEndpointData $endpoint): array
+    {
+        return collect($endpoint->responses)->map(function (Response $response) {
+            $headers = [];
+            foreach ($response->headers as $header => $values) {
+                $headers[] = ['key' => $header, 'value' => implode('; ', $values)];
+            }
+
+            return [
+                'header' => $headers,
+                'code' => $response->status,
+                'body' => $response->content,
+                'name' => $response->description,
+            ];
+        })->toArray();
+    }
 }
 }

+ 294 - 246
tests/Fixtures/collection.json

@@ -1,266 +1,314 @@
 {
 {
-    "variable": [
+  "variable": [
+    {
+      "id": "baseUrl",
+      "key": "baseUrl",
+      "type": "string",
+      "name": "string",
+      "value": "localhost"
+    }
+  ],
+  "info": {
+    "name": "GREAT API!",
+    "_postman_id": "",
+    "description": "",
+    "schema": "https:\/\/schema.getpostman.com\/json\/collection\/v2.1.0\/collection.json",
+    "version": "3.9.9"
+  },
+  "item": [
+    {
+      "name": "Group A",
+      "description": "",
+      "item": [
         {
         {
-            "id": "baseUrl",
-            "key": "baseUrl",
-            "type": "string",
-            "name": "string",
-            "value": "localhost"
-        }
-    ],
-    "info": {
-        "name": "GREAT API!",
-        "_postman_id": "",
-        "description": "",
-        "schema": "https:\/\/schema.getpostman.com\/json\/collection\/v2.1.0\/collection.json",
-        "version": "3.9.9"
-    },
-    "item": [
+          "name": "Endpoint with body form data parameters.",
+          "request": {
+            "url": {
+              "protocol": "http",
+              "host": "{{baseUrl}}",
+              "path": "api\/withFormDataParams",
+              "query": [],
+              "raw": "http:\/\/{{baseUrl}}\/api\/withFormDataParams"
+            },
+            "method": "POST",
+            "header": [
+              {
+                "key": "Custom-Header",
+                "value": "NotSoCustom"
+              },
+              {
+                "key": "Content-Type",
+                "value": "multipart\/form-data"
+              },
+              {
+                "key": "Accept",
+                "value": "application\/json"
+              }
+            ],
+            "body": {
+              "mode": "formdata",
+              "formdata": [
+                {
+                  "key": "name",
+                  "value": "cat.jpg",
+                  "type": "text"
+                },
+                {
+                  "key": "image",
+                  "src": [],
+                  "type": "file"
+                }
+              ]
+            },
+            "description": "",
+            "auth": {
+              "type": "noauth"
+            }
+          },
+          "response": []
+        },
         {
         {
-            "name": "Group A",
+          "name": "Endpoint with body parameters.",
+          "request": {
+            "url": {
+              "protocol": "http",
+              "host": "{{baseUrl}}",
+              "path": "api\/withBodyParameters",
+              "query": [],
+              "raw": "http:\/\/{{baseUrl}}\/api\/withBodyParameters"
+            },
+            "method": "POST",
+            "header": [
+              {
+                "key": "Custom-Header",
+                "value": "NotSoCustom"
+              },
+              {
+                "key": "Content-Type",
+                "value": "application\/json"
+              },
+              {
+                "key": "Accept",
+                "value": "application\/json"
+              }
+            ],
+            "body": {
+              "mode": "raw",
+              "raw": "{\n    \"user_id\": 9,\n    \"room_id\": \"consequatur\",\n    \"forever\": false,\n    \"another_one\": 11613.31890586,\n    \"yet_another_param\": {\n        \"name\": \"consequatur\"\n    },\n    \"even_more_param\": [\n        11613.31890586,\n        11613.31890586\n    ],\n    \"book\": {\n        \"name\": \"consequatur\",\n        \"author_id\": 17,\n        \"pages_count\": 17\n    },\n    \"ids\": [\n        17,\n        17\n    ],\n    \"users\": [\n        {\n            \"first_name\": \"John\",\n            \"last_name\": \"Doe\"\n        },\n        {\n            \"first_name\": \"John\",\n            \"last_name\": \"Doe\"\n        }\n    ]\n}"
+            },
             "description": "",
             "description": "",
-            "item": [
+            "auth": {
+              "type": "noauth"
+            }
+          },
+          "response": []
+        },
+        {
+          "name": "api\/withQueryParameters",
+          "request": {
+            "url": {
+              "protocol": "http",
+              "host": "{{baseUrl}}",
+              "path": "api\/withQueryParameters",
+              "query": [
+                {
+                  "key": "location_id",
+                  "value": "consequatur",
+                  "description": "The id of the location.",
+                  "disabled": false
+                },
                 {
                 {
-                    "name": "Endpoint with body form data parameters.",
-                    "request": {
-                        "url": {
-                            "protocol": "http",
-                            "host": "{{baseUrl}}",
-                            "path": "api\/withFormDataParams",
-                            "query": [],
-                            "raw": "http:\/\/{{baseUrl}}\/api\/withFormDataParams"
-                        },
-                        "method": "POST",
-                        "header": [
-                            {
-                                "key": "Custom-Header",
-                                "value": "NotSoCustom"
-                            },
-                            {
-                                "key": "Content-Type",
-                                "value": "multipart\/form-data"
-                            },
-                            {
-                                "key": "Accept",
-                                "value": "application\/json"
-                            }
-                        ],
-                        "body": {
-                            "mode": "formdata",
-                            "formdata": [
-                                {
-                                    "key": "name",
-                                    "value": "cat.jpg",
-                                    "type": "text"
-                                },
-                                {
-                                    "key": "image",
-                                    "src": [],
-                                    "type": "file"
-                                }
-                            ]
-                        },
-                        "description": "",
-                        "auth": {
-                            "type": "noauth"
-                        }
-                    },
-                    "response": []
+                  "key": "user_id",
+                  "value": "me",
+                  "description": "The id of the user.",
+                  "disabled": false
                 },
                 },
                 {
                 {
-                    "name": "Endpoint with body parameters.",
-                    "request": {
-                        "url": {
-                            "protocol": "http",
-                            "host": "{{baseUrl}}",
-                            "path": "api\/withBodyParameters",
-                            "query": [],
-                            "raw": "http:\/\/{{baseUrl}}\/api\/withBodyParameters"
-                        },
-                        "method": "POST",
-                        "header": [
-                            {
-                                "key": "Custom-Header",
-                                "value": "NotSoCustom"
-                            },
-                            {
-                                "key": "Content-Type",
-                                "value": "application\/json"
-                            },
-                            {
-                                "key": "Accept",
-                                "value": "application\/json"
-                            }
-                        ],
-                        "body": {
-                            "mode": "raw",
-                            "raw": "{\n    \"user_id\": 9,\n    \"room_id\": \"consequatur\",\n    \"forever\": false,\n    \"another_one\": 11613.31890586,\n    \"yet_another_param\": {\n        \"name\": \"consequatur\"\n    },\n    \"even_more_param\": [\n        11613.31890586,\n        11613.31890586\n    ],\n    \"book\": {\n        \"name\": \"consequatur\",\n        \"author_id\": 17,\n        \"pages_count\": 17\n    },\n    \"ids\": [\n        17,\n        17\n    ],\n    \"users\": [\n        {\n            \"first_name\": \"John\",\n            \"last_name\": \"Doe\"\n        },\n        {\n            \"first_name\": \"John\",\n            \"last_name\": \"Doe\"\n        }\n    ]\n}"
-                        },
-                        "description": "",
-                        "auth": {
-                            "type": "noauth"
-                        }
-                    },
-                    "response": []
+                  "key": "page",
+                  "value": "4",
+                  "description": "The page number.",
+                  "disabled": false
                 },
                 },
                 {
                 {
-                    "name": "api\/withQueryParameters",
-                    "request": {
-                        "url": {
-                            "protocol": "http",
-                            "host": "{{baseUrl}}",
-                            "path": "api\/withQueryParameters",
-                            "query": [
-                                {
-                                    "key": "location_id",
-                                    "value": "consequatur",
-                                    "description": "The id of the location.",
-                                    "disabled": false
-                                },
-                                {
-                                    "key": "user_id",
-                                    "value": "me",
-                                    "description": "The id of the user.",
-                                    "disabled": false
-                                },
-                                {
-                                    "key": "page",
-                                    "value": "4",
-                                    "description": "The page number.",
-                                    "disabled": false
-                                },
-                                {
-                                    "key": "filters",
-                                    "value": "consequatur",
-                                    "description": "The filters.",
-                                    "disabled": false
-                                },
-                                {
-                                    "key": "url_encoded",
-                                    "value": "%2B+%5B%5D%26%3D",
-                                    "description": "Used for testing that URL parameters will be URL-encoded where needed.",
-                                    "disabled": false
-                                }
-                            ],
-                            "raw": "http:\/\/{{baseUrl}}\/api\/withQueryParameters?location_id=consequatur&user_id=me&page=4&filters=consequatur&url_encoded=%2B+%5B%5D%26%3D"
-                        },
-                        "method": "GET",
-                        "header": [
-                            {
-                                "key": "Custom-Header",
-                                "value": "NotSoCustom"
-                            },
-                            {
-                                "key": "Accept",
-                                "value": "application\/json"
-                            }
-                        ],
-                        "body": null,
-                        "description": "",
-                        "auth": {
-                            "type": "noauth"
-                        }
-                    },
-                    "response": []
+                  "key": "filters",
+                  "value": "consequatur",
+                  "description": "The filters.",
+                  "disabled": false
                 },
                 },
                 {
                 {
-                    "name": "api\/withAuthTag",
-                    "request": {
-                        "url": {
-                            "protocol": "http",
-                            "host": "{{baseUrl}}",
-                            "path": "api\/withAuthTag",
-                            "query": [],
-                            "raw": "http:\/\/{{baseUrl}}\/api\/withAuthTag"
-                        },
-                        "method": "GET",
-                        "header": [
-                            {
-                                "key": "Custom-Header",
-                                "value": "NotSoCustom"
-                            },
-                            {
-                                "key": "Accept",
-                                "value": "application\/json"
-                            }
-                        ],
-                        "body": null,
-                        "description": ""
-                    },
-                    "response": []
+                  "key": "url_encoded",
+                  "value": "%2B+%5B%5D%26%3D",
+                  "description": "Used for testing that URL parameters will be URL-encoded where needed.",
+                  "disabled": false
                 }
                 }
-            ]
+              ],
+              "raw": "http:\/\/{{baseUrl}}\/api\/withQueryParameters?location_id=consequatur&user_id=me&page=4&filters=consequatur&url_encoded=%2B+%5B%5D%26%3D"
+            },
+            "method": "GET",
+            "header": [
+              {
+                "key": "Custom-Header",
+                "value": "NotSoCustom"
+              },
+              {
+                "key": "Accept",
+                "value": "application\/json"
+              }
+            ],
+            "body": null,
+            "description": "",
+            "auth": {
+              "type": "noauth"
+            }
+          },
+          "response": [
+            {
+              "header": [
+                {
+                  "key": "content-type",
+                  "value": "text/html; charset=UTF-8"
+                },
+                {
+                  "key": "cache-control",
+                  "value": "no-cache, private"
+                }
+              ],
+              "code": 200,
+              "body": "",
+              "name": null
+            }
+          ]
         },
         },
         {
         {
-            "name": "Other\ud83d\ude0e",
+          "name": "api\/withAuthTag",
+          "request": {
+            "url": {
+              "protocol": "http",
+              "host": "{{baseUrl}}",
+              "path": "api\/withAuthTag",
+              "query": [],
+              "raw": "http:\/\/{{baseUrl}}\/api\/withAuthTag"
+            },
+            "method": "GET",
+            "header": [
+              {
+                "key": "Custom-Header",
+                "value": "NotSoCustom"
+              },
+              {
+                "key": "Accept",
+                "value": "application\/json"
+              }
+            ],
+            "body": null,
+            "description": ""
+          },
+          "response": [
+            {
+              "header": [
+                {
+                  "key": "content-type",
+                  "value": "text/html; charset=UTF-8"
+                },
+                {
+                  "key": "cache-control",
+                  "value": "no-cache, private"
+                }
+              ],
+              "code": 200,
+              "body": "",
+              "name": null
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "Other\ud83d\ude0e",
+      "description": "",
+      "item": [
+        {
+          "name": "api\/echoesUrlParameters\/{param}\/{param2}\/{param3?}\/{param4?}",
+          "request": {
+            "url": {
+              "protocol": "http",
+              "host": "{{baseUrl}}",
+              "path": "api\/echoesUrlParameters\/:param\/:param2\/:param3\/:param4",
+              "query": [
+                {
+                  "key": "something",
+                  "value": "consequatur",
+                  "description": "",
+                  "disabled": false
+                }
+              ],
+              "raw": "http:\/\/{{baseUrl}}\/api\/echoesUrlParameters\/:param\/:param2\/:param3\/:param4?something=consequatur",
+              "variable": [
+                {
+                  "id": "param",
+                  "key": "param",
+                  "value": "4",
+                  "description": ""
+                },
+                {
+                  "id": "param2",
+                  "key": "param2",
+                  "value": "consequatur",
+                  "description": ""
+                },
+                {
+                  "id": "param3",
+                  "key": "param3",
+                  "value": "consequatur",
+                  "description": ""
+                },
+                {
+                  "id": "param4",
+                  "key": "param4",
+                  "value": null,
+                  "description": ""
+                }
+              ]
+            },
+            "method": "GET",
+            "header": [
+              {
+                "key": "Custom-Header",
+                "value": "NotSoCustom"
+              },
+              {
+                "key": "Accept",
+                "value": "application\/json"
+              }
+            ],
+            "body": null,
             "description": "",
             "description": "",
-            "item": [
+            "auth": {
+              "type": "noauth"
+            }
+          },
+          "response": [
+            {
+              "header": [
+                {
+                  "key": "cache-control",
+                  "value": "no-cache, private"
+                },
                 {
                 {
-                    "name": "api\/echoesUrlParameters\/{param}\/{param2}\/{param3?}\/{param4?}",
-                    "request": {
-                        "url": {
-                            "protocol": "http",
-                            "host": "{{baseUrl}}",
-                            "path": "api\/echoesUrlParameters\/:param\/:param2\/:param3\/:param4",
-                            "query": [
-                                {
-                                    "key": "something",
-                                    "value": "consequatur",
-                                    "description": "",
-                                    "disabled": false
-                                }
-                            ],
-                            "raw": "http:\/\/{{baseUrl}}\/api\/echoesUrlParameters\/:param\/:param2\/:param3\/:param4?something=consequatur",
-                            "variable": [
-                                {
-                                    "id": "param",
-                                    "key": "param",
-                                    "value": "4",
-                                    "description": ""
-                                },
-                                {
-                                    "id": "param2",
-                                    "key": "param2",
-                                    "value": "consequatur",
-                                    "description": ""
-                                },
-                                {
-                                    "id": "param3",
-                                    "key": "param3",
-                                    "value": "consequatur",
-                                    "description": ""
-                                },
-                                {
-                                    "id": "param4",
-                                    "key": "param4",
-                                    "value": null,
-                                    "description": ""
-                                }
-                            ]
-                        },
-                        "method": "GET",
-                        "header": [
-                            {
-                                "key": "Custom-Header",
-                                "value": "NotSoCustom"
-                            },
-                            {
-                                "key": "Accept",
-                                "value": "application\/json"
-                            }
-                        ],
-                        "body": null,
-                        "description": "",
-                        "auth": {
-                            "type": "noauth"
-                        }
-                    },
-                    "response": []
+                  "key": "content-type",
+                  "value": "application/json"
                 }
                 }
-            ]
+              ],
+              "code": 200,
+              "body": "{\"param\":\"4\",\"param2\":\"consequatur\",\"param3\":\"consequatur\",\"param4\":null}",
+              "name": null
+            }
+          ]
         }
         }
-    ],
-    "auth": {
-        "type": "bearer"
+      ]
     }
     }
+  ],
+  "auth": {
+    "type": "bearer"
+  }
 }
 }