mirror of
https://github.com/harivansh-afk/sandbox-agent.git
synced 2026-04-15 17:01:02 +00:00
92 lines
2.4 KiB
TypeScript
92 lines
2.4 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import type { HandoffRecord } from "@openhandoff/shared";
|
|
import {
|
|
filterHandoffs,
|
|
formatRelativeAge,
|
|
fuzzyMatch,
|
|
summarizeHandoffs
|
|
} from "../src/view-model.js";
|
|
|
|
const sample: HandoffRecord = {
|
|
workspaceId: "default",
|
|
repoId: "repo-a",
|
|
repoRemote: "https://example.com/repo-a.git",
|
|
handoffId: "handoff-1",
|
|
branchName: "feature/test",
|
|
title: "Test Title",
|
|
task: "Do test",
|
|
providerId: "daytona",
|
|
status: "running",
|
|
statusMessage: null,
|
|
activeSandboxId: "sandbox-1",
|
|
activeSessionId: "session-1",
|
|
sandboxes: [
|
|
{
|
|
sandboxId: "sandbox-1",
|
|
providerId: "daytona",
|
|
sandboxActorId: null,
|
|
switchTarget: "daytona://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("search helpers", () => {
|
|
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: HandoffRecord[] = [
|
|
sample,
|
|
{
|
|
...sample,
|
|
handoffId: "handoff-2",
|
|
branchName: "docs/update-intro",
|
|
title: "Docs Intro Refresh",
|
|
status: "idle"
|
|
}
|
|
];
|
|
expect(filterHandoffs(rows, "doc")).toHaveLength(1);
|
|
expect(filterHandoffs(rows, "h2")).toHaveLength(1);
|
|
expect(filterHandoffs(rows, "test")).toHaveLength(2);
|
|
});
|
|
});
|
|
|
|
describe("summary helpers", () => {
|
|
it("formats relative age", () => {
|
|
expect(formatRelativeAge(9_000, 10_000)).toBe("1s");
|
|
expect(formatRelativeAge(0, 120_000)).toBe("2m");
|
|
});
|
|
|
|
it("summarizes by status and provider", () => {
|
|
const rows: HandoffRecord[] = [
|
|
sample,
|
|
{ ...sample, handoffId: "handoff-2", status: "idle", providerId: "daytona" },
|
|
{ ...sample, handoffId: "handoff-3", status: "error", providerId: "daytona" }
|
|
];
|
|
|
|
const summary = summarizeHandoffs(rows);
|
|
expect(summary.total).toBe(3);
|
|
expect(summary.byStatus.running).toBe(1);
|
|
expect(summary.byStatus.idle).toBe(1);
|
|
expect(summary.byStatus.error).toBe(1);
|
|
expect(summary.byProvider.daytona).toBe(3);
|
|
});
|
|
});
|