AkurAI Build
Menu

popagent

public

Latest 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"]);
  });
});