//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)) } }) }