import { expect, test } from "bun:test"; test("a short CLI exits while its version updater remains pending", async () => { const moduleUrl = new URL("../../lib/version-update.ts", import.meta.url) .href; const script = ` const { createVersionObserver } = await import(${JSON.stringify(moduleUrl)}); createVersionObserver({ currentVersion: "2.6.1-rc3", runner: () => new Promise(() => {}), })("2.7.0"); `; const child = Bun.spawn([process.execPath, "-e", script], { stdin: "ignore", stdout: "pipe", stderr: "pipe", }); const exit = await Promise.race([ child.exited, new Promise((_, reject) => setTimeout(() => reject(new Error("short CLI stayed alive")), 1_000), ), ]); expect(exit).toBe(0); expect(await new Response(child.stderr).text()).toBe(""); }); test.each([ ["success", "return true", "+ Updated to 2.7.0"], ["failure", "throw new Error('install failed')", "+ New version available: 2.7.0"], ])("reports exactly one %s outcome when it settles", async (_name, outcome, message) => { const moduleUrl = new URL("../../lib/version-update.ts", import.meta.url).href; const script = ` const { createVersionObserver } = await import(${JSON.stringify(moduleUrl)}); createVersionObserver({ currentVersion: "2.6.1-rc3", runner: async () => { ${outcome}; }, })("2.7.0"); await new Promise((resolve) => setTimeout(resolve, 25)); `; const child = Bun.spawn([process.execPath, "-e", script], { stdin: "ignore", stdout: "pipe", stderr: "pipe", }); expect(await child.exited).toBe(0); const stderr = await new Response(child.stderr).text(); expect(stderr.split("\n").filter((line) => line.includes(message))).toHaveLength(1); });