@apideck/portman
Version:
Port OpenAPI Spec to Postman Collection, with contract & variation tests included
200 lines • 12.1 kB
JavaScript
;
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