Files
bun.sh/test/cli/install/bun-create.test.ts
Jarred Sumner 2e02d9de28 Use ReadableStream.prototype.* in tests instead of new Response(...).* (#20937)
Co-authored-by: Jarred-Sumner <709451+Jarred-Sumner@users.noreply.github.com>
Co-authored-by: Alistair Smith <hi@alistair.sh>
Co-authored-by: Claude Bot <claude-bot@bun.sh>
Co-authored-by: Claude <noreply@anthropic.com>
2025-07-14 00:47:53 -07:00

147 lines
4.1 KiB
TypeScript

import { spawn, spawnSync } from "bun";
import { beforeEach, describe, expect, it } from "bun:test";
import { exists, stat } from "fs/promises";
import { bunExe, bunEnv as env, tmpdirSync } from "harness";
import { join } from "path";
let x_dir: string;
let testNumber = 0;
beforeEach(async () => {
x_dir = tmpdirSync(`cr8-${testNumber++}`);
});
describe("should not crash", async () => {
const args = [
[bunExe(), "create"],
[bunExe(), "create", ""],
[bunExe(), "create", "--"],
[bunExe(), "create", "--", ""],
[bunExe(), "create", "--help"],
];
for (let cmd of args) {
it(JSON.stringify(cmd.slice(1)), () => {
const { exitCode } = spawnSync({
cmd,
cwd: x_dir,
stdout: "ignore",
stdin: "inherit",
stderr: "inherit",
env,
});
expect(exitCode).toBe(cmd.length === 2 ? 1 : 0);
});
}
});
it("should create selected template with @ prefix", async () => {
const { stderr, exited } = spawn({
cmd: [bunExe(), "create", "@quick-start/some-template"],
cwd: x_dir,
stdout: "inherit",
stdin: "inherit",
stderr: "pipe",
env,
});
await exited;
const err = await stderr.text();
expect(err.split(/\r?\n/)).toContain(
`error: GET https://registry.npmjs.org/@quick-start%2fcreate-some-template - 404`,
);
});
it("should create selected template with @ prefix implicit `/create`", async () => {
const { stderr, exited } = spawn({
cmd: [bunExe(), "create", "@second-quick-start"],
cwd: x_dir,
stdout: "inherit",
stdin: "inherit",
stderr: "pipe",
env,
});
const err = await stderr.text();
expect(err.split(/\r?\n/)).toContain(`error: GET https://registry.npmjs.org/@second-quick-start%2fcreate - 404`);
await exited;
});
it("should create selected template with @ prefix implicit `/create` with version", async () => {
const { stderr, exited } = spawn({
cmd: [bunExe(), "create", "@second-quick-start"],
cwd: x_dir,
stdout: "inherit",
stdin: "inherit",
stderr: "pipe",
env,
});
const err = await stderr.text();
expect(err.split(/\r?\n/)).toContain(`error: GET https://registry.npmjs.org/@second-quick-start%2fcreate - 404`);
await exited;
});
it("should create template from local folder", async () => {
const bunCreateDir = join(x_dir, "bun-create");
const testTemplate = "test-template";
await Bun.write(join(bunCreateDir, testTemplate, "index.js"), "hi");
await Bun.write(join(bunCreateDir, testTemplate, "foo", "bar.js"), "hi");
const { exited } = spawn({
cmd: [bunExe(), "create", testTemplate],
cwd: x_dir,
stdout: "inherit",
stdin: "inherit",
stderr: "inherit",
env: { ...env, BUN_CREATE_DIR: bunCreateDir },
});
expect(await exited).toBe(0);
const dirStat = await stat(join(x_dir, testTemplate));
expect(dirStat.isDirectory()).toBe(true);
expect(await Bun.file(join(x_dir, testTemplate, "index.js")).text()).toBe("hi");
expect(await Bun.file(join(x_dir, testTemplate, "foo", "bar.js")).text()).toBe("hi");
});
it("should not mention cd prompt when created in current directory", async () => {
const { stdout, exited } = spawn({
cmd: [bunExe(), "create", "https://github.com/dylan-conway/create-test", "."],
cwd: x_dir,
stdout: "pipe",
stdin: "inherit",
stderr: "inherit",
env,
});
await exited;
const out = await stdout.text();
expect(out).toContain("bun dev");
expect(out).not.toContain("\n\n cd \n bun dev\n\n");
}, 20_000);
for (const repo of ["https://github.com/dylan-conway/create-test", "github.com/dylan-conway/create-test"]) {
it(`should create and install github template from ${repo}`, async () => {
const { stderr, stdout, exited } = spawn({
cmd: [bunExe(), "create", repo],
cwd: x_dir,
stdout: "pipe",
stderr: "pipe",
env,
});
const err = await stderr.text();
expect(err).not.toContain("error:");
const out = await stdout.text();
expect(out).toContain("Success! dylan-conway/create-test loaded into create-test");
expect(await exists(join(x_dir, "create-test", "node_modules", "jquery"))).toBe(true);
expect(await exited).toBe(0);
}, 20_000);
}