From b21d31e16e914a06a14226bc372d4eb119a2eb9e Mon Sep 17 00:00:00 2001 From: Rahul Hegde Date: Mon, 26 Jul 2021 17:45:24 -0700 Subject: [PATCH 1/4] feat: add bundling to docs command --- src/cmds/openapi.js | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/cmds/openapi.js b/src/cmds/openapi.js index a94d1e900..966cd20fa 100644 --- a/src/cmds/openapi.js +++ b/src/cmds/openapi.js @@ -98,9 +98,25 @@ exports.run = async function (opts) { } } + let bundledSpec; + if (spec) { + const oas = new OASNormalize(spec, { enablePaths: true }); + await oas.validate().catch(err => { + return Promise.reject(err); + }); + await oas + .bundle() + .then(res => { + bundledSpec = JSON.stringify(res); + }) + .catch(err => { + return Promise.reject(err); + }); + } + const options = { formData: { - spec: fs.createReadStream(path.resolve(process.cwd(), specPath)), + spec: bundledSpec || fs.createReadStream(path.resolve(process.cwd(), specPath)), }, headers: { 'x-readme-version': versionCleaned, @@ -120,13 +136,6 @@ exports.run = async function (opts) { return request.put(`${config.host}/api/v1/api-specification/${specId}`, options).then(success, error); } - if (spec) { - const oas = new OASNormalize(spec, { enablePaths: true }); - await oas.validate().catch(err => { - return Promise.reject(err); - }); - } - /* Create a new OAS file in Readme: - Enter flow if user does not pass an id as cli arg From 3baeb8974f635266f7466dd438f1f55ddd5391cf Mon Sep 17 00:00:00 2001 From: Rahul Hegde Date: Tue, 27 Jul 2021 11:20:44 -0700 Subject: [PATCH 2/4] test: add test for ref bundling --- __tests__/__fixtures__/ref-oas/petstore.json | 976 ++++++++++++++++ __tests__/__fixtures__/ref-oas/pettest.json | 1068 ++++++++++++++++++ __tests__/cmds/openapi.test.js | 35 + 3 files changed, 2079 insertions(+) create mode 100644 __tests__/__fixtures__/ref-oas/petstore.json create mode 100644 __tests__/__fixtures__/ref-oas/pettest.json diff --git a/__tests__/__fixtures__/ref-oas/petstore.json b/__tests__/__fixtures__/ref-oas/petstore.json new file mode 100644 index 000000000..a64f86ed5 --- /dev/null +++ b/__tests__/__fixtures__/ref-oas/petstore.json @@ -0,0 +1,976 @@ +{ + "openapi": "3.0.0", + "info": { + "description": "This is a sample server Petstore server. You can find out more about\nSwagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net,\n`special-key` to test the authorization filters.", + "version": "1.0.0", + "title": "Swagger Petstore", + "termsOfService": "http://swagger.io/terms/", + "contact": { + "email": "apiteam@swagger.io" + }, + "license": { + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + } + }, + "externalDocs": { + "description": "Find out more about Swagger", + "url": "http://swagger.io" + }, + "servers": [ + { + "url": "http://petstore.swagger.io/v2" + } + ], + "tags": [ + { + "name": "pet", + "description": "Everything about your Pets", + "externalDocs": { + "description": "Find out more", + "url": "http://swagger.io" + } + }, + { + "name": "store", + "description": "Access to Petstore orders" + }, + { + "name": "user", + "description": "Operations about user", + "externalDocs": { + "description": "Find out more about our store", + "url": "http://swagger.io" + } + } + ], + "paths": { + "/pet": { + "post": { + "tags": ["pet"], + "summary": "Add a new pet to the store", + "description": "", + "operationId": "addPet", + "requestBody": { + "$ref": "__tests__/__fixtures__/ref-oas/pettest.json#/components/requestBodies/Pet" + }, + "responses": { + "405": { + "description": "Invalid input" + } + }, + "security": [ + { + "petstore_auth": ["write:pets", "read:pets"] + } + ] + }, + "put": { + "tags": ["pet"], + "summary": "Update an existing pet", + "description": "", + "operationId": "updatePet", + "requestBody": { + "$ref": "__tests__/__fixtures__/ref-oas/pettest.json#/components/requestBodies/Pet" + }, + "responses": { + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Pet not found" + }, + "405": { + "description": "Validation exception" + } + }, + "security": [ + { + "petstore_auth": ["write:pets", "read:pets"] + } + ] + } + }, + "/pet/findByStatus": { + "get": { + "tags": ["pet"], + "summary": "Finds Pets by status", + "description": "Multiple status values can be provided with comma separated strings", + "operationId": "findPetsByStatus", + "parameters": [ + { + "name": "status", + "in": "query", + "description": "Status values that need to be considered for filter", + "required": true, + "explode": true, + "schema": { + "type": "array", + "items": { + "type": "string", + "enum": ["available", "pending", "sold"], + "default": "available" + } + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/xml": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Pet" + } + } + }, + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Pet" + } + } + } + } + }, + "400": { + "description": "Invalid status value" + } + }, + "security": [ + { + "petstore_auth": ["write:pets", "read:pets"] + } + ] + } + }, + "/pet/findByTags": { + "get": { + "tags": ["pet"], + "summary": "Finds Pets by tags", + "description": "Muliple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.", + "operationId": "findPetsByTags", + "parameters": [ + { + "name": "tags", + "in": "query", + "description": "Tags to filter by", + "required": true, + "explode": true, + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/xml": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Pet" + } + } + }, + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Pet" + } + } + } + } + }, + "400": { + "description": "Invalid tag value" + } + }, + "security": [ + { + "petstore_auth": ["write:pets", "read:pets"] + } + ], + "deprecated": true + } + }, + "/pet/{petId}": { + "get": { + "tags": ["pet"], + "summary": "Find pet by ID", + "description": "Returns a single pet", + "operationId": "getPetById", + "parameters": [ + { + "name": "petId", + "in": "path", + "description": "ID of pet to return", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + } + } + }, + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Pet not found" + }, + "default": { + "description": "successful response" + } + }, + "security": [ + { + "api_key": [] + } + ] + }, + "post": { + "tags": ["pet"], + "summary": "Updates a pet in the store with form data", + "description": "", + "operationId": "updatePetWithForm", + "parameters": [ + { + "name": "petId", + "in": "path", + "description": "ID of pet that needs to be updated", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "requestBody": { + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object", + "properties": { + "name": { + "description": "Updated name of the pet", + "type": "string" + }, + "status": { + "description": "Updated status of the pet", + "type": "string" + } + } + } + } + } + }, + "responses": { + "405": { + "description": "Invalid input" + } + }, + "security": [ + { + "petstore_auth": ["write:pets", "read:pets"] + } + ] + }, + "delete": { + "tags": ["pet"], + "summary": "Deletes a pet", + "description": "", + "operationId": "deletePet", + "parameters": [ + { + "name": "api_key", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "petId", + "in": "path", + "description": "Pet id to delete", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Pet not found" + } + }, + "security": [ + { + "petstore_auth": ["write:pets", "read:pets"] + } + ] + } + }, + "/pet/{petId}/uploadImage": { + "post": { + "tags": ["pet"], + "summary": "Uploads an image", + "description": "", + "operationId": "uploadFile", + "parameters": [ + { + "name": "petId", + "in": "path", + "description": "ID of pet to update", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "type": "object", + "properties": { + "additionalMetadata": { + "description": "Additional data to pass to server", + "type": "string" + }, + "file": { + "description": "file to upload", + "type": "string", + "format": "binary" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiResponse" + } + } + } + } + }, + "security": [ + { + "petstore_auth": ["write:pets", "read:pets"] + } + ] + } + }, + "/store/inventory": { + "get": { + "tags": ["store"], + "summary": "Returns pet inventories by status", + "description": "Returns a map of status codes to quantities", + "operationId": "getInventory", + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": { + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "security": [ + { + "api_key": [] + } + ] + } + }, + "/store/order": { + "post": { + "tags": ["store"], + "summary": "Place an order for a pet", + "description": "", + "operationId": "placeOrder", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Order" + } + } + }, + "description": "order placed for purchasing the pet", + "required": true + }, + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Order" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/Order" + } + } + } + }, + "400": { + "description": "Invalid Order" + } + } + } + }, + "/store/order/{orderId}": { + "get": { + "tags": ["store"], + "summary": "Find purchase order by ID", + "description": "For valid response try integer IDs with value >= 1 and <= 10. Other values will generated exceptions", + "operationId": "getOrderById", + "parameters": [ + { + "name": "orderId", + "in": "path", + "description": "ID of pet that needs to be fetched", + "required": true, + "schema": { + "type": "integer", + "format": "int64", + "minimum": 1, + "maximum": 10 + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Order" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/Order" + } + } + } + }, + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Order not found" + } + } + }, + "delete": { + "tags": ["store"], + "summary": "Delete purchase order by ID", + "description": "For valid response try integer IDs with positive integer value. Negative or non-integer values will generate API errors", + "operationId": "deleteOrder", + "parameters": [ + { + "name": "orderId", + "in": "path", + "description": "ID of the order that needs to be deleted", + "required": true, + "schema": { + "type": "integer", + "format": "int64", + "minimum": 1 + } + } + ], + "responses": { + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Order not found" + } + } + } + }, + "/user": { + "post": { + "tags": ["user"], + "summary": "Create user", + "description": "This can only be done by the logged in user.", + "operationId": "createUser", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + }, + "description": "Created user object", + "required": true + }, + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/user/createWithArray": { + "post": { + "tags": ["user"], + "summary": "Creates list of users with given input array", + "description": "", + "operationId": "createUsersWithArrayInput", + "requestBody": { + "$ref": "#/components/requestBodies/UserArray" + }, + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/user/createWithList": { + "post": { + "tags": ["user"], + "summary": "Creates list of users with given input array", + "description": "", + "operationId": "createUsersWithListInput", + "requestBody": { + "$ref": "#/components/requestBodies/UserArray" + }, + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/user/login": { + "get": { + "tags": ["user"], + "summary": "Logs user into the system", + "description": "", + "operationId": "loginUser", + "parameters": [ + { + "name": "username", + "in": "query", + "description": "The user name for login", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "password", + "in": "query", + "description": "The password for login in clear text", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "headers": { + "X-Rate-Limit": { + "description": "calls per hour allowed by the user", + "schema": { + "type": "integer", + "format": "int32" + } + }, + "X-Expires-After": { + "description": "date in UTC when token expires", + "schema": { + "type": "string", + "format": "date-time" + } + } + }, + "content": { + "application/xml": { + "schema": { + "type": "string" + } + }, + "application/json": { + "schema": { + "type": "string" + } + } + } + }, + "400": { + "description": "Invalid username/password supplied" + } + } + } + }, + "/user/logout": { + "get": { + "tags": ["user"], + "summary": "Logs out current logged in user session", + "description": "", + "operationId": "logoutUser", + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/user/{username}": { + "get": { + "tags": ["user"], + "summary": "Get user by user name", + "description": "", + "operationId": "getUserByName", + "parameters": [ + { + "name": "username", + "in": "path", + "description": "The name that needs to be fetched. Use user1 for testing. ", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/xml": { + "schema": { + "$ref": "#/components/schemas/User" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "400": { + "description": "Invalid username supplied" + }, + "404": { + "description": "User not found" + } + } + }, + "put": { + "tags": ["user"], + "summary": "Updated user", + "description": "This can only be done by the logged in user.", + "operationId": "updateUser", + "parameters": [ + { + "name": "username", + "in": "path", + "description": "name that need to be updated", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + }, + "description": "Updated user object", + "required": true + }, + "responses": { + "400": { + "description": "Invalid user supplied" + }, + "404": { + "description": "User not found" + } + } + }, + "delete": { + "tags": ["user"], + "summary": "Delete user", + "description": "This can only be done by the logged in user.", + "operationId": "deleteUser", + "parameters": [ + { + "name": "username", + "in": "path", + "description": "The name that needs to be deleted", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "400": { + "description": "Invalid username supplied" + }, + "404": { + "description": "User not found" + } + } + } + } + }, + "components": { + "requestBodies": { + "UserArray": { + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "description": "List of user object", + "required": true + } + }, + "securitySchemes": { + "petstore_auth": { + "type": "oauth2", + "flows": { + "implicit": { + "authorizationUrl": "http://petstore.swagger.io/oauth/dialog", + "scopes": { + "write:pets": "modify pets in your account", + "read:pets": "read your pets" + } + } + } + }, + "api_key": { + "type": "apiKey", + "name": "api_key", + "in": "header" + } + }, + "schemas": { + "Order": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "petId": { + "type": "integer", + "format": "int64" + }, + "quantity": { + "type": "integer", + "format": "int32" + }, + "shipDate": { + "type": "string", + "format": "date-time" + }, + "status": { + "type": "string", + "description": "Order Status", + "enum": ["placed", "approved", "delivered"] + }, + "complete": { + "type": "boolean", + "default": false + } + }, + "xml": { + "name": "Order" + } + }, + "Category": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + } + }, + "xml": { + "name": "Category" + } + }, + "User": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "username": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "email": { + "type": "string" + }, + "password": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "userStatus": { + "type": "integer", + "format": "int32", + "description": "User Status" + } + }, + "xml": { + "name": "User" + } + }, + "Tag": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + } + }, + "xml": { + "name": "Tag" + } + }, + "Pet": { + "type": "object", + "required": ["name", "photoUrls"], + "properties": { + "id": { + "type": "integer", + "format": "int64", + "default": 40, + "example": 25 + }, + "category": { + "$ref": "#/components/schemas/Category" + }, + "name": { + "type": "string", + "example": "doggie" + }, + "photoUrls": { + "type": "array", + "xml": { + "name": "photoUrl", + "wrapped": true + }, + "items": { + "type": "string", + "example": "https://example.com/photo.png" + } + }, + "tags": { + "type": "array", + "xml": { + "name": "tag", + "wrapped": true + }, + "items": { + "$ref": "#/components/schemas/Tag" + } + }, + "status": { + "type": "string", + "description": "pet status in the store", + "enum": ["available", "pending", "sold"] + } + }, + "xml": { + "name": "Pet" + } + }, + "ApiResponse": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "format": "int32" + }, + "type": { + "type": "string" + }, + "message": { + "type": "string" + } + } + } + } + } +} diff --git a/__tests__/__fixtures__/ref-oas/pettest.json b/__tests__/__fixtures__/ref-oas/pettest.json new file mode 100644 index 000000000..0aa64ed6f --- /dev/null +++ b/__tests__/__fixtures__/ref-oas/pettest.json @@ -0,0 +1,1068 @@ +{ + "openapi": "3.0.0", + "info": { + "description": "This is a sample server Petstore server. You can find out more about\nSwagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net,\n`special-key` to test the authorization filters.", + "version": "1.0.0", + "title": "Swagger Petstore", + "termsOfService": "http://swagger.io/terms/", + "contact": { + "email": "apiteam@swagger.io" + }, + "license": { + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + } + }, + "externalDocs": { + "description": "Find out more about Swagger", + "url": "http://swagger.io" + }, + "servers": [ + { + "url": "http://petstore.swagger.io/v2" + } + ], + "tags": [ + { + "name": "pet", + "description": "Everything about your Pets", + "externalDocs": { + "description": "Find out more", + "url": "http://swagger.io" + } + }, + { + "name": "store", + "description": "Access to Petstore orders" + }, + { + "name": "user", + "description": "Operations about user", + "externalDocs": { + "description": "Find out more about our store", + "url": "http://swagger.io" + } + } + ], + "paths": { + "/pet": { + "post": { + "tags": [ + "pet" + ], + "summary": "Add a new pet to the store", + "description": "", + "operationId": "addPet", + "requestBody": { + "$ref": "#/components/requestBodies/Pet" + }, + "responses": { + "405": { + "description": "Invalid input" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + }, + "put": { + "tags": [ + "pet" + ], + "summary": "Update an existing pet", + "description": "", + "operationId": "updatePet", + "requestBody": { + "$ref": "#/components/requestBodies/Pet" + }, + "responses": { + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Pet not found" + }, + "405": { + "description": "Validation exception" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/pet/findByStatus": { + "get": { + "tags": [ + "pet" + ], + "summary": "Finds Pets by status", + "description": "Multiple status values can be provided with comma separated strings", + "operationId": "findPetsByStatus", + "parameters": [ + { + "name": "status", + "in": "query", + "description": "Status values that need to be considered for filter", + "required": true, + "explode": true, + "schema": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "available", + "pending", + "sold" + ], + "default": "available" + } + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/xml": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Pet" + } + } + }, + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Pet" + } + } + } + } + }, + "400": { + "description": "Invalid status value" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/pet/findByTags": { + "get": { + "tags": [ + "pet" + ], + "summary": "Finds Pets by tags", + "description": "Muliple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.", + "operationId": "findPetsByTags", + "parameters": [ + { + "name": "tags", + "in": "query", + "description": "Tags to filter by", + "required": true, + "explode": true, + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/xml": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Pet" + } + } + }, + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Pet" + } + } + } + } + }, + "400": { + "description": "Invalid tag value" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ], + "deprecated": true + } + }, + "/pet/{petId}": { + "get": { + "tags": [ + "pet" + ], + "summary": "Find pet by ID", + "description": "Returns a single pet", + "operationId": "getPetById", + "parameters": [ + { + "name": "petId", + "in": "path", + "description": "ID of pet to return", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + } + } + }, + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Pet not found" + }, + "default": { + "description": "successful response" + } + }, + "security": [ + { + "api_key": [] + } + ] + }, + "post": { + "tags": [ + "pet" + ], + "summary": "Updates a pet in the store with form data", + "description": "", + "operationId": "updatePetWithForm", + "parameters": [ + { + "name": "petId", + "in": "path", + "description": "ID of pet that needs to be updated", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "requestBody": { + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object", + "properties": { + "name": { + "description": "Updated name of the pet", + "type": "string" + }, + "status": { + "description": "Updated status of the pet", + "type": "string" + } + } + } + } + } + }, + "responses": { + "405": { + "description": "Invalid input" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + }, + "delete": { + "tags": [ + "pet" + ], + "summary": "Deletes a pet", + "description": "", + "operationId": "deletePet", + "parameters": [ + { + "name": "api_key", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "petId", + "in": "path", + "description": "Pet id to delete", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Pet not found" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/pet/{petId}/uploadImage": { + "post": { + "tags": [ + "pet" + ], + "summary": "Uploads an image", + "description": "", + "operationId": "uploadFile", + "parameters": [ + { + "name": "petId", + "in": "path", + "description": "ID of pet to update", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "type": "object", + "properties": { + "additionalMetadata": { + "description": "Additional data to pass to server", + "type": "string" + }, + "file": { + "description": "file to upload", + "type": "string", + "format": "binary" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiResponse" + } + } + } + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/store/inventory": { + "get": { + "tags": [ + "store" + ], + "summary": "Returns pet inventories by status", + "description": "Returns a map of status codes to quantities", + "operationId": "getInventory", + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": { + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "security": [ + { + "api_key": [] + } + ] + } + }, + "/store/order": { + "post": { + "tags": [ + "store" + ], + "summary": "Place an order for a pet", + "description": "", + "operationId": "placeOrder", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Order" + } + } + }, + "description": "order placed for purchasing the pet", + "required": true + }, + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Order" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/Order" + } + } + } + }, + "400": { + "description": "Invalid Order" + } + } + } + }, + "/store/order/{orderId}": { + "get": { + "tags": [ + "store" + ], + "summary": "Find purchase order by ID", + "description": "For valid response try integer IDs with value >= 1 and <= 10. Other values will generated exceptions", + "operationId": "getOrderById", + "parameters": [ + { + "name": "orderId", + "in": "path", + "description": "ID of pet that needs to be fetched", + "required": true, + "schema": { + "type": "integer", + "format": "int64", + "minimum": 1, + "maximum": 10 + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Order" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/Order" + } + } + } + }, + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Order not found" + } + } + }, + "delete": { + "tags": [ + "store" + ], + "summary": "Delete purchase order by ID", + "description": "For valid response try integer IDs with positive integer value. Negative or non-integer values will generate API errors", + "operationId": "deleteOrder", + "parameters": [ + { + "name": "orderId", + "in": "path", + "description": "ID of the order that needs to be deleted", + "required": true, + "schema": { + "type": "integer", + "format": "int64", + "minimum": 1 + } + } + ], + "responses": { + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Order not found" + } + } + } + }, + "/user": { + "post": { + "tags": [ + "user" + ], + "summary": "Create user", + "description": "This can only be done by the logged in user.", + "operationId": "createUser", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + }, + "description": "Created user object", + "required": true + }, + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/user/createWithArray": { + "post": { + "tags": [ + "user" + ], + "summary": "Creates list of users with given input array", + "description": "", + "operationId": "createUsersWithArrayInput", + "requestBody": { + "$ref": "#/components/requestBodies/UserArray" + }, + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/user/createWithList": { + "post": { + "tags": [ + "user" + ], + "summary": "Creates list of users with given input array", + "description": "", + "operationId": "createUsersWithListInput", + "requestBody": { + "$ref": "#/components/requestBodies/UserArray" + }, + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/user/login": { + "get": { + "tags": [ + "user" + ], + "summary": "Logs user into the system", + "description": "", + "operationId": "loginUser", + "parameters": [ + { + "name": "username", + "in": "query", + "description": "The user name for login", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "password", + "in": "query", + "description": "The password for login in clear text", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "headers": { + "X-Rate-Limit": { + "description": "calls per hour allowed by the user", + "schema": { + "type": "integer", + "format": "int32" + } + }, + "X-Expires-After": { + "description": "date in UTC when token expires", + "schema": { + "type": "string", + "format": "date-time" + } + } + }, + "content": { + "application/xml": { + "schema": { + "type": "string" + } + }, + "application/json": { + "schema": { + "type": "string" + } + } + } + }, + "400": { + "description": "Invalid username/password supplied" + } + } + } + }, + "/user/logout": { + "get": { + "tags": [ + "user" + ], + "summary": "Logs out current logged in user session", + "description": "", + "operationId": "logoutUser", + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/user/{username}": { + "get": { + "tags": [ + "user" + ], + "summary": "Get user by user name", + "description": "", + "operationId": "getUserByName", + "parameters": [ + { + "name": "username", + "in": "path", + "description": "The name that needs to be fetched. Use user1 for testing. ", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/xml": { + "schema": { + "$ref": "#/components/schemas/User" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "400": { + "description": "Invalid username supplied" + }, + "404": { + "description": "User not found" + } + } + }, + "put": { + "tags": [ + "user" + ], + "summary": "Updated user", + "description": "This can only be done by the logged in user.", + "operationId": "updateUser", + "parameters": [ + { + "name": "username", + "in": "path", + "description": "name that need to be updated", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + }, + "description": "Updated user object", + "required": true + }, + "responses": { + "400": { + "description": "Invalid user supplied" + }, + "404": { + "description": "User not found" + } + } + }, + "delete": { + "tags": [ + "user" + ], + "summary": "Delete user", + "description": "This can only be done by the logged in user.", + "operationId": "deleteUser", + "parameters": [ + { + "name": "username", + "in": "path", + "description": "The name that needs to be deleted", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "400": { + "description": "Invalid username supplied" + }, + "404": { + "description": "User not found" + } + } + } + } + }, + "components": { + "requestBodies": { + "Pet": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + } + }, + "description": "Pet object that needs to be added to the store", + "required": true + }, + "UserArray": { + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "description": "List of user object", + "required": true + } + }, + "securitySchemes": { + "petstore_auth": { + "type": "oauth2", + "flows": { + "implicit": { + "authorizationUrl": "http://petstore.swagger.io/oauth/dialog", + "scopes": { + "write:pets": "modify pets in your account", + "read:pets": "read your pets" + } + } + } + }, + "api_key": { + "type": "apiKey", + "name": "api_key", + "in": "header" + } + }, + "schemas": { + "Order": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "petId": { + "type": "integer", + "format": "int64" + }, + "quantity": { + "type": "integer", + "format": "int32" + }, + "shipDate": { + "type": "string", + "format": "date-time" + }, + "status": { + "type": "string", + "description": "Order Status", + "enum": [ + "placed", + "approved", + "delivered" + ] + }, + "complete": { + "type": "boolean", + "default": false + } + }, + "xml": { + "name": "Order" + } + }, + "Category": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + } + }, + "xml": { + "name": "Category" + } + }, + "User": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "username": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "email": { + "type": "string" + }, + "password": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "userStatus": { + "type": "integer", + "format": "int32", + "description": "User Status" + } + }, + "xml": { + "name": "User" + } + }, + "Tag": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + } + }, + "xml": { + "name": "Tag" + } + }, + "Pet": { + "type": "object", + "required": [ + "name", + "photoUrls" + ], + "properties": { + "id": { + "type": "integer", + "format": "int64", + "default": 40, + "example": 25 + }, + "category": { + "$ref": "#/components/schemas/Category" + }, + "name": { + "type": "string", + "example": "doggie" + }, + "photoUrls": { + "type": "array", + "xml": { + "name": "photoUrl", + "wrapped": true + }, + "items": { + "type": "string", + "example": "https://example.com/photo.png" + } + }, + "tags": { + "type": "array", + "xml": { + "name": "tag", + "wrapped": true + }, + "items": { + "$ref": "#/components/schemas/Tag" + } + }, + "status": { + "type": "string", + "description": "pet status in the store", + "enum": [ + "available", + "pending", + "sold" + ] + } + }, + "xml": { + "name": "Pet" + } + }, + "ApiResponse": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "format": "int32" + }, + "type": { + "type": "string" + }, + "message": { + "type": "string" + } + } + } + } + } +} diff --git a/__tests__/cmds/openapi.test.js b/__tests__/cmds/openapi.test.js index 628a8579b..f6737b9a2 100644 --- a/__tests__/cmds/openapi.test.js +++ b/__tests__/cmds/openapi.test.js @@ -200,6 +200,41 @@ describe('rdme openapi', () => { }); }); + it('should bundle and upload the expected content', () => { + let requestBody = null; + const mock = nock(config.host) + .get(`/api/v1/api-specification`) + .basicAuth({ user: key }) + .reply(200, []) + .get(`/api/v1/version/${version}`) + .basicAuth({ user: key }) + .reply(200, { version: '1.0.0' }) + .post('/api/v1/api-specification', body => { + requestBody = body; + return body.match('form-data; name="spec"'); + }) + .basicAuth({ user: key }) + .reply(201, { _id: 1 }, { location: exampleRefLocation }); + + return openapi.run({ spec: './__tests__/__fixtures__/ref-oas/petstore.json', key, version }).then(() => { + expect(console.log).toHaveBeenCalledTimes(1); + + expect(requestBody).not.toMatch( + '"paths":{"/pet":{"post":{"tags":["pet"],"summary":"Add a new pet to the store","description":"","operationId":"addPet","requestBody":{"$ref":"__tests__/__fixtures__/ref-oas/pettest.json#/components/requestBodies/Pet"},"responses":{"405":{"description":"Invalid input"}},"security":[{"petstore_auth":["write:pets","read:pets"]}]}' + ); + expect(requestBody).toMatch( + '"paths":{"/pet":{"post":{"tags":["pet"],"summary":"Add a new pet to the store","description":"","operationId":"addPet","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["name","photoUrls"],"properties":{"id":{"type":"integer","format":"int64","default":40,"example":25},"category":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"}},"xml":{"name":"Category"}},"name":{"type":"string","example":"doggie"},"photoUrls":{"type":"array","xml":{"name":"photoUrl","wrapped":true},"items":{"type":"string","example":"https://example.com/photo.png"}},"tags":{"type":"array","xml":{"name":"tag","wrapped":true},"items":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"}},"xml":{"name":"Tag"}}},"status":{"type":"string","description":"pet status in the store","enum":["available","pending","sold"]}},"xml":{"name":"Pet"}}},"application/xml":{"schema":{"type":"object","required":["name","photoUrls"],"properties":{"id":{"type":"integer","format":"int64","default":40,"example":25},"category":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"}},"xml":{"name":"Category"}},"name":{"type":"string","example":"doggie"},"photoUrls":{"type":"array","xml":{"name":"photoUrl","wrapped":true},"items":{"type":"string","example":"https://example.com/photo.png"}},"tags":{"type":"array","xml":{"name":"tag","wrapped":true},"items":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"}},"xml":{"name":"Tag"}}},"status":{"type":"string","description":"pet status in the store","enum":["available","pending","sold"]}},"xml":{"name":"Pet"}}}},"description":"Pet object that needs to be added to the store","required":true},"responses":{"405":{"description":"Invalid input"}},"security":[{"petstore_auth":["write:pets","read:pets"]}]}' + ); + + const output = getCommandOutput(); + expect(output).toMatch(/successfully uploaded/); + expect(output).toMatch(exampleRefLocation); + expect(output).toMatch(/to update your swagger or openapi file/i); + + mock.done(); + }); + }); + it('should error if no api key provided', async () => { await expect(openapi.run({ spec: './__tests__/__fixtures__/swagger.json' })).rejects.toThrow( 'No project API key provided. Please use `--key`.' From 8d83d5ab47ea4bfe3c8db90a7ae6f8d6cd842e8d Mon Sep 17 00:00:00 2001 From: Rahul Hegde Date: Tue, 27 Jul 2021 12:14:17 -0700 Subject: [PATCH 3/4] fix: testing and openapi command changes --- .../cmds/__snapshots__/openapi.test.js.snap | 3 +++ __tests__/cmds/openapi.test.js | 9 ++----- src/cmds/openapi.js | 25 ++++++++----------- 3 files changed, 16 insertions(+), 21 deletions(-) create mode 100644 __tests__/cmds/__snapshots__/openapi.test.js.snap diff --git a/__tests__/cmds/__snapshots__/openapi.test.js.snap b/__tests__/cmds/__snapshots__/openapi.test.js.snap new file mode 100644 index 000000000..30412ee7c --- /dev/null +++ b/__tests__/cmds/__snapshots__/openapi.test.js.snap @@ -0,0 +1,3 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`rdme openapi should bundle and upload the expected content 1`] = `"{\\"openapi\\":\\"3.0.0\\",\\"info\\":{\\"description\\":\\"This is a sample server Petstore server. You can find out more about\\\\nSwagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net,\\\\n\`special-key\` to test the authorization filters.\\",\\"version\\":\\"1.0.0\\",\\"title\\":\\"Swagger Petstore\\",\\"termsOfService\\":\\"http://swagger.io/terms/\\",\\"contact\\":{\\"email\\":\\"apiteam@swagger.io\\"},\\"license\\":{\\"name\\":\\"Apache 2.0\\",\\"url\\":\\"http://www.apache.org/licenses/LICENSE-2.0.html\\"}},\\"externalDocs\\":{\\"description\\":\\"Find out more about Swagger\\",\\"url\\":\\"http://swagger.io\\"},\\"servers\\":[{\\"url\\":\\"http://petstore.swagger.io/v2\\"}],\\"tags\\":[{\\"name\\":\\"pet\\",\\"description\\":\\"Everything about your Pets\\",\\"externalDocs\\":{\\"description\\":\\"Find out more\\",\\"url\\":\\"http://swagger.io\\"}},{\\"name\\":\\"store\\",\\"description\\":\\"Access to Petstore orders\\"},{\\"name\\":\\"user\\",\\"description\\":\\"Operations about user\\",\\"externalDocs\\":{\\"description\\":\\"Find out more about our store\\",\\"url\\":\\"http://swagger.io\\"}}],\\"paths\\":{\\"/pet\\":{\\"post\\":{\\"tags\\":[\\"pet\\"],\\"summary\\":\\"Add a new pet to the store\\",\\"description\\":\\"\\",\\"operationId\\":\\"addPet\\",\\"requestBody\\":{\\"content\\":{\\"application/json\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"required\\":[\\"name\\",\\"photoUrls\\"],\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\",\\"default\\":40,\\"example\\":25},\\"category\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Category\\"}},\\"name\\":{\\"type\\":\\"string\\",\\"example\\":\\"doggie\\"},\\"photoUrls\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"photoUrl\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"string\\",\\"example\\":\\"https://example.com/photo.png\\"}},\\"tags\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"tag\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Tag\\"}}},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"pet status in the store\\",\\"enum\\":[\\"available\\",\\"pending\\",\\"sold\\"]}},\\"xml\\":{\\"name\\":\\"Pet\\"}}},\\"application/xml\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"required\\":[\\"name\\",\\"photoUrls\\"],\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\",\\"default\\":40,\\"example\\":25},\\"category\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Category\\"}},\\"name\\":{\\"type\\":\\"string\\",\\"example\\":\\"doggie\\"},\\"photoUrls\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"photoUrl\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"string\\",\\"example\\":\\"https://example.com/photo.png\\"}},\\"tags\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"tag\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Tag\\"}}},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"pet status in the store\\",\\"enum\\":[\\"available\\",\\"pending\\",\\"sold\\"]}},\\"xml\\":{\\"name\\":\\"Pet\\"}}}},\\"description\\":\\"Pet object that needs to be added to the store\\",\\"required\\":true},\\"responses\\":{\\"405\\":{\\"description\\":\\"Invalid input\\"}},\\"security\\":[{\\"petstore_auth\\":[\\"write:pets\\",\\"read:pets\\"]}]},\\"put\\":{\\"tags\\":[\\"pet\\"],\\"summary\\":\\"Update an existing pet\\",\\"description\\":\\"\\",\\"operationId\\":\\"updatePet\\",\\"requestBody\\":{\\"content\\":{\\"application/json\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"required\\":[\\"name\\",\\"photoUrls\\"],\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\",\\"default\\":40,\\"example\\":25},\\"category\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Category\\"}},\\"name\\":{\\"type\\":\\"string\\",\\"example\\":\\"doggie\\"},\\"photoUrls\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"photoUrl\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"string\\",\\"example\\":\\"https://example.com/photo.png\\"}},\\"tags\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"tag\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Tag\\"}}},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"pet status in the store\\",\\"enum\\":[\\"available\\",\\"pending\\",\\"sold\\"]}},\\"xml\\":{\\"name\\":\\"Pet\\"}}},\\"application/xml\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"required\\":[\\"name\\",\\"photoUrls\\"],\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\",\\"default\\":40,\\"example\\":25},\\"category\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Category\\"}},\\"name\\":{\\"type\\":\\"string\\",\\"example\\":\\"doggie\\"},\\"photoUrls\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"photoUrl\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"string\\",\\"example\\":\\"https://example.com/photo.png\\"}},\\"tags\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"tag\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Tag\\"}}},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"pet status in the store\\",\\"enum\\":[\\"available\\",\\"pending\\",\\"sold\\"]}},\\"xml\\":{\\"name\\":\\"Pet\\"}}}},\\"description\\":\\"Pet object that needs to be added to the store\\",\\"required\\":true},\\"responses\\":{\\"400\\":{\\"description\\":\\"Invalid ID supplied\\"},\\"404\\":{\\"description\\":\\"Pet not found\\"},\\"405\\":{\\"description\\":\\"Validation exception\\"}},\\"security\\":[{\\"petstore_auth\\":[\\"write:pets\\",\\"read:pets\\"]}]}},\\"/pet/findByStatus\\":{\\"get\\":{\\"tags\\":[\\"pet\\"],\\"summary\\":\\"Finds Pets by status\\",\\"description\\":\\"Multiple status values can be provided with comma separated strings\\",\\"operationId\\":\\"findPetsByStatus\\",\\"parameters\\":[{\\"name\\":\\"status\\",\\"in\\":\\"query\\",\\"description\\":\\"Status values that need to be considered for filter\\",\\"required\\":true,\\"explode\\":true,\\"schema\\":{\\"type\\":\\"array\\",\\"items\\":{\\"type\\":\\"string\\",\\"enum\\":[\\"available\\",\\"pending\\",\\"sold\\"],\\"default\\":\\"available\\"}}}],\\"responses\\":{\\"200\\":{\\"description\\":\\"successful operation\\",\\"content\\":{\\"application/xml\\":{\\"schema\\":{\\"type\\":\\"array\\",\\"items\\":{\\"type\\":\\"object\\",\\"required\\":[\\"name\\",\\"photoUrls\\"],\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\",\\"default\\":40,\\"example\\":25},\\"category\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Category\\"}},\\"name\\":{\\"type\\":\\"string\\",\\"example\\":\\"doggie\\"},\\"photoUrls\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"photoUrl\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"string\\",\\"example\\":\\"https://example.com/photo.png\\"}},\\"tags\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"tag\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Tag\\"}}},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"pet status in the store\\",\\"enum\\":[\\"available\\",\\"pending\\",\\"sold\\"]}},\\"xml\\":{\\"name\\":\\"Pet\\"}}}},\\"application/json\\":{\\"schema\\":{\\"type\\":\\"array\\",\\"items\\":{\\"type\\":\\"object\\",\\"required\\":[\\"name\\",\\"photoUrls\\"],\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\",\\"default\\":40,\\"example\\":25},\\"category\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Category\\"}},\\"name\\":{\\"type\\":\\"string\\",\\"example\\":\\"doggie\\"},\\"photoUrls\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"photoUrl\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"string\\",\\"example\\":\\"https://example.com/photo.png\\"}},\\"tags\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"tag\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Tag\\"}}},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"pet status in the store\\",\\"enum\\":[\\"available\\",\\"pending\\",\\"sold\\"]}},\\"xml\\":{\\"name\\":\\"Pet\\"}}}}}},\\"400\\":{\\"description\\":\\"Invalid status value\\"}},\\"security\\":[{\\"petstore_auth\\":[\\"write:pets\\",\\"read:pets\\"]}]}},\\"/pet/findByTags\\":{\\"get\\":{\\"tags\\":[\\"pet\\"],\\"summary\\":\\"Finds Pets by tags\\",\\"description\\":\\"Muliple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.\\",\\"operationId\\":\\"findPetsByTags\\",\\"parameters\\":[{\\"name\\":\\"tags\\",\\"in\\":\\"query\\",\\"description\\":\\"Tags to filter by\\",\\"required\\":true,\\"explode\\":true,\\"schema\\":{\\"type\\":\\"array\\",\\"items\\":{\\"type\\":\\"string\\"}}}],\\"responses\\":{\\"200\\":{\\"description\\":\\"successful operation\\",\\"content\\":{\\"application/xml\\":{\\"schema\\":{\\"type\\":\\"array\\",\\"items\\":{\\"type\\":\\"object\\",\\"required\\":[\\"name\\",\\"photoUrls\\"],\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\",\\"default\\":40,\\"example\\":25},\\"category\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Category\\"}},\\"name\\":{\\"type\\":\\"string\\",\\"example\\":\\"doggie\\"},\\"photoUrls\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"photoUrl\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"string\\",\\"example\\":\\"https://example.com/photo.png\\"}},\\"tags\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"tag\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Tag\\"}}},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"pet status in the store\\",\\"enum\\":[\\"available\\",\\"pending\\",\\"sold\\"]}},\\"xml\\":{\\"name\\":\\"Pet\\"}}}},\\"application/json\\":{\\"schema\\":{\\"type\\":\\"array\\",\\"items\\":{\\"type\\":\\"object\\",\\"required\\":[\\"name\\",\\"photoUrls\\"],\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\",\\"default\\":40,\\"example\\":25},\\"category\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Category\\"}},\\"name\\":{\\"type\\":\\"string\\",\\"example\\":\\"doggie\\"},\\"photoUrls\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"photoUrl\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"string\\",\\"example\\":\\"https://example.com/photo.png\\"}},\\"tags\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"tag\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Tag\\"}}},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"pet status in the store\\",\\"enum\\":[\\"available\\",\\"pending\\",\\"sold\\"]}},\\"xml\\":{\\"name\\":\\"Pet\\"}}}}}},\\"400\\":{\\"description\\":\\"Invalid tag value\\"}},\\"security\\":[{\\"petstore_auth\\":[\\"write:pets\\",\\"read:pets\\"]}],\\"deprecated\\":true}},\\"/pet/{petId}\\":{\\"get\\":{\\"tags\\":[\\"pet\\"],\\"summary\\":\\"Find pet by ID\\",\\"description\\":\\"Returns a single pet\\",\\"operationId\\":\\"getPetById\\",\\"parameters\\":[{\\"name\\":\\"petId\\",\\"in\\":\\"path\\",\\"description\\":\\"ID of pet to return\\",\\"required\\":true,\\"schema\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"}}],\\"responses\\":{\\"200\\":{\\"description\\":\\"successful operation\\",\\"content\\":{\\"application/xml\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"required\\":[\\"name\\",\\"photoUrls\\"],\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\",\\"default\\":40,\\"example\\":25},\\"category\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Category\\"}},\\"name\\":{\\"type\\":\\"string\\",\\"example\\":\\"doggie\\"},\\"photoUrls\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"photoUrl\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"string\\",\\"example\\":\\"https://example.com/photo.png\\"}},\\"tags\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"tag\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Tag\\"}}},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"pet status in the store\\",\\"enum\\":[\\"available\\",\\"pending\\",\\"sold\\"]}},\\"xml\\":{\\"name\\":\\"Pet\\"}}},\\"application/json\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"required\\":[\\"name\\",\\"photoUrls\\"],\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\",\\"default\\":40,\\"example\\":25},\\"category\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Category\\"}},\\"name\\":{\\"type\\":\\"string\\",\\"example\\":\\"doggie\\"},\\"photoUrls\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"photoUrl\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"string\\",\\"example\\":\\"https://example.com/photo.png\\"}},\\"tags\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"tag\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Tag\\"}}},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"pet status in the store\\",\\"enum\\":[\\"available\\",\\"pending\\",\\"sold\\"]}},\\"xml\\":{\\"name\\":\\"Pet\\"}}}}},\\"400\\":{\\"description\\":\\"Invalid ID supplied\\"},\\"404\\":{\\"description\\":\\"Pet not found\\"},\\"default\\":{\\"description\\":\\"successful response\\"}},\\"security\\":[{\\"api_key\\":[]}]},\\"post\\":{\\"tags\\":[\\"pet\\"],\\"summary\\":\\"Updates a pet in the store with form data\\",\\"description\\":\\"\\",\\"operationId\\":\\"updatePetWithForm\\",\\"parameters\\":[{\\"name\\":\\"petId\\",\\"in\\":\\"path\\",\\"description\\":\\"ID of pet that needs to be updated\\",\\"required\\":true,\\"schema\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"}}],\\"requestBody\\":{\\"content\\":{\\"application/x-www-form-urlencoded\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"name\\":{\\"description\\":\\"Updated name of the pet\\",\\"type\\":\\"string\\"},\\"status\\":{\\"description\\":\\"Updated status of the pet\\",\\"type\\":\\"string\\"}}}}}},\\"responses\\":{\\"405\\":{\\"description\\":\\"Invalid input\\"}},\\"security\\":[{\\"petstore_auth\\":[\\"write:pets\\",\\"read:pets\\"]}]},\\"delete\\":{\\"tags\\":[\\"pet\\"],\\"summary\\":\\"Deletes a pet\\",\\"description\\":\\"\\",\\"operationId\\":\\"deletePet\\",\\"parameters\\":[{\\"name\\":\\"api_key\\",\\"in\\":\\"header\\",\\"required\\":false,\\"schema\\":{\\"type\\":\\"string\\"}},{\\"name\\":\\"petId\\",\\"in\\":\\"path\\",\\"description\\":\\"Pet id to delete\\",\\"required\\":true,\\"schema\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"}}],\\"responses\\":{\\"400\\":{\\"description\\":\\"Invalid ID supplied\\"},\\"404\\":{\\"description\\":\\"Pet not found\\"}},\\"security\\":[{\\"petstore_auth\\":[\\"write:pets\\",\\"read:pets\\"]}]}},\\"/pet/{petId}/uploadImage\\":{\\"post\\":{\\"tags\\":[\\"pet\\"],\\"summary\\":\\"Uploads an image\\",\\"description\\":\\"\\",\\"operationId\\":\\"uploadFile\\",\\"parameters\\":[{\\"name\\":\\"petId\\",\\"in\\":\\"path\\",\\"description\\":\\"ID of pet to update\\",\\"required\\":true,\\"schema\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"}}],\\"requestBody\\":{\\"content\\":{\\"multipart/form-data\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"additionalMetadata\\":{\\"description\\":\\"Additional data to pass to server\\",\\"type\\":\\"string\\"},\\"file\\":{\\"description\\":\\"file to upload\\",\\"type\\":\\"string\\",\\"format\\":\\"binary\\"}}}}}},\\"responses\\":{\\"200\\":{\\"description\\":\\"successful operation\\",\\"content\\":{\\"application/json\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"code\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\"},\\"type\\":{\\"type\\":\\"string\\"},\\"message\\":{\\"type\\":\\"string\\"}}}}}}},\\"security\\":[{\\"petstore_auth\\":[\\"write:pets\\",\\"read:pets\\"]}]}},\\"/store/inventory\\":{\\"get\\":{\\"tags\\":[\\"store\\"],\\"summary\\":\\"Returns pet inventories by status\\",\\"description\\":\\"Returns a map of status codes to quantities\\",\\"operationId\\":\\"getInventory\\",\\"responses\\":{\\"200\\":{\\"description\\":\\"successful operation\\",\\"content\\":{\\"application/json\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"additionalProperties\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\"}}}}}},\\"security\\":[{\\"api_key\\":[]}]}},\\"/store/order\\":{\\"post\\":{\\"tags\\":[\\"store\\"],\\"summary\\":\\"Place an order for a pet\\",\\"description\\":\\"\\",\\"operationId\\":\\"placeOrder\\",\\"requestBody\\":{\\"content\\":{\\"application/json\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"petId\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"quantity\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\"},\\"shipDate\\":{\\"type\\":\\"string\\",\\"format\\":\\"date-time\\"},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"Order Status\\",\\"enum\\":[\\"placed\\",\\"approved\\",\\"delivered\\"]},\\"complete\\":{\\"type\\":\\"boolean\\",\\"default\\":false}},\\"xml\\":{\\"name\\":\\"Order\\"}}}},\\"description\\":\\"order placed for purchasing the pet\\",\\"required\\":true},\\"responses\\":{\\"200\\":{\\"description\\":\\"successful operation\\",\\"content\\":{\\"application/xml\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"petId\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"quantity\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\"},\\"shipDate\\":{\\"type\\":\\"string\\",\\"format\\":\\"date-time\\"},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"Order Status\\",\\"enum\\":[\\"placed\\",\\"approved\\",\\"delivered\\"]},\\"complete\\":{\\"type\\":\\"boolean\\",\\"default\\":false}},\\"xml\\":{\\"name\\":\\"Order\\"}}},\\"application/json\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"petId\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"quantity\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\"},\\"shipDate\\":{\\"type\\":\\"string\\",\\"format\\":\\"date-time\\"},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"Order Status\\",\\"enum\\":[\\"placed\\",\\"approved\\",\\"delivered\\"]},\\"complete\\":{\\"type\\":\\"boolean\\",\\"default\\":false}},\\"xml\\":{\\"name\\":\\"Order\\"}}}}},\\"400\\":{\\"description\\":\\"Invalid Order\\"}}}},\\"/store/order/{orderId}\\":{\\"get\\":{\\"tags\\":[\\"store\\"],\\"summary\\":\\"Find purchase order by ID\\",\\"description\\":\\"For valid response try integer IDs with value >= 1 and <= 10. Other values will generated exceptions\\",\\"operationId\\":\\"getOrderById\\",\\"parameters\\":[{\\"name\\":\\"orderId\\",\\"in\\":\\"path\\",\\"description\\":\\"ID of pet that needs to be fetched\\",\\"required\\":true,\\"schema\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\",\\"minimum\\":1,\\"maximum\\":10}}],\\"responses\\":{\\"200\\":{\\"description\\":\\"successful operation\\",\\"content\\":{\\"application/xml\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"petId\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"quantity\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\"},\\"shipDate\\":{\\"type\\":\\"string\\",\\"format\\":\\"date-time\\"},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"Order Status\\",\\"enum\\":[\\"placed\\",\\"approved\\",\\"delivered\\"]},\\"complete\\":{\\"type\\":\\"boolean\\",\\"default\\":false}},\\"xml\\":{\\"name\\":\\"Order\\"}}},\\"application/json\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"petId\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"quantity\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\"},\\"shipDate\\":{\\"type\\":\\"string\\",\\"format\\":\\"date-time\\"},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"Order Status\\",\\"enum\\":[\\"placed\\",\\"approved\\",\\"delivered\\"]},\\"complete\\":{\\"type\\":\\"boolean\\",\\"default\\":false}},\\"xml\\":{\\"name\\":\\"Order\\"}}}}},\\"400\\":{\\"description\\":\\"Invalid ID supplied\\"},\\"404\\":{\\"description\\":\\"Order not found\\"}}},\\"delete\\":{\\"tags\\":[\\"store\\"],\\"summary\\":\\"Delete purchase order by ID\\",\\"description\\":\\"For valid response try integer IDs with positive integer value. Negative or non-integer values will generate API errors\\",\\"operationId\\":\\"deleteOrder\\",\\"parameters\\":[{\\"name\\":\\"orderId\\",\\"in\\":\\"path\\",\\"description\\":\\"ID of the order that needs to be deleted\\",\\"required\\":true,\\"schema\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\",\\"minimum\\":1}}],\\"responses\\":{\\"400\\":{\\"description\\":\\"Invalid ID supplied\\"},\\"404\\":{\\"description\\":\\"Order not found\\"}}}},\\"/user\\":{\\"post\\":{\\"tags\\":[\\"user\\"],\\"summary\\":\\"Create user\\",\\"description\\":\\"This can only be done by the logged in user.\\",\\"operationId\\":\\"createUser\\",\\"requestBody\\":{\\"content\\":{\\"application/json\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"username\\":{\\"type\\":\\"string\\"},\\"firstName\\":{\\"type\\":\\"string\\"},\\"lastName\\":{\\"type\\":\\"string\\"},\\"email\\":{\\"type\\":\\"string\\"},\\"password\\":{\\"type\\":\\"string\\"},\\"phone\\":{\\"type\\":\\"string\\"},\\"userStatus\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\",\\"description\\":\\"User Status\\"}},\\"xml\\":{\\"name\\":\\"User\\"}}}},\\"description\\":\\"Created user object\\",\\"required\\":true},\\"responses\\":{\\"default\\":{\\"description\\":\\"successful operation\\"}}}},\\"/user/createWithArray\\":{\\"post\\":{\\"tags\\":[\\"user\\"],\\"summary\\":\\"Creates list of users with given input array\\",\\"description\\":\\"\\",\\"operationId\\":\\"createUsersWithArrayInput\\",\\"requestBody\\":{\\"content\\":{\\"application/json\\":{\\"schema\\":{\\"type\\":\\"array\\",\\"items\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"username\\":{\\"type\\":\\"string\\"},\\"firstName\\":{\\"type\\":\\"string\\"},\\"lastName\\":{\\"type\\":\\"string\\"},\\"email\\":{\\"type\\":\\"string\\"},\\"password\\":{\\"type\\":\\"string\\"},\\"phone\\":{\\"type\\":\\"string\\"},\\"userStatus\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\",\\"description\\":\\"User Status\\"}},\\"xml\\":{\\"name\\":\\"User\\"}}}}},\\"description\\":\\"List of user object\\",\\"required\\":true},\\"responses\\":{\\"default\\":{\\"description\\":\\"successful operation\\"}}}},\\"/user/createWithList\\":{\\"post\\":{\\"tags\\":[\\"user\\"],\\"summary\\":\\"Creates list of users with given input array\\",\\"description\\":\\"\\",\\"operationId\\":\\"createUsersWithListInput\\",\\"requestBody\\":{\\"content\\":{\\"application/json\\":{\\"schema\\":{\\"type\\":\\"array\\",\\"items\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"username\\":{\\"type\\":\\"string\\"},\\"firstName\\":{\\"type\\":\\"string\\"},\\"lastName\\":{\\"type\\":\\"string\\"},\\"email\\":{\\"type\\":\\"string\\"},\\"password\\":{\\"type\\":\\"string\\"},\\"phone\\":{\\"type\\":\\"string\\"},\\"userStatus\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\",\\"description\\":\\"User Status\\"}},\\"xml\\":{\\"name\\":\\"User\\"}}}}},\\"description\\":\\"List of user object\\",\\"required\\":true},\\"responses\\":{\\"default\\":{\\"description\\":\\"successful operation\\"}}}},\\"/user/login\\":{\\"get\\":{\\"tags\\":[\\"user\\"],\\"summary\\":\\"Logs user into the system\\",\\"description\\":\\"\\",\\"operationId\\":\\"loginUser\\",\\"parameters\\":[{\\"name\\":\\"username\\",\\"in\\":\\"query\\",\\"description\\":\\"The user name for login\\",\\"required\\":true,\\"schema\\":{\\"type\\":\\"string\\"}},{\\"name\\":\\"password\\",\\"in\\":\\"query\\",\\"description\\":\\"The password for login in clear text\\",\\"required\\":true,\\"schema\\":{\\"type\\":\\"string\\"}}],\\"responses\\":{\\"200\\":{\\"description\\":\\"successful operation\\",\\"headers\\":{\\"X-Rate-Limit\\":{\\"description\\":\\"calls per hour allowed by the user\\",\\"schema\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\"}},\\"X-Expires-After\\":{\\"description\\":\\"date in UTC when token expires\\",\\"schema\\":{\\"type\\":\\"string\\",\\"format\\":\\"date-time\\"}}},\\"content\\":{\\"application/xml\\":{\\"schema\\":{\\"type\\":\\"string\\"}},\\"application/json\\":{\\"schema\\":{\\"type\\":\\"string\\"}}}},\\"400\\":{\\"description\\":\\"Invalid username/password supplied\\"}}}},\\"/user/logout\\":{\\"get\\":{\\"tags\\":[\\"user\\"],\\"summary\\":\\"Logs out current logged in user session\\",\\"description\\":\\"\\",\\"operationId\\":\\"logoutUser\\",\\"responses\\":{\\"default\\":{\\"description\\":\\"successful operation\\"}}}},\\"/user/{username}\\":{\\"get\\":{\\"tags\\":[\\"user\\"],\\"summary\\":\\"Get user by user name\\",\\"description\\":\\"\\",\\"operationId\\":\\"getUserByName\\",\\"parameters\\":[{\\"name\\":\\"username\\",\\"in\\":\\"path\\",\\"description\\":\\"The name that needs to be fetched. Use user1 for testing. \\",\\"required\\":true,\\"schema\\":{\\"type\\":\\"string\\"}}],\\"responses\\":{\\"200\\":{\\"description\\":\\"successful operation\\",\\"content\\":{\\"application/xml\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"username\\":{\\"type\\":\\"string\\"},\\"firstName\\":{\\"type\\":\\"string\\"},\\"lastName\\":{\\"type\\":\\"string\\"},\\"email\\":{\\"type\\":\\"string\\"},\\"password\\":{\\"type\\":\\"string\\"},\\"phone\\":{\\"type\\":\\"string\\"},\\"userStatus\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\",\\"description\\":\\"User Status\\"}},\\"xml\\":{\\"name\\":\\"User\\"}}},\\"application/json\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"username\\":{\\"type\\":\\"string\\"},\\"firstName\\":{\\"type\\":\\"string\\"},\\"lastName\\":{\\"type\\":\\"string\\"},\\"email\\":{\\"type\\":\\"string\\"},\\"password\\":{\\"type\\":\\"string\\"},\\"phone\\":{\\"type\\":\\"string\\"},\\"userStatus\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\",\\"description\\":\\"User Status\\"}},\\"xml\\":{\\"name\\":\\"User\\"}}}}},\\"400\\":{\\"description\\":\\"Invalid username supplied\\"},\\"404\\":{\\"description\\":\\"User not found\\"}}},\\"put\\":{\\"tags\\":[\\"user\\"],\\"summary\\":\\"Updated user\\",\\"description\\":\\"This can only be done by the logged in user.\\",\\"operationId\\":\\"updateUser\\",\\"parameters\\":[{\\"name\\":\\"username\\",\\"in\\":\\"path\\",\\"description\\":\\"name that need to be updated\\",\\"required\\":true,\\"schema\\":{\\"type\\":\\"string\\"}}],\\"requestBody\\":{\\"content\\":{\\"application/json\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"username\\":{\\"type\\":\\"string\\"},\\"firstName\\":{\\"type\\":\\"string\\"},\\"lastName\\":{\\"type\\":\\"string\\"},\\"email\\":{\\"type\\":\\"string\\"},\\"password\\":{\\"type\\":\\"string\\"},\\"phone\\":{\\"type\\":\\"string\\"},\\"userStatus\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\",\\"description\\":\\"User Status\\"}},\\"xml\\":{\\"name\\":\\"User\\"}}}},\\"description\\":\\"Updated user object\\",\\"required\\":true},\\"responses\\":{\\"400\\":{\\"description\\":\\"Invalid user supplied\\"},\\"404\\":{\\"description\\":\\"User not found\\"}}},\\"delete\\":{\\"tags\\":[\\"user\\"],\\"summary\\":\\"Delete user\\",\\"description\\":\\"This can only be done by the logged in user.\\",\\"operationId\\":\\"deleteUser\\",\\"parameters\\":[{\\"name\\":\\"username\\",\\"in\\":\\"path\\",\\"description\\":\\"The name that needs to be deleted\\",\\"required\\":true,\\"schema\\":{\\"type\\":\\"string\\"}}],\\"responses\\":{\\"400\\":{\\"description\\":\\"Invalid username supplied\\"},\\"404\\":{\\"description\\":\\"User not found\\"}}}}},\\"components\\":{\\"requestBodies\\":{\\"UserArray\\":{\\"content\\":{\\"application/json\\":{\\"schema\\":{\\"type\\":\\"array\\",\\"items\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"username\\":{\\"type\\":\\"string\\"},\\"firstName\\":{\\"type\\":\\"string\\"},\\"lastName\\":{\\"type\\":\\"string\\"},\\"email\\":{\\"type\\":\\"string\\"},\\"password\\":{\\"type\\":\\"string\\"},\\"phone\\":{\\"type\\":\\"string\\"},\\"userStatus\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\",\\"description\\":\\"User Status\\"}},\\"xml\\":{\\"name\\":\\"User\\"}}}}},\\"description\\":\\"List of user object\\",\\"required\\":true}},\\"securitySchemes\\":{\\"petstore_auth\\":{\\"type\\":\\"oauth2\\",\\"flows\\":{\\"implicit\\":{\\"authorizationUrl\\":\\"http://petstore.swagger.io/oauth/dialog\\",\\"scopes\\":{\\"write:pets\\":\\"modify pets in your account\\",\\"read:pets\\":\\"read your pets\\"}}}},\\"api_key\\":{\\"type\\":\\"apiKey\\",\\"name\\":\\"api_key\\",\\"in\\":\\"header\\"}},\\"schemas\\":{\\"Order\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"petId\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"quantity\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\"},\\"shipDate\\":{\\"type\\":\\"string\\",\\"format\\":\\"date-time\\"},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"Order Status\\",\\"enum\\":[\\"placed\\",\\"approved\\",\\"delivered\\"]},\\"complete\\":{\\"type\\":\\"boolean\\",\\"default\\":false}},\\"xml\\":{\\"name\\":\\"Order\\"}},\\"Category\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Category\\"}},\\"User\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"username\\":{\\"type\\":\\"string\\"},\\"firstName\\":{\\"type\\":\\"string\\"},\\"lastName\\":{\\"type\\":\\"string\\"},\\"email\\":{\\"type\\":\\"string\\"},\\"password\\":{\\"type\\":\\"string\\"},\\"phone\\":{\\"type\\":\\"string\\"},\\"userStatus\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\",\\"description\\":\\"User Status\\"}},\\"xml\\":{\\"name\\":\\"User\\"}},\\"Tag\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Tag\\"}},\\"Pet\\":{\\"type\\":\\"object\\",\\"required\\":[\\"name\\",\\"photoUrls\\"],\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\",\\"default\\":40,\\"example\\":25},\\"category\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Category\\"}},\\"name\\":{\\"type\\":\\"string\\",\\"example\\":\\"doggie\\"},\\"photoUrls\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"photoUrl\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"string\\",\\"example\\":\\"https://example.com/photo.png\\"}},\\"tags\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"tag\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Tag\\"}}},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"pet status in the store\\",\\"enum\\":[\\"available\\",\\"pending\\",\\"sold\\"]}},\\"xml\\":{\\"name\\":\\"Pet\\"}},\\"ApiResponse\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"code\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\"},\\"type\\":{\\"type\\":\\"string\\"},\\"message\\":{\\"type\\":\\"string\\"}}}}}}"`; diff --git a/__tests__/cmds/openapi.test.js b/__tests__/cmds/openapi.test.js index f6737b9a2..f6d651e6b 100644 --- a/__tests__/cmds/openapi.test.js +++ b/__tests__/cmds/openapi.test.js @@ -210,7 +210,7 @@ describe('rdme openapi', () => { .basicAuth({ user: key }) .reply(200, { version: '1.0.0' }) .post('/api/v1/api-specification', body => { - requestBody = body; + requestBody = body.substring(body.indexOf('{'), body.lastIndexOf('}') + 1); return body.match('form-data; name="spec"'); }) .basicAuth({ user: key }) @@ -219,12 +219,7 @@ describe('rdme openapi', () => { return openapi.run({ spec: './__tests__/__fixtures__/ref-oas/petstore.json', key, version }).then(() => { expect(console.log).toHaveBeenCalledTimes(1); - expect(requestBody).not.toMatch( - '"paths":{"/pet":{"post":{"tags":["pet"],"summary":"Add a new pet to the store","description":"","operationId":"addPet","requestBody":{"$ref":"__tests__/__fixtures__/ref-oas/pettest.json#/components/requestBodies/Pet"},"responses":{"405":{"description":"Invalid input"}},"security":[{"petstore_auth":["write:pets","read:pets"]}]}' - ); - expect(requestBody).toMatch( - '"paths":{"/pet":{"post":{"tags":["pet"],"summary":"Add a new pet to the store","description":"","operationId":"addPet","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["name","photoUrls"],"properties":{"id":{"type":"integer","format":"int64","default":40,"example":25},"category":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"}},"xml":{"name":"Category"}},"name":{"type":"string","example":"doggie"},"photoUrls":{"type":"array","xml":{"name":"photoUrl","wrapped":true},"items":{"type":"string","example":"https://example.com/photo.png"}},"tags":{"type":"array","xml":{"name":"tag","wrapped":true},"items":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"}},"xml":{"name":"Tag"}}},"status":{"type":"string","description":"pet status in the store","enum":["available","pending","sold"]}},"xml":{"name":"Pet"}}},"application/xml":{"schema":{"type":"object","required":["name","photoUrls"],"properties":{"id":{"type":"integer","format":"int64","default":40,"example":25},"category":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"}},"xml":{"name":"Category"}},"name":{"type":"string","example":"doggie"},"photoUrls":{"type":"array","xml":{"name":"photoUrl","wrapped":true},"items":{"type":"string","example":"https://example.com/photo.png"}},"tags":{"type":"array","xml":{"name":"tag","wrapped":true},"items":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"}},"xml":{"name":"Tag"}}},"status":{"type":"string","description":"pet status in the store","enum":["available","pending","sold"]}},"xml":{"name":"Pet"}}}},"description":"Pet object that needs to be added to the store","required":true},"responses":{"405":{"description":"Invalid input"}},"security":[{"petstore_auth":["write:pets","read:pets"]}]}' - ); + expect(requestBody).toMatchSnapshot(); const output = getCommandOutput(); expect(output).toMatch(/successfully uploaded/); diff --git a/src/cmds/openapi.js b/src/cmds/openapi.js index 966cd20fa..cb1affa03 100644 --- a/src/cmds/openapi.js +++ b/src/cmds/openapi.js @@ -1,7 +1,6 @@ require('colors'); const request = require('request-promise-native'); const fs = require('fs'); -const path = require('path'); const config = require('config'); const { prompt } = require('enquirer'); const OASNormalize = require('oas-normalize'); @@ -99,24 +98,22 @@ exports.run = async function (opts) { } let bundledSpec; - if (spec) { - const oas = new OASNormalize(spec, { enablePaths: true }); - await oas.validate().catch(err => { + const oas = new OASNormalize(specPath, { enablePaths: true }); + await oas.validate().catch(err => { + return Promise.reject(err); + }); + await oas + .bundle() + .then(res => { + bundledSpec = JSON.stringify(res); + }) + .catch(err => { return Promise.reject(err); }); - await oas - .bundle() - .then(res => { - bundledSpec = JSON.stringify(res); - }) - .catch(err => { - return Promise.reject(err); - }); - } const options = { formData: { - spec: bundledSpec || fs.createReadStream(path.resolve(process.cwd(), specPath)), + spec: bundledSpec, }, headers: { 'x-readme-version': versionCleaned, From 9211f09e21cfadbafc8e5f7fb4aeaa863aef3f46 Mon Sep 17 00:00:00 2001 From: Jon Ursenbach Date: Tue, 27 Jul 2021 14:42:06 -0700 Subject: [PATCH 4/4] test: slimming down the ref-oas fixture a bit --- .../ref-oas/external-components.json | 179 +++ __tests__/__fixtures__/ref-oas/petstore.json | 854 +------------ __tests__/__fixtures__/ref-oas/pettest.json | 1068 ----------------- .../cmds/__snapshots__/openapi.test.js.snap | 629 +++++++++- __tests__/cmds/openapi.test.js | 2 + 5 files changed, 814 insertions(+), 1918 deletions(-) create mode 100644 __tests__/__fixtures__/ref-oas/external-components.json delete mode 100644 __tests__/__fixtures__/ref-oas/pettest.json diff --git a/__tests__/__fixtures__/ref-oas/external-components.json b/__tests__/__fixtures__/ref-oas/external-components.json new file mode 100644 index 000000000..0a87758ce --- /dev/null +++ b/__tests__/__fixtures__/ref-oas/external-components.json @@ -0,0 +1,179 @@ +{ + "requestBodies": { + "Pet": { + "content": { + "application/json": { + "schema": { + "$ref": "#/schemas/Pet" + } + }, + "application/xml": { + "schema": { + "$ref": "#/schemas/Pet" + } + } + }, + "description": "Pet object that needs to be added to the store", + "required": true + } + }, + "schemas": { + "Order": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "petId": { + "type": "integer", + "format": "int64" + }, + "quantity": { + "type": "integer", + "format": "int32" + }, + "shipDate": { + "type": "string", + "format": "date-time" + }, + "status": { + "type": "string", + "description": "Order Status", + "enum": [ + "placed", + "approved", + "delivered" + ] + }, + "complete": { + "type": "boolean", + "default": false + } + }, + "xml": { + "name": "Order" + } + }, + "Category": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + } + }, + "xml": { + "name": "Category" + } + }, + "User": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "username": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "email": { + "type": "string" + }, + "password": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "userStatus": { + "type": "integer", + "format": "int32", + "description": "User Status" + } + }, + "xml": { + "name": "User" + } + }, + "Tag": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + } + }, + "xml": { + "name": "Tag" + } + }, + "Pet": { + "type": "object", + "required": [ + "name", + "photoUrls" + ], + "properties": { + "id": { + "type": "integer", + "format": "int64", + "default": 40, + "example": 25 + }, + "category": { + "$ref": "#/schemas/Category" + }, + "name": { + "type": "string", + "example": "doggie" + }, + "photoUrls": { + "type": "array", + "xml": { + "name": "photoUrl", + "wrapped": true + }, + "items": { + "type": "string", + "example": "https://example.com/photo.png" + } + }, + "tags": { + "type": "array", + "xml": { + "name": "tag", + "wrapped": true + }, + "items": { + "$ref": "#/schemas/Tag" + } + }, + "status": { + "type": "string", + "description": "pet status in the store", + "enum": [ + "available", + "pending", + "sold" + ] + } + }, + "xml": { + "name": "Pet" + } + } + } +} diff --git a/__tests__/__fixtures__/ref-oas/petstore.json b/__tests__/__fixtures__/ref-oas/petstore.json index a64f86ed5..a9633840e 100644 --- a/__tests__/__fixtures__/ref-oas/petstore.json +++ b/__tests__/__fixtures__/ref-oas/petstore.json @@ -1,49 +1,14 @@ { "openapi": "3.0.0", "info": { - "description": "This is a sample server Petstore server. You can find out more about\nSwagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net,\n`special-key` to test the authorization filters.", "version": "1.0.0", - "title": "Swagger Petstore", - "termsOfService": "http://swagger.io/terms/", - "contact": { - "email": "apiteam@swagger.io" - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0.html" - } - }, - "externalDocs": { - "description": "Find out more about Swagger", - "url": "http://swagger.io" + "title": "Example petstore to demo our handling of external $ref pointers" }, "servers": [ { "url": "http://petstore.swagger.io/v2" } ], - "tags": [ - { - "name": "pet", - "description": "Everything about your Pets", - "externalDocs": { - "description": "Find out more", - "url": "http://swagger.io" - } - }, - { - "name": "store", - "description": "Access to Petstore orders" - }, - { - "name": "user", - "description": "Operations about user", - "externalDocs": { - "description": "Find out more about our store", - "url": "http://swagger.io" - } - } - ], "paths": { "/pet": { "post": { @@ -52,7 +17,7 @@ "description": "", "operationId": "addPet", "requestBody": { - "$ref": "__tests__/__fixtures__/ref-oas/pettest.json#/components/requestBodies/Pet" + "$ref": "__tests__/__fixtures__/ref-oas/external-components.json#/requestBodies/Pet" }, "responses": { "405": { @@ -71,7 +36,7 @@ "description": "", "operationId": "updatePet", "requestBody": { - "$ref": "__tests__/__fixtures__/ref-oas/pettest.json#/components/requestBodies/Pet" + "$ref": "__tests__/__fixtures__/ref-oas/external-components.json#/requestBodies/Pet" }, "responses": { "400": { @@ -91,117 +56,6 @@ ] } }, - "/pet/findByStatus": { - "get": { - "tags": ["pet"], - "summary": "Finds Pets by status", - "description": "Multiple status values can be provided with comma separated strings", - "operationId": "findPetsByStatus", - "parameters": [ - { - "name": "status", - "in": "query", - "description": "Status values that need to be considered for filter", - "required": true, - "explode": true, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": ["available", "pending", "sold"], - "default": "available" - } - } - } - ], - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/xml": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Pet" - } - } - }, - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Pet" - } - } - } - } - }, - "400": { - "description": "Invalid status value" - } - }, - "security": [ - { - "petstore_auth": ["write:pets", "read:pets"] - } - ] - } - }, - "/pet/findByTags": { - "get": { - "tags": ["pet"], - "summary": "Finds Pets by tags", - "description": "Muliple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.", - "operationId": "findPetsByTags", - "parameters": [ - { - "name": "tags", - "in": "query", - "description": "Tags to filter by", - "required": true, - "explode": true, - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - } - ], - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/xml": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Pet" - } - } - }, - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Pet" - } - } - } - } - }, - "400": { - "description": "Invalid tag value" - } - }, - "security": [ - { - "petstore_auth": ["write:pets", "read:pets"] - } - ], - "deprecated": true - } - }, "/pet/{petId}": { "get": { "tags": ["pet"], @@ -226,12 +80,12 @@ "content": { "application/xml": { "schema": { - "$ref": "#/components/schemas/Pet" + "$ref": "__tests__/__fixtures__/ref-oas/external-components.json#/schemas/Pet" } }, "application/json": { "schema": { - "$ref": "#/components/schemas/Pet" + "$ref": "__tests__/__fixtures__/ref-oas/external-components.json#/schemas/Pet" } } } @@ -251,545 +105,10 @@ "api_key": [] } ] - }, - "post": { - "tags": ["pet"], - "summary": "Updates a pet in the store with form data", - "description": "", - "operationId": "updatePetWithForm", - "parameters": [ - { - "name": "petId", - "in": "path", - "description": "ID of pet that needs to be updated", - "required": true, - "schema": { - "type": "integer", - "format": "int64" - } - } - ], - "requestBody": { - "content": { - "application/x-www-form-urlencoded": { - "schema": { - "type": "object", - "properties": { - "name": { - "description": "Updated name of the pet", - "type": "string" - }, - "status": { - "description": "Updated status of the pet", - "type": "string" - } - } - } - } - } - }, - "responses": { - "405": { - "description": "Invalid input" - } - }, - "security": [ - { - "petstore_auth": ["write:pets", "read:pets"] - } - ] - }, - "delete": { - "tags": ["pet"], - "summary": "Deletes a pet", - "description": "", - "operationId": "deletePet", - "parameters": [ - { - "name": "api_key", - "in": "header", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "petId", - "in": "path", - "description": "Pet id to delete", - "required": true, - "schema": { - "type": "integer", - "format": "int64" - } - } - ], - "responses": { - "400": { - "description": "Invalid ID supplied" - }, - "404": { - "description": "Pet not found" - } - }, - "security": [ - { - "petstore_auth": ["write:pets", "read:pets"] - } - ] - } - }, - "/pet/{petId}/uploadImage": { - "post": { - "tags": ["pet"], - "summary": "Uploads an image", - "description": "", - "operationId": "uploadFile", - "parameters": [ - { - "name": "petId", - "in": "path", - "description": "ID of pet to update", - "required": true, - "schema": { - "type": "integer", - "format": "int64" - } - } - ], - "requestBody": { - "content": { - "multipart/form-data": { - "schema": { - "type": "object", - "properties": { - "additionalMetadata": { - "description": "Additional data to pass to server", - "type": "string" - }, - "file": { - "description": "file to upload", - "type": "string", - "format": "binary" - } - } - } - } - } - }, - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApiResponse" - } - } - } - } - }, - "security": [ - { - "petstore_auth": ["write:pets", "read:pets"] - } - ] - } - }, - "/store/inventory": { - "get": { - "tags": ["store"], - "summary": "Returns pet inventories by status", - "description": "Returns a map of status codes to quantities", - "operationId": "getInventory", - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/json": { - "schema": { - "type": "object", - "additionalProperties": { - "type": "integer", - "format": "int32" - } - } - } - } - } - }, - "security": [ - { - "api_key": [] - } - ] - } - }, - "/store/order": { - "post": { - "tags": ["store"], - "summary": "Place an order for a pet", - "description": "", - "operationId": "placeOrder", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Order" - } - } - }, - "description": "order placed for purchasing the pet", - "required": true - }, - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/xml": { - "schema": { - "$ref": "#/components/schemas/Order" - } - }, - "application/json": { - "schema": { - "$ref": "#/components/schemas/Order" - } - } - } - }, - "400": { - "description": "Invalid Order" - } - } - } - }, - "/store/order/{orderId}": { - "get": { - "tags": ["store"], - "summary": "Find purchase order by ID", - "description": "For valid response try integer IDs with value >= 1 and <= 10. Other values will generated exceptions", - "operationId": "getOrderById", - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "ID of pet that needs to be fetched", - "required": true, - "schema": { - "type": "integer", - "format": "int64", - "minimum": 1, - "maximum": 10 - } - } - ], - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/xml": { - "schema": { - "$ref": "#/components/schemas/Order" - } - }, - "application/json": { - "schema": { - "$ref": "#/components/schemas/Order" - } - } - } - }, - "400": { - "description": "Invalid ID supplied" - }, - "404": { - "description": "Order not found" - } - } - }, - "delete": { - "tags": ["store"], - "summary": "Delete purchase order by ID", - "description": "For valid response try integer IDs with positive integer value. Negative or non-integer values will generate API errors", - "operationId": "deleteOrder", - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "ID of the order that needs to be deleted", - "required": true, - "schema": { - "type": "integer", - "format": "int64", - "minimum": 1 - } - } - ], - "responses": { - "400": { - "description": "Invalid ID supplied" - }, - "404": { - "description": "Order not found" - } - } - } - }, - "/user": { - "post": { - "tags": ["user"], - "summary": "Create user", - "description": "This can only be done by the logged in user.", - "operationId": "createUser", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/User" - } - } - }, - "description": "Created user object", - "required": true - }, - "responses": { - "default": { - "description": "successful operation" - } - } - } - }, - "/user/createWithArray": { - "post": { - "tags": ["user"], - "summary": "Creates list of users with given input array", - "description": "", - "operationId": "createUsersWithArrayInput", - "requestBody": { - "$ref": "#/components/requestBodies/UserArray" - }, - "responses": { - "default": { - "description": "successful operation" - } - } - } - }, - "/user/createWithList": { - "post": { - "tags": ["user"], - "summary": "Creates list of users with given input array", - "description": "", - "operationId": "createUsersWithListInput", - "requestBody": { - "$ref": "#/components/requestBodies/UserArray" - }, - "responses": { - "default": { - "description": "successful operation" - } - } - } - }, - "/user/login": { - "get": { - "tags": ["user"], - "summary": "Logs user into the system", - "description": "", - "operationId": "loginUser", - "parameters": [ - { - "name": "username", - "in": "query", - "description": "The user name for login", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "password", - "in": "query", - "description": "The password for login in clear text", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "successful operation", - "headers": { - "X-Rate-Limit": { - "description": "calls per hour allowed by the user", - "schema": { - "type": "integer", - "format": "int32" - } - }, - "X-Expires-After": { - "description": "date in UTC when token expires", - "schema": { - "type": "string", - "format": "date-time" - } - } - }, - "content": { - "application/xml": { - "schema": { - "type": "string" - } - }, - "application/json": { - "schema": { - "type": "string" - } - } - } - }, - "400": { - "description": "Invalid username/password supplied" - } - } - } - }, - "/user/logout": { - "get": { - "tags": ["user"], - "summary": "Logs out current logged in user session", - "description": "", - "operationId": "logoutUser", - "responses": { - "default": { - "description": "successful operation" - } - } - } - }, - "/user/{username}": { - "get": { - "tags": ["user"], - "summary": "Get user by user name", - "description": "", - "operationId": "getUserByName", - "parameters": [ - { - "name": "username", - "in": "path", - "description": "The name that needs to be fetched. Use user1 for testing. ", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/xml": { - "schema": { - "$ref": "#/components/schemas/User" - } - }, - "application/json": { - "schema": { - "$ref": "#/components/schemas/User" - } - } - } - }, - "400": { - "description": "Invalid username supplied" - }, - "404": { - "description": "User not found" - } - } - }, - "put": { - "tags": ["user"], - "summary": "Updated user", - "description": "This can only be done by the logged in user.", - "operationId": "updateUser", - "parameters": [ - { - "name": "username", - "in": "path", - "description": "name that need to be updated", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/User" - } - } - }, - "description": "Updated user object", - "required": true - }, - "responses": { - "400": { - "description": "Invalid user supplied" - }, - "404": { - "description": "User not found" - } - } - }, - "delete": { - "tags": ["user"], - "summary": "Delete user", - "description": "This can only be done by the logged in user.", - "operationId": "deleteUser", - "parameters": [ - { - "name": "username", - "in": "path", - "description": "The name that needs to be deleted", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "400": { - "description": "Invalid username supplied" - }, - "404": { - "description": "User not found" - } - } } } }, "components": { - "requestBodies": { - "UserArray": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/User" - } - } - } - }, - "description": "List of user object", - "required": true - } - }, "securitySchemes": { "petstore_auth": { "type": "oauth2", @@ -808,169 +127,6 @@ "name": "api_key", "in": "header" } - }, - "schemas": { - "Order": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "petId": { - "type": "integer", - "format": "int64" - }, - "quantity": { - "type": "integer", - "format": "int32" - }, - "shipDate": { - "type": "string", - "format": "date-time" - }, - "status": { - "type": "string", - "description": "Order Status", - "enum": ["placed", "approved", "delivered"] - }, - "complete": { - "type": "boolean", - "default": false - } - }, - "xml": { - "name": "Order" - } - }, - "Category": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - } - }, - "xml": { - "name": "Category" - } - }, - "User": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "username": { - "type": "string" - }, - "firstName": { - "type": "string" - }, - "lastName": { - "type": "string" - }, - "email": { - "type": "string" - }, - "password": { - "type": "string" - }, - "phone": { - "type": "string" - }, - "userStatus": { - "type": "integer", - "format": "int32", - "description": "User Status" - } - }, - "xml": { - "name": "User" - } - }, - "Tag": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - } - }, - "xml": { - "name": "Tag" - } - }, - "Pet": { - "type": "object", - "required": ["name", "photoUrls"], - "properties": { - "id": { - "type": "integer", - "format": "int64", - "default": 40, - "example": 25 - }, - "category": { - "$ref": "#/components/schemas/Category" - }, - "name": { - "type": "string", - "example": "doggie" - }, - "photoUrls": { - "type": "array", - "xml": { - "name": "photoUrl", - "wrapped": true - }, - "items": { - "type": "string", - "example": "https://example.com/photo.png" - } - }, - "tags": { - "type": "array", - "xml": { - "name": "tag", - "wrapped": true - }, - "items": { - "$ref": "#/components/schemas/Tag" - } - }, - "status": { - "type": "string", - "description": "pet status in the store", - "enum": ["available", "pending", "sold"] - } - }, - "xml": { - "name": "Pet" - } - }, - "ApiResponse": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32" - }, - "type": { - "type": "string" - }, - "message": { - "type": "string" - } - } - } } } } diff --git a/__tests__/__fixtures__/ref-oas/pettest.json b/__tests__/__fixtures__/ref-oas/pettest.json deleted file mode 100644 index 0aa64ed6f..000000000 --- a/__tests__/__fixtures__/ref-oas/pettest.json +++ /dev/null @@ -1,1068 +0,0 @@ -{ - "openapi": "3.0.0", - "info": { - "description": "This is a sample server Petstore server. You can find out more about\nSwagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net,\n`special-key` to test the authorization filters.", - "version": "1.0.0", - "title": "Swagger Petstore", - "termsOfService": "http://swagger.io/terms/", - "contact": { - "email": "apiteam@swagger.io" - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0.html" - } - }, - "externalDocs": { - "description": "Find out more about Swagger", - "url": "http://swagger.io" - }, - "servers": [ - { - "url": "http://petstore.swagger.io/v2" - } - ], - "tags": [ - { - "name": "pet", - "description": "Everything about your Pets", - "externalDocs": { - "description": "Find out more", - "url": "http://swagger.io" - } - }, - { - "name": "store", - "description": "Access to Petstore orders" - }, - { - "name": "user", - "description": "Operations about user", - "externalDocs": { - "description": "Find out more about our store", - "url": "http://swagger.io" - } - } - ], - "paths": { - "/pet": { - "post": { - "tags": [ - "pet" - ], - "summary": "Add a new pet to the store", - "description": "", - "operationId": "addPet", - "requestBody": { - "$ref": "#/components/requestBodies/Pet" - }, - "responses": { - "405": { - "description": "Invalid input" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - }, - "put": { - "tags": [ - "pet" - ], - "summary": "Update an existing pet", - "description": "", - "operationId": "updatePet", - "requestBody": { - "$ref": "#/components/requestBodies/Pet" - }, - "responses": { - "400": { - "description": "Invalid ID supplied" - }, - "404": { - "description": "Pet not found" - }, - "405": { - "description": "Validation exception" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - } - }, - "/pet/findByStatus": { - "get": { - "tags": [ - "pet" - ], - "summary": "Finds Pets by status", - "description": "Multiple status values can be provided with comma separated strings", - "operationId": "findPetsByStatus", - "parameters": [ - { - "name": "status", - "in": "query", - "description": "Status values that need to be considered for filter", - "required": true, - "explode": true, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "available", - "pending", - "sold" - ], - "default": "available" - } - } - } - ], - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/xml": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Pet" - } - } - }, - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Pet" - } - } - } - } - }, - "400": { - "description": "Invalid status value" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - } - }, - "/pet/findByTags": { - "get": { - "tags": [ - "pet" - ], - "summary": "Finds Pets by tags", - "description": "Muliple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.", - "operationId": "findPetsByTags", - "parameters": [ - { - "name": "tags", - "in": "query", - "description": "Tags to filter by", - "required": true, - "explode": true, - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - } - ], - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/xml": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Pet" - } - } - }, - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Pet" - } - } - } - } - }, - "400": { - "description": "Invalid tag value" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ], - "deprecated": true - } - }, - "/pet/{petId}": { - "get": { - "tags": [ - "pet" - ], - "summary": "Find pet by ID", - "description": "Returns a single pet", - "operationId": "getPetById", - "parameters": [ - { - "name": "petId", - "in": "path", - "description": "ID of pet to return", - "required": true, - "schema": { - "type": "integer", - "format": "int64" - } - } - ], - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/xml": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - }, - "application/json": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - } - } - }, - "400": { - "description": "Invalid ID supplied" - }, - "404": { - "description": "Pet not found" - }, - "default": { - "description": "successful response" - } - }, - "security": [ - { - "api_key": [] - } - ] - }, - "post": { - "tags": [ - "pet" - ], - "summary": "Updates a pet in the store with form data", - "description": "", - "operationId": "updatePetWithForm", - "parameters": [ - { - "name": "petId", - "in": "path", - "description": "ID of pet that needs to be updated", - "required": true, - "schema": { - "type": "integer", - "format": "int64" - } - } - ], - "requestBody": { - "content": { - "application/x-www-form-urlencoded": { - "schema": { - "type": "object", - "properties": { - "name": { - "description": "Updated name of the pet", - "type": "string" - }, - "status": { - "description": "Updated status of the pet", - "type": "string" - } - } - } - } - } - }, - "responses": { - "405": { - "description": "Invalid input" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - }, - "delete": { - "tags": [ - "pet" - ], - "summary": "Deletes a pet", - "description": "", - "operationId": "deletePet", - "parameters": [ - { - "name": "api_key", - "in": "header", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "petId", - "in": "path", - "description": "Pet id to delete", - "required": true, - "schema": { - "type": "integer", - "format": "int64" - } - } - ], - "responses": { - "400": { - "description": "Invalid ID supplied" - }, - "404": { - "description": "Pet not found" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - } - }, - "/pet/{petId}/uploadImage": { - "post": { - "tags": [ - "pet" - ], - "summary": "Uploads an image", - "description": "", - "operationId": "uploadFile", - "parameters": [ - { - "name": "petId", - "in": "path", - "description": "ID of pet to update", - "required": true, - "schema": { - "type": "integer", - "format": "int64" - } - } - ], - "requestBody": { - "content": { - "multipart/form-data": { - "schema": { - "type": "object", - "properties": { - "additionalMetadata": { - "description": "Additional data to pass to server", - "type": "string" - }, - "file": { - "description": "file to upload", - "type": "string", - "format": "binary" - } - } - } - } - } - }, - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApiResponse" - } - } - } - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - } - }, - "/store/inventory": { - "get": { - "tags": [ - "store" - ], - "summary": "Returns pet inventories by status", - "description": "Returns a map of status codes to quantities", - "operationId": "getInventory", - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/json": { - "schema": { - "type": "object", - "additionalProperties": { - "type": "integer", - "format": "int32" - } - } - } - } - } - }, - "security": [ - { - "api_key": [] - } - ] - } - }, - "/store/order": { - "post": { - "tags": [ - "store" - ], - "summary": "Place an order for a pet", - "description": "", - "operationId": "placeOrder", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Order" - } - } - }, - "description": "order placed for purchasing the pet", - "required": true - }, - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/xml": { - "schema": { - "$ref": "#/components/schemas/Order" - } - }, - "application/json": { - "schema": { - "$ref": "#/components/schemas/Order" - } - } - } - }, - "400": { - "description": "Invalid Order" - } - } - } - }, - "/store/order/{orderId}": { - "get": { - "tags": [ - "store" - ], - "summary": "Find purchase order by ID", - "description": "For valid response try integer IDs with value >= 1 and <= 10. Other values will generated exceptions", - "operationId": "getOrderById", - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "ID of pet that needs to be fetched", - "required": true, - "schema": { - "type": "integer", - "format": "int64", - "minimum": 1, - "maximum": 10 - } - } - ], - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/xml": { - "schema": { - "$ref": "#/components/schemas/Order" - } - }, - "application/json": { - "schema": { - "$ref": "#/components/schemas/Order" - } - } - } - }, - "400": { - "description": "Invalid ID supplied" - }, - "404": { - "description": "Order not found" - } - } - }, - "delete": { - "tags": [ - "store" - ], - "summary": "Delete purchase order by ID", - "description": "For valid response try integer IDs with positive integer value. Negative or non-integer values will generate API errors", - "operationId": "deleteOrder", - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "ID of the order that needs to be deleted", - "required": true, - "schema": { - "type": "integer", - "format": "int64", - "minimum": 1 - } - } - ], - "responses": { - "400": { - "description": "Invalid ID supplied" - }, - "404": { - "description": "Order not found" - } - } - } - }, - "/user": { - "post": { - "tags": [ - "user" - ], - "summary": "Create user", - "description": "This can only be done by the logged in user.", - "operationId": "createUser", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/User" - } - } - }, - "description": "Created user object", - "required": true - }, - "responses": { - "default": { - "description": "successful operation" - } - } - } - }, - "/user/createWithArray": { - "post": { - "tags": [ - "user" - ], - "summary": "Creates list of users with given input array", - "description": "", - "operationId": "createUsersWithArrayInput", - "requestBody": { - "$ref": "#/components/requestBodies/UserArray" - }, - "responses": { - "default": { - "description": "successful operation" - } - } - } - }, - "/user/createWithList": { - "post": { - "tags": [ - "user" - ], - "summary": "Creates list of users with given input array", - "description": "", - "operationId": "createUsersWithListInput", - "requestBody": { - "$ref": "#/components/requestBodies/UserArray" - }, - "responses": { - "default": { - "description": "successful operation" - } - } - } - }, - "/user/login": { - "get": { - "tags": [ - "user" - ], - "summary": "Logs user into the system", - "description": "", - "operationId": "loginUser", - "parameters": [ - { - "name": "username", - "in": "query", - "description": "The user name for login", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "password", - "in": "query", - "description": "The password for login in clear text", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "successful operation", - "headers": { - "X-Rate-Limit": { - "description": "calls per hour allowed by the user", - "schema": { - "type": "integer", - "format": "int32" - } - }, - "X-Expires-After": { - "description": "date in UTC when token expires", - "schema": { - "type": "string", - "format": "date-time" - } - } - }, - "content": { - "application/xml": { - "schema": { - "type": "string" - } - }, - "application/json": { - "schema": { - "type": "string" - } - } - } - }, - "400": { - "description": "Invalid username/password supplied" - } - } - } - }, - "/user/logout": { - "get": { - "tags": [ - "user" - ], - "summary": "Logs out current logged in user session", - "description": "", - "operationId": "logoutUser", - "responses": { - "default": { - "description": "successful operation" - } - } - } - }, - "/user/{username}": { - "get": { - "tags": [ - "user" - ], - "summary": "Get user by user name", - "description": "", - "operationId": "getUserByName", - "parameters": [ - { - "name": "username", - "in": "path", - "description": "The name that needs to be fetched. Use user1 for testing. ", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/xml": { - "schema": { - "$ref": "#/components/schemas/User" - } - }, - "application/json": { - "schema": { - "$ref": "#/components/schemas/User" - } - } - } - }, - "400": { - "description": "Invalid username supplied" - }, - "404": { - "description": "User not found" - } - } - }, - "put": { - "tags": [ - "user" - ], - "summary": "Updated user", - "description": "This can only be done by the logged in user.", - "operationId": "updateUser", - "parameters": [ - { - "name": "username", - "in": "path", - "description": "name that need to be updated", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/User" - } - } - }, - "description": "Updated user object", - "required": true - }, - "responses": { - "400": { - "description": "Invalid user supplied" - }, - "404": { - "description": "User not found" - } - } - }, - "delete": { - "tags": [ - "user" - ], - "summary": "Delete user", - "description": "This can only be done by the logged in user.", - "operationId": "deleteUser", - "parameters": [ - { - "name": "username", - "in": "path", - "description": "The name that needs to be deleted", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "400": { - "description": "Invalid username supplied" - }, - "404": { - "description": "User not found" - } - } - } - } - }, - "components": { - "requestBodies": { - "Pet": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - }, - "application/xml": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - } - }, - "description": "Pet object that needs to be added to the store", - "required": true - }, - "UserArray": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/User" - } - } - } - }, - "description": "List of user object", - "required": true - } - }, - "securitySchemes": { - "petstore_auth": { - "type": "oauth2", - "flows": { - "implicit": { - "authorizationUrl": "http://petstore.swagger.io/oauth/dialog", - "scopes": { - "write:pets": "modify pets in your account", - "read:pets": "read your pets" - } - } - } - }, - "api_key": { - "type": "apiKey", - "name": "api_key", - "in": "header" - } - }, - "schemas": { - "Order": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "petId": { - "type": "integer", - "format": "int64" - }, - "quantity": { - "type": "integer", - "format": "int32" - }, - "shipDate": { - "type": "string", - "format": "date-time" - }, - "status": { - "type": "string", - "description": "Order Status", - "enum": [ - "placed", - "approved", - "delivered" - ] - }, - "complete": { - "type": "boolean", - "default": false - } - }, - "xml": { - "name": "Order" - } - }, - "Category": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - } - }, - "xml": { - "name": "Category" - } - }, - "User": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "username": { - "type": "string" - }, - "firstName": { - "type": "string" - }, - "lastName": { - "type": "string" - }, - "email": { - "type": "string" - }, - "password": { - "type": "string" - }, - "phone": { - "type": "string" - }, - "userStatus": { - "type": "integer", - "format": "int32", - "description": "User Status" - } - }, - "xml": { - "name": "User" - } - }, - "Tag": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - } - }, - "xml": { - "name": "Tag" - } - }, - "Pet": { - "type": "object", - "required": [ - "name", - "photoUrls" - ], - "properties": { - "id": { - "type": "integer", - "format": "int64", - "default": 40, - "example": 25 - }, - "category": { - "$ref": "#/components/schemas/Category" - }, - "name": { - "type": "string", - "example": "doggie" - }, - "photoUrls": { - "type": "array", - "xml": { - "name": "photoUrl", - "wrapped": true - }, - "items": { - "type": "string", - "example": "https://example.com/photo.png" - } - }, - "tags": { - "type": "array", - "xml": { - "name": "tag", - "wrapped": true - }, - "items": { - "$ref": "#/components/schemas/Tag" - } - }, - "status": { - "type": "string", - "description": "pet status in the store", - "enum": [ - "available", - "pending", - "sold" - ] - } - }, - "xml": { - "name": "Pet" - } - }, - "ApiResponse": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32" - }, - "type": { - "type": "string" - }, - "message": { - "type": "string" - } - } - } - } - } -} diff --git a/__tests__/cmds/__snapshots__/openapi.test.js.snap b/__tests__/cmds/__snapshots__/openapi.test.js.snap index 30412ee7c..68b124db7 100644 --- a/__tests__/cmds/__snapshots__/openapi.test.js.snap +++ b/__tests__/cmds/__snapshots__/openapi.test.js.snap @@ -1,3 +1,630 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`rdme openapi should bundle and upload the expected content 1`] = `"{\\"openapi\\":\\"3.0.0\\",\\"info\\":{\\"description\\":\\"This is a sample server Petstore server. You can find out more about\\\\nSwagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net,\\\\n\`special-key\` to test the authorization filters.\\",\\"version\\":\\"1.0.0\\",\\"title\\":\\"Swagger Petstore\\",\\"termsOfService\\":\\"http://swagger.io/terms/\\",\\"contact\\":{\\"email\\":\\"apiteam@swagger.io\\"},\\"license\\":{\\"name\\":\\"Apache 2.0\\",\\"url\\":\\"http://www.apache.org/licenses/LICENSE-2.0.html\\"}},\\"externalDocs\\":{\\"description\\":\\"Find out more about Swagger\\",\\"url\\":\\"http://swagger.io\\"},\\"servers\\":[{\\"url\\":\\"http://petstore.swagger.io/v2\\"}],\\"tags\\":[{\\"name\\":\\"pet\\",\\"description\\":\\"Everything about your Pets\\",\\"externalDocs\\":{\\"description\\":\\"Find out more\\",\\"url\\":\\"http://swagger.io\\"}},{\\"name\\":\\"store\\",\\"description\\":\\"Access to Petstore orders\\"},{\\"name\\":\\"user\\",\\"description\\":\\"Operations about user\\",\\"externalDocs\\":{\\"description\\":\\"Find out more about our store\\",\\"url\\":\\"http://swagger.io\\"}}],\\"paths\\":{\\"/pet\\":{\\"post\\":{\\"tags\\":[\\"pet\\"],\\"summary\\":\\"Add a new pet to the store\\",\\"description\\":\\"\\",\\"operationId\\":\\"addPet\\",\\"requestBody\\":{\\"content\\":{\\"application/json\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"required\\":[\\"name\\",\\"photoUrls\\"],\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\",\\"default\\":40,\\"example\\":25},\\"category\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Category\\"}},\\"name\\":{\\"type\\":\\"string\\",\\"example\\":\\"doggie\\"},\\"photoUrls\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"photoUrl\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"string\\",\\"example\\":\\"https://example.com/photo.png\\"}},\\"tags\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"tag\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Tag\\"}}},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"pet status in the store\\",\\"enum\\":[\\"available\\",\\"pending\\",\\"sold\\"]}},\\"xml\\":{\\"name\\":\\"Pet\\"}}},\\"application/xml\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"required\\":[\\"name\\",\\"photoUrls\\"],\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\",\\"default\\":40,\\"example\\":25},\\"category\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Category\\"}},\\"name\\":{\\"type\\":\\"string\\",\\"example\\":\\"doggie\\"},\\"photoUrls\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"photoUrl\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"string\\",\\"example\\":\\"https://example.com/photo.png\\"}},\\"tags\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"tag\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Tag\\"}}},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"pet status in the store\\",\\"enum\\":[\\"available\\",\\"pending\\",\\"sold\\"]}},\\"xml\\":{\\"name\\":\\"Pet\\"}}}},\\"description\\":\\"Pet object that needs to be added to the store\\",\\"required\\":true},\\"responses\\":{\\"405\\":{\\"description\\":\\"Invalid input\\"}},\\"security\\":[{\\"petstore_auth\\":[\\"write:pets\\",\\"read:pets\\"]}]},\\"put\\":{\\"tags\\":[\\"pet\\"],\\"summary\\":\\"Update an existing pet\\",\\"description\\":\\"\\",\\"operationId\\":\\"updatePet\\",\\"requestBody\\":{\\"content\\":{\\"application/json\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"required\\":[\\"name\\",\\"photoUrls\\"],\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\",\\"default\\":40,\\"example\\":25},\\"category\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Category\\"}},\\"name\\":{\\"type\\":\\"string\\",\\"example\\":\\"doggie\\"},\\"photoUrls\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"photoUrl\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"string\\",\\"example\\":\\"https://example.com/photo.png\\"}},\\"tags\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"tag\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Tag\\"}}},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"pet status in the store\\",\\"enum\\":[\\"available\\",\\"pending\\",\\"sold\\"]}},\\"xml\\":{\\"name\\":\\"Pet\\"}}},\\"application/xml\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"required\\":[\\"name\\",\\"photoUrls\\"],\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\",\\"default\\":40,\\"example\\":25},\\"category\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Category\\"}},\\"name\\":{\\"type\\":\\"string\\",\\"example\\":\\"doggie\\"},\\"photoUrls\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"photoUrl\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"string\\",\\"example\\":\\"https://example.com/photo.png\\"}},\\"tags\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"tag\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Tag\\"}}},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"pet status in the store\\",\\"enum\\":[\\"available\\",\\"pending\\",\\"sold\\"]}},\\"xml\\":{\\"name\\":\\"Pet\\"}}}},\\"description\\":\\"Pet object that needs to be added to the store\\",\\"required\\":true},\\"responses\\":{\\"400\\":{\\"description\\":\\"Invalid ID supplied\\"},\\"404\\":{\\"description\\":\\"Pet not found\\"},\\"405\\":{\\"description\\":\\"Validation exception\\"}},\\"security\\":[{\\"petstore_auth\\":[\\"write:pets\\",\\"read:pets\\"]}]}},\\"/pet/findByStatus\\":{\\"get\\":{\\"tags\\":[\\"pet\\"],\\"summary\\":\\"Finds Pets by status\\",\\"description\\":\\"Multiple status values can be provided with comma separated strings\\",\\"operationId\\":\\"findPetsByStatus\\",\\"parameters\\":[{\\"name\\":\\"status\\",\\"in\\":\\"query\\",\\"description\\":\\"Status values that need to be considered for filter\\",\\"required\\":true,\\"explode\\":true,\\"schema\\":{\\"type\\":\\"array\\",\\"items\\":{\\"type\\":\\"string\\",\\"enum\\":[\\"available\\",\\"pending\\",\\"sold\\"],\\"default\\":\\"available\\"}}}],\\"responses\\":{\\"200\\":{\\"description\\":\\"successful operation\\",\\"content\\":{\\"application/xml\\":{\\"schema\\":{\\"type\\":\\"array\\",\\"items\\":{\\"type\\":\\"object\\",\\"required\\":[\\"name\\",\\"photoUrls\\"],\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\",\\"default\\":40,\\"example\\":25},\\"category\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Category\\"}},\\"name\\":{\\"type\\":\\"string\\",\\"example\\":\\"doggie\\"},\\"photoUrls\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"photoUrl\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"string\\",\\"example\\":\\"https://example.com/photo.png\\"}},\\"tags\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"tag\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Tag\\"}}},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"pet status in the store\\",\\"enum\\":[\\"available\\",\\"pending\\",\\"sold\\"]}},\\"xml\\":{\\"name\\":\\"Pet\\"}}}},\\"application/json\\":{\\"schema\\":{\\"type\\":\\"array\\",\\"items\\":{\\"type\\":\\"object\\",\\"required\\":[\\"name\\",\\"photoUrls\\"],\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\",\\"default\\":40,\\"example\\":25},\\"category\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Category\\"}},\\"name\\":{\\"type\\":\\"string\\",\\"example\\":\\"doggie\\"},\\"photoUrls\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"photoUrl\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"string\\",\\"example\\":\\"https://example.com/photo.png\\"}},\\"tags\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"tag\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Tag\\"}}},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"pet status in the store\\",\\"enum\\":[\\"available\\",\\"pending\\",\\"sold\\"]}},\\"xml\\":{\\"name\\":\\"Pet\\"}}}}}},\\"400\\":{\\"description\\":\\"Invalid status value\\"}},\\"security\\":[{\\"petstore_auth\\":[\\"write:pets\\",\\"read:pets\\"]}]}},\\"/pet/findByTags\\":{\\"get\\":{\\"tags\\":[\\"pet\\"],\\"summary\\":\\"Finds Pets by tags\\",\\"description\\":\\"Muliple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.\\",\\"operationId\\":\\"findPetsByTags\\",\\"parameters\\":[{\\"name\\":\\"tags\\",\\"in\\":\\"query\\",\\"description\\":\\"Tags to filter by\\",\\"required\\":true,\\"explode\\":true,\\"schema\\":{\\"type\\":\\"array\\",\\"items\\":{\\"type\\":\\"string\\"}}}],\\"responses\\":{\\"200\\":{\\"description\\":\\"successful operation\\",\\"content\\":{\\"application/xml\\":{\\"schema\\":{\\"type\\":\\"array\\",\\"items\\":{\\"type\\":\\"object\\",\\"required\\":[\\"name\\",\\"photoUrls\\"],\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\",\\"default\\":40,\\"example\\":25},\\"category\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Category\\"}},\\"name\\":{\\"type\\":\\"string\\",\\"example\\":\\"doggie\\"},\\"photoUrls\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"photoUrl\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"string\\",\\"example\\":\\"https://example.com/photo.png\\"}},\\"tags\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"tag\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Tag\\"}}},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"pet status in the store\\",\\"enum\\":[\\"available\\",\\"pending\\",\\"sold\\"]}},\\"xml\\":{\\"name\\":\\"Pet\\"}}}},\\"application/json\\":{\\"schema\\":{\\"type\\":\\"array\\",\\"items\\":{\\"type\\":\\"object\\",\\"required\\":[\\"name\\",\\"photoUrls\\"],\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\",\\"default\\":40,\\"example\\":25},\\"category\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Category\\"}},\\"name\\":{\\"type\\":\\"string\\",\\"example\\":\\"doggie\\"},\\"photoUrls\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"photoUrl\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"string\\",\\"example\\":\\"https://example.com/photo.png\\"}},\\"tags\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"tag\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Tag\\"}}},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"pet status in the store\\",\\"enum\\":[\\"available\\",\\"pending\\",\\"sold\\"]}},\\"xml\\":{\\"name\\":\\"Pet\\"}}}}}},\\"400\\":{\\"description\\":\\"Invalid tag value\\"}},\\"security\\":[{\\"petstore_auth\\":[\\"write:pets\\",\\"read:pets\\"]}],\\"deprecated\\":true}},\\"/pet/{petId}\\":{\\"get\\":{\\"tags\\":[\\"pet\\"],\\"summary\\":\\"Find pet by ID\\",\\"description\\":\\"Returns a single pet\\",\\"operationId\\":\\"getPetById\\",\\"parameters\\":[{\\"name\\":\\"petId\\",\\"in\\":\\"path\\",\\"description\\":\\"ID of pet to return\\",\\"required\\":true,\\"schema\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"}}],\\"responses\\":{\\"200\\":{\\"description\\":\\"successful operation\\",\\"content\\":{\\"application/xml\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"required\\":[\\"name\\",\\"photoUrls\\"],\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\",\\"default\\":40,\\"example\\":25},\\"category\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Category\\"}},\\"name\\":{\\"type\\":\\"string\\",\\"example\\":\\"doggie\\"},\\"photoUrls\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"photoUrl\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"string\\",\\"example\\":\\"https://example.com/photo.png\\"}},\\"tags\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"tag\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Tag\\"}}},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"pet status in the store\\",\\"enum\\":[\\"available\\",\\"pending\\",\\"sold\\"]}},\\"xml\\":{\\"name\\":\\"Pet\\"}}},\\"application/json\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"required\\":[\\"name\\",\\"photoUrls\\"],\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\",\\"default\\":40,\\"example\\":25},\\"category\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Category\\"}},\\"name\\":{\\"type\\":\\"string\\",\\"example\\":\\"doggie\\"},\\"photoUrls\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"photoUrl\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"string\\",\\"example\\":\\"https://example.com/photo.png\\"}},\\"tags\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"tag\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Tag\\"}}},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"pet status in the store\\",\\"enum\\":[\\"available\\",\\"pending\\",\\"sold\\"]}},\\"xml\\":{\\"name\\":\\"Pet\\"}}}}},\\"400\\":{\\"description\\":\\"Invalid ID supplied\\"},\\"404\\":{\\"description\\":\\"Pet not found\\"},\\"default\\":{\\"description\\":\\"successful response\\"}},\\"security\\":[{\\"api_key\\":[]}]},\\"post\\":{\\"tags\\":[\\"pet\\"],\\"summary\\":\\"Updates a pet in the store with form data\\",\\"description\\":\\"\\",\\"operationId\\":\\"updatePetWithForm\\",\\"parameters\\":[{\\"name\\":\\"petId\\",\\"in\\":\\"path\\",\\"description\\":\\"ID of pet that needs to be updated\\",\\"required\\":true,\\"schema\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"}}],\\"requestBody\\":{\\"content\\":{\\"application/x-www-form-urlencoded\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"name\\":{\\"description\\":\\"Updated name of the pet\\",\\"type\\":\\"string\\"},\\"status\\":{\\"description\\":\\"Updated status of the pet\\",\\"type\\":\\"string\\"}}}}}},\\"responses\\":{\\"405\\":{\\"description\\":\\"Invalid input\\"}},\\"security\\":[{\\"petstore_auth\\":[\\"write:pets\\",\\"read:pets\\"]}]},\\"delete\\":{\\"tags\\":[\\"pet\\"],\\"summary\\":\\"Deletes a pet\\",\\"description\\":\\"\\",\\"operationId\\":\\"deletePet\\",\\"parameters\\":[{\\"name\\":\\"api_key\\",\\"in\\":\\"header\\",\\"required\\":false,\\"schema\\":{\\"type\\":\\"string\\"}},{\\"name\\":\\"petId\\",\\"in\\":\\"path\\",\\"description\\":\\"Pet id to delete\\",\\"required\\":true,\\"schema\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"}}],\\"responses\\":{\\"400\\":{\\"description\\":\\"Invalid ID supplied\\"},\\"404\\":{\\"description\\":\\"Pet not found\\"}},\\"security\\":[{\\"petstore_auth\\":[\\"write:pets\\",\\"read:pets\\"]}]}},\\"/pet/{petId}/uploadImage\\":{\\"post\\":{\\"tags\\":[\\"pet\\"],\\"summary\\":\\"Uploads an image\\",\\"description\\":\\"\\",\\"operationId\\":\\"uploadFile\\",\\"parameters\\":[{\\"name\\":\\"petId\\",\\"in\\":\\"path\\",\\"description\\":\\"ID of pet to update\\",\\"required\\":true,\\"schema\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"}}],\\"requestBody\\":{\\"content\\":{\\"multipart/form-data\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"additionalMetadata\\":{\\"description\\":\\"Additional data to pass to server\\",\\"type\\":\\"string\\"},\\"file\\":{\\"description\\":\\"file to upload\\",\\"type\\":\\"string\\",\\"format\\":\\"binary\\"}}}}}},\\"responses\\":{\\"200\\":{\\"description\\":\\"successful operation\\",\\"content\\":{\\"application/json\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"code\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\"},\\"type\\":{\\"type\\":\\"string\\"},\\"message\\":{\\"type\\":\\"string\\"}}}}}}},\\"security\\":[{\\"petstore_auth\\":[\\"write:pets\\",\\"read:pets\\"]}]}},\\"/store/inventory\\":{\\"get\\":{\\"tags\\":[\\"store\\"],\\"summary\\":\\"Returns pet inventories by status\\",\\"description\\":\\"Returns a map of status codes to quantities\\",\\"operationId\\":\\"getInventory\\",\\"responses\\":{\\"200\\":{\\"description\\":\\"successful operation\\",\\"content\\":{\\"application/json\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"additionalProperties\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\"}}}}}},\\"security\\":[{\\"api_key\\":[]}]}},\\"/store/order\\":{\\"post\\":{\\"tags\\":[\\"store\\"],\\"summary\\":\\"Place an order for a pet\\",\\"description\\":\\"\\",\\"operationId\\":\\"placeOrder\\",\\"requestBody\\":{\\"content\\":{\\"application/json\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"petId\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"quantity\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\"},\\"shipDate\\":{\\"type\\":\\"string\\",\\"format\\":\\"date-time\\"},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"Order Status\\",\\"enum\\":[\\"placed\\",\\"approved\\",\\"delivered\\"]},\\"complete\\":{\\"type\\":\\"boolean\\",\\"default\\":false}},\\"xml\\":{\\"name\\":\\"Order\\"}}}},\\"description\\":\\"order placed for purchasing the pet\\",\\"required\\":true},\\"responses\\":{\\"200\\":{\\"description\\":\\"successful operation\\",\\"content\\":{\\"application/xml\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"petId\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"quantity\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\"},\\"shipDate\\":{\\"type\\":\\"string\\",\\"format\\":\\"date-time\\"},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"Order Status\\",\\"enum\\":[\\"placed\\",\\"approved\\",\\"delivered\\"]},\\"complete\\":{\\"type\\":\\"boolean\\",\\"default\\":false}},\\"xml\\":{\\"name\\":\\"Order\\"}}},\\"application/json\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"petId\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"quantity\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\"},\\"shipDate\\":{\\"type\\":\\"string\\",\\"format\\":\\"date-time\\"},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"Order Status\\",\\"enum\\":[\\"placed\\",\\"approved\\",\\"delivered\\"]},\\"complete\\":{\\"type\\":\\"boolean\\",\\"default\\":false}},\\"xml\\":{\\"name\\":\\"Order\\"}}}}},\\"400\\":{\\"description\\":\\"Invalid Order\\"}}}},\\"/store/order/{orderId}\\":{\\"get\\":{\\"tags\\":[\\"store\\"],\\"summary\\":\\"Find purchase order by ID\\",\\"description\\":\\"For valid response try integer IDs with value >= 1 and <= 10. Other values will generated exceptions\\",\\"operationId\\":\\"getOrderById\\",\\"parameters\\":[{\\"name\\":\\"orderId\\",\\"in\\":\\"path\\",\\"description\\":\\"ID of pet that needs to be fetched\\",\\"required\\":true,\\"schema\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\",\\"minimum\\":1,\\"maximum\\":10}}],\\"responses\\":{\\"200\\":{\\"description\\":\\"successful operation\\",\\"content\\":{\\"application/xml\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"petId\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"quantity\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\"},\\"shipDate\\":{\\"type\\":\\"string\\",\\"format\\":\\"date-time\\"},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"Order Status\\",\\"enum\\":[\\"placed\\",\\"approved\\",\\"delivered\\"]},\\"complete\\":{\\"type\\":\\"boolean\\",\\"default\\":false}},\\"xml\\":{\\"name\\":\\"Order\\"}}},\\"application/json\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"petId\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"quantity\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\"},\\"shipDate\\":{\\"type\\":\\"string\\",\\"format\\":\\"date-time\\"},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"Order Status\\",\\"enum\\":[\\"placed\\",\\"approved\\",\\"delivered\\"]},\\"complete\\":{\\"type\\":\\"boolean\\",\\"default\\":false}},\\"xml\\":{\\"name\\":\\"Order\\"}}}}},\\"400\\":{\\"description\\":\\"Invalid ID supplied\\"},\\"404\\":{\\"description\\":\\"Order not found\\"}}},\\"delete\\":{\\"tags\\":[\\"store\\"],\\"summary\\":\\"Delete purchase order by ID\\",\\"description\\":\\"For valid response try integer IDs with positive integer value. Negative or non-integer values will generate API errors\\",\\"operationId\\":\\"deleteOrder\\",\\"parameters\\":[{\\"name\\":\\"orderId\\",\\"in\\":\\"path\\",\\"description\\":\\"ID of the order that needs to be deleted\\",\\"required\\":true,\\"schema\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\",\\"minimum\\":1}}],\\"responses\\":{\\"400\\":{\\"description\\":\\"Invalid ID supplied\\"},\\"404\\":{\\"description\\":\\"Order not found\\"}}}},\\"/user\\":{\\"post\\":{\\"tags\\":[\\"user\\"],\\"summary\\":\\"Create user\\",\\"description\\":\\"This can only be done by the logged in user.\\",\\"operationId\\":\\"createUser\\",\\"requestBody\\":{\\"content\\":{\\"application/json\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"username\\":{\\"type\\":\\"string\\"},\\"firstName\\":{\\"type\\":\\"string\\"},\\"lastName\\":{\\"type\\":\\"string\\"},\\"email\\":{\\"type\\":\\"string\\"},\\"password\\":{\\"type\\":\\"string\\"},\\"phone\\":{\\"type\\":\\"string\\"},\\"userStatus\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\",\\"description\\":\\"User Status\\"}},\\"xml\\":{\\"name\\":\\"User\\"}}}},\\"description\\":\\"Created user object\\",\\"required\\":true},\\"responses\\":{\\"default\\":{\\"description\\":\\"successful operation\\"}}}},\\"/user/createWithArray\\":{\\"post\\":{\\"tags\\":[\\"user\\"],\\"summary\\":\\"Creates list of users with given input array\\",\\"description\\":\\"\\",\\"operationId\\":\\"createUsersWithArrayInput\\",\\"requestBody\\":{\\"content\\":{\\"application/json\\":{\\"schema\\":{\\"type\\":\\"array\\",\\"items\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"username\\":{\\"type\\":\\"string\\"},\\"firstName\\":{\\"type\\":\\"string\\"},\\"lastName\\":{\\"type\\":\\"string\\"},\\"email\\":{\\"type\\":\\"string\\"},\\"password\\":{\\"type\\":\\"string\\"},\\"phone\\":{\\"type\\":\\"string\\"},\\"userStatus\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\",\\"description\\":\\"User Status\\"}},\\"xml\\":{\\"name\\":\\"User\\"}}}}},\\"description\\":\\"List of user object\\",\\"required\\":true},\\"responses\\":{\\"default\\":{\\"description\\":\\"successful operation\\"}}}},\\"/user/createWithList\\":{\\"post\\":{\\"tags\\":[\\"user\\"],\\"summary\\":\\"Creates list of users with given input array\\",\\"description\\":\\"\\",\\"operationId\\":\\"createUsersWithListInput\\",\\"requestBody\\":{\\"content\\":{\\"application/json\\":{\\"schema\\":{\\"type\\":\\"array\\",\\"items\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"username\\":{\\"type\\":\\"string\\"},\\"firstName\\":{\\"type\\":\\"string\\"},\\"lastName\\":{\\"type\\":\\"string\\"},\\"email\\":{\\"type\\":\\"string\\"},\\"password\\":{\\"type\\":\\"string\\"},\\"phone\\":{\\"type\\":\\"string\\"},\\"userStatus\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\",\\"description\\":\\"User Status\\"}},\\"xml\\":{\\"name\\":\\"User\\"}}}}},\\"description\\":\\"List of user object\\",\\"required\\":true},\\"responses\\":{\\"default\\":{\\"description\\":\\"successful operation\\"}}}},\\"/user/login\\":{\\"get\\":{\\"tags\\":[\\"user\\"],\\"summary\\":\\"Logs user into the system\\",\\"description\\":\\"\\",\\"operationId\\":\\"loginUser\\",\\"parameters\\":[{\\"name\\":\\"username\\",\\"in\\":\\"query\\",\\"description\\":\\"The user name for login\\",\\"required\\":true,\\"schema\\":{\\"type\\":\\"string\\"}},{\\"name\\":\\"password\\",\\"in\\":\\"query\\",\\"description\\":\\"The password for login in clear text\\",\\"required\\":true,\\"schema\\":{\\"type\\":\\"string\\"}}],\\"responses\\":{\\"200\\":{\\"description\\":\\"successful operation\\",\\"headers\\":{\\"X-Rate-Limit\\":{\\"description\\":\\"calls per hour allowed by the user\\",\\"schema\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\"}},\\"X-Expires-After\\":{\\"description\\":\\"date in UTC when token expires\\",\\"schema\\":{\\"type\\":\\"string\\",\\"format\\":\\"date-time\\"}}},\\"content\\":{\\"application/xml\\":{\\"schema\\":{\\"type\\":\\"string\\"}},\\"application/json\\":{\\"schema\\":{\\"type\\":\\"string\\"}}}},\\"400\\":{\\"description\\":\\"Invalid username/password supplied\\"}}}},\\"/user/logout\\":{\\"get\\":{\\"tags\\":[\\"user\\"],\\"summary\\":\\"Logs out current logged in user session\\",\\"description\\":\\"\\",\\"operationId\\":\\"logoutUser\\",\\"responses\\":{\\"default\\":{\\"description\\":\\"successful operation\\"}}}},\\"/user/{username}\\":{\\"get\\":{\\"tags\\":[\\"user\\"],\\"summary\\":\\"Get user by user name\\",\\"description\\":\\"\\",\\"operationId\\":\\"getUserByName\\",\\"parameters\\":[{\\"name\\":\\"username\\",\\"in\\":\\"path\\",\\"description\\":\\"The name that needs to be fetched. Use user1 for testing. \\",\\"required\\":true,\\"schema\\":{\\"type\\":\\"string\\"}}],\\"responses\\":{\\"200\\":{\\"description\\":\\"successful operation\\",\\"content\\":{\\"application/xml\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"username\\":{\\"type\\":\\"string\\"},\\"firstName\\":{\\"type\\":\\"string\\"},\\"lastName\\":{\\"type\\":\\"string\\"},\\"email\\":{\\"type\\":\\"string\\"},\\"password\\":{\\"type\\":\\"string\\"},\\"phone\\":{\\"type\\":\\"string\\"},\\"userStatus\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\",\\"description\\":\\"User Status\\"}},\\"xml\\":{\\"name\\":\\"User\\"}}},\\"application/json\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"username\\":{\\"type\\":\\"string\\"},\\"firstName\\":{\\"type\\":\\"string\\"},\\"lastName\\":{\\"type\\":\\"string\\"},\\"email\\":{\\"type\\":\\"string\\"},\\"password\\":{\\"type\\":\\"string\\"},\\"phone\\":{\\"type\\":\\"string\\"},\\"userStatus\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\",\\"description\\":\\"User Status\\"}},\\"xml\\":{\\"name\\":\\"User\\"}}}}},\\"400\\":{\\"description\\":\\"Invalid username supplied\\"},\\"404\\":{\\"description\\":\\"User not found\\"}}},\\"put\\":{\\"tags\\":[\\"user\\"],\\"summary\\":\\"Updated user\\",\\"description\\":\\"This can only be done by the logged in user.\\",\\"operationId\\":\\"updateUser\\",\\"parameters\\":[{\\"name\\":\\"username\\",\\"in\\":\\"path\\",\\"description\\":\\"name that need to be updated\\",\\"required\\":true,\\"schema\\":{\\"type\\":\\"string\\"}}],\\"requestBody\\":{\\"content\\":{\\"application/json\\":{\\"schema\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"username\\":{\\"type\\":\\"string\\"},\\"firstName\\":{\\"type\\":\\"string\\"},\\"lastName\\":{\\"type\\":\\"string\\"},\\"email\\":{\\"type\\":\\"string\\"},\\"password\\":{\\"type\\":\\"string\\"},\\"phone\\":{\\"type\\":\\"string\\"},\\"userStatus\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\",\\"description\\":\\"User Status\\"}},\\"xml\\":{\\"name\\":\\"User\\"}}}},\\"description\\":\\"Updated user object\\",\\"required\\":true},\\"responses\\":{\\"400\\":{\\"description\\":\\"Invalid user supplied\\"},\\"404\\":{\\"description\\":\\"User not found\\"}}},\\"delete\\":{\\"tags\\":[\\"user\\"],\\"summary\\":\\"Delete user\\",\\"description\\":\\"This can only be done by the logged in user.\\",\\"operationId\\":\\"deleteUser\\",\\"parameters\\":[{\\"name\\":\\"username\\",\\"in\\":\\"path\\",\\"description\\":\\"The name that needs to be deleted\\",\\"required\\":true,\\"schema\\":{\\"type\\":\\"string\\"}}],\\"responses\\":{\\"400\\":{\\"description\\":\\"Invalid username supplied\\"},\\"404\\":{\\"description\\":\\"User not found\\"}}}}},\\"components\\":{\\"requestBodies\\":{\\"UserArray\\":{\\"content\\":{\\"application/json\\":{\\"schema\\":{\\"type\\":\\"array\\",\\"items\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"username\\":{\\"type\\":\\"string\\"},\\"firstName\\":{\\"type\\":\\"string\\"},\\"lastName\\":{\\"type\\":\\"string\\"},\\"email\\":{\\"type\\":\\"string\\"},\\"password\\":{\\"type\\":\\"string\\"},\\"phone\\":{\\"type\\":\\"string\\"},\\"userStatus\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\",\\"description\\":\\"User Status\\"}},\\"xml\\":{\\"name\\":\\"User\\"}}}}},\\"description\\":\\"List of user object\\",\\"required\\":true}},\\"securitySchemes\\":{\\"petstore_auth\\":{\\"type\\":\\"oauth2\\",\\"flows\\":{\\"implicit\\":{\\"authorizationUrl\\":\\"http://petstore.swagger.io/oauth/dialog\\",\\"scopes\\":{\\"write:pets\\":\\"modify pets in your account\\",\\"read:pets\\":\\"read your pets\\"}}}},\\"api_key\\":{\\"type\\":\\"apiKey\\",\\"name\\":\\"api_key\\",\\"in\\":\\"header\\"}},\\"schemas\\":{\\"Order\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"petId\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"quantity\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\"},\\"shipDate\\":{\\"type\\":\\"string\\",\\"format\\":\\"date-time\\"},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"Order Status\\",\\"enum\\":[\\"placed\\",\\"approved\\",\\"delivered\\"]},\\"complete\\":{\\"type\\":\\"boolean\\",\\"default\\":false}},\\"xml\\":{\\"name\\":\\"Order\\"}},\\"Category\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Category\\"}},\\"User\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"username\\":{\\"type\\":\\"string\\"},\\"firstName\\":{\\"type\\":\\"string\\"},\\"lastName\\":{\\"type\\":\\"string\\"},\\"email\\":{\\"type\\":\\"string\\"},\\"password\\":{\\"type\\":\\"string\\"},\\"phone\\":{\\"type\\":\\"string\\"},\\"userStatus\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\",\\"description\\":\\"User Status\\"}},\\"xml\\":{\\"name\\":\\"User\\"}},\\"Tag\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Tag\\"}},\\"Pet\\":{\\"type\\":\\"object\\",\\"required\\":[\\"name\\",\\"photoUrls\\"],\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\",\\"default\\":40,\\"example\\":25},\\"category\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Category\\"}},\\"name\\":{\\"type\\":\\"string\\",\\"example\\":\\"doggie\\"},\\"photoUrls\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"photoUrl\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"string\\",\\"example\\":\\"https://example.com/photo.png\\"}},\\"tags\\":{\\"type\\":\\"array\\",\\"xml\\":{\\"name\\":\\"tag\\",\\"wrapped\\":true},\\"items\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"id\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int64\\"},\\"name\\":{\\"type\\":\\"string\\"}},\\"xml\\":{\\"name\\":\\"Tag\\"}}},\\"status\\":{\\"type\\":\\"string\\",\\"description\\":\\"pet status in the store\\",\\"enum\\":[\\"available\\",\\"pending\\",\\"sold\\"]}},\\"xml\\":{\\"name\\":\\"Pet\\"}},\\"ApiResponse\\":{\\"type\\":\\"object\\",\\"properties\\":{\\"code\\":{\\"type\\":\\"integer\\",\\"format\\":\\"int32\\"},\\"type\\":{\\"type\\":\\"string\\"},\\"message\\":{\\"type\\":\\"string\\"}}}}}}"`; +exports[`rdme openapi should bundle and upload the expected content 1`] = ` +Object { + "components": Object { + "securitySchemes": Object { + "api_key": Object { + "in": "header", + "name": "api_key", + "type": "apiKey", + }, + "petstore_auth": Object { + "flows": Object { + "implicit": Object { + "authorizationUrl": "http://petstore.swagger.io/oauth/dialog", + "scopes": Object { + "read:pets": "read your pets", + "write:pets": "modify pets in your account", + }, + }, + }, + "type": "oauth2", + }, + }, + }, + "info": Object { + "title": "Example petstore to demo our handling of external $ref pointers", + "version": "1.0.0", + }, + "openapi": "3.0.0", + "paths": Object { + "/pet": Object { + "post": Object { + "description": "", + "operationId": "addPet", + "requestBody": Object { + "content": Object { + "application/json": Object { + "schema": Object { + "properties": Object { + "category": Object { + "properties": Object { + "id": Object { + "format": "int64", + "type": "integer", + }, + "name": Object { + "type": "string", + }, + }, + "type": "object", + "xml": Object { + "name": "Category", + }, + }, + "id": Object { + "default": 40, + "example": 25, + "format": "int64", + "type": "integer", + }, + "name": Object { + "example": "doggie", + "type": "string", + }, + "photoUrls": Object { + "items": Object { + "example": "https://example.com/photo.png", + "type": "string", + }, + "type": "array", + "xml": Object { + "name": "photoUrl", + "wrapped": true, + }, + }, + "status": Object { + "description": "pet status in the store", + "enum": Array [ + "available", + "pending", + "sold", + ], + "type": "string", + }, + "tags": Object { + "items": Object { + "properties": Object { + "id": Object { + "format": "int64", + "type": "integer", + }, + "name": Object { + "type": "string", + }, + }, + "type": "object", + "xml": Object { + "name": "Tag", + }, + }, + "type": "array", + "xml": Object { + "name": "tag", + "wrapped": true, + }, + }, + }, + "required": Array [ + "name", + "photoUrls", + ], + "type": "object", + "xml": Object { + "name": "Pet", + }, + }, + }, + "application/xml": Object { + "schema": Object { + "properties": Object { + "category": Object { + "properties": Object { + "id": Object { + "format": "int64", + "type": "integer", + }, + "name": Object { + "type": "string", + }, + }, + "type": "object", + "xml": Object { + "name": "Category", + }, + }, + "id": Object { + "default": 40, + "example": 25, + "format": "int64", + "type": "integer", + }, + "name": Object { + "example": "doggie", + "type": "string", + }, + "photoUrls": Object { + "items": Object { + "example": "https://example.com/photo.png", + "type": "string", + }, + "type": "array", + "xml": Object { + "name": "photoUrl", + "wrapped": true, + }, + }, + "status": Object { + "description": "pet status in the store", + "enum": Array [ + "available", + "pending", + "sold", + ], + "type": "string", + }, + "tags": Object { + "items": Object { + "properties": Object { + "id": Object { + "format": "int64", + "type": "integer", + }, + "name": Object { + "type": "string", + }, + }, + "type": "object", + "xml": Object { + "name": "Tag", + }, + }, + "type": "array", + "xml": Object { + "name": "tag", + "wrapped": true, + }, + }, + }, + "required": Array [ + "name", + "photoUrls", + ], + "type": "object", + "xml": Object { + "name": "Pet", + }, + }, + }, + }, + "description": "Pet object that needs to be added to the store", + "required": true, + }, + "responses": Object { + "405": Object { + "description": "Invalid input", + }, + }, + "security": Array [ + Object { + "petstore_auth": Array [ + "write:pets", + "read:pets", + ], + }, + ], + "summary": "Add a new pet to the store", + "tags": Array [ + "pet", + ], + }, + "put": Object { + "description": "", + "operationId": "updatePet", + "requestBody": Object { + "content": Object { + "application/json": Object { + "schema": Object { + "properties": Object { + "category": Object { + "properties": Object { + "id": Object { + "format": "int64", + "type": "integer", + }, + "name": Object { + "type": "string", + }, + }, + "type": "object", + "xml": Object { + "name": "Category", + }, + }, + "id": Object { + "default": 40, + "example": 25, + "format": "int64", + "type": "integer", + }, + "name": Object { + "example": "doggie", + "type": "string", + }, + "photoUrls": Object { + "items": Object { + "example": "https://example.com/photo.png", + "type": "string", + }, + "type": "array", + "xml": Object { + "name": "photoUrl", + "wrapped": true, + }, + }, + "status": Object { + "description": "pet status in the store", + "enum": Array [ + "available", + "pending", + "sold", + ], + "type": "string", + }, + "tags": Object { + "items": Object { + "properties": Object { + "id": Object { + "format": "int64", + "type": "integer", + }, + "name": Object { + "type": "string", + }, + }, + "type": "object", + "xml": Object { + "name": "Tag", + }, + }, + "type": "array", + "xml": Object { + "name": "tag", + "wrapped": true, + }, + }, + }, + "required": Array [ + "name", + "photoUrls", + ], + "type": "object", + "xml": Object { + "name": "Pet", + }, + }, + }, + "application/xml": Object { + "schema": Object { + "properties": Object { + "category": Object { + "properties": Object { + "id": Object { + "format": "int64", + "type": "integer", + }, + "name": Object { + "type": "string", + }, + }, + "type": "object", + "xml": Object { + "name": "Category", + }, + }, + "id": Object { + "default": 40, + "example": 25, + "format": "int64", + "type": "integer", + }, + "name": Object { + "example": "doggie", + "type": "string", + }, + "photoUrls": Object { + "items": Object { + "example": "https://example.com/photo.png", + "type": "string", + }, + "type": "array", + "xml": Object { + "name": "photoUrl", + "wrapped": true, + }, + }, + "status": Object { + "description": "pet status in the store", + "enum": Array [ + "available", + "pending", + "sold", + ], + "type": "string", + }, + "tags": Object { + "items": Object { + "properties": Object { + "id": Object { + "format": "int64", + "type": "integer", + }, + "name": Object { + "type": "string", + }, + }, + "type": "object", + "xml": Object { + "name": "Tag", + }, + }, + "type": "array", + "xml": Object { + "name": "tag", + "wrapped": true, + }, + }, + }, + "required": Array [ + "name", + "photoUrls", + ], + "type": "object", + "xml": Object { + "name": "Pet", + }, + }, + }, + }, + "description": "Pet object that needs to be added to the store", + "required": true, + }, + "responses": Object { + "400": Object { + "description": "Invalid ID supplied", + }, + "404": Object { + "description": "Pet not found", + }, + "405": Object { + "description": "Validation exception", + }, + }, + "security": Array [ + Object { + "petstore_auth": Array [ + "write:pets", + "read:pets", + ], + }, + ], + "summary": "Update an existing pet", + "tags": Array [ + "pet", + ], + }, + }, + "/pet/{petId}": Object { + "get": Object { + "description": "Returns a single pet", + "operationId": "getPetById", + "parameters": Array [ + Object { + "description": "ID of pet to return", + "in": "path", + "name": "petId", + "required": true, + "schema": Object { + "format": "int64", + "type": "integer", + }, + }, + ], + "responses": Object { + "200": Object { + "content": Object { + "application/json": Object { + "schema": Object { + "properties": Object { + "category": Object { + "properties": Object { + "id": Object { + "format": "int64", + "type": "integer", + }, + "name": Object { + "type": "string", + }, + }, + "type": "object", + "xml": Object { + "name": "Category", + }, + }, + "id": Object { + "default": 40, + "example": 25, + "format": "int64", + "type": "integer", + }, + "name": Object { + "example": "doggie", + "type": "string", + }, + "photoUrls": Object { + "items": Object { + "example": "https://example.com/photo.png", + "type": "string", + }, + "type": "array", + "xml": Object { + "name": "photoUrl", + "wrapped": true, + }, + }, + "status": Object { + "description": "pet status in the store", + "enum": Array [ + "available", + "pending", + "sold", + ], + "type": "string", + }, + "tags": Object { + "items": Object { + "properties": Object { + "id": Object { + "format": "int64", + "type": "integer", + }, + "name": Object { + "type": "string", + }, + }, + "type": "object", + "xml": Object { + "name": "Tag", + }, + }, + "type": "array", + "xml": Object { + "name": "tag", + "wrapped": true, + }, + }, + }, + "required": Array [ + "name", + "photoUrls", + ], + "type": "object", + "xml": Object { + "name": "Pet", + }, + }, + }, + "application/xml": Object { + "schema": Object { + "properties": Object { + "category": Object { + "properties": Object { + "id": Object { + "format": "int64", + "type": "integer", + }, + "name": Object { + "type": "string", + }, + }, + "type": "object", + "xml": Object { + "name": "Category", + }, + }, + "id": Object { + "default": 40, + "example": 25, + "format": "int64", + "type": "integer", + }, + "name": Object { + "example": "doggie", + "type": "string", + }, + "photoUrls": Object { + "items": Object { + "example": "https://example.com/photo.png", + "type": "string", + }, + "type": "array", + "xml": Object { + "name": "photoUrl", + "wrapped": true, + }, + }, + "status": Object { + "description": "pet status in the store", + "enum": Array [ + "available", + "pending", + "sold", + ], + "type": "string", + }, + "tags": Object { + "items": Object { + "properties": Object { + "id": Object { + "format": "int64", + "type": "integer", + }, + "name": Object { + "type": "string", + }, + }, + "type": "object", + "xml": Object { + "name": "Tag", + }, + }, + "type": "array", + "xml": Object { + "name": "tag", + "wrapped": true, + }, + }, + }, + "required": Array [ + "name", + "photoUrls", + ], + "type": "object", + "xml": Object { + "name": "Pet", + }, + }, + }, + }, + "description": "successful operation", + }, + "400": Object { + "description": "Invalid ID supplied", + }, + "404": Object { + "description": "Pet not found", + }, + "default": Object { + "description": "successful response", + }, + }, + "security": Array [ + Object { + "api_key": Array [], + }, + ], + "summary": "Find pet by ID", + "tags": Array [ + "pet", + ], + }, + }, + }, + "servers": Array [ + Object { + "url": "http://petstore.swagger.io/v2", + }, + ], +} +`; diff --git a/__tests__/cmds/openapi.test.js b/__tests__/cmds/openapi.test.js index f6d651e6b..f170683ab 100644 --- a/__tests__/cmds/openapi.test.js +++ b/__tests__/cmds/openapi.test.js @@ -211,6 +211,8 @@ describe('rdme openapi', () => { .reply(200, { version: '1.0.0' }) .post('/api/v1/api-specification', body => { requestBody = body.substring(body.indexOf('{'), body.lastIndexOf('}') + 1); + requestBody = JSON.parse(requestBody); + return body.match('form-data; name="spec"'); }) .basicAuth({ user: key })