79 lines
2.6 KiB
JavaScript
79 lines
2.6 KiB
JavaScript
//Imports
|
|
const processes = require("child_process")
|
|
const yaml = require("js-yaml")
|
|
const fss = require("fs")
|
|
const paths = require("path")
|
|
|
|
//Git setup
|
|
const __metrics = paths.join(paths.dirname(__dirname, ".."))
|
|
const __presets = paths.join(__metrics, ".presets")
|
|
|
|
//Clone presets branch
|
|
try {
|
|
fss.accessSync(__presets)
|
|
}
|
|
catch {
|
|
processes.execSync(`git clone https://github.com/lowlighter/metrics.git ${__presets} --branch presets --single-branch`)
|
|
}
|
|
|
|
//Generate presets examples
|
|
for (const path of fss.readdirSync(__presets)) {
|
|
if (/^[.@]/.test(path))
|
|
continue
|
|
if (!(fss.lstatSync(paths.join(__presets, path))).isDirectory())
|
|
continue
|
|
|
|
describe(`Preset: ${path}`, () => {
|
|
try {
|
|
//Load preset
|
|
const preset = yaml.load(fss.readFileSync(paths.join(__presets, path, "preset.yml")))
|
|
test("syntax is valid", () => expect(true).toBe(true))
|
|
try {
|
|
//Load schema
|
|
const { properties } = yaml.load(fss.readFileSync(paths.join(__presets, "@schema", `${preset.schema}.yml`)))
|
|
test("schema is valid", () => expect(preset.schema).toBeDefined())
|
|
//Test schema
|
|
for (const [key, { type, required }] of Object.entries(properties)) {
|
|
if (required)
|
|
test(`preset.${key} is defined`, () => expect(preset[key]).toBeDefined())
|
|
test(`preset.${key} type is ${type}`, () => {
|
|
switch (true) {
|
|
case /^'.*'$/.test(type): {
|
|
const value = type.substring(1, type.length - 1)
|
|
expect(preset[key]).toBe(value)
|
|
return
|
|
}
|
|
case /\{\}$/.test(type): {
|
|
const typed = type.substring(0, type.length - 2)
|
|
expect(typeof preset[key]).toBe("object")
|
|
if (typed !== "unknown") {
|
|
for (const value of Object.values(preset[key]))
|
|
expect(typeof value).toBe(typed)
|
|
}
|
|
return
|
|
}
|
|
case /\[\]$/.test(type): {
|
|
const typed = type.substring(0, type.length - 2)
|
|
expect(Array.isArray(preset[key])).toBe(true)
|
|
if (typed !== "unknown") {
|
|
for (const value of Object.values(preset[key]))
|
|
expect(typeof value).toBe(typed)
|
|
}
|
|
return
|
|
}
|
|
default:
|
|
expect(typeof preset[key]).toBe(type)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
catch (error) {
|
|
test(`schema is valid (got ${preset.schema})`, () => expect(false).toBe(true))
|
|
}
|
|
}
|
|
catch {
|
|
test("syntax is valid", () => expect(false).toBe(true))
|
|
}
|
|
})
|
|
}
|