Files
js-sdk/tests/files.test.ts
2026-05-14 23:22:53 +06:00

93 lines
2.8 KiB
TypeScript

import { describe, expect, it, vi } from "vitest";
import { Capsule } from "../src/capsule.js";
function streamFrom(text: string): ReadableStream<Uint8Array> {
return new ReadableStream({
start(controller) {
controller.enqueue(Buffer.from(text));
controller.close();
},
});
}
describe("FileManager", () => {
it("reads and writes files through the capsule file client", async () => {
const capsule = new Capsule("cap_1", {
baseUrl: "https://api.example.com",
});
const download = vi
.spyOn(capsule.client.files, "download")
.mockResolvedValue(streamFrom("hello"));
const upload = vi
.spyOn(capsule.client.files, "upload")
.mockResolvedValue(undefined);
await expect(capsule.files.read("/tmp/a.txt")).resolves.toEqual(
Buffer.from("hello"),
);
await expect(
capsule.files.write("/tmp/a.txt", "hello"),
).resolves.toBeUndefined();
expect(download).toHaveBeenCalledWith("cap_1", { path: "/tmp/a.txt" });
expect(upload).toHaveBeenCalledWith("cap_1", {
file: "hello",
path: "/tmp/a.txt",
});
});
it("maps directory operations", async () => {
const capsule = new Capsule("cap_1", {
baseUrl: "https://api.example.com",
});
const list = vi.spyOn(capsule.client.files, "list").mockResolvedValue({
entries: [{ name: "a.txt", path: "/tmp/a.txt", type: "file" }],
});
const mkdir = vi.spyOn(capsule.client.files, "mkdir").mockResolvedValue({
entry: { path: "/tmp/new", type: "directory" },
});
const remove = vi
.spyOn(capsule.client.files, "remove")
.mockResolvedValue(undefined);
await expect(
capsule.files.list("/tmp", { depth: 2 }),
).resolves.toMatchObject({
entries: [{ name: "a.txt" }],
});
await expect(capsule.files.mkdir("/tmp/new")).resolves.toMatchObject({
entry: { type: "directory" },
});
await expect(capsule.files.remove("/tmp/a.txt")).resolves.toBeUndefined();
expect(list).toHaveBeenCalledWith("cap_1", { depth: 2, path: "/tmp" });
expect(mkdir).toHaveBeenCalledWith("cap_1", { path: "/tmp/new" });
expect(remove).toHaveBeenCalledWith("cap_1", { path: "/tmp/a.txt" });
});
it("streams downloads as Buffer chunks and uploads streaming content", async () => {
const capsule = new Capsule("cap_1", {
baseUrl: "https://api.example.com",
});
vi.spyOn(capsule.client.files, "streamDownload").mockResolvedValue(
streamFrom("hello"),
);
const streamUpload = vi
.spyOn(capsule.client.files, "streamUpload")
.mockResolvedValue(undefined);
const chunks: Buffer[] = [];
for await (const chunk of capsule.files.downloadStream("/tmp/a.txt")) {
chunks.push(chunk);
}
await capsule.files.uploadStream("/tmp/a.txt", Buffer.from("hello"));
expect(Buffer.concat(chunks).toString()).toBe("hello");
expect(streamUpload).toHaveBeenCalledWith("cap_1", {
file: expect.any(Blob),
path: "/tmp/a.txt",
});
});
});