134 lines
3.6 KiB
TypeScript
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",
|
|
);
|
|
});
|
|
});
|