AkurAI Build
Menu

popagent

public

Latest change 2c7138e7ddf8cb6b5ac0dc1abbe6d76743366c19 - Checkpoint workspace and secret management work by AkurAI Build

import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import { mkdir, mkdtemp, rm } from "node:fs/promises";
import { tmpdir } from "node:os";
import { join, resolve } from "node:path";
import { AgentWorkspaceStore } from "./agent-workspaces";

let root = "";
let repositoryA = "";
let repositoryB = "";
let store: AgentWorkspaceStore;
let createdId: string | undefined;

beforeAll(async () => {
  root = await mkdtemp(join(tmpdir(), "popagent-workspaces-"));
  repositoryA = `repo-${crypto.randomUUID()}`;
  repositoryB = `repo-${crypto.randomUUID()}`;
  await Promise.all([
    mkdir(join(root, repositoryA)),
    mkdir(join(root, repositoryB)),
    mkdir(join(root, process.env.POPAGENT_DEFAULT_REPOSITORY ?? "."), { recursive: true }),
  ]);
  store = new AgentWorkspaceStore(root);
  await store.init();
});

afterAll(async () => {
  if (createdId) await store.delete(createdId);
  await rm(root, { recursive: true, force: true });
});

describe("AgentWorkspaceStore", () => {
  test("persists repository workspaces and resolves contained paths", async () => {
    const created = await store.create({ name: "Test repository", repositoryPath: repositoryA });
    createdId = created.id;

    expect(await store.list()).toContainEqual(expect.objectContaining({
      id: created.id,
      name: "Test repository",
      repositoryPath: repositoryA,
    }));
    expect((await store.resolveRepository(created.id)).path).toBe(resolve(root, repositoryA));

    const updated = await store.update(created.id, {
      name: "Renamed repository",
      repositoryPath: repositoryB,
    });
    expect(updated).toEqual(expect.objectContaining({
      name: "Renamed repository",
      repositoryPath: repositoryB,
    }));
    expect((await store.resolveRepository(created.id)).path).toBe(resolve(root, repositoryB));

    expect(await store.delete(created.id)).toBe(true);
    createdId = undefined;
    expect(await store.get(created.id)).toBeUndefined();
  });

  test("rejects absolute paths and traversal outside the workspace root", async () => {
    await expect(store.create({ name: "Absolute", repositoryPath: resolve(root) })).rejects.toThrow(
      "relative to the workspace root",
    );
    await expect(store.create({ name: "Traversal", repositoryPath: ".." })).rejects.toThrow(
      "inside the workspace root",
    );
  });
});