2e1f4d7929
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
36 lines
1.5 KiB
TypeScript
36 lines
1.5 KiB
TypeScript
import { mkdtemp, rm } from "node:fs/promises";
|
||
import { tmpdir } from "node:os";
|
||
import path from "node:path";
|
||
import { afterAll, describe, expect, it } from "vitest";
|
||
import { createLocalDriver } from "./local";
|
||
import { isValidStorageKey } from "./types";
|
||
|
||
const dirs: string[] = [];
|
||
afterAll(() => Promise.all(dirs.map((d) => rm(d, { recursive: true, force: true }))));
|
||
|
||
describe("yerel depolama", () => {
|
||
it("anahtar biçimi: yol geçişi ve beklenmeyen uzantılar reddedilir", () => {
|
||
expect(isValidStorageKey("ab/0123456789abcdef0123.webp")).toBe(true);
|
||
expect(isValidStorageKey("ab/0123456789abcdef0123.thumb.webp")).toBe(true);
|
||
expect(isValidStorageKey("ab/0123456789abcdef0123.pdf")).toBe(true);
|
||
expect(isValidStorageKey("../0123456789abcdef0123.webp")).toBe(false);
|
||
expect(isValidStorageKey("ab/../../etc/passwd")).toBe(false);
|
||
expect(isValidStorageKey("/ab/0123456789abcdef0123.webp")).toBe(false);
|
||
expect(isValidStorageKey("ab/0123456789abcdef0123.html")).toBe(false);
|
||
});
|
||
|
||
it("put/get/delete", async () => {
|
||
const dir = await mkdtemp(path.join(tmpdir(), "butcem-storage-"));
|
||
dirs.push(dir);
|
||
const s = createLocalDriver(dir);
|
||
const key = "cd/cdef0123456789abcdef.pdf";
|
||
expect(await s.get(key)).toBeNull();
|
||
await s.put(key, new TextEncoder().encode("merhaba"));
|
||
expect((await s.get(key))!.toString()).toBe("merhaba");
|
||
await s.delete(key);
|
||
await s.delete(key);
|
||
expect(await s.get(key)).toBeNull();
|
||
await expect(s.put("../x.pdf", new Uint8Array())).rejects.toThrow();
|
||
});
|
||
});
|