diff --git a/index.js b/index.js index a119828..1c2346a 100644 --- a/index.js +++ b/index.js @@ -94,9 +94,11 @@ _.forEach(endpointsParsed, function (endpointParsed, i) { //GENERATOR-------------------------------- */ let endpointsPostman = []; const endpoints = require('./src/generator/endpoints.js')(endpointsParsed); +const cloneDeep = _.cloneDeep; -_.forEach(endpoints, function (endpoint, i) { - for (let index = 0; index < endpoint.count; index++) { +_.forEach(endpoints, function (originalEndpoint, i) { + for (let index = 0; index < originalEndpoint.count; index++) { + let endpoint = cloneDeep(originalEndpoint); endpoint = require('./src/generator/testStatus.js')(endpoint); endpoint = require('./src/generator/testBody.js')(endpoint, configurationFile); endpoint = require('./src/generator/contentType.js')(endpoint); diff --git a/package.json b/package.json index b5e5eba..d8580b8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "openapi2postman", - "version": "2.2.4", + "version": "2.2.5", "description": "openapi2postman", "bin": { "o2p": "index.js" diff --git a/src/parser/openapi3/body.js b/src/parser/openapi3/body.js index effd3fb..fcff2e3 100644 --- a/src/parser/openapi3/body.js +++ b/src/parser/openapi3/body.js @@ -7,7 +7,8 @@ const _ = require('lodash') module.exports = function() { const MAX_DEPTH_LEVEL = 20; - + let seenSchemas = new WeakSet(); + return function get(verb, path, bodyResponse) { if (!_.isObject(global.definition.paths)) { require('../../utils/error.js')('paths is required') @@ -110,6 +111,17 @@ module.exports = function() { } function replaceAllOfs(schema){ + if (!_.isObject(schema)) return schema; + + // Detectar ciclos por identidad + if (seenSchemas.has(schema)) { + return { + type: "string", + description: "Circular schema avoided" + }; + } + seenSchemas.add(schema); + let result = {} for (let i in schema) { if (i === 'allOf' && _.isArray(schema[i])){ @@ -151,11 +163,11 @@ module.exports = function() { } result = _.merge(result, merged) } else if ( _.isArray(schema[i]) && i !== 'required') { - const arrayResult = [] - for (let k in schema[i]) { - arrayResult.push(replaceAllOfs(schema[i][k])) + if (schema[i].every(v => !_.isObject(v))) { + result[i] = [...schema[i]]; + } else { + result[i] = schema[i].map(item => replaceAllOfs(item)); } - result[i] = arrayResult } else if ( _.isObject(schema[i]) && i !== 'required') { // result.type = 'object'; result[i] = _.merge(result[i],replaceAllOfs(schema[i])) diff --git a/src/parser/openapi3/queryParams.js b/src/parser/openapi3/queryParams.js index a40dba6..afc529e 100644 --- a/src/parser/openapi3/queryParams.js +++ b/src/parser/openapi3/queryParams.js @@ -15,12 +15,13 @@ module.exports = function() { // parameters = replaceRefs(parameters); let queryParams = _.filter(parameters, ['in', 'query']) const result = [] - _.forEach(queryParams, function(queryParam) { + _.forEach(queryParams, function(queryParam) { + const param = queryParam.schema ? queryParam : getContentProperty(queryParam); result.push({ name: queryParam.name, - type: queryParam.schema.type, + type: param.schema.type, required : queryParam.required, - example: getExamples(queryParam) + example: getExamples(param) }); }); return result @@ -68,4 +69,11 @@ module.exports = function() { } } + function getContentProperty(query){ + const queryContent = query.content; + for (const key in queryContent) { + return queryContent[key]; + } + } + }() \ No newline at end of file diff --git a/src/parser/openapiAuthorizationDefinition.js b/src/parser/openapiAuthorizationDefinition.js index 1f54e44..73287fc 100644 --- a/src/parser/openapiAuthorizationDefinition.js +++ b/src/parser/openapiAuthorizationDefinition.js @@ -14,10 +14,11 @@ module.exports = function() { } const data = parseUrl(definition.flows) - return generateDefinition(data) + const authKey = _.keys(global.definition.security[0])[0] + return generateDefinition(data,authKey) } - function generateDefinition(data){ + function generateDefinition(data,auth){ const postmanCollection = { info: { _postman_id: "2e397e19-7819-4425-bbb8-e2b7283336a4", @@ -37,9 +38,9 @@ module.exports = function() { " pm.response.to.have.status(200);", "});", "", - "var json = JSON.parse(responseBody);", + "var json = pm.response.json();", "", - "pm.environment.set(\"OAuth2\", \"Bearer \"+json.data.access_token);" + `pm.environment.set(\"${auth}\", \"Bearer \"+json.data.access_token);` ], type: "text/javascript" } diff --git a/src/parser/swagger2/body.js b/src/parser/swagger2/body.js index dc5c1ad..a28544d 100644 --- a/src/parser/swagger2/body.js +++ b/src/parser/swagger2/body.js @@ -5,6 +5,9 @@ const _ = require('lodash'); module.exports = function() { + + let seenSchemas = new WeakSet(); + return function get(verb, path, bodyResponse) { if (!_.isObject(global.definition.paths)) { @@ -38,6 +41,18 @@ module.exports = function() { }; function replaceRefs(schema){ + + if (!_.isObject(schema)) return schema; + + // Detectar ciclos por identidad + if (seenSchemas.has(schema)) { + return { + type: "string", + description: "Circular schema avoided" + }; + } + seenSchemas.add(schema); + let result = {}; for (let i in schema) { if (i === '$ref'){ diff --git a/src/parser/swagger2/pathParameters.js b/src/parser/swagger2/pathParameters.js index e5c5407..6779acd 100644 --- a/src/parser/swagger2/pathParameters.js +++ b/src/parser/swagger2/pathParameters.js @@ -5,6 +5,7 @@ const _ = require('lodash'); module.exports = function() { + let seenSchemas = new WeakSet(); return function get(verb,path){ if (!_.isObject(global.definition.paths)) { @@ -23,6 +24,17 @@ module.exports = function() { } function replaceRefs(schema){ + if (!_.isObject(schema)) return schema; + + // Detectar ciclos por identidad + if (seenSchemas.has(schema)) { + return { + type: "string", + description: "Circular schema avoided" + }; + } + seenSchemas.add(schema); + let result = {}; for (let i in schema) { if (i === '$ref'){ diff --git a/src/swagger2json/array.js b/src/swagger2json/array.js index 44ad850..4416b39 100644 --- a/src/swagger2json/array.js +++ b/src/swagger2json/array.js @@ -10,8 +10,10 @@ module.exports = function() { if (!swagger.items){ require('../utils/error.js')('There is a array without items'); } + if(swagger.items.oneOf) delete swagger.items.oneOf; + if(swagger.items.anyOf) delete swagger.items.anyOf; if (!swagger.items.properties){ - swagger.items.properties = _.cloneDeep(swagger.items); + swagger.items.properties = _.cloneDeep(swagger.items); } if (!(swagger.items.properties.type && typeof swagger.items.properties.type === 'string')){ let keys = _.keys(swagger.items.properties); diff --git a/src/swagger2json/index.js b/src/swagger2json/index.js index e33cc2d..5d2e630 100644 --- a/src/swagger2json/index.js +++ b/src/swagger2json/index.js @@ -7,13 +7,22 @@ const _ = require('lodash'); module.exports = function() { return function get(swagger, name, parent,index){ +if (typeof swagger !== 'object' || swagger === null) { + swagger = { type: 'string' }; + } - if (!swagger.type && swagger.properties){ - swagger.type = 'object'; - } else if (swagger.oneOf) { - swagger.type = 'oneOf'; - } else if (swagger.anyOf) { - swagger.type = 'anyOf'; + if (!swagger.type) { + if (swagger.properties) { + swagger.type = 'object'; + } else if (swagger.items) { + swagger.type = 'array'; + } else if (swagger.oneOf) { + swagger.type = 'oneOf'; + } else if (swagger.anyOf) { + swagger.type = 'anyOf'; + } else { + swagger.type = 'string'; + } } let wrongParam = false; diff --git a/src/swagger2json/object.js b/src/swagger2json/object.js index dc15987..275e5e8 100644 --- a/src/swagger2json/object.js +++ b/src/swagger2json/object.js @@ -7,9 +7,9 @@ const _ = require('lodash'); module.exports = function() { return function get(swagger,parent){ - if (!swagger.properties){ - require('../utils/error.js')(`There is an object without properties: ${swagger}`); - } + + validationProperties(swagger); + let notInclude = false; if (parent && global.requiredParamsCatch && _.has(swagger, 'required')){ if(!global.configurationFile.minimal_endpoints){ @@ -35,6 +35,7 @@ module.exports = function() { } const object = {}; _.forEach(swagger.properties,function(property,name){ + if(!property.type) return object; if (notInclude === false || notInclude !== name){ let newParent = parent ? parent+'.'+name : undefined; object[name] = require('./index.js')(property,name,newParent); @@ -43,4 +44,13 @@ module.exports = function() { return object; }; + function validationProperties(swagger){ + if(!swagger.properties || Object.keys(swagger.properties).length === 0){ + if(swagger.additionalProperties && swagger.additionalProperties !== false){ + return {} + } + require('../utils/error.js')(`There is an object without properties: ${JSON.stringify(swagger)}`); + } + } + }() \ No newline at end of file