|
|
|
|
|
import { describe, expect, it, vi } from "vitest"; |
|
import { createSymlink } from "./symlink"; |
|
import { readFileSync, writeFileSync } from "node:fs"; |
|
import { lstat, rm } from "node:fs/promises"; |
|
import { tmpdir } from "node:os"; |
|
import { join } from "node:path"; |
|
|
|
let failSymlink = false; |
|
vi.mock("node:fs/promises", async (importOriginal) => ({ |
|
...(await importOriginal<typeof import("node:fs/promises")>()), |
|
symlink: async (...args: any[]) => { |
|
if (failSymlink) { |
|
failSymlink = false; |
|
throw new Error("Symlink not supported"); |
|
} |
|
|
|
|
|
return (await importOriginal<typeof import("node:fs/promises")>()).symlink(...args); |
|
}, |
|
})); |
|
|
|
describe("utils/symlink", () => { |
|
it("should create a symlink", async () => { |
|
writeFileSync(join(tmpdir(), "test.txt"), "hello world"); |
|
await createSymlink({ |
|
sourcePath: join(tmpdir(), "test.txt"), |
|
finalPath: join(tmpdir(), "test-symlink.txt"), |
|
}); |
|
|
|
const stats = await lstat(join(tmpdir(), "test-symlink.txt")); |
|
expect(stats.isSymbolicLink()).toBe(process.platform !== "win32"); |
|
|
|
|
|
const content = readFileSync(join(tmpdir(), "test-symlink.txt"), "utf8"); |
|
expect(content).toBe("hello world"); |
|
|
|
|
|
await rm(join(tmpdir(), "test-symlink.txt")); |
|
await rm(join(tmpdir(), "test.txt")); |
|
}); |
|
|
|
it("should work when symlinking twice", async () => { |
|
writeFileSync(join(tmpdir(), "test.txt"), "hello world"); |
|
writeFileSync(join(tmpdir(), "test2.txt"), "hello world2"); |
|
await createSymlink({ |
|
sourcePath: join(tmpdir(), "test.txt"), |
|
finalPath: join(tmpdir(), "test-symlink.txt"), |
|
}); |
|
await createSymlink({ |
|
sourcePath: join(tmpdir(), "test2.txt"), |
|
finalPath: join(tmpdir(), "test-symlink.txt"), |
|
}); |
|
|
|
const stats = await lstat(join(tmpdir(), "test-symlink.txt")); |
|
expect(stats.isSymbolicLink()).toBe(process.platform !== "win32"); |
|
|
|
|
|
const content = readFileSync(join(tmpdir(), "test-symlink.txt"), "utf8"); |
|
expect(content).toBe("hello world2"); |
|
|
|
|
|
await rm(join(tmpdir(), "test-symlink.txt")); |
|
await rm(join(tmpdir(), "test.txt")); |
|
await rm(join(tmpdir(), "test2.txt")); |
|
}); |
|
|
|
it("should work when symlink doesn't work (windows)", async () => { |
|
writeFileSync(join(tmpdir(), "test.txt"), "hello world"); |
|
|
|
failSymlink = true; |
|
await createSymlink({ |
|
sourcePath: join(tmpdir(), "test.txt"), |
|
finalPath: join(tmpdir(), "test-symlink.txt"), |
|
}); |
|
|
|
const stats = await lstat(join(tmpdir(), "test-symlink.txt")); |
|
expect(stats.isSymbolicLink()).toBe(false); |
|
|
|
|
|
const content = readFileSync(join(tmpdir(), "test-symlink.txt"), "utf8"); |
|
expect(content).toBe("hello world"); |
|
|
|
|
|
await rm(join(tmpdir(), "test-symlink.txt")); |
|
await rm(join(tmpdir(), "test.txt")); |
|
}); |
|
}); |
|
|