Menu
popagent
publicLatest change 7f0ff66d6d9fb6468416c58bee46bd3d08169501 - Checkpoint browser channels and memory work by AkurAI Build
import { afterEach, describe, expect, test } from "bun:test";
import { mkdir, rm, utimes, writeFile } from "node:fs/promises";
import { join } from "node:path";
import { BrowserRecordingStore } from "./browser-recordings";
const root = join("/tmp", `popagent-recordings-${crypto.randomUUID()}`);
afterEach(() => rm(root, { recursive: true, force: true }));
describe("BrowserRecordingStore", () => {
test("lists only contained AVI recordings and rejects traversal", async () => {
await mkdir(root, { recursive: true });
await writeFile(join(root, "run.avi"), "video");
await writeFile(join(root, "ignore.txt"), "text");
const store = new BrowserRecordingStore(root);
expect(await store.list()).toEqual([expect.objectContaining({ name: "run.avi", size: 5 })]);
await expect(store.pathFor("../secret.avi")).rejects.toThrow("Invalid recording");
});
test("enforces age and count retention", async () => {
await mkdir(root, { recursive: true });
for (const name of ["old.avi", "middle.avi", "new.avi"]) await writeFile(join(root, name), name);
const now = Date.now();
await utimes(join(root, "old.avi"), new Date(now - 10 * 86400000), new Date(now - 10 * 86400000));
await utimes(join(root, "middle.avi"), new Date(now - 1000), new Date(now - 1000));
await utimes(join(root, "new.avi"), new Date(now), new Date(now));
const store = new BrowserRecordingStore(root, () => now);
expect(await store.cleanup({ retentionDays: 7, maxFiles: 1 })).toBe(2);
expect((await store.list()).map((item) => item.name)).toEqual(["new.avi"]);
});
});