| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- import { mkdir, mkdtemp, rm } from "node:fs/promises";
- import { tmpdir } from "node:os";
- import { join } from "node:path";
- import { describe, expect, it } from "vitest";
- import { PROJECT_YAML_NAME, projectYamlSchema, readProjectYaml, writeProjectYaml } from "../src/project-yaml.js";
- async function tmpDir(): Promise<string> {
- return mkdtemp(join(tmpdir(), "editor-yaml-"));
- }
- describe("projectYamlSchema", () => {
- it("accepts empty and partial metadata", () => {
- expect(projectYamlSchema.safeParse({}).success).toBe(true);
- expect(projectYamlSchema.safeParse({ name: "Game" }).success).toBe(true);
- expect(
- projectYamlSchema.safeParse({ name: "Game", icon: "icon.png", pack: { installer: true, splitAssets: true } })
- .success,
- ).toBe(true);
- });
- it("rejects unknown keys and wrong types", () => {
- expect(projectYamlSchema.safeParse({ nmae: "Game" }).success).toBe(false);
- expect(projectYamlSchema.safeParse({ name: 42 }).success).toBe(false);
- expect(projectYamlSchema.safeParse({ pack: { installer: "yes" } }).success).toBe(false);
- expect(projectYamlSchema.safeParse({ pack: { unknown: true } }).success).toBe(false);
- expect(projectYamlSchema.safeParse({ pack: "installed" }).success).toBe(false);
- });
- });
- describe("readProjectYaml / writeProjectYaml", () => {
- it("returns null when project.yaml is absent", async () => {
- const dir = await tmpDir();
- try {
- expect(await readProjectYaml(dir)).toBeNull();
- } finally {
- await rm(dir, { recursive: true, force: true });
- }
- });
- it("roundtrips a written project.yaml", async () => {
- const dir = await tmpDir();
- try {
- const data = { name: "Pinefield", icon: "icon.png", pack: { installer: true, mods: true, splitAssets: true } };
- await writeProjectYaml(dir, data);
- expect(await readProjectYaml(dir)).toEqual(data);
- const { readFile } = await import("node:fs/promises");
- const raw = await readFile(join(dir, PROJECT_YAML_NAME), "utf8");
- expect(raw).toContain("name: Pinefield");
- } finally {
- await rm(dir, { recursive: true, force: true });
- }
- });
- it("throws on malformed yaml and invalid data", async () => {
- const dir = await tmpDir();
- try {
- await mkdir(dir, { recursive: true });
- const { writeFile } = await import("node:fs/promises");
- await writeFile(join(dir, PROJECT_YAML_NAME), "name: [unclosed\n", "utf8");
- await expect(readProjectYaml(dir)).rejects.toThrow(/invalid project.yaml/);
- await expect(writeProjectYaml(dir, { name: 42 } as never)).rejects.toThrow(/invalid project.yaml/);
- } finally {
- await rm(dir, { recursive: true, force: true });
- }
- });
- });
|