90 lines
2.9 KiB
JavaScript
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)
|
|
})
|
|
}
|
|
} |