UNPKG

@apideck/portman

Version:

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

121 lines 5.38 kB
"use strict"; 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