project-bootstrap.test.ts 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import { beforeEach, afterEach, describe, expect, it } from "vitest";
  2. import { mkdtemp, readFile, rm, writeFile } from "node:fs/promises";
  3. import { join } from "node:path";
  4. import { tmpdir } from "node:os";
  5. describe("project bootstrap", () => {
  6. const originalHome = process.env.HOME;
  7. let tempDir: string;
  8. beforeEach(async () => {
  9. tempDir = await mkdtemp(join(tmpdir(), "inkos-bootstrap-"));
  10. process.env.HOME = tempDir;
  11. });
  12. afterEach(async () => {
  13. process.env.HOME = originalHome;
  14. await rm(tempDir, { recursive: true, force: true });
  15. });
  16. it("creates a minimal Studio-first project when none exists", async () => {
  17. const { ensureProjectDirectoryInitialized } = await import("../project-bootstrap.js");
  18. const initialized = await ensureProjectDirectoryInitialized(tempDir, { language: "zh" });
  19. expect(initialized).toBe(true);
  20. const config = JSON.parse(await readFile(join(tempDir, "inkos.json"), "utf-8"));
  21. expect(config.name).toMatch(/^inkos-bootstrap-/);
  22. expect(config.version).toBe("0.1.0");
  23. expect(config.llm.configSource).toBe("studio");
  24. expect(config.llm.service).toBe("custom");
  25. expect(config.llm.model).toBe("");
  26. expect(config.llm.baseUrl).toBe("");
  27. await expect(readFile(join(tempDir, ".nvmrc"), "utf-8")).resolves.toBe("22\n");
  28. await expect(readFile(join(tempDir, ".node-version"), "utf-8")).resolves.toBe("22\n");
  29. });
  30. it("does not overwrite support files when auto-initializing", async () => {
  31. await writeFile(join(tempDir, ".env"), "EXISTING=1\n", "utf-8");
  32. await writeFile(join(tempDir, ".gitignore"), "CUSTOM\n", "utf-8");
  33. const { ensureProjectDirectoryInitialized } = await import("../project-bootstrap.js");
  34. await ensureProjectDirectoryInitialized(tempDir, { language: "zh" });
  35. await expect(readFile(join(tempDir, ".env"), "utf-8")).resolves.toBe("EXISTING=1\n");
  36. await expect(readFile(join(tempDir, ".gitignore"), "utf-8")).resolves.toBe("CUSTOM\n");
  37. });
  38. it("returns false when the directory is already an InkOS project", async () => {
  39. await writeFile(join(tempDir, "inkos.json"), "{}\n", "utf-8");
  40. const { ensureProjectDirectoryInitialized } = await import("../project-bootstrap.js");
  41. await expect(ensureProjectDirectoryInitialized(tempDir, { language: "zh" })).resolves.toBe(false);
  42. });
  43. });