project-yaml.test.ts 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import { mkdir, mkdtemp, rm } from "node:fs/promises";
  2. import { tmpdir } from "node:os";
  3. import { join } from "node:path";
  4. import { describe, expect, it } from "vitest";
  5. import { PROJECT_YAML_NAME, projectYamlSchema, readProjectYaml, writeProjectYaml } from "../src/project-yaml.js";
  6. async function tmpDir(): Promise<string> {
  7. return mkdtemp(join(tmpdir(), "editor-yaml-"));
  8. }
  9. describe("projectYamlSchema", () => {
  10. it("accepts empty and partial metadata", () => {
  11. expect(projectYamlSchema.safeParse({}).success).toBe(true);
  12. expect(projectYamlSchema.safeParse({ name: "Game" }).success).toBe(true);
  13. expect(
  14. projectYamlSchema.safeParse({ name: "Game", icon: "icon.png", pack: { installer: true, splitAssets: true } })
  15. .success,
  16. ).toBe(true);
  17. });
  18. it("rejects unknown keys and wrong types", () => {
  19. expect(projectYamlSchema.safeParse({ nmae: "Game" }).success).toBe(false);
  20. expect(projectYamlSchema.safeParse({ name: 42 }).success).toBe(false);
  21. expect(projectYamlSchema.safeParse({ pack: { installer: "yes" } }).success).toBe(false);
  22. expect(projectYamlSchema.safeParse({ pack: { unknown: true } }).success).toBe(false);
  23. expect(projectYamlSchema.safeParse({ pack: "installed" }).success).toBe(false);
  24. });
  25. });
  26. describe("readProjectYaml / writeProjectYaml", () => {
  27. it("returns null when project.yaml is absent", async () => {
  28. const dir = await tmpDir();
  29. try {
  30. expect(await readProjectYaml(dir)).toBeNull();
  31. } finally {
  32. await rm(dir, { recursive: true, force: true });
  33. }
  34. });
  35. it("roundtrips a written project.yaml", async () => {
  36. const dir = await tmpDir();
  37. try {
  38. const data = { name: "Pinefield", icon: "icon.png", pack: { installer: true, mods: true, splitAssets: true } };
  39. await writeProjectYaml(dir, data);
  40. expect(await readProjectYaml(dir)).toEqual(data);
  41. const { readFile } = await import("node:fs/promises");
  42. const raw = await readFile(join(dir, PROJECT_YAML_NAME), "utf8");
  43. expect(raw).toContain("name: Pinefield");
  44. } finally {
  45. await rm(dir, { recursive: true, force: true });
  46. }
  47. });
  48. it("throws on malformed yaml and invalid data", async () => {
  49. const dir = await tmpDir();
  50. try {
  51. await mkdir(dir, { recursive: true });
  52. const { writeFile } = await import("node:fs/promises");
  53. await writeFile(join(dir, PROJECT_YAML_NAME), "name: [unclosed\n", "utf8");
  54. await expect(readProjectYaml(dir)).rejects.toThrow(/invalid project.yaml/);
  55. await expect(writeProjectYaml(dir, { name: 42 } as never)).rejects.toThrow(/invalid project.yaml/);
  56. } finally {
  57. await rm(dir, { recursive: true, force: true });
  58. }
  59. });
  60. });