Files
kandev/apps/web/components/task/file-tab-content.test.tsx
T
2026-09-07 13:45:28 +01:00

134 lines
3.6 KiB
TypeScript

import { cleanup, fireEvent, render, screen } from "@testing-library/react";
import { afterEach, describe, expect, it, vi } from "vitest";
import type { ReactNode } from "react";
import type { OpenFileTab } from "@/lib/types/backend";
import { FileTabContent } from "./file-tab-content";
const FILE_EDITOR_CONTENT_TEST_ID = "file-editor-content";
vi.mock("./file-editor-content", () => ({
FileEditorContent: ({
previewKind,
renderedPreview,
worktreePath,
onTogglePreview,
}: {
previewKind?: string;
renderedPreview?: boolean;
worktreePath?: string;
onTogglePreview?: () => void;
}) => (
<div
data-testid="file-editor-content"
data-preview-kind={previewKind}
data-rendered-preview={String(renderedPreview)}
data-worktree-path={worktreePath}
>
<button type="button" onClick={onTogglePreview}>
Toggle preview
</button>
</div>
),
}));
vi.mock("@kandev/ui/tabs", () => ({
TabsContent: ({ children }: { children: ReactNode }) => <div>{children}</div>,
}));
vi.mock("./file-viewer-header", () => ({
FileViewerExternalLink: () => null,
}));
vi.mock("./file-image-viewer", () => ({ FileImageViewer: () => null }));
vi.mock("./file-binary-viewer", () => ({ FileBinaryViewer: () => null }));
const file: OpenFileTab = {
path: "README.md",
name: "README.md",
content: "# README",
originalContent: "# README",
originalHash: "hash",
isDirty: false,
renderedPreview: true,
};
afterEach(cleanup);
describe("FileTabContent Markdown preview", () => {
it("renders a Markdown tab in preview mode and forwards the toggle", () => {
const onTogglePreview = vi.fn();
render(
<FileTabContent
tab={file}
activeSession={null}
activeSessionId="session-1"
taskId="task-1"
isSaving={false}
onFileChange={vi.fn()}
onFileSave={vi.fn()}
onFileDelete={vi.fn()}
onTogglePreview={onTogglePreview}
/>,
);
expect(screen.getByTestId(FILE_EDITOR_CONTENT_TEST_ID).getAttribute("data-preview-kind")).toBe(
"markdown",
);
expect(
screen.getByTestId(FILE_EDITOR_CONTENT_TEST_ID).getAttribute("data-rendered-preview"),
).toBe("true");
fireEvent.click(screen.getByRole("button", { name: "Toggle preview" }));
expect(onTogglePreview).toHaveBeenCalledOnce();
});
it("uses the effective workspace path for desktop file viewers", () => {
render(
<FileTabContent
tab={file}
activeSession={{
workspace_path: "/tmp/task-root",
worktree_path: "/tmp/task-root/kandev",
}}
activeSessionId="session-1"
taskId="task-1"
isSaving={false}
onFileChange={vi.fn()}
onFileSave={vi.fn()}
onFileDelete={vi.fn()}
/>,
);
expect(screen.getByTestId(FILE_EDITOR_CONTENT_TEST_ID).getAttribute("data-worktree-path")).toBe(
"/tmp/task-root",
);
});
});
describe("FileTabContent HTML preview", () => {
it("delegates HTML preview ownership to the file editor content", () => {
render(
<FileTabContent
tab={{
...file,
path: "reports/index.html",
name: "index.html",
content: "<h1>Report</h1>",
renderedPreview: false,
}}
activeSession={null}
activeSessionId="session-1"
taskId="task-1"
isSaving={false}
onFileChange={vi.fn()}
onFileSave={vi.fn()}
onFileDelete={vi.fn()}
/>,
);
expect(screen.getByTestId(FILE_EDITOR_CONTENT_TEST_ID).getAttribute("data-preview-kind")).toBe(
"html",
);
});
});