aboutsummaryrefslogtreecommitdiff
path: root/test/ajv-schemas.test.js
diff options
context:
space:
mode:
Diffstat (limited to 'test/ajv-schemas.test.js')
-rw-r--r--test/ajv-schemas.test.js71
1 files changed, 71 insertions, 0 deletions
diff --git a/test/ajv-schemas.test.js b/test/ajv-schemas.test.js
new file mode 100644
index 00000000..49545c17
--- /dev/null
+++ b/test/ajv-schemas.test.js
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2024 Yomitan Authors
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+import Ajv from 'ajv';
+import standaloneCode from 'ajv/dist/standalone/index.js';
+import {readFileSync, readdirSync} from 'fs';
+import {dirname, join} from 'path';
+import {fileURLToPath} from 'url';
+import {describe, test} from 'vitest';
+import {parseJson} from '../dev/json.js';
+
+/**
+ * @param {string} path
+ * @returns {import('ajv').AnySchema}
+ */
+function loadSchema(path) {
+ return parseJson(readFileSync(path, {encoding: 'utf8'}));
+}
+
+const extDir = join(dirname(fileURLToPath(import.meta.url)), '..', 'ext');
+
+describe('Ajv schema compilation', () => {
+ const schemaDir = join(extDir, 'data/schemas/');
+ const schemaFileNames = readdirSync(schemaDir);
+ /** @type {{name: string, schema: import('ajv').AnySchema}[]} */
+ const schemaTestCases = [];
+ for (const schemaFileName of schemaFileNames) {
+ schemaTestCases.push({name: schemaFileName, schema: loadSchema(join(schemaDir, schemaFileName))});
+ }
+
+ describe.each(schemaTestCases)('Validating $name', ({schema}) => {
+ test('Compiles without warnings', ({expect}) => {
+ /** @type {string[]} */
+ const messages = [];
+ /**
+ * @param {...unknown} args
+ */
+ const log = (...args) => {
+ messages.push(args.join(' '));
+ };
+ const ajv = new Ajv({
+ schemas: [schema],
+ code: {source: true, esm: true},
+ allowUnionTypes: true,
+ logger: {
+ log,
+ warn: log,
+ error: log
+ }
+ });
+ standaloneCode(ajv);
+ if (messages.length > 0) {
+ expect.fail(messages.join('\n'));
+ }
+ });
+ });
+});