UNPKG

@apideck/portman

Version:

Port OpenAPI Spec to Postman Collection, with contract & variation tests included

200 lines 12.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.VariationWriter = void 0; var tslib_1 = require("tslib"); var postman_collection_1 = require("postman-collection"); var types_1 = require("../types"); var Fuzzer_1 = require("./Fuzzer"); var openapi_format_1 = require("openapi-format"); var utils_1 = require("../utils"); var VariationWriter = (function () { function VariationWriter(options) { var testSuite = options.testSuite, variationFolderName = options.variationFolderName; this.testSuite = testSuite; this.operationFolders = {}; this.overwriteMap = {}; this.variationCollection = new postman_collection_1.Collection(); this.variationFolder = new postman_collection_1.ItemGroup({ name: variationFolderName }); } VariationWriter.prototype.add = function (pmOperation, oaOperation, variation, name) { var _this = this; var variations = (variation === null || variation === void 0 ? void 0 : variation.variations) || []; var variationMeta = tslib_1.__rest(variation, []); this.fuzzer = new Fuzzer_1.Fuzzer({ testSuite: this.testSuite, variationWriter: this }); variations.map(function (variation) { var _a; var folderId = pmOperation.getParentFolderId(); var folderName = pmOperation.getParentFolderName(); var baseName = name || "".concat(pmOperation.item.name, "[").concat(variation.name, "]"); var targetOaRequest = variation === null || variation === void 0 ? void 0 : variation.openApiRequest; if (!targetOaRequest && (variationMeta === null || variationMeta === void 0 ? void 0 : variationMeta.openApiRequest)) { targetOaRequest = variationMeta.openApiRequest; } var reqInfo = (0, utils_1.parseOpenApiRequest)(targetOaRequest); var reqContentTypes = []; if ((reqInfo === null || reqInfo === void 0 ? void 0 : reqInfo.contentType) && reqInfo.contentType.includes('*') && ((_a = oaOperation === null || oaOperation === void 0 ? void 0 : oaOperation.schema) === null || _a === void 0 ? void 0 : _a.requestBody)) { var reqObj = oaOperation.schema.requestBody; if (reqObj === null || reqObj === void 0 ? void 0 : reqObj.content) { reqContentTypes = Object.keys(reqObj.content).filter(function (ct) { return (0, utils_1.matchWildcard)(ct, reqInfo.contentType); }); } } if (reqContentTypes.length === 0) { reqContentTypes = [reqInfo === null || reqInfo === void 0 ? void 0 : reqInfo.contentType]; } var targetOaResponse = variation === null || variation === void 0 ? void 0 : variation.openApiResponse; if (!targetOaResponse && (variationMeta === null || variationMeta === void 0 ? void 0 : variationMeta.openApiResponse)) { targetOaResponse = variationMeta.openApiResponse; } var respInfo = (0, utils_1.parseOpenApiResponse)(targetOaResponse); var respCodes = []; if ((respInfo === null || respInfo === void 0 ? void 0 : respInfo.code) && respInfo.code.includes('*') && oaOperation) { respCodes = oaOperation.responseCodes.filter(function (code) { return (0, utils_1.matchWildcard)(code, respInfo.code); }); } if (respCodes.length === 0) { respCodes = [respInfo === null || respInfo === void 0 ? void 0 : respInfo.code]; } respCodes.forEach(function (code) { var _a, _b; var respContentTypes = []; if ((respInfo === null || respInfo === void 0 ? void 0 : respInfo.contentType) && respInfo.contentType.includes('*') && ((_b = (_a = oaOperation === null || oaOperation === void 0 ? void 0 : oaOperation.schema) === null || _a === void 0 ? void 0 : _a.responses) === null || _b === void 0 ? void 0 : _b[code])) { var respObj = oaOperation.schema.responses[code]; if (respObj === null || respObj === void 0 ? void 0 : respObj.content) { respContentTypes = Object.keys(respObj.content).filter(function (ct) { return (0, utils_1.matchWildcard)(ct, respInfo.contentType); }); } } if (respContentTypes.length === 0) { respContentTypes = [respInfo === null || respInfo === void 0 ? void 0 : respInfo.contentType]; } reqContentTypes.forEach(function (reqCt) { respContentTypes.forEach(function (ct) { var codeSuffix = code && respCodes.length > 1 ? "[".concat(code, "]") : ''; var reqSuffix = reqCt && reqContentTypes.length > 1 ? "[".concat(reqCt, "]") : ''; var respSuffix = ct && respContentTypes.length > 1 ? "[".concat(ct, "]") : ''; var variationName = "".concat(baseName).concat(codeSuffix).concat(reqSuffix).concat(respSuffix); var fuzzingSet = variation.fuzzing; var updatedVariation = tslib_1.__assign(tslib_1.__assign({}, variation), { openApiRequest: reqCt || variation.openApiRequest, openApiResponse: respInfo ? "".concat(code).concat(ct ? "::".concat(ct) : '') : variation.openApiResponse, name: "".concat(variation.name).concat(codeSuffix).concat(reqSuffix).concat(respSuffix) }); if (fuzzingSet) { _this.fuzzer = new Fuzzer_1.Fuzzer({ testSuite: _this.testSuite, variationWriter: _this }); _this.fuzzer.injectFuzzRequestBodyVariations(pmOperation, oaOperation, updatedVariation, variationMeta); _this.fuzzer.injectFuzzRequestQueryParamsVariations(pmOperation, oaOperation, updatedVariation, variationMeta); _this.fuzzer.injectFuzzRequestHeadersVariations(pmOperation, oaOperation, updatedVariation, variationMeta); _this.fuzzer.fuzzVariations.map(function (operationVariation) { _this.addToLocalCollection(operationVariation, folderId, folderName); }); } else { var operationVariation = pmOperation.clone({ newId: (0, openapi_format_1.changeCase)(variationName, 'camelCase'), name: variationName }); _this.testSuite.registerOperationTestType(operationVariation, types_1.PortmanTestTypes.variation); _this.injectVariations(operationVariation, oaOperation, updatedVariation, variationMeta); _this.addToLocalCollection(operationVariation, folderId, folderName); } }); }); }); }); }; VariationWriter.prototype.mergeToCollection = function (collection) { var _this = this; this.variationCollection.items.map(function (item) { _this.variationFolder.items.add(item); }); collection.items.add(this.variationFolder); return collection; }; VariationWriter.prototype.addToLocalCollection = function (operationVariation, folderId, folderName) { var target; if (folderId) { if (this.operationFolders[folderId]) { target = this.variationCollection.items.one(this.operationFolders[folderId]); } else { var newFolder = new postman_collection_1.ItemGroup({ name: "".concat(folderName, " Variations") || 'Variations' }); this.variationCollection.items.add(newFolder); this.operationFolders[folderId] = newFolder.id; target = newFolder; } } else { target = this.variationCollection; } target.items.add(operationVariation.item); }; VariationWriter.prototype.addToFolder = function (operationVariation, folder) { folder.items.add(operationVariation.item); }; VariationWriter.prototype.injectVariations = function (pmOperation, oaOperation, variation, variationMeta) { var _a; var overwrites = variation.overwrites, tests = variation.tests, assignVariables = variation.assignVariables, operationPreRequestScripts = variation.operationPreRequestScripts; var targetOaRequest = variation === null || variation === void 0 ? void 0 : variation.openApiRequest; if (!targetOaRequest && (variationMeta === null || variationMeta === void 0 ? void 0 : variationMeta.openApiRequest)) { targetOaRequest = variationMeta.openApiRequest; } var reqInfo = (0, utils_1.parseOpenApiRequest)(targetOaRequest); var targetOaResponse = variation === null || variation === void 0 ? void 0 : variation.openApiResponse; if (!targetOaResponse && (variationMeta === null || variationMeta === void 0 ? void 0 : variationMeta.openApiResponse)) { targetOaResponse = variationMeta.openApiResponse; } var respInfo = (0, utils_1.parseOpenApiResponse)(targetOaResponse); if (respInfo === null || respInfo === void 0 ? void 0 : respInfo.contentType) { pmOperation.item.request.upsertHeader({ key: 'Accept', value: respInfo.contentType }); } if (reqInfo === null || reqInfo === void 0 ? void 0 : reqInfo.contentType) { pmOperation.item.request.upsertHeader({ key: 'Content-Type', value: reqInfo.contentType }); var reqBodyObj = (_a = oaOperation === null || oaOperation === void 0 ? void 0 : oaOperation.schema) === null || _a === void 0 ? void 0 : _a.requestBody; var example = (0, utils_1.getRequestBodyExample)(reqBodyObj, reqInfo.contentType); if (example && pmOperation.item.request.body) { pmOperation.item.request.body.mode = 'raw'; pmOperation.item.request.body.raw = example; var lang = (0, utils_1.getRawLanguageFromContentType)(reqInfo.contentType); pmOperation.item.request.body.options = { raw: { language: lang, headerFamily: lang } }; } } if (overwrites) { this.overwriteMap[pmOperation.item.id] = overwrites; this.testSuite.injectOverwrites([pmOperation], overwrites); } if (oaOperation && (tests === null || tests === void 0 ? void 0 : tests.contractTests)) { this.testSuite.generateContractTests([pmOperation], oaOperation, tests.contractTests, respInfo === null || respInfo === void 0 ? void 0 : respInfo.code, respInfo === null || respInfo === void 0 ? void 0 : respInfo.contentType); } if (tests === null || tests === void 0 ? void 0 : tests.contentTests) { this.testSuite.injectContentTests([pmOperation], tests.contentTests); } if (tests === null || tests === void 0 ? void 0 : tests.extendTests) { this.testSuite.injectExtendedTests([pmOperation], tests.extendTests); } if (assignVariables) { this.testSuite.injectAssignVariables([pmOperation], assignVariables); } if (operationPreRequestScripts) { this.testSuite.injectPreRequestScripts([pmOperation], operationPreRequestScripts); } }; return VariationWriter; }()); exports.VariationWriter = VariationWriter; //# sourceMappingURL=VariationWriter.js.map