@apideck/portman
Version:
Port OpenAPI Spec to Postman Collection, with contract & variation tests included
121 lines • 5.38 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.convertJsonSchemaAdditionalProperties = exports.convertUnsupportedJsonSchemaProperties = exports.testResponseJsonSchema = void 0;
var tslib_1 = require("tslib");
var application_1 = require("../../application");
var legacy_1 = tslib_1.__importDefault(require("neotraverse/legacy"));
var ajv_1 = tslib_1.__importDefault(require("ajv"));
var chalk_1 = tslib_1.__importDefault(require("chalk"));
var testResponseJsonSchema = function (schemaValidation, jsonSchema, pmOperation, _oaOperation, extraUnknownFormats, config) {
var _a;
if (extraUnknownFormats === void 0) { extraUnknownFormats = []; }
if (schemaValidation.additionalProperties || schemaValidation.additionalProperties === false) {
jsonSchema = (0, exports.convertJsonSchemaAdditionalProperties)(jsonSchema, schemaValidation.additionalProperties);
}
jsonSchema = (0, exports.convertUnsupportedJsonSchemaProperties)(jsonSchema);
var split = (_a = config === null || config === void 0 ? void 0 : config.separatorSymbol) !== null && _a !== void 0 ? _a : '::';
var targetName = "".concat(pmOperation.method.toUpperCase(), "]").concat(split).concat(pmOperation.path);
var validJsonSchema = true;
try {
var ajv = new ajv_1.default({ allErrors: true, strict: false, logger: false });
ajv.compile(jsonSchema);
}
catch (e) {
validJsonSchema = false;
console.log(chalk_1.default.red("schemaValidation skipped for[".concat(pmOperation.method.toUpperCase(), "]").concat(split).concat(pmOperation.path, " ") + "".concat(e.message)));
}
var jsonSchemaString = JSON.stringify(jsonSchema);
var containsRef = jsonSchemaString.includes('$ref');
var pmTest = '';
var unknownFormats = '[' +
['int32', 'int64', 'float', 'double']
.concat(extraUnknownFormats)
.map(function (fmt) { return "\"".concat(fmt, "\""); })
.join(', ') +
']';
pmTest = [
"// Response Validation\n",
"const schema = ".concat(jsonSchemaString, "\n\n"),
"// Validate if response matches JSON schema \n",
"pm.test(\"[".concat(targetName),
" - Schema is valid\", function() {\n",
" pm.response.to.have.jsonSchema(schema,{unknownFormats: ".concat(unknownFormats, "});\n"),
"});\n"
].join('');
if (!validJsonSchema) {
pmTest = [
"// Response Validation - Disabled due to Invalid JSON Schema\n",
"console.log('".concat(targetName, " response is not being validated against your spec!');\n")
].join('');
}
if (containsRef) {
pmTest = [
"// Response Validation - Disabled due to Circular Reference\n",
"console.log('".concat(targetName, " response is not being validated against your spec!');\n")
].join('');
}
(0, application_1.writeOperationTestScript)(pmOperation, pmTest);
return pmOperation;
};
exports.testResponseJsonSchema = testResponseJsonSchema;
var convertUnsupportedJsonSchemaProperties = function (oaSchema) {
var jsonSchema = JSON.parse(JSON.stringify(oaSchema));
var openApiSpecificFields = [
'discriminator',
'readOnly',
'writeOnly',
'xml',
'externalDocs',
'example',
'deprecated'
];
var traverse = function (obj) {
var _a, _b;
var _loop_1 = function (k) {
if (typeof obj[k] === 'object' && obj[k] !== null) {
if ((_a = obj[k]) === null || _a === void 0 ? void 0 : _a.types) {
obj[k].type = obj[k].types;
delete obj[k].types;
}
if (((_b = obj[k]) === null || _b === void 0 ? void 0 : _b.nullable) === true) {
if (Array.isArray(obj[k].type)) {
if (!obj[k].type.includes('null')) {
obj[k].type.push('null');
}
}
else {
var jsonTypes = [];
jsonTypes.push(obj[k].type);
jsonTypes.push('null');
obj[k].type = jsonTypes;
}
delete obj[k].nullable;
}
openApiSpecificFields.forEach(function (field) {
if (field in obj[k]) {
delete obj[k][field];
}
});
traverse(obj[k]);
}
};
for (var k in obj) {
_loop_1(k);
}
};
traverse(jsonSchema);
return jsonSchema;
};
exports.convertUnsupportedJsonSchemaProperties = convertUnsupportedJsonSchemaProperties;
var convertJsonSchemaAdditionalProperties = function (oaSchema, additionalProperties) {
var jsonSchema = JSON.parse(JSON.stringify(oaSchema));
(0, legacy_1.default)(jsonSchema).forEach(function (node) {
if ((node === null || node === void 0 ? void 0 : node.type) === 'object') {
node.additionalProperties = additionalProperties;
this.update(node);
}
});
return jsonSchema;
};
exports.convertJsonSchemaAdditionalProperties = convertJsonSchemaAdditionalProperties;
//# sourceMappingURL=testResponseJsonSchema.js.map