64 lines
2.0 KiB
TypeScript
64 lines
2.0 KiB
TypeScript
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 publicJsonPath = path.join(process.cwd(), 'public/json');
|
|
const getJsonDirectory = async () => {
|
|
if (!(await fs.stat(publicJsonPath).catch(() => null))) {
|
|
throw new Error(`JSON path file not found: ${publicJsonPath}`);
|
|
}
|
|
const jsonPath = (await fs.readFile(publicJsonPath, "utf-8")).trim();
|
|
return path.resolve(process.cwd(), jsonPath);
|
|
};
|
|
|
|
|
|
const jsonDir = await getJsonDirectory();
|
|
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)
|
|
});
|
|
});
|
|
})
|