ajv-cli
Version:
Command line interface for Ajv JSON schema validator
141 lines (124 loc) • 4.42 kB
text/typescript
import cli from "./cli"
import assert = require("assert")
import fs = require("fs")
import path = require("path")
import {AnySchemaObject} from "ajv"
describe("migrate", function () {
this.timeout(10000)
it("should migrate schema to draft-07", (done) => {
testMigrate(
"migrate -s test/migrate/schema.json -o test/migrate/migrated_schema.json --spec=draft7",
"./migrate/expected_migrated_schema.json",
done
)
})
it("should migrate schema to draft-07 by default", (done) => {
testMigrate(
"migrate -s test/migrate/schema.json -o test/migrate/migrated_schema.json",
"./migrate/expected_migrated_schema.json",
done
)
})
it("should migrate schema to draft-2019-09", (done) => {
testMigrate(
"migrate -s test/migrate/schema.json -o test/migrate/migrated_schema.json --spec=draft2019",
"./migrate/expected_migrated_schema_2019.json",
done
)
})
function testMigrate(cmd: string, expectedFile: string, done: () => void): void {
try {
deleteSchema("migrated_schema.json")
} catch (e) {}
cli(cmd, (error, stdout, stderr) => {
try {
assert.strictEqual(error, null)
assertMigrated(stdout, 1)
assert.strictEqual(stderr, "")
const migratedSchema = readSchema("migrated_schema.json")
const expectedMigratedSchema = require(expectedFile)
assert.deepStrictEqual(migratedSchema, expectedMigratedSchema)
} finally {
deleteSchema("migrated_schema.json")
}
done()
})
}
it("should migrate schema to draft-07 to the same file and create backup", (done) => {
const backup = fs.readFileSync(path.join(__dirname, "migrate", "schema.json"), "utf8")
cli("migrate -s test/migrate/schema.json", (error, stdout, stderr) => {
try {
assert.strictEqual(error, null)
assertMigrated(stdout, 1)
assert.strictEqual(stderr, "")
const backupSchema = readSchema("schema.json.bak")
assert.deepStrictEqual(backupSchema, JSON.parse(backup))
const migratedSchema = readSchema("schema.json")
const expectedMigratedSchema = require("./migrate/expected_migrated_schema.json")
assert.deepStrictEqual(migratedSchema, expectedMigratedSchema)
} finally {
fs.writeFileSync(path.join(__dirname, "migrate", "schema.json"), backup)
deleteSchema("schema.json.bak")
}
done()
})
})
it("should not save schema if schema is draft-07 compatible", (done) => {
cli(
"migrate -s test/migrate/schema_no_changes.json -o test/migrate/migrated_schema.json",
(error, stdout, stderr) => {
assert.strictEqual(error, null)
assert.strictEqual(stderr, "")
const lines = stdout.split("\n")
assert.strictEqual(lines.length, 2)
assert(/no\schanges/.test(lines[0]))
let err
try {
readSchema("migrated_schema.json")
} catch (e) {
err = e
}
assert(err instanceof Error)
done()
}
)
})
it("should fail on invalid schema", (done) => {
cli("migrate -s test/migrate/schema_invalid.json", (error, stdout, stderr) => {
assert(error instanceof Error)
assert.strictEqual(stdout, "")
assertError(stderr)
done()
})
})
it("should fail if multiple schemas passed with -o option", (done) => {
cli(
'migrate -s "test/migrate/schema*.json" -o test/migrate/migrated_schema.json',
(error, stdout, stderr) => {
assert(error instanceof Error)
assert.strictEqual(stdout, "")
assert(/multiple\sschemas/.test(stderr))
done()
}
)
})
})
function assertMigrated(stdout: string, count: number): void {
const lines = stdout.split("\n")
assert.strictEqual(lines.length, count + 1)
for (let i = 0; i < count; i++) assert(/saved\smigrated\sschema/.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 readSchema(file: string): AnySchemaObject {
return JSON.parse(fs.readFileSync(path.join(__dirname, "migrate", file), "utf8"))
}
function deleteSchema(file: string): void {
fs.unlinkSync(path.join(__dirname, "migrate", file))
}