Menu
popagent
publicLatest change 248b7c0673ea9d544f9e4738ee4d3e8ec2925924 - Add native BifrOSt Navigator browser provider with per-browser status LEDs by AkurAI Build
import { describe, expect, test } from "bun:test";
import { renderToStaticMarkup } from "react-dom/server";
import type { AgentSettings } from "../api-types";
import { AgentIdentityCard, AgentRosterRow, agentRosterGroups, AgentWorkSource, BrowserProviderLeds, RuntimeModelSource, scheduleTimingLabel, scheduleWorkspaceName } from "./AgentSettingsPage";
describe("global schedule view", () => {
test("labels each schedule with its execution workspace", () => {
expect(scheduleWorkspaceName("simulation", [
{ id: "default", name: "popagent", repositoryPath: "popagent", createdAt: "", updatedAt: "" },
{ id: "simulation", name: "Market Simulation", repositoryPath: "simulation", createdAt: "", updatedAt: "" },
])).toBe("Market Simulation");
expect(scheduleTimingLabel({ source: "self-update", cron: "0 * * * *", nextRunAt: "2099-01-01T00:00:00Z" })).toBe("When idle");
});
});
describe("agent work source", () => {
test("labels user, self-update, and Build maintenance work explicitly", () => {
expect(renderToStaticMarkup(<AgentWorkSource source="user" />)).toContain("source user");
expect(renderToStaticMarkup(<AgentWorkSource source="self-update" />)).toContain("source self-update");
expect(renderToStaticMarkup(<AgentWorkSource source="build-maintenance" />)).toContain("source build-maintenance");
});
});
describe("runtime model source", () => {
test("offers configured, local Titan, and OpenRouter free routes", () => {
const markup = renderToStaticMarkup(
<RuntimeModelSource value="local" onChange={() => {}} />,
);
expect(markup).toContain("Configured model");
expect(markup).toContain("Titan local 9B");
expect(markup).toContain("OpenRouter free router");
});
});
describe("agent identity card", () => {
test("shows the assigned person's portrait, title, department, and email", () => {
const markup = renderToStaticMarkup(
<AgentIdentityCard
agentId="orchistrator"
model="cx/gpt-5.6-luna-max"
delegationEnabled={true}
/>,
);
expect(markup).toContain("Embla Náttsól");
expect(markup).toContain("Operations Coordinator");
expect(markup).toContain("Operations");
expect(markup).toContain("mailto:embla@olibuijr.com");
expect(markup).toContain("/api/company/avatars/6766bf84-a89a-4b01-bf21-94777efb2e7c");
expect(markup).toContain("cx/gpt-5.6-luna-max");
});
});
describe("agent roster row", () => {
test("presents each agent as a compact identity row", () => {
const markup = renderToStaticMarkup(
<AgentRosterRow
agent={{
id: "researcher",
name: "Researcher",
description: "Evidence investigator",
instructions: "Investigate.",
model: "codex/gpt-5.6-luna-medium",
sourceUrls: [],
workspaceAccess: "read-only",
browserAccess: "read-only",
delegationEnabled: true,
tools: [],
createdAt: "",
updatedAt: "",
}}
selected={true}
onChoose={() => {}}
/>,
);
expect(markup).toContain("Salka Valgerðardóttir");
expect(markup).toContain("Technical Documentation Lead");
expect(markup).not.toContain("Evidence investigator");
expect(markup).toContain("size-8");
expect(markup).toContain('aria-pressed="true"');
});
test("does not repeat generated role copy beneath the staff title", () => {
const markup = renderToStaticMarkup(
<AgentRosterRow
agent={{
id: "staff-soley",
name: "Mail API Engineer",
description: "Mail API Engineer for AkurAI Communications, responsible for evidence-backed work within that specialty.",
instructions: "Own mail API work.",
model: "codex/gpt-5.6-luna-medium",
sourceUrls: [],
workspaceAccess: "read-write",
browserAccess: "read-only",
delegationEnabled: true,
tools: [],
createdAt: "",
updatedAt: "",
}}
selected={false}
onChoose={() => {}}
/>,
);
expect(markup).toContain("Sóley Hvannberg");
expect(markup).toContain("Mail API Engineer");
expect(markup).not.toContain("responsible for evidence-backed work");
});
});
describe("agent roster groups", () => {
const agent = (id: string, name: string): AgentSettings => ({
id,
name,
description: "",
instructions: "",
model: null,
sourceUrls: [],
workspaceAccess: "none",
browserAccess: "none",
delegationEnabled: true,
tools: [],
createdAt: "",
updatedAt: "",
});
test("groups agents by department and filters by name, role, or department", () => {
const agents = [agent("orchistrator", "Orchistrator"), agent("staff-soley", "Mail API Engineer"), agent("custom", "Custom agent")];
expect(agentRosterGroups(agents).map((group) => group.name)).toEqual(["Communications", "Operations", "Other agents"]);
expect(agentRosterGroups(agents, "sóley")).toEqual([{ name: "Communications", members: [agents[1]!] }]);
expect(agentRosterGroups(agents, "operations")).toEqual([{ name: "Operations", members: [agents[0]!] }]);
expect(agentRosterGroups(agents, "nobody")).toEqual([]);
});
});
describe("browser provider LEDs", () => {
test("shows a green LED for working browsers, red for unavailable, and marks the selected provider", () => {
const markup = renderToStaticMarkup(
<BrowserProviderLeds selected="bifrost-navigator" health={{
provider: "BifrOSt Navigator", healthy: false, headless: false, selected: "bifrost-navigator",
providers: [
{ id: "agent-browser", label: "Headless AgentBrowser", healthy: true, headless: true, detail: "Chromium installed" },
{ id: "bifrost-navigator", label: "BifrOSt Navigator", healthy: false, headless: false, detail: "MCP socket unreachable" },
],
enabled: true, scope: "thread", activeSessions: 0, profileConfigured: false, screencastEnabled: true, recordingEnabled: false,
}} />,
);
expect(markup).toContain('aria-label="Headless AgentBrowser: working"');
expect(markup).toContain("bg-emerald-500");
expect(markup).toContain('aria-label="BifrOSt Navigator: unavailable"');
expect(markup).toContain("bg-red-500");
expect(markup).toContain("Selected");
expect(markup).toContain("MCP socket unreachable");
});
test("pulses amber while health is still loading", () => {
const markup = renderToStaticMarkup(<BrowserProviderLeds selected="agent-browser" />);
expect(markup).toContain("bg-amber-400");
expect(markup).toContain('aria-label="BifrOSt Navigator: checking"');
});
});