Files
horus-3d/tests/unit/agentEditorModal.test.ts
2026-03-20 23:05:14 -05:00

138 lines
3.8 KiB
TypeScript

import { createElement } from "react";
import { beforeEach, describe, expect, it, vi } from "vitest";
import { cleanup, fireEvent, render, screen } from "@testing-library/react";
import { AgentEditorModal } from "@/features/agents/components/AgentEditorModal";
import { createDefaultAgentAvatarProfile } from "@/lib/avatars/profile";
import type { AgentState } from "@/features/agents/state/store";
import type { GatewayClient } from "@/lib/gateway/GatewayClient";
vi.mock("@/features/agents/components/AgentAvatarPreview3D", () => ({
AgentAvatarPreview3D: () => createElement("div", { "data-testid": "avatar-preview-3d" }, "preview"),
}));
vi.mock("@/features/agents/components/inspect/AgentBrainPanel", () => ({
AgentBrainPanel: ({
selectedAgentId,
activeSection,
}: {
selectedAgentId: string | null;
activeSection?: string;
}) =>
createElement(
"div",
{ "data-testid": "brain-panel" },
`brain:${selectedAgentId}:${activeSection ?? "all"}`,
),
}));
const buildAgent = (): AgentState =>
({
agentId: "agent-1",
name: "Agent One",
avatarProfile: createDefaultAgentAvatarProfile("seed-a"),
avatarSeed: "seed-a",
avatarUrl: null,
status: "idle",
sessionCreated: false,
awaitingUserInput: false,
hasUnseenActivity: false,
outputLines: [],
lastResult: null,
lastDiff: null,
runId: null,
runStartedAt: null,
streamText: null,
thinkingTrace: null,
latestOverride: null,
latestOverrideKind: null,
lastAssistantMessageAt: null,
lastActivityAt: null,
latestPreview: null,
lastUserMessage: null,
draft: "",
queuedMessages: [],
sessionSettingsSynced: false,
historyLoadedAt: null,
historyFetchLimit: null,
historyFetchedCount: null,
historyMaybeTruncated: false,
toolCallingEnabled: true,
showThinkingTraces: false,
sessionKey: "session-1",
model: undefined,
thinkingLevel: undefined,
}) as AgentState;
describe("AgentEditorModal", () => {
beforeEach(() => {
vi.restoreAllMocks();
cleanup();
});
it("saves avatar changes from the avatar section", async () => {
const agent = buildAgent();
const onAvatarSave = vi.fn(async () => {});
const initialBackpack = agent.avatarProfile?.accessories.backpack;
render(
createElement(AgentEditorModal, {
open: true,
client: {} as GatewayClient,
agents: [agent],
agent,
onClose: () => {},
onAvatarSave,
}),
);
fireEvent.click(screen.getByRole("button", { name: "Backpack" }));
fireEvent.click(screen.getByRole("button", { name: "Save avatar" }));
expect(onAvatarSave).toHaveBeenCalledTimes(1);
expect(onAvatarSave).toHaveBeenCalledWith(
"agent-1",
expect.objectContaining({
seed: "seed-a",
accessories: expect.objectContaining({ backpack: !initialBackpack }),
}),
);
});
it("switches to another file section", () => {
const agent = buildAgent();
render(
createElement(AgentEditorModal, {
open: true,
client: {} as GatewayClient,
agents: [agent],
agent,
onClose: () => {},
onAvatarSave: () => {},
}),
);
fireEvent.click(screen.getByRole("button", { name: /Tools/i }));
expect(screen.getByTestId("brain-panel")).toHaveTextContent("brain:agent-1:TOOLS.md");
});
it("honors the initial file section", () => {
const agent = buildAgent();
render(
createElement(AgentEditorModal, {
open: true,
client: {} as GatewayClient,
agents: [agent],
agent,
initialSection: "MEMORY.md",
onClose: () => {},
onAvatarSave: () => {},
}),
);
expect(screen.getByTestId("brain-panel")).toHaveTextContent("brain:agent-1:MEMORY.md");
});
});