import { assertEquals } from "https://deno.land/std@0.119.0/testing/asserts.ts"; import { UTXOEngine } from "./engine.js"; // initialize ajv JSON Schema validator import Ajv from "https://esm.sh/ajv@8.8.1?pin=v58"; import addFormats from "https://esm.sh/ajv-formats@2.1.1"; const ajv = new Ajv(); addFormats(ajv); const utxo = new UTXOEngine({ silent: true }); await utxo.init(); const schemas = await utxo.schemas(); const validators = {}; for (const item of schemas) { validators[item.name] = ajv.compile(item.schema); } // check entries for (const entryId of utxo.entriesList()) { const entry = utxo.entries[entryId]; // check index Deno.test(`UTXO.${entryId}: index[schema]`, () => { if (!validators.index(entry.index)) { throw validators.index.errors; } }); // check specific specs for (const specId of Object.keys(entry.specs)) { Deno.test(`UTXO.${entryId}: ${specId}[schema]`, () => { if (!validators[specId]) { return null; } if (!validators[specId](entry.specs[specId])) { throw validators[specId].errors; } }); Deno.test(`UTXO.${entryId}: ${specId}[id-duplicates]`, () => { const used = []; for (const item of entry.specs[specId]) { if (!item.id) { return null; } if (used.includes(item.id)) { throw `Duplicate key: ${item.id}`; } used.push(item.id); } }); if (["speakers", "projects"].includes(specId)) { Deno.test(`UTXO.${entryId}: ${specId}[tracks-links]`, () => { const tracks = entry.specs.tracks.map((t) => t.id); for (const item of entry.specs[specId]) { if (!item.tracks) { continue; } for (const t of item.tracks) { if (!tracks.includes(t)) { throw new Error(`Track not exists: ${t}`); } } } }); } if (["events"].includes(specId)) { Deno.test(`UTXO.${entryId}: ${specId}[speakers-links]`, () => { const speakers = entry.specs.speakers.map((t) => t.id); for (const item of entry.specs[specId]) { if (!item.speakers || item.speakers.length === 0) { continue; } for (const t of item.speakers) { if (!speakers.includes(t)) { throw new Error(`Speaker not exists: ${t}`); } } } }); } if (["events"].includes(specId)) { Deno.test(`UTXO.${entryId}: ${specId}[speakers-tracks]`, () => { const tracks = entry.specs.tracks.map((t) => t.id); for (const item of entry.specs[specId]) { if (!item.track) { continue; } if (!tracks.includes(item.track)) { throw new Error(`Track not exists: ${item.track}`); } } }); } } }