ajv-cli
Version:
Command line interface for Ajv JSON schema validator
214 lines (188 loc) • 6.99 kB
text/typescript
import type {ExecException} from "child_process"
import cli from "./cli"
import assert = require("assert")
import fs = require("fs")
describe("compile", function () {
this.timeout(10000)
it("should compile valid schema", (done) => {
cli("compile -s test/schema", (error, stdout, stderr) => {
assert.strictEqual(error, null)
assertValid(stdout, 1)
assert.strictEqual(stderr, "")
done()
})
})
it("should compile multiple schemas", (done) => {
cli(
"compile -s test/schema -s test/meta/schema -m test/meta/meta_schema --strict=false",
(error, stdout, stderr) => {
assert.strictEqual(error, null)
assertValid(stdout, 2)
assert.strictEqual(stderr, "")
done()
}
)
})
it("should compile schema to output file", (done) => {
cli("compile -s test/schema -o test/validate_schema1.js", (error, stdout, stderr) => {
const validate = require("./validate_schema1.js")
fs.unlinkSync("test/validate_schema1.js")
assert.strictEqual(error, null)
assertValid(stdout, 1)
assert.strictEqual(stderr, "")
const validData = require("./valid_data.json")
const invalidData = require("./invalid_data.json")
assert.strictEqual(validate(validData), true)
assert.strictEqual(validate(invalidData), false)
done()
})
})
it("should compile multiple schemas to output file", (done) => {
cli(
"compile -s test/schema -s test/schema_with_ref -o test/validate_schema2.js",
(error, stdout, stderr) => {
const validators = require("./validate_schema2.js")
fs.unlinkSync("test/validate_schema2.js")
assert.strictEqual(error, null)
assertValid(stdout, 2)
assert.strictEqual(stderr, "")
const validData = require("./valid_data.json")
const invalidData = require("./invalid_data.json")
assert.strictEqual(validators["schema.json"](validData), true)
assert.strictEqual(validators["schema.json"](invalidData), false)
assert.strictEqual(validators["schema_with_ref.json"](validData), true)
assert.strictEqual(validators["schema_with_ref.json"](invalidData), false)
done()
}
)
})
it("should compile valid schema with a custom meta-schema", (done) => {
cli(
"compile -s test/meta/schema -m test/meta/meta_schema --strict=false",
(error, stdout, stderr) => {
assert.strictEqual(error, null)
assertValid(stdout, 1)
assert.strictEqual(stderr, "")
done()
}
)
})
it("should compile schema with custom keyword", (done) => {
cli(
"compile -s test/custom/schema -c ./test/custom/typeof.js -o test/custom/validate_schema.js",
(error, stdout, stderr) => {
assertCompiledCustom(error, stdout, stderr)
done()
}
)
})
it("should compile schema with custom keyword from npm package", (done) => {
cli(
"compile -s test/custom/schema -c ajv-keywords/dist/keywords/typeof -o test/custom/validate_schema.js",
(error, stdout, stderr) => {
assertCompiledCustom(error, stdout, stderr)
done()
}
)
})
it("should compile schema with custom keyword written in typescript", (done) => {
cli(
"compile -s test/custom/schema -c ./test/custom/typeof_ts.ts -o test/custom/validate_schema.js",
(error, stdout, stderr) => {
assertCompiledCustom(error, stdout, stderr)
done()
}
)
})
it("should fail to compile invalid schema with a custom meta-schema", (done) => {
cli("compile -s test/meta/invalid_schema -m test/meta/meta_schema", (error, stdout, stderr) => {
assert(error instanceof Error)
assert.strictEqual(stdout, "")
const lines = assertError(stderr)
assert(/my_keyword\smust\sbe\sboolean/.test(lines[1]))
done()
})
})
it("should fail to save compiled schemas when path does not exist", (done) => {
cli("compile -s test/schema -o no_folder/validate_schema.js", (error, stdout, stderr) => {
assert(error instanceof Error)
assertValid(stdout, 1)
const lines = stderr.split("\n")
assert(lines.length > 1)
assert(/error\ssaving\sfile/.test(lines[0]))
done()
})
})
it("should fail to compile if referenced schema is invalid", (done) => {
cli("compile -s test/schema -r test/meta/invalid_schema2", (error, stdout, stderr) => {
assert(error instanceof Error)
assert.strictEqual(stdout, "")
const lines = assertError(stderr)
assert(/schema\sis\sinvalid/.test(lines[1]))
done()
})
})
it("should fail to compile if custom package does not export function", (done) => {
cli(
"compile -s test/custom/schema -c ./test/custom/invalid_custom.js",
(error, stdout, stderr) => {
assert(error instanceof Error)
assert.strictEqual(stdout, "")
const lines = stderr.split("\n")
assert(/module.*is\sinvalid/.test(lines[0]))
assert(/not\sa\sfunction/.test(lines[1]))
done()
}
)
})
it("should fail if output file is glob", (done) => {
cli("compile -s test/schema -o test/*.js", (error, stdout, stderr) => {
assert(error instanceof Error)
assert(stderr.includes("only one file is allowed"))
assert(stderr.includes("usage"))
assert.strictEqual(stdout, "")
done()
})
})
it("should fail if too many parameters", (done) => {
cli("compile file -s test/schema", (error, stdout, stderr) => {
assert(error instanceof Error)
assert(stderr.includes("too many arguments"))
assert(stderr.includes("usage"))
assert.strictEqual(stdout, "")
done()
})
})
it("should compile JTD schema", (done) => {
cli("compile -s test/jtd/schema --spec=jtd", (error, stdout, stderr) => {
assert.strictEqual(error, null)
assertValid(stdout, 1)
assert.strictEqual(stderr, "")
done()
})
})
})
function assertValid(stdout: string, count: number): void {
const lines = stdout.split("\n")
assert.strictEqual(lines.length, count + 1)
for (let i = 0; i < count; i++) assert(/\svalid/.test(lines[i]))
}
function assertError(stderr: string): string[] {
const lines = stderr.split("\n")
assert.strictEqual(lines.length, 3)
assert(lines[0].includes("schema"))
assert(/\sinvalid/.test(lines[0]))
assert(lines[1].includes("error"))
return lines
}
function assertCompiledCustom(error: ExecException | null, stdout: string, stderr: string): void {
assert.strictEqual(error, null)
assertValid(stdout, 1)
assert.strictEqual(stderr, "")
const validate = require("./custom/validate_schema.js")
const validData = require("./custom/valid_data.json")
const invalidData = require("./custom/invalid_data.json")
assert.strictEqual(validate(validData), true)
assert.strictEqual(validate(invalidData), false)
fs.unlinkSync("test/custom/validate_schema.js")
}