From 1ab2f5e337f7df9f89ae9377eba339f77cc88974 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Wed, 12 Mar 2025 12:59:41 +0100 Subject: [PATCH] Create validate-json.test.ts --- .../__tests__/public/validate-json.test.ts | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 frontend/src/__tests__/public/validate-json.test.ts diff --git a/frontend/src/__tests__/public/validate-json.test.ts b/frontend/src/__tests__/public/validate-json.test.ts new file mode 100644 index 0000000..562ebe9 --- /dev/null +++ b/frontend/src/__tests__/public/validate-json.test.ts @@ -0,0 +1,53 @@ +import { describe, it, assert, beforeAll } from "vitest"; +import { promises as fs } from "fs"; +import path from "path"; +import { ScriptSchema, type Script } from "@/app/json-editor/_schemas/schemas"; +import { Metadata } from "@/lib/types"; + +const jsonDir = "public/json"; +const metadataFileName = "metadata.json"; +const encoding = "utf-8"; + +const fileNames = (await fs.readdir(jsonDir)) + .filter((fileName) => fileName !== metadataFileName) + +describe.each(fileNames)("%s", async (fileName) => { + let script: Script; + + beforeAll(async () => { + const filePath = path.resolve(jsonDir, fileName); + const fileContent = await fs.readFile(filePath, encoding) + script = JSON.parse(fileContent); + }) + + it("should have valid json according to script schema", () => { + ScriptSchema.parse(script); + }); + + it("should have a corresponding script file", () => { + script.install_methods.forEach((method) => { + const scriptPath = path.resolve("..", method.script) + assert(fs.stat(scriptPath), `Script file not found: ${scriptPath}`) + }) + }); +}) + +describe(`${metadataFileName}`, async () => { + let metadata: Metadata; + + beforeAll(async () => { + const filePath = path.resolve(jsonDir, metadataFileName); + const fileContent = await fs.readFile(filePath, encoding) + metadata = JSON.parse(fileContent); + }) + + it("should have valid json according to metadata schema", () => { + // TODO: create zod schema for metadata. Move zod schemas to /lib/types.ts + assert(metadata.categories.length > 0); + metadata.categories.forEach((category) => { + assert.isString(category.name) + assert.isNumber(category.id) + assert.isNumber(category.sort_order) + }); + }); +})