mirror of
https://github.com/harivansh-afk/sandbox-agent.git
synced 2026-04-15 15:03:37 +00:00
93 lines
2.6 KiB
TypeScript
93 lines
2.6 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import type { TaskRecord } from "@sandbox-agent/foundry-shared";
|
|
import { filterTasks, fuzzyMatch } from "@sandbox-agent/foundry-client";
|
|
import { formatRows } from "../src/tui.js";
|
|
|
|
const sample: TaskRecord = {
|
|
organizationId: "default",
|
|
repoId: "repo-a",
|
|
repoRemote: "https://example.com/repo-a.git",
|
|
taskId: "task-1",
|
|
branchName: "feature/test",
|
|
title: "Test Title",
|
|
task: "Do test",
|
|
sandboxProviderId: "local",
|
|
status: "running",
|
|
statusMessage: null,
|
|
activeSandboxId: "sandbox-1",
|
|
activeSessionId: "session-1",
|
|
sandboxes: [
|
|
{
|
|
sandboxId: "sandbox-1",
|
|
sandboxProviderId: "local",
|
|
switchTarget: "sandbox://local/sandbox-1",
|
|
cwd: null,
|
|
createdAt: 1,
|
|
updatedAt: 1,
|
|
},
|
|
],
|
|
agentType: null,
|
|
prSubmitted: false,
|
|
diffStat: null,
|
|
prUrl: null,
|
|
prAuthor: null,
|
|
ciStatus: null,
|
|
reviewStatus: null,
|
|
reviewer: null,
|
|
conflictsWithMain: null,
|
|
hasUnpushed: null,
|
|
parentBranch: null,
|
|
createdAt: 1,
|
|
updatedAt: 1,
|
|
};
|
|
|
|
describe("formatRows", () => {
|
|
it("renders rust-style table header and empty state", () => {
|
|
const output = formatRows([], 0, "default", "ok");
|
|
expect(output).toContain("Branch/PR (type to filter)");
|
|
expect(output).toContain("No branches found.");
|
|
expect(output).toContain("Ctrl-H:cheatsheet");
|
|
expect(output).toContain("ok");
|
|
});
|
|
|
|
it("marks selected row with highlight", () => {
|
|
const output = formatRows([sample], 0, "default", "ready");
|
|
expect(output).toContain("┃ ");
|
|
expect(output).toContain("Test Title");
|
|
expect(output).toContain("Ctrl-H:cheatsheet");
|
|
});
|
|
|
|
it("pins footer to the last terminal row", () => {
|
|
const output = formatRows([sample], 0, "default", "ready", "", false, {
|
|
width: 80,
|
|
height: 12,
|
|
});
|
|
const lines = output.split("\n");
|
|
expect(lines).toHaveLength(12);
|
|
expect(lines[11]).toContain("Ctrl-H:cheatsheet");
|
|
expect(lines[11]).toContain("v");
|
|
});
|
|
});
|
|
|
|
describe("search", () => {
|
|
it("supports ordered fuzzy matching", () => {
|
|
expect(fuzzyMatch("feature/test-branch", "ftb")).toBe(true);
|
|
expect(fuzzyMatch("feature/test-branch", "fbt")).toBe(false);
|
|
});
|
|
|
|
it("filters rows across branch and title", () => {
|
|
const rows: TaskRecord[] = [
|
|
sample,
|
|
{
|
|
...sample,
|
|
taskId: "task-2",
|
|
branchName: "docs/update-intro",
|
|
title: "Docs Intro Refresh",
|
|
status: "idle",
|
|
},
|
|
];
|
|
expect(filterTasks(rows, "doc")).toHaveLength(1);
|
|
expect(filterTasks(rows, "h2")).toHaveLength(1);
|
|
expect(filterTasks(rows, "test")).toHaveLength(2);
|
|
});
|
|
});
|