Files
multica/packages/views/issues/components/execution-log-section.test.tsx

90 lines
2.8 KiB
TypeScript

// @vitest-environment jsdom
import { cleanup, screen } from "@testing-library/react";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import type { AgentTask } from "@multica/core/types";
import { renderWithI18n } from "../../test/i18n";
const mockState = vi.hoisted(() => ({
taskMessagesOptions: vi.fn(),
}));
vi.mock("@multica/core/chat/queries", () => ({
taskMessagesOptions: mockState.taskMessagesOptions,
}));
vi.mock("../../common/actor-avatar", () => ({
ActorAvatar: () => <span data-testid="actor-avatar" />,
}));
vi.mock("../../common/task-transcript", () => ({
TranscriptButton: ({ title }: { title?: string }) => (
<button type="button">{title ?? "Transcript"}</button>
),
}));
vi.mock("./terminate-task-confirm-dialog", () => ({
TerminateTaskConfirmDialog: () => null,
}));
import { ActiveTaskRow } from "./execution-log-section";
function makeTask(overrides: Partial<AgentTask> = {}): AgentTask {
return {
id: "task-1",
agent_id: "agent-1",
runtime_id: "runtime-1",
issue_id: "issue-1",
status: "running",
priority: 0,
dispatched_at: null,
started_at: "2026-06-08T08:00:00Z",
completed_at: null,
result: null,
error: null,
created_at: "2026-06-08T08:00:00Z",
trigger_summary: "Started from comment",
...overrides,
};
}
beforeEach(() => {
cleanup();
vi.clearAllMocks();
vi.useFakeTimers();
vi.setSystemTime(new Date("2026-06-08T08:05:04Z"));
});
afterEach(() => {
vi.useRealTimers();
});
describe("ActiveTaskRow", () => {
it("renders running status as elapsed time only", () => {
renderWithI18n(<ActiveTaskRow task={makeTask()} issueId="issue-1" />);
expect(screen.getByText("5m 04s")).toBeInTheDocument();
expect(screen.queryByText(/events?/i)).not.toBeInTheDocument();
expect(screen.getByText("Started from comment")).toBeInTheDocument();
expect(screen.getByText("View transcript")).toBeInTheDocument();
expect(mockState.taskMessagesOptions).not.toHaveBeenCalled();
});
it("does not make transcript actions depend on hover-only rendering", () => {
renderWithI18n(<ActiveTaskRow task={makeTask()} issueId="issue-1" />);
const transcriptButton = screen.getByRole("button", { name: "View transcript" });
const status = screen.getByText("5m 04s");
expect(status.parentElement?.className).toContain("flex h-7");
expect(status.parentElement?.className).toContain(
"[@media(hover:hover)]:group-hover/execution-log-row:hidden",
);
expect(transcriptButton.parentElement?.className).toContain("flex h-7");
expect(transcriptButton.parentElement?.className).toContain("[@media(hover:hover)]:hidden");
expect(transcriptButton.parentElement?.className).toContain(
"[@media(hover:hover)]:group-hover/execution-log-row:flex",
);
});
});