Ekapp/swagger/test/unit/plugins/json-schema-validator/index.js

90 lines
2.9 KiB
JavaScript

import YAML from "js-yaml"
import JSONSchemaValidator from "src/plugins/json-schema-validator/validator/index.js"
import fs from "fs"
import path from "path"
import expect from "expect"
const swagger2SchemaYaml = fs.readFileSync(path.join(__dirname, "../../../../src/plugins/json-schema-validator/swagger2-schema.yaml")).toString()
const oas3SchemaYaml = fs.readFileSync(path.join(__dirname, "../../../../src/plugins/json-schema-validator/oas3-schema.yaml")).toString()
const swagger2Schema = YAML.safeLoad(swagger2SchemaYaml)
const oas3Schema = YAML.safeLoad(oas3SchemaYaml)
var testDocuments = fs
.readdirSync(__dirname + "/test-documents")
.filter(path => path.endsWith("yaml"))
.map(path => ({
path: "/test-documents/" + path,
contentString: fs.readFileSync(__dirname + "/test-documents/" + path, "utf8"),
}))
.map(doc => ({
path: doc.path,
content: YAML.safeLoad(doc.contentString)
}))
testDocuments.forEach(doc => {
const { path, content } = doc
const { meta = {}, cases = [] } = content
const validator = new JSONSchemaValidator()
validator.addSchema(swagger2Schema, ["openapi-2.0"])
validator.addSchema(oas3Schema, ["openapi-3.0"])
const rootDescribe = meta.skip ? describe.skip : describe
rootDescribe(`schema validation plugin - ` + (meta.title || path), function() {
if(content.input && content.output) {
// fold simple input/output docs into implicit cases
cases.push({
input: content.input,
output: content.output,
})
}
if(cases && cases.length) {
cases.forEach(currentCase => {
const versionDefaultSchema = currentCase.input.openapi && !currentCase.input.swagger ? "openapi-3.0" : "openapi-2.0"
const result = validator.validate({
jsSpec: currentCase.input,
specStr: "", // not needed here
schemaPath: versionDefaultSchema,
source: "structural",
})
if(currentCase.name) {
// only create a new describe block if we have a name
describe(currentCase.name || "", function () {
assertCaseExpectations(currentCase, result)
})
} else {
// else, just do the assertions under the root describe block
assertCaseExpectations(currentCase, result)
}
})
}
})
})
function assertCaseExpectations(currentCase, result) {
const itFn = currentCase.skip ? it.skip : it
if (currentCase.output.match !== undefined) {
itFn("should match expected error output", function () {
expect(result).toMatch(currentCase.output.match)
})
}
if (currentCase.output.length !== undefined) {
itFn("should have expected array length", function () {
expect(result).toBeAn(Array)
expect(result.length).toBe(currentCase.output.length)
})
}
if(currentCase.output.equal !== undefined) {
itFn("should equal expected value", function() {
expect(result).toEqual(currentCase.output.equal)
})
}
}