aboutsummaryrefslogtreecommitdiff
path: root/test/bun.js/install/bun-link.test.ts
diff options
context:
space:
mode:
authorGravatar Alex Lam S.L <alexlamsl@gmail.com> 2023-01-24 21:52:47 +0200
committerGravatar GitHub <noreply@github.com> 2023-01-24 11:52:47 -0800
commite47fe2ca00a5d3cbf9710fedc1440aa25025317d (patch)
treeeec2c318509d964611a9863e1a938162c12cbb05 /test/bun.js/install/bun-link.test.ts
parent2edbf4d0ec7340d40f5e51b3b7d262499b5bc131 (diff)
downloadbun-e47fe2ca00a5d3cbf9710fedc1440aa25025317d.tar.gz
bun-e47fe2ca00a5d3cbf9710fedc1440aa25025317d.tar.zst
bun-e47fe2ca00a5d3cbf9710fedc1440aa25025317d.zip
support `bun link` of scoped packages (#1892)
Diffstat (limited to 'test/bun.js/install/bun-link.test.ts')
-rw-r--r--test/bun.js/install/bun-link.test.ts201
1 files changed, 201 insertions, 0 deletions
diff --git a/test/bun.js/install/bun-link.test.ts b/test/bun.js/install/bun-link.test.ts
new file mode 100644
index 000000000..32d7b91fc
--- /dev/null
+++ b/test/bun.js/install/bun-link.test.ts
@@ -0,0 +1,201 @@
+import { file, spawn } from "bun";
+import {
+ afterEach,
+ beforeEach,
+ expect,
+ it,
+} from "bun:test";
+import { bunExe } from "bunExe";
+import { bunEnv as env } from "bunEnv";
+import { access, mkdir, mkdtemp, readdir, readlink, rm, writeFile } from "fs/promises";
+import { basename, join } from "path";
+import { tmpdir } from "os";
+
+let package_dir, link_dir;
+
+beforeEach(async () => {
+ link_dir = await mkdtemp(join(tmpdir(), "bun-link.test"));
+ package_dir = await mkdtemp(join(tmpdir(), "bun-link.pkg"));
+});
+afterEach(async () => {
+ await rm(link_dir, { force: true, recursive: true });
+ await rm(package_dir, { force: true, recursive: true });
+});
+
+it("should link package", async () => {
+ var link_name = basename(link_dir).slice("bun-link.".length);
+ await writeFile(join(link_dir, "package.json"), JSON.stringify({
+ name: link_name,
+ version: "0.0.1",
+ }));
+ await writeFile(join(package_dir, "package.json"), JSON.stringify({
+ name: "foo",
+ version: "0.0.2",
+ }));
+
+ const { stdout: stdout1, stderr: stderr1, exited: exited1 } = spawn({
+ cmd: [bunExe(), "link"],
+ cwd: link_dir,
+ stdout: null,
+ stdin: "pipe",
+ stderr: "pipe",
+ env,
+ });
+ expect(stderr1).toBeDefined();
+ const err1 = await new Response(stderr1).text();
+ expect(err1.replace(/^(.*?) v[^\n]+/, "$1").split(/\r?\n/)).toEqual([
+ "bun link",
+ "",
+ ]);
+ expect(stdout1).toBeDefined();
+ expect(await new Response(stdout1).text()).toContain(`Success! Registered "${link_name}"`);
+ expect(await exited1).toBe(0);
+
+ const { stdout: stdout2, stderr: stderr2, exited: exited2 } = spawn({
+ cmd: [bunExe(), "link", link_name],
+ cwd: package_dir,
+ stdout: null,
+ stdin: "pipe",
+ stderr: "pipe",
+ env,
+ });
+ expect(stderr2).toBeDefined();
+ const err2 = await new Response(stderr2).text();
+ expect(err2.replace(/^(.*?) v[^\n]+/, "$1").split(/\r?\n/)).toEqual([
+ "bun link",
+ "",
+ ]);
+ expect(stdout2).toBeDefined();
+ const out2 = await new Response(stdout2).text();
+ expect(out2.replace(/\s*\[[0-9\.]+ms\]\s*$/, "").split(/\r?\n/)).toEqual([
+ "",
+ ` installed ${link_name}@link:${link_name}`,
+ "",
+ "",
+ " 1 packages installed",
+ ]);
+ expect(await exited2).toBe(0);
+
+ const { stdout: stdout3, stderr: stderr3, exited: exited3 } = spawn({
+ cmd: [bunExe(), "unlink"],
+ cwd: link_dir,
+ stdout: null,
+ stdin: "pipe",
+ stderr: "pipe",
+ env,
+ });
+ expect(stderr3).toBeDefined();
+ const err3 = await new Response(stderr3).text();
+ expect(err3.replace(/^(.*?) v[^\n]+/, "$1").split(/\r?\n/)).toEqual([
+ "bun unlink",
+ "",
+ ]);
+ expect(stdout3).toBeDefined();
+ expect(await new Response(stdout3).text()).toContain(`success: unlinked package "${link_name}"`);
+ expect(await exited3).toBe(0);
+
+ const { stdout: stdout4, stderr: stderr4, exited: exited4 } = spawn({
+ cmd: [bunExe(), "link", link_name],
+ cwd: package_dir,
+ stdout: null,
+ stdin: "pipe",
+ stderr: "pipe",
+ env,
+ });
+ expect(stderr4).toBeDefined();
+ const err4 = await new Response(stderr4).text();
+ expect(err4).toContain(`error: package "${link_name}" is not linked`);
+ expect(stdout4).toBeDefined();
+ const out4 = await new Response(stdout4).text();
+ expect(await new Response(stdout4).text()).toBe("");
+ expect(await exited4).toBe(1);
+});
+
+it("should link scoped package", async () => {
+ var link_name = `@${basename(link_dir).slice("bun-link.".length)}/foo`;
+ await writeFile(join(link_dir, "package.json"), JSON.stringify({
+ name: link_name,
+ version: "0.0.1",
+ }));
+ await writeFile(join(package_dir, "package.json"), JSON.stringify({
+ name: "bar",
+ version: "0.0.2",
+ }));
+
+ const { stdout: stdout1, stderr: stderr1, exited: exited1 } = spawn({
+ cmd: [bunExe(), "link"],
+ cwd: link_dir,
+ stdout: null,
+ stdin: "pipe",
+ stderr: "pipe",
+ env,
+ });
+ expect(stderr1).toBeDefined();
+ const err1 = await new Response(stderr1).text();
+ expect(err1.replace(/^(.*?) v[^\n]+/, "$1").split(/\r?\n/)).toEqual([
+ "bun link",
+ "",
+ ]);
+ expect(stdout1).toBeDefined();
+ expect(await new Response(stdout1).text()).toContain(`Success! Registered "${link_name}"`);
+ expect(await exited1).toBe(0);
+
+ const { stdout: stdout2, stderr: stderr2, exited: exited2 } = spawn({
+ cmd: [bunExe(), "link", link_name],
+ cwd: package_dir,
+ stdout: null,
+ stdin: "pipe",
+ stderr: "pipe",
+ env,
+ });
+ expect(stderr2).toBeDefined();
+ const err2 = await new Response(stderr2).text();
+ expect(err2.replace(/^(.*?) v[^\n]+/, "$1").split(/\r?\n/)).toEqual([
+ "bun link",
+ "",
+ ]);
+ expect(stdout2).toBeDefined();
+ const out2 = await new Response(stdout2).text();
+ expect(out2.replace(/\s*\[[0-9\.]+ms\]\s*$/, "").split(/\r?\n/)).toEqual([
+ "",
+ ` installed ${link_name}@link:${link_name}`,
+ "",
+ "",
+ " 1 packages installed",
+ ]);
+ expect(await exited2).toBe(0);
+
+ const { stdout: stdout3, stderr: stderr3, exited: exited3 } = spawn({
+ cmd: [bunExe(), "unlink"],
+ cwd: link_dir,
+ stdout: null,
+ stdin: "pipe",
+ stderr: "pipe",
+ env,
+ });
+ expect(stderr3).toBeDefined();
+ const err3 = await new Response(stderr3).text();
+ expect(err3.replace(/^(.*?) v[^\n]+/, "$1").split(/\r?\n/)).toEqual([
+ "bun unlink",
+ "",
+ ]);
+ expect(stdout3).toBeDefined();
+ expect(await new Response(stdout3).text()).toContain(`success: unlinked package "${link_name}"`);
+ expect(await exited3).toBe(0);
+
+ const { stdout: stdout4, stderr: stderr4, exited: exited4 } = spawn({
+ cmd: [bunExe(), "link", link_name],
+ cwd: package_dir,
+ stdout: null,
+ stdin: "pipe",
+ stderr: "pipe",
+ env,
+ });
+ expect(stderr4).toBeDefined();
+ const err4 = await new Response(stderr4).text();
+ expect(err4).toContain(`error: package "${link_name}" is not linked`);
+ expect(stdout4).toBeDefined();
+ const out4 = await new Response(stdout4).text();
+ expect(await new Response(stdout4).text()).toBe("");
+ expect(await exited4).toBe(1);
+});