var expect = require('chai').expect, _ = require('lodash'), Utils = require('../../lib/util.js'), openApiErr = require('../../lib/error.js'); /* Utility function Unit tests */ describe('UTILITY FUNCTION TESTS ', function () { describe('safeSchemaFaker Function ', function() { it('should return result supports json-schema', function(done) { var schema = { anyOf: [{ '$ref': '#/components/schemas/schema1' }, { '$ref': '#/components/schemas/schema2' }] }, components = { schemas: { schema1: { anyOf: [{ '$ref': '#/components/schemas/schema3' }] }, schema2: { type: 'string' }, schema3: { $ref: '#/components/schemas/schema2' } } }; expect(Utils.safeSchemaFaker(schema, components)).to.equal(''); done(); }); it('should throw error ref not found', function(done) { var schema = { anyOf: [{ '$ref': '#/components/schemas/schema1' }, { '$ref': '#/components/schemas/schema2' }] }, components = { schemas: { schema1: { anyOf: [{ '$ref': '#/components/schemas/schema4' }, { '$ref': '#/components' } ] }, schema2: { type: 'string' }, schema4: { $ref: '#/components/schem2' } } }; expect(function() { Utils.safeSchemaFaker(schema, components); }).to.throw(openApiErr, 'Invalid schema reference: #/components/schem2'); done(); }); }); describe('convertToPmCollectionVariables function', function() { it('should convert serverVariables correctly', function () { var serverVariables = { 'v1': { 'default': 'v2.0', 'enum': ['v2.0', 'v2.1'], 'description': 'version number' } }, retVal = Utils.convertToPmCollectionVariables(serverVariables, null, null); expect(retVal).to.be.an('array'); expect(retVal[0].id).to.equal('v1'); expect(retVal[0].value).to.equal('v2.0'); }); it('should convert baseUrl correctly', function () { var serverVariables = { 'v1': { 'default': 'v2.0', 'enum': ['v2.0', 'v2.1'], 'description': 'version number' } }, keyName = 'baseUrl', baseUrl = 'hello.com', retVal = Utils.convertToPmCollectionVariables(serverVariables, keyName, baseUrl); expect(retVal).to.be.an('array'); expect(retVal[0].id).to.equal('v1'); expect(retVal[0].value).to.equal('v2.0'); expect(retVal[1].id).to.equal('baseUrl'); expect(retVal[1].value).to.equal('hello.com'); }); }); describe('getRequestParam', function () { it('should combine operationParams and pathParams', function() { var operationParams = [ { name: 'limit', in: 'query', description: 'hello operation' }, { name: 'variable', in: 'header', description: 'hello again' } ], pathParams = [ { name: 'limit', in: 'query', description: 'hello path' } ], retVal = Utils.getRequestParams(operationParams, pathParams); expect(retVal).to.be.an('array'); expect(retVal.length).to.equal(2); expect(retVal[0].name).to.equal('limit'); expect(retVal[0].description).to.equal('hello operation'); expect(retVal[1].name).to.equal('variable'); expect(retVal[1].description).to.equal('hello again'); }); }); describe('generateTrieFromPaths Function ', function() { it('should generate trie taking swagger specs as input', function(done) { var openapi = { 'openapi': '3.0.0', 'info': { 'version': '1.0.0', 'title': 'Swagger Petstore', 'license': { 'name': 'MIT' } }, 'servers': [ { 'url': 'http://petstore.swagger.io/{v1}' } ], 'paths': { '/pet': { 'get': { 'summary': 'List all pets', 'operationId': 'listPets', 'tags': [ 'pets' ], 'parameters': [ { 'name': 'variable', 'in': 'header', 'description': 'random variable', 'style': 'form', 'explode': false, 'schema': { 'type': 'array', 'items': { 'type': 'string' } } }, { 'name': 'variable2', 'in': 'query', 'description': 'another random variable', 'style': 'spaceDelimited', 'schema': { 'type': 'array', 'items': { 'type': 'integer', 'format': 'int64' } } } ], 'responses': { '200': { 'description': 'An paged array of pets', 'headers': { 'x-next': { 'description': 'A link to the next page of responses', 'schema': { 'type': 'string' } } }, 'content': { 'application/json': { 'schema': { '$ref': '#/components/schemas/Pets' } } } }, 'default': { 'description': 'unexpected error', 'content': { 'application/json': { 'schema': { '$ref': '#/components/schemas/Error' } } } } }, 'servers': [ { 'url': 'http://petstore3.swagger.io/{v3}', 'variables': { 'v3': { 'default': 'v6.0', 'enum': ['v4.0', 'v5.0', 'v6.0'], 'description': 'version number' } } } ] }, 'post': { 'tags': [ 'pets' ], 'requestBody': { '$ref': '#/components/requestBodies/body1' }, 'responses': { '201': { 'description': 'Null response' }, 'default': { 'description': 'unexpected error', 'headers': { 'X-Rate-Limit-Limit': { '$ref': '#/components/headers/header1' } }, 'content': { 'application/json': { 'schema': { '$ref': '#/components/schemas/Error' } } } } } }, 'servers': [ { 'url': 'http://petstore.swagger.io/{v2}', 'variables': { 'v2': { 'default': 'v3.0', 'enum': ['v2.0', 'v2.1', 'v2.2', 'v2.3'], 'description': 'version number' } } } ] }, '/pet/{petId}': { 'get': { 'operationId': 'showPetById', 'tags': [ 'pets' ], 'parameters': [ { 'name': 'petId', 'in': 'path', 'required': true, 'description': 'The id of the pet to retrieve', 'schema': { 'type': 'string' } } ], 'responses': { '200': { 'description': 'Expected response to a valid request', 'content': { 'application/json': { 'schema': { '$ref': '#/components/schemas/Pets' } } } }, 'default': { 'description': 'unexpected error', 'content': { 'application/json': { 'schema': { '$ref': '#/components/schemas/Error' } } } } } } } } }, output = Utils.generateTrieFromPaths(openapi), root = output.tree.root, collectionVariables = output.variables; expect(root.children).to.have.key('pet'); expect(root.children.pet.requestCount).to.equal(3); expect(root.children.pet.requests.length).to.equal(2); expect(root.children.pet.children).to.have.key('{petId}'); expect(root.children.pet.children['{petId}'].requestCount).to.equal(1); expect(collectionVariables).to.have.key('petUrl'); done(); }); }); describe('convertPathVariables', function() { it('should convert method variables', function() { var retVal = Utils.convertPathVariables( 'method', [], { v3: { default: 'v6.0', enum: ['v4.0', 'v5.0'], description: 'version number' } } ); expect(retVal).to.be.an('array'); expect(retVal[0].key).to.equal('v3'); expect(retVal[0].description).to.equal('version number (This can only be one of v4.0,v5.0)'); expect(retVal[0].value).to.equal('v6.0'); }); it('should convert root variables', function() { var retVal = Utils.convertPathVariables( 'root', [], { v3: { default: 'v6.0', enum: ['v4.0', 'v5.0'], description: 'version number' } } ); expect(retVal).to.be.an('array'); expect(retVal[0].key).to.equal('v3'); expect(retVal[0].description).to.equal('version number (This can only be one of v4.0,v5.0)'); expect(retVal[0].value).to.equal('{{v3}}'); }); it('should convert non-root/method variables', function() { Utils.options.schemaFaker = true; var retVal = Utils.convertPathVariables( 'not-root-or-method', [], [ { name: 'varName', description: 'varDesc', schema: { type: 'integer', format: 'int32' } } ] ); expect(retVal).to.be.an('array'); expect(retVal[0].key).to.equal('varName'); expect(retVal[0].description).to.equal('varDesc'); expect(retVal[0].value).to.equal(''); }); }); describe('convertToPmBodyData', function() { it('should work for schemas', function() { Utils.options.schemaFaker = true; var bodyWithSchema = { schema: { type: 'integer', format: 'int32' } }, retValSchema = Utils.convertToPmBodyData(bodyWithSchema, 'application/json'); expect(retValSchema).to.be.equal(''); }); it('should work for example', function() { Utils.options.schemaFaker = true; var bodyWithExample = { example: { value: 'This is a sample value' } }, retValExample = Utils.convertToPmBodyData(bodyWithExample, 'application/json'); expect(retValExample).to.equal('This is a sample value'); }); it('should work for examples', function() { Utils.options.schemaFaker = true; var bodyWithExamples = { examples: { foo: { value: { foo: 1, bar: 2 } } } }, retValExamples = Utils.convertToPmBodyData(bodyWithExamples, 'application/json'); expect(retValExamples.foo).to.equal(1); expect(retValExamples.bar).to.equal(2); }); }); describe('convertToPmHeader Function ', function() { it('Should convert header with schema to pm header', function (done) { var header = { name: 'X-Header-One', in: 'header', description: 'Header1', schema: { type: 'integer', format: 'int64' } }; Utils.options.schemaFaker = true; let pmHeader = Utils.convertToPmHeader(header); expect(pmHeader.key).to.equal(header.name); expect(pmHeader.description).to.equal(header.description); expect(typeof pmHeader.value).to.equal('string');// because schema v2.1.0 supports only string value. done(); }); it('Should convert header without schema to pm header', function (done) { var header = { name: 'X-Header-One', in: 'header', description: 'Header1' }; Utils.options.schemaFaker = true; let pmHeader = Utils.convertToPmHeader(header); expect(pmHeader.key).to.equal(header.name); expect(pmHeader.description).to.equal(header.description); expect(pmHeader.value).to.equal(''); done(); }); it('Should convert strings without extra quotes', function (done) { var header = { name: 'Authorization', in: 'header', description: 'Authorization', required: false, schema: { type: 'string', default: 'Bearer' } }; Utils.options.schemaFaker = true; let pmHeader = Utils.convertToPmHeader(header); expect(pmHeader.key).to.equal('Authorization'); expect(pmHeader.value).to.equal('Bearer'); // not \"Bearer\" done(); }); }); describe('getRefObject', function() { it('Should convert schemas where compnents have refs to other components', function (done) { Utils.components = { 'responses': { 'TooManyRequests': { 'description': '`Too Many Requests`\n', 'headers': { 'Retry-After': { '$ref': '#/components/responses/InternalError/headers/Retry-After' } } }, 'InternalError': { 'description': '`Internal Error`\n', 'headers': { 'Retry-After': { 'description': 'Some description', 'schema': { 'oneOf': [ { 'type': 'string', 'description': 'A date' } ] } } } } } }; // deref compnents more than 2 levels deep var resolvedObject = Utils.getRefObject('#/components/responses/InternalError/headers/Retry-After'); expect(resolvedObject.description).to.equal('Some description'); expect(resolvedObject.schema.oneOf.length).to.equal(1); done(); }); }); describe('convertParamsWithStyle', function () { it('should work for string params', function() { var params = { name: 'limit', in: 'query', description: 'How many items to return at one time (max 100)', schema: { type: 'string' } }, paramValue = '', retVal = Utils.convertParamsWithStyle(params, paramValue); expect(retVal).be.an('array').with.length(1); expect(retVal[0].description).to.equal(params.description); expect(retVal[0].key).to.equal(params.name); expect(retVal[0].value).to.equal(paramValue); }); it('should work for different styles of arrays', function() { var paramsExplode = { explode: true, style: 'form', name: 'arrayParam', in: 'query', schema: { type: 'array' } }, paramsSpace = { style: 'spaceDelimited', name: 'arrayParam', in: 'query', schema: { type: 'array' } }, paramsPipe = { style: 'pipeDelimited', name: 'arrayParam', in: 'query', schema: { type: 'array' } }, paramsDeep = { style: 'deepObject', name: 'arrayParam', in: 'query', schema: { type: 'array' } }, paramsForm = { style: 'form', name: 'arrayParam', in: 'query', schema: { type: 'array' } }, paramValue = ['1', '2'], retVal; retVal = Utils.convertParamsWithStyle(paramsExplode, paramValue); expect(retVal).be.an('array').with.length(2); expect(retVal[0].key).to.equal(paramsExplode.name); expect(retVal[0].value).to.equal(paramValue[0]); expect(retVal[1].key).to.equal(paramsExplode.name); expect(retVal[1].value).to.equal(paramValue[1]); retVal = Utils.convertParamsWithStyle(paramsSpace, paramValue); expect(retVal).be.an('array').with.length(1); expect(retVal[0].key).to.equal(paramsSpace.name); expect(retVal[0].value).to.equal('1 2'); retVal = Utils.convertParamsWithStyle(paramsPipe, paramValue); expect(retVal).be.an('array').with.length(1); expect(retVal[0].key).to.equal(paramsPipe.name); expect(retVal[0].value).to.equal('1|2'); retVal = Utils.convertParamsWithStyle(paramsDeep, paramValue); expect(retVal).be.an('array').with.length(2); expect(retVal[0].key).to.equal(paramsDeep.name + '[]'); expect(retVal[0].value).to.equal('1'); expect(retVal[1].key).to.equal(paramsDeep.name + '[]'); expect(retVal[1].value).to.equal('2'); retVal = Utils.convertParamsWithStyle(paramsForm, paramValue); expect(retVal).be.an('array').with.length(1); expect(retVal[0].key).to.equal(paramsForm.name); expect(retVal[0].value).to.equal('1,2'); }); it('should work for different styles of objects', function() { var paramsSpace = { style: 'spaceDelimited', name: 'arrayParam', in: 'query', schema: { type: 'object' } }, paramsPipe = { style: 'pipeDelimited', name: 'arrayParam', in: 'query', schema: { type: 'object' } }, paramsDeep = { style: 'deepObject', name: 'arrayParam', in: 'query', schema: { type: 'object' } }, paramsForm = { style: 'form', name: 'arrayParam', in: 'query', schema: { type: 'object' } }, paramValue = { a: 1, b: 2 }, retVal = Utils.convertParamsWithStyle(paramsSpace, paramValue); expect(retVal).be.an('array').with.length(1); expect(retVal[0].key).to.equal(paramsSpace.name); expect(retVal[0].value).to.equal('a%201%20b%202'); retVal = Utils.convertParamsWithStyle(paramsPipe, paramValue); expect(retVal).be.an('array').with.length(1); expect(retVal[0].key).to.equal(paramsPipe.name); expect(retVal[0].value).to.equal('a|1|b|2'); retVal = Utils.convertParamsWithStyle(paramsDeep, paramValue); expect(retVal).be.an('array').with.length(2); expect(retVal[0].key).to.equal(paramsDeep.name + '[a]'); expect(retVal[0].value).to.equal(1); expect(retVal[1].key).to.equal(paramsDeep.name + '[b]'); expect(retVal[1].value).to.equal(2); retVal = Utils.convertParamsWithStyle(paramsForm, paramValue); expect(retVal).be.an('array').with.length(1); expect(retVal[0].key).to.equal(paramsForm.name); expect(retVal[0].value).to.equal('a,1,b,2'); }); }); describe('convertToPmQueryParameters ', function() { it('Should convert undefined queryParam to pm param', function (done) { var param; let pmParam = Utils.convertToPmQueryParameters(param); expect(pmParam.length).to.equal(0); done(); }); it('Should convert queryParam without schema to pm param', function (done) { var param = { name: 'X-Header-One', in: 'query', description: 'query param' }; Utils.options.schemaFaker = true; let pmParam = Utils.convertToPmQueryParameters(param); expect(pmParam[0].key).to.equal(param.name); expect(pmParam[0].description).to.equal(param.description); expect(pmParam[0].value).to.equal(''); done(); }); describe('Should convert queryParam with schema {type:array, ', function() { describe('style:form, ', function() { it('explode:true} to pm param', function (done) { var param = { name: 'X-Header-One', in: 'query', description: 'query param', style: 'form', explode: true, schema: { type: 'array', items: { type: 'integer', format: 'int64' } } }; Utils.options.schemaFaker = true; let pmParam = Utils.convertToPmQueryParameters(param); expect(pmParam[0].key).to.equal(param.name); expect(pmParam[0].description).to.equal(param.description); expect(pmParam[0].value).to.equal(''); done(); }); it('explode:false} to pm param', function (done) { var param = { name: 'X-Header-One', in: 'query', description: 'query param', style: 'form', explode: false, schema: { type: 'array', items: { type: 'integer', format: 'int64' } } }; Utils.options.schemaFaker = true; let pmParam = Utils.convertToPmQueryParameters(param); expect(pmParam[0].key).to.equal(param.name); expect(pmParam[0].description).to.equal(param.description); expect(pmParam[0].value).to.have.string(','); done(); }); }); it('style:spaceDelimited} to pm param', function (done) { var param = { name: 'X-Header-One', in: 'query', description: 'query param', style: 'spaceDelimited', schema: { type: 'array', items: { type: 'string' } } }; Utils.options.schemaFaker = true; let pmParam = Utils.convertToPmQueryParameters(param); expect(pmParam[0].key).to.equal(param.name); expect(pmParam[0].description).to.equal(param.description); expect(pmParam[0].value).to.have.string(' '); done(); }); it('style:pipeDelimited} to pm param', function (done) { var param = { name: 'X-Header-One', in: 'query', description: 'query param', style: 'pipeDelimited', schema: { type: 'array', items: { type: 'string' } } }; Utils.options.schemaFaker = true; let pmParam = Utils.convertToPmQueryParameters(param); expect(pmParam[0].key).to.equal(param.name); expect(pmParam[0].description).to.equal(param.description); expect(pmParam[0].value).to.have.string('|'); done(); }); it('style:deepObject} to pm param', function (done) { var param = { name: 'X-Header-One', in: 'query', description: 'query param', style: 'deepObject', schema: { type: 'array', maxItems: 2, minItems: 2, items: { type: 'string' } } }; Utils.options.schemaFaker = true; let pmParam = Utils.convertToPmQueryParameters(param); expect(pmParam[0].key).to.equal(param.name + '[]'); expect(pmParam[0].description).to.equal(param.description); done(); }); it('style:any other} to pm param', function (done) { var param = { name: 'X-Header-One', in: 'query', description: 'query param', schema: { type: 'array', items: { type: 'string' } } }; Utils.options.schemaFaker = true; let pmParam = Utils.convertToPmQueryParameters(param); expect(pmParam[0].key).to.equal(param.name); expect(pmParam[0].description).to.equal(param.description); expect(pmParam[0].value).to.have.string(','); done(); }); }); describe('Should convert queryParam with schema {type:object, ', function() { describe('style:form, ', function() { it('explode:true} to pm param', function (done) { var param = { name: 'X-Header-One', in: 'query', description: 'query param', style: 'form', explode: true, schema: { type: 'object', required: [ 'id', 'name' ], properties: { id: { type: 'integer', format: 'int64' }, name: { type: 'string' } } } }; Utils.options.schemaFaker = true; let pmParam = Utils.convertToPmQueryParameters(param); expect(pmParam[0].key).to.equal('id'); expect(pmParam[1].key).to.equal('name'); expect(pmParam[0].description).to.equal(param.description); expect(pmParam[1].description).to.equal(param.description); expect(pmParam[0].value).to.equal(''); expect(pmParam[1].value).to.equal(''); done(); }); it('explode:false} to pm param ', function (done) { var param = { name: 'X-Header-One', in: 'query', description: 'query param', style: 'form', explode: false, schema: { type: 'object', required: [ 'id', 'name' ], properties: { id: { type: 'integer', format: 'int64' }, name: { type: 'string' } } } }; Utils.options.schemaFaker = true; let pmParam = Utils.convertToPmQueryParameters(param); expect(pmParam[0].key).to.equal(param.name); expect(pmParam[0].description).to.equal(param.description); expect(pmParam[0].value).to.have.string('id'); expect(pmParam[0].value).to.have.string('name'); done(); }); }); it('style:spaceDelimited} to pm param', function (done) { var param = { name: 'X-Header-One', in: 'query', description: 'query param', style: 'spaceDelimited', schema: { type: 'object', required: [ 'id', 'name' ], properties: { id: { type: 'integer', format: 'int64' }, name: { type: 'integer', format: 'int64' } } } }; Utils.options.schemaFaker = true; let pmParam = Utils.convertToPmQueryParameters(param); expect(pmParam[0].key).to.equal(param.name); expect(pmParam[0].description).to.equal(param.description); expect(pmParam[0].value).to.have.string('%20'); done(); }); it('style:pipeDelimited} to pm param', function (done) { var param = { name: 'X-Header-One', in: 'query', description: 'query param', style: 'pipeDelimited', schema: { type: 'object', required: [ 'id', 'name' ], properties: { id: { type: 'integer', format: 'int64' }, name: { type: 'integer', format: 'int64' } } } }; Utils.options.schemaFaker = true; let pmParam = Utils.convertToPmQueryParameters(param); expect(pmParam[0].key).to.equal(param.name); expect(pmParam[0].description).to.equal(param.description); expect(pmParam[0].value).to.have.string('|'); done(); }); it('style:deepObject} to pm param', function (done) { var param = { name: 'X-Header-One', in: 'query', description: 'query param', style: 'deepObject', schema: { type: 'object', required: [ 'id', 'name' ], properties: { id: { type: 'integer', format: 'int64' }, name: { type: 'string' } } } }; Utils.options.schemaFaker = true; let pmParam = Utils.convertToPmQueryParameters(param); expect(pmParam[0].key).to.equal(param.name + '[id]'); expect(pmParam[1].key).to.equal(param.name + '[name]'); expect(pmParam[0].description).to.equal(param.description); expect(pmParam[1].description).to.equal(param.description); expect(pmParam[0].value).to.equal(''); expect(pmParam[1].value).to.equal(''); done(); }); it('style:any other} to pm param', function (done) { var param = { name: 'X-Header-One', in: 'query', description: 'query param', schema: { type: 'object', required: [ 'id', 'name' ], properties: { id: { type: 'integer', format: 'int64' }, name: { type: 'string' } } } }; Utils.options.schemaFaker = true; let pmParam = Utils.convertToPmQueryParameters(param); expect(pmParam[0].key).to.equal(param.name); expect(pmParam[0].description).to.equal(param.description); expect(typeof pmParam[0].value).to.equal('object'); done(); }); }); }); describe('getQueryStringWithStyle function', function () { it('Should correctly return the query string with the appropriate delimiter', function (done) { var param = { name: 'tuhin', age: 22, occupation: 'student' }; expect(Utils.getQueryStringWithStyle(param, '%20')).to.equal('name%20tuhin%20age%2022%20occupation%20student'); expect(Utils.getQueryStringWithStyle(param, '|')).to.equal('name|tuhin|age|22|occupation|student'); expect(Utils.getQueryStringWithStyle(param, ',')).to.equal('name,tuhin,age,22,occupation,student'); done(); }); it('Should add the delimiter if the value is undefined', function (done) { var param = { name: 'tuhin', age: undefined, occupation: 'student' }; expect(Utils.getQueryStringWithStyle(param, '%20')).to.equal('name%20tuhin%20age%20occupation%20student'); expect(Utils.getQueryStringWithStyle(param, '|')).to.equal('name|tuhin|age|occupation|student'); expect(Utils.getQueryStringWithStyle(param, ',')).to.equal('name,tuhin,age,occupation,student'); done(); }); }); describe('insertSpacesInName function', function() { it('should insert spaces in snake/camelCase strings correctly', function (done) { var stringMaps = { 'myNameIsRed': 'my Name Is Red', 'my_nameIs_red': 'my name Is red', 'my_name__is_red': 'my name is red', 'NASAMission': 'NASA Mission' }; _.forOwn(stringMaps, (value, key) => { expect(Utils.insertSpacesInName(key)).to.equal(value); }); done(); }); it('should work for wrong inputs', function (done) { var stringMaps = [ false, null, [] ]; _.forEach(stringMaps, (value) => { expect(Utils.insertSpacesInName(value)).to.equal(''); }); done(); }); }); describe('convertToPmBody function', function() { describe('should convert requestbody of media type', function() { it(' application/json', function(done) { var requestBody = { description: 'body description', content: { 'application/json': { 'schema': { type: 'object', required: [ 'id', 'name' ], properties: { id: { type: 'integer', format: 'int64' }, name: { type: 'string' }, neglect: { // this will be neglected since schemaFaker does not process type: 'string', format: 'binary' } } } } } }, result, resultBody; Utils.options.schemaFaker = true; result = Utils.convertToPmBody(requestBody); resultBody = JSON.parse(result.body.raw); expect(resultBody.id).to.equal(''); expect(resultBody.name).to.equal(''); expect(result.contentHeader).to.deep.include({ key: 'Content-Type', value: 'application/json' }); done(); }); it(' application/x-www-form-urlencoded', function(done) { var requestBody = { description: 'body description', content: { 'application/x-www-form-urlencoded': { examples: '' } } }, result, resultBody; Utils.options.schemaFaker = true; result = Utils.convertToPmBody(requestBody); resultBody = (result.body.urlencoded.toJSON()); expect(resultBody).to.eql([]); expect(result.contentHeader).to.deep.include( { key: 'Content-Type', value: 'application/x-www-form-urlencoded' }); done(); }); it(' multipart/form-data', function(done) { var requestBody = { description: 'body description', content: { 'multipart/form-data': { schema: { type: 'object', properties: { file: { type: 'array', items: { type: 'string' } } }, required: ['file'] } } } }, result, resultBody; Utils.options.schemaFaker = true; result = Utils.convertToPmBody(requestBody); resultBody = (result.body.formdata.toJSON()); expect(resultBody[0].key).to.equal('file'); expect(result.contentHeader).to.deep.include( { key: 'Content-Type', value: 'multipart/form-data' }); done(); }); it(' text/xml', function(done) { // not properly done var requestBody = { description: 'body description', content: { 'text/xml': { examples: { xml: { summary: 'A list containing two items', value: 'text/plain description' } } } } }, result, resultBody; Utils.options.schemaFaker = true; result = Utils.convertToPmBody(requestBody); resultBody = (result.body.raw); expect(resultBody).to.equal('"text/plain description"'); expect(result.contentHeader).to.deep.include( { key: 'Content-Type', value: 'text/xml' }); done(); }); it(' text/plain', function(done) { var requestBody = { description: 'body description', content: { 'text/plain': { example: { summary: 'A list containing two items', value: 'text/plain description' } } } }, result, resultBody; Utils.options.schemaFaker = true; result = Utils.convertToPmBody(requestBody); resultBody = result.body.raw; expect(resultBody).to.equal('"text/plain description"'); expect(result.contentHeader).to.deep.include( { key: 'Content-Type', value: 'text/plain' }); done(); }); it(' text/html', function(done) { var requestBody = { description: 'body description', content: { 'text/html': { example: { summary: 'A list containing two items', value: '
  • item 1
  • item 2
' } } } }, result, resultBody; Utils.options.schemaFaker = true; result = Utils.convertToPmBody(requestBody); resultBody = (result.body.raw); expect(resultBody).to.equal('"
  • item 1
  • item 2
"'); expect(result.contentHeader).to.deep.include( { key: 'Content-Type', value: 'text/html' }); done(); }); it(' application/javascript', function(done) { // not properly done var requestBody = { description: 'body description', content: { 'application/javascript': { } } }, result, resultBody; Utils.options.schemaFaker = true; result = Utils.convertToPmBody(requestBody); resultBody = (result.body.raw); expect(typeof resultBody).to.equal('string'); expect(result.contentHeader).to.deep.include( { key: 'Content-Type', value: 'application/javascript' }); done(); }); // things remaining : application/xml }); }); describe('convertToPmResponseBody function', function() { describe('should convert content object to response body data', function() { it('with undefined ContentObj', function() { var contentObj, pmResponseBody; pmResponseBody = Utils.convertToPmResponseBody(contentObj).responseBody; expect(pmResponseBody).to.equal(''); }); it('with Content-Type application/json', function() { var contentObj = { 'application/json': { 'schema': { 'type': 'object', 'required': [ 'id', 'name' ], 'properties': { id: { type: 'integer', format: 'int64' }, name: { type: 'string' } } } } }, pmResponseBody; Utils.options.schemaFaker = true; pmResponseBody = JSON.parse(Utils.convertToPmResponseBody(contentObj).responseBody); expect(pmResponseBody.id).to.equal(''); expect(pmResponseBody.name).to.equal(''); }); it('with Content-Type application/vnd.api+json', function() { var contentObj = { 'application/vnd.api+json': { 'schema': { 'type': 'object', 'required': [ 'id', 'name' ], 'properties': { id: { type: 'integer', format: 'int64' }, name: { type: 'string' } } } } }, pmResponseBody; Utils.options.schemaFaker = true; pmResponseBody = JSON.parse(Utils.convertToPmResponseBody(contentObj).responseBody); expect(pmResponseBody.id).to.equal(''); expect(pmResponseBody.name).to.equal(''); }); it('with Content-Type application/json and specified indentCharacter', function() { var contentObj = { 'application/json': { 'schema': { 'type': 'object', 'properties': { id: { type: 'integer' } } } } }, pmResponseBody; Utils.options.schemaFaker = true; Utils.options.indentCharacter = '\t'; pmResponseBody = Utils.convertToPmResponseBody(contentObj).responseBody; expect(pmResponseBody).to.equal('{\n\t"id": ""\n}'); }); it('with Content-Type text/plain', function() { var contentObj = { 'text/plain': { 'schema': { 'type': 'string' } } }, pmResponseBody; Utils.options.schemaFaker = true; pmResponseBody = Utils.convertToPmResponseBody(contentObj).responseBody; expect(typeof pmResponseBody).to.equal('string'); }); it('with Content-Type application/xml', function() { var contentObj = { 'application/xml': { 'schema': { 'type': 'object', 'properties': { 'id': { 'type': 'integer', 'format': 'int32', 'xml': { 'attribute': true } }, 'name': { 'type': 'string', 'xml': { 'namespace': 'http://example.com/schema/sample', 'prefix': 'sample' } }, 'hobbies': { 'type': 'array', 'items': { 'type': 'string' }, 'xml': { 'wrapped': true } }, 'pets': { 'type': 'array', 'items': { 'type': 'string' } } }, 'xml': { 'name': 'Person' } } } }, pmResponseBody; Utils.options.schemaFaker = true; Utils.options.indentCharacter = ' '; pmResponseBody = Utils.convertToPmResponseBody(contentObj).responseBody; expect(pmResponseBody).to.equal( [ '', ' (string)', ' ', ' (string)', ' (string)', ' ', ' (string)', ' (string)', '' ].join('\n')); }); it('with Content-Type application/javascript', function() { var contentObj = { 'application/javascript': { } }, pmResponseBody; Utils.options.schemaFaker = true; pmResponseBody = Utils.convertToPmResponseBody(contentObj).responseBody; expect(typeof pmResponseBody).to.equal('string'); }); it('with Content-Type unsupported', function() { var contentObj = { 'application/vnd.api+json+unsupported': { 'schema': { 'type': 'object', 'required': [ 'id', 'name' ], 'properties': { id: { type: 'integer', format: 'int64' }, name: { type: 'string' } } } } }, pmResponseBody; Utils.options.schemaFaker = true; pmResponseBody = Utils.convertToPmResponseBody(contentObj).responseBody; expect(pmResponseBody).to.equal(''); }); // things remaining application/xml, application/javascript }); }); describe('convertToPmResponse function', function() { it('should convert response with JSON content field', function(done) { var response = { 'description': 'A list of pets.', 'content': { 'application/json': { 'schema': { 'type': 'object', 'required': [ 'id', 'name' ], 'properties': { id: { type: 'integer', format: 'int64' }, name: { type: 'string' } } } } } }, code = '20X', pmResponse, responseBody; Utils.options.schemaFaker = true; pmResponse = Utils.convertToPmResponse(response, code).toJSON(); responseBody = JSON.parse(pmResponse.body); expect(pmResponse.name).to.equal(response.description); expect(pmResponse.code).to.equal(200); expect(pmResponse._postman_previewlanguage).to.equal('json'); expect(pmResponse.header).to.deep.include({ 'key': 'Content-Type', 'value': 'application/json' }); expect(responseBody.id).to.equal(''); expect(responseBody.name).to.equal(''); done(); }); it('should convert response with XML content field', function(done) { var response = { 'description': 'A list of pets.', 'content': { 'application/xml': { 'schema': { 'type': 'object', 'required': [ 'id', 'name' ], 'properties': { id: { type: 'integer', format: 'int64' }, name: { type: 'string' } } } } } }, code = '20X', pmResponse; Utils.options.schemaFaker = true; pmResponse = Utils.convertToPmResponse(response, code).toJSON(); expect(pmResponse.body).to.equal('\n (integer)\n (string)\n'); expect(pmResponse.name).to.equal(response.description); expect(pmResponse.code).to.equal(200); expect(pmResponse._postman_previewlanguage).to.equal('xml'); expect(pmResponse.header).to.deep.include({ 'key': 'Content-Type', 'value': 'application/xml' }); done(); }); it('sholud convert response without content field', function(done) { var response = { 'description': 'A list of pets.' }, code = '201', pmResponse; Utils.options.schemaFaker = true; pmResponse = Utils.convertToPmResponse(response, code).toJSON(); expect(pmResponse.name).to.equal(response.description); expect(pmResponse.code).to.equal(201); expect(pmResponse.body).to.equal(''); expect(pmResponse.header).to.deep.include({ 'key': 'Content-Type', 'value': 'text/plain' }); done(); }); it('should convert headers with refs', function(done) { Utils.components = { 'responses': { 'TooManyRequests': { 'description': '`Too Many Requests`\n', 'headers': { 'Retry-After': { '$ref': '#/components/responses/InternalError/headers/Retry-After' } } }, 'InternalError': { 'description': '`Internal Error`\n', 'headers': { 'Retry-After': { 'description': 'Some description', 'schema': { 'oneOf': [ { 'type': 'string', 'description': 'A date' } ] } } } } } }; var response = { 'description': '`Too Many Requests`\\n', 'headers': { 'Retry-After': { '$ref': '#/components/responses/InternalError/headers/Retry-After' } } }, code = '200', pmResponse = Utils.convertToPmResponse(response, code, null); expect(pmResponse.headers.members[0].key).to.equal('Retry-After'); expect(pmResponse.headers.members[0].description).to.equal('Some description'); done(); }); }); describe('fixPathVariablesInUrl function', function() { it('should convert a url with scheme and path variables', function(done) { var convertedUrl = Utils.fixPathVariablesInUrl('{scheme}://developer.uspto.gov/{path0}/segment/{path1}'); expect(convertedUrl).to.equal('{{scheme}}://developer.uspto.gov/{{path0}}/segment/{{path1}}'); expect(Utils.fixPathVariablesInUrl('{{a}}')).to.equal('{{a}}'); expect(Utils.fixPathVariablesInUrl('{{a}}://{b}.com/{pathvar}/{morevar}')) .to.equal('{{a}}://{{b}}.com/{{pathvar}}/{{morevar}}'); expect(Utils.fixPathVariablesInUrl('{protocol}://{host}:{port}/{contextpath}/{restapi}')) .to.equal('{{protocol}}://{{host}}:{{port}}/{{contextpath}}/{{restapi}}'); done(); }); }); });