65c2b9cf85
Co-authored-by: iamlukethedev <iamlukethedev@users.noreply.github.com>
138 lines
3.8 KiB
TypeScript
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");
|
|
});
|
|
});
|